三、微服务之网关

三、微服务之网关

网关作用
  1. 统一入口:微服务项目往往存在多个服务,每个服务都有自己的端口,访问地址即存在多个;使用网关可以统一入口,对所有接口进行维护;
  2. 路径校验:对接口路径进行全局的校验,即类似于用户权限 TOKEN 的校验,又或者对特殊接口路径直接放行等;
  3. 网关路由:网关的主要作用,用于具体实现第一点的需求,根据路径匹配规则路由到指定服务访问其接口。
网关选择
  1. ZUUL: 核心包 spring-cloud-starter-netflix-zuul
  2. GATEWAY: 核心包 spring-cloud-starter-gateway
  3. 两者主要区别在于对于同步阻塞的处理;其中zuul仅支持同步,gateway支持异步即NIO,所以gateway可以提高系统的吞吐量;本次微服务搭建使用 GATEWAY
网关依赖
<?xml version="1.0" encoding="UTF-8"?>
<project
    xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.1.RELEASE</version>
        <relativePath/>
        <!-- lookup parent from repository -->
    </parent>
    <groupId>com.fatcat</groupId>
    <artifactId>fc-gateway</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <name>fc-gateway</name>
    <description>网关路由中心</description>
    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Hoxton.RELEASE</spring-cloud.version>
    </properties>
    <dependencies>
        <!--第三方依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>
        <!-- EUREKA 注册中心 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
    </dependencies>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
</project>
网关配置

这里使用properties文件配置常规属性,使用yml文件配置路由属性;常规属性配置:

# 当前服务配置 
server.port=9000 
# 服务名称 
spring.application.name=fc-gateway 
# eureka 注册地址 
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/ 
# 自身的主机地址 
eureka.instance.hostname=localhost 
# 心跳周期,单位秒 
eureka.instance.lease-renewal-interval-in-seconds=10 
# 过期时间,单位秒,即60s没有心跳就从注册中心剔除 
eureka.instance.lease-expiration-duration-in-seconds=30 
# 服务路由发现,开启后会自动根据服务名路由,可以省略下方所有路由配置 
# spring.cloud.gateway.discovery.locator.enabled=false 
# 开启路由名全小写 
spring.cloud.gateway.discovery.locator.lower-case-service-id=true

路由属性配置:

# id: 路由的id,自定义,保证唯一即可 
# uri: 用于转发的地址,有三种配置方式 
# - http方式 spring.cloud.gateway.routes[0].uri=http://localhost:port/ 
# - websocket方式 spring.cloud.gateway.routes[0].uri=ws://localhost:port/ 
# - 注册中心服务名方式 spring.cloud.gateway.routes[0].uri=lb://fc-search 
# predicate: 断言规则,将匹配到的路径全部拼接至uri上再访问 
# 使用yaml形式配置路由,方便追加 
spring: cloud: gateway: routes: 
  # 配置查询中心的路由路径 
  - id: fc-search 
    uri: lb://fc-search 
    predicates: 
      - Path=/fc-search/** 
  # 配置用户中心的路由路径 
  - id: fc-user 
    uri: lb://fc-user 
    predicates: 
      - Path=/fc-user/**
注意事项
  1. gateway 是基于netty运行的,而非tomcat,所以如果程序中两个同时存在会报错;
  2. 传统 web 服务是基于tomcat容器启动,也可以修改成jetty服务器,依赖包 spring-boot-starert-web 中已经集成了spring-boot-starter-tomcat,所以传统 web 服务引入 web 依赖即可;
  3. gateway 核心依赖 spring-cloud-starter-gateway 中集成的是 spring-boot-starert-webflux,启动的服务器是 spring-boot-starter-reactor-netty,与tomcat冲突;
  4. gateway 工程中不可引入 web 依赖(因此某些异常处理配置需要单独提供)。