官网:https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.1.RELEASE/reference/html/
官方文档(3.0.1GA):https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#the-query-route-predicate-factory
一、概念
Gatewag 使用的Webflux中的reactor-netty响应式编程组件,底层使用了Netty通讯框架,旨在为微服务架构提供简单有效的统一API路由管理,基于异步非阻塞模型的网关(而zuul1是基于阻塞Sevle2.x 开发的)。 可用来做反向代理、鉴权、流量控制、熔断、日志监控等。
服务框架:外部请求 -> 负载均衡(Nginx)-> 网关(gateway) -> 微服务
1. 路由(Route):
路由是构建网关的基本模块,他是由ID,目标URI,一系列的断言和过滤器组成,如果断言为true则匹配该路由。
2. 断言(Predicate)
开发人员可以匹配HTTP请求中的所有内容(例如请求头或请求参数),如果请求与断言相匹配则进行路由。
3. 过滤(Filter)
指的是Spring框架中GatewayFilter的实例,使用过滤器,可以在请求被路由前或者之后对请求进行修改。
4. 执行流程
二、网关服务创建
pom依赖:引入 spring-cloud-starter-gateway
1
2
3
4<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>配置文件(注册进Eureka,配置路由)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27server:
port: 网关服务端口
spring:
application:
name: gateway # 服务名
cloud:
gateway:
routes:
- id: routh1 #路由的ID,没有固定规则但要求唯一,建议配合服务名
uri: http://localhost:8001 #匹配后提供服务的路由地址
predicates:
- Path=/user/get/** #断言,路径相匹配的进行路由
- id: routh2
uri: http://localhost:8001
predicates:
- Path=/course/** #断言,路径相匹配的进行路由
# 注册进eureka
eureka:
instance:
hostname: gateway-service
client:
service-url:
register-with-eureka: true
fetch-registry: true
defaultZone: http://eurekaIP:eureka端口/eureka启动类,添加注册中心所需要的的注解(以eureka为例)
1
@EnableEurekaClient
1. 路由配置
① 配置文件的方式,如上yaml中的配置
② 通过java代码配置类配置,通过网关访问百度 直接访问http://网关端口/test 即可访问到
http://ip:端口/test
微服务。1
2
3
4
5
6
7
8
9
10
public class GateWayConfig {
public RouteLocator customRouteLocator(RouteLocatorBuilder routeLocatorBuilder) {
RouteLocatorBuilder.Builder routes = routeLocatorBuilder.routes();
routes.route("testBaidu", r -> r.path("/test").uri("http://ip:端口/test")).build();
return routes.build();
}
}
三、动态路由
默认Gateway会根据注册中心的服务列表,以注册中心上微服务名为路径创建动态路由进行转发,从而实现动态路由的功能,负载均衡访问网关后的微服务。
网关服务注册到注册中心以后,在网关测直接通过注册到微服务的服务名来访问微服务。
① 开启从注册中心动态创建路由的功能,利用微服务名进行路由
1
2
3
4
5
6
7
8spring:
application:
name: cloud-gateway
cloud:
gateway:
discovery:
locator:
enabled: true #开启从注册中心动态创建路由的功能,利用微服务名进行路由② 将原有的 uri 改为微服务名
注:uri的协议为lb,表示启用Gateway的负载均衡功能。
1
2
3
4
5
6
7
8
9
10
11
12
13
14spring:
application:
name: cloud-gateway
cloud:
gateway:
discovery:
locator:
enabled: true #开启从注册中心动态创建路由的功能,利用微服务名进行路由
routes:
- id: routh1 #路由的ID,没有固定规则但要求唯一,建议配合服务名
# uri: http://localhost:ip #匹配后提供服务的路由地址
uri: lb://微服务名
predicates:
- Path=/payment/get/** #断言,路径相匹配的进行路由
四、断言(Predicate)
按照一定的规则使用断言,均为predicates下的配置。
1 | routes: |
五、过滤器(Filter)
通常用来做全局的日志记录和入口的鉴权。
1.过滤器配置
均为Filters 下的配置,可参考官网文档
1 | spring: |
2. 自定义全局过滤器
只需在类中实现 GlobalFilter,Ordered 接口。例子参照如下:
- filter 方法为过滤器方法。下例表示必须有username 参数。
- getOrder 方法返回值表示过滤器的优先级,数字小在前。正负 2147483647
1 |
|
...
...
本文为作者原创文章,未经作者允许不得转载。