一 什么是网关?为什么选择 Gateway?
网关功能如下:
- 身份认证和权限校验
- 服务路由、负载均衡
- 请求限流
在 Spring Cloud 中网关的实现包含两种:
- Gateway(推荐):是基于 Spring5 中提供的 WebFlux ,属于响应式编程的实现,具备更好的性能,因此作为比较推荐实现网关的方式。
- Zuul:是基于 Servlet 的实现,属于阻塞式编程
二 Gateway 网关
主要分为以下几个步骤:
1 创建新的module-gateway
引入SpringCloudGateway的依赖和nacos的服务发现依赖:
java
<!--网关依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!--nacos服务发现依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
高版本错误:
a)如果使用的是 springcloud高版本(例如 2020.1.0),那么 gateway 中的 ribbon 负载均衡已经被剔除了,因此需要引入 springcloud loadbalencer 作为 gateway 的负载均衡.
java
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-loadbalancer</artifactId>
</dependency>
b)引入此依赖后,可能还会报 cache 的警告,引入一下两个依赖即可
java
<dependency>
<groupId>com.github.ben-manes.caffeine</groupId>
<artifactId>caffeine</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
</dependency>
2 编写nacos地址和路由配置
java
server:
port: 10010 # 网关端口
spring:
application:
name: gateway
cloud:
nacos:
server-addr: localhost:8848 # nacos 地址
gateway:
routes: # 网关路由配置
- id: user-service # 路由 id,自定义,只要唯一即可
uri: lb://userservice # 路由的目标地址 lb 就是负载均衡,后面跟微服务名
predicates: #路由断言
- Path=/user/** # 这个是按照路径匹配,只要以 /user/ 开头就符合要求
- id: order-service
uri: lb://orderservice
predicates:
- Path=/order/**
路由配置解释如下:
- 路由id:路由的唯一标示(自定义)
- 路由目标(uri):路由的目标地址,http代表固定地址,lb代表根据服务名负载均衡
- 路由断言(predicates):路由的规则(匹配的才被 gateway 拦截下来).
- 路由过滤器(filters):对请求或响应做处理,例如 StripProfix 就是去掉指定数量的前缀路由,例如请求是 api/user/login,filters 处理为 StripProfix = 1(去掉一个前缀),那么处理后请求就是 /user/login.
3 效果展示
出现下述结果展示,说明路由转发成功.