专栏目录
0.docker快速入门
1.初识微服务
2.Gateway网关路由
3.微服务配置管理
文章目录
- SpringCloudGateway网关路由
-
- 网关请求处理流程
- 相关网站
- 快速入门
- 基础知识
-
- 路由断言
- 路由过滤器
- 自定义过滤器
-
- 一、**自定义GatewayFilter**
- 二、**自定义GlobalFilter**
- 登录校验功能--基于[JWT]()
-
- 如何在网关转发之前做登录校验
- 网关如何将登录信息传递给微服务
- 如何在微服务之间传递用户信息
SpringCloudGateway网关路由
网关就是网络的关口。数据从一个网络传输到另一网络时,通过网关来实现数据的路由和转发以及数据安全的校验。
在微服务中,前端请求不能直接访问到服务,因此需要通过网关的路由转发来实现请求,前端只需要知道网关的地址就好
- 网关可以做安全控制,也就是登录身份校验,校验通过才放行
- 通过认证后,网关再根据请求判断应该访问哪个微服务,将请求转发过去
- 网关也是一种微服务,可以通过在注册中心拉取到已注册的微服务的相关信息
Spring Cloud中网关的实现有两种方案:
- Netflix Zuul:由Netflix推出基于Servlet技术的阻塞式编程,需要调优才能获得与SpringCloudGateway类似的性能
- SpringCloudGateway官网:基于Spring的WebFlux技术,完全支持响应式编程,吞吐能力更强
网关请求处理流程
- 前端或客户端向后端发起请求
- 网关基于路由规则实现转发
- HandlerMapping:默认通过路由断言实现,根据请求找到匹配的路由并存入上下文,把请求交给Webhandler处理
- WebHandler:默认实现是FilteringWebHandler,使用网关中配置的过滤器链依次通过过滤器进行过滤
- NettyRoutingFilter:默认对所有路由过滤且位于过滤器链的末端
- 将请求转发给微服务
- 接收微服务返回的响应并加以封装,存入上下文
相关网站
- SpringCloudGateway官网
- Spring Cloud Gateway官方文档
快速入门
①网关属于一种微服务,因此需要单独的项目模块
②引入相关依赖
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-gatewayartifactId>
dependency>
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-loadbalancerartifactId>
dependency>
③编写启动类
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class GatewayApplication {
public static void main(String[] args) {
SpringApplication.run(GatewayApplication.class, args);
}
}
④配置路由转发规则
spring:
application:
name: gateway
cloud:
nacos:
server-addr: ip:8848
gateway:
routes:
- id: item
uri: lb://{服务名称}
predicates:
- Path=/items/**,/search/**
- id: cart
uri: lb://{服务名称}
predicates:
- Path=/carts/**
基础知识
定义语法:
spring:
cloud:
gateway:
routes:
- id: item
uri: lb://{服务名称}
predicates:
- Path=/items/**,/search/**
网关路由对应Java的RouteDefinition
id:路由唯一标识
uri:路由目标地址
lb://
代表负载均衡,从注册中心获取目标微服务的实例列表,并且负载均衡选择一个访问
predicates:路由断言,判断是否符合当前路由
filters:路由过滤器,对请求或响应进行处理
路由断言
详情请见RoutePredicate
名称 |
说明 |
示例 |
After |
是某个时间点后的请求 |
- After=2037-01-20T17:42:47.789-07:00[America/Denver] |
Before |
是某个时间点之前的请求 |
- Before=2031-04-13T15:14:47.433+08:00[Asia/Shanghai] |
Between |
是某两个时间点之前的请求 |
- Between= 2037-01-20T17:42:47.789-07:00[America/Denver], 2037-01-21T17:42:47.789-07:00[America/Denver] |
Cookie |
请求必须包含某些cookie |
- Cookie=chocolate, ch.p |
Header |
请求必须包含某些header |
- Header=X-Request-Id, \d+ |
Host |
请求必须是访问某个host(域名) |
- Host=.somehost.org ,.anotherhost.org |
Method |
请求方式必须是指定方式 |
- Method=GET,POST |
Path |
请求路径必须符合指定规则 |
- Path=/path_1/{segment},/path_2/** |
Query |
请求参数必须包含指定参数 |
- Query=name, Jack或者- Query=name |
RemoteAddr |
请求者的IP必须是指定范围 |
- RemoteAddr=192.168.1.1/24 |
weight |
权重处理 |
|
路由过滤器
过滤器内部包含两部分逻辑,分为pre和post,分别在请求路由到微服务之前和之后执行
当所有Filter的pre都执行通过后,请求才会被路由到微服务上,否则会被拦截,后续过滤器不再执行
微服务返回结果后倒叙执行Filter的post逻辑
详情请见GatewayFilter
名称 |
说明 |
示例- filters: |
AddRequestHeader |
给当前请求添加一个请求头 |
-AddRequestHeader=headerName,headerValue |
RemoveRequestHeader |
移除请求中的一个请求头 |
-RemoveRequestHeader=headerName |
AddResponseHeader |
给响应结果中添加一个响应头 |
-AddResponseHeader=headerName,headerValue |
RemoveResponseHeader |
从响应结果中移除有一个响应头 |
-RemoveResponseHeader=headerName |
RewritePath |
请求路径重写 |
-RewritePath=/red/?(?.*), /${segment} |
StripPrefix |
去除请求路径中N段前缀 |
-StripPrefix=1(如/a/b路径只保留/b) |
示例:
spring:
cloud:
gateway:
routes:
- id: test_route
uri: lb://test-service
predicates:
-Path=/test/**
filters:
- AddRequestHeader=key, value
spring:
cloud:
gateway:
default-filters:
- AddRequestHeader=key, value
routes:
- id: test_route
uri: lb://test-service
predicates:
-Path=/test/**
自定义过滤器
一、自定义GatewayFilter
①创建自定义过滤器的类,类名命名规则为**GatewayFilterFactory
,继承实现AbstractGatewayFilterFactory