网关作用
- 统一入口:微服务项目往往存在多个服务,每个服务都有自己的端口,访问地址即存在多个;使用网关可以统一入口,对所有接口进行维护;
- 路径校验:对接口路径进行全局的校验,即类似于用户权限 TOKEN 的校验,又或者对特殊接口路径直接放行等;
- 网关路由:网关的主要作用,用于具体实现第一点的需求,根据路径匹配规则路由到指定服务访问其接口。
网关选择
- ZUUL: 核心包 spring-cloud-starter-netflix-zuul
- GATEWAY: 核心包 spring-cloud-starter-gateway
- 两者主要区别在于对于同步阻塞的处理;其中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/**
注意事项
- gateway 是基于netty运行的,而非tomcat,所以如果程序中两个同时存在会报错;
- 传统 web 服务是基于tomcat容器启动,也可以修改成jetty服务器,依赖包 spring-boot-starert-web 中已经集成了spring-boot-starter-tomcat,所以传统 web 服务引入 web 依赖即可;
- gateway 核心依赖 spring-cloud-starter-gateway 中集成的是 spring-boot-starert-webflux,启动的服务器是 spring-boot-starter-reactor-netty,与tomcat冲突;
- gateway 工程中不可引入 web 依赖(因此某些异常处理配置需要单独提供)。