Gateway 新一代网关
- 概述简介
- 三大核心概念
- Gateway工作流程
- 入门配置
- 通过微服务名实现动态路由
- Predicate的使用
- Filter的使用
文章目录
概述简介
是什么
能干吗
- 反向代理
- 鉴权
- 流量监控
- 熔断
- 日志监控
- 。。。。。
微服务架构中网关在哪里
为什么选择Gateway
Gateway 使用 Spring WebFlux 和 Netty:
三大核心概念
-
Route(路由)
路由是构建网关的基本模块,它又ID、目标url、一系列的断言和过滤器组成,如果断言为true则匹配该路由
-
Predicate(断言)
参考的是Java8的 java.util.function.Predicate
开发人员可以匹配Http请求中的所有内容(例如请求头和请求参数),如果请求和断言相匹配则进行路由
-
Filter(过滤)
指的是spring框架中GatewayFilter的实例,使用过滤器,可以在请求被路由前或者之后对请求进行修改
-
总体
Gateway工作流程
官网总结
核心逻辑
- 路由转发 + 执行过滤器链
入门配置
-
新建module cloud-gateway-gateway9527
-
改pom
新加入gateway依赖:
<!--gateway--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency>
-
写配置
-
业务类 无
-
主启动类
加上 @EnableEurekaClient
-
9527网关如何做到路由映射
目前不想暴露8001端口,希望在8001外面套一层9527
-
yml新增网关配置:
#gateway网关配置 spring: cloud: gateway: routes: - id: payment_routh #payment_routh #路由的ID,没有固定规则但要求唯一,建议配合服务名 uri: http://localhost:8001 #匹配后提供服务的路由地址 predicates: - Path=/payment/get/** #断言,路径相匹配的进行路由 - id: payment_routh2 #payment_routh #路由的ID,没有固定规则但要求唯一,建议配合服务名 uri: http://localhost:8001 #匹配后提供服务的路由地址 predicates: - Path=/payment/lb/** #断言,路径相匹配的进行路由
-
测试:
- 启动7001
- 启动8001
- 启动9527网关
-
访问说明
-
添加网关之前:
-
添加网关之后:
-
yml配置说明
gateway网关路由有两种配置方式:
-
在配置文件ynl中配置
-
代码中注入 RouteLocator 的 Bean
官网案例:
业务需求:通过9527网关访问到外网的百度新闻网址
通过微服务名实现动态路由
默认情况下Gateway会根据注册中心注册的服务列表,以注册中心上微服务名为路径创建动态路由进行转发,从而实现动态路由的功能
-
启动:一个eureka7001 + 两个服务提供者8001、8002
-
配置yml:
-
测试
启动9527,访问 http://localhost:9527/pay/lb
多次访问,可以看到:8001、8002两个端口互相切换
Predicate(断言)的使用
是什么
Predicate就是为了实现一组匹配规则,让请求过来找到对应的Route(路由)进行处理
启动 微服务9527:
常用的Route Predicate
After Route Predicate Factory:
表示需要在After后面的时间之后的请求才会正确响应
使用下面的类生成的 当前时间串 来填充上面的 After 后的位置,然后在时间串上进行修改
Cokiee Route Predicate:
表示需要携带cookie访问微服务
测试方法:
- jmeter
- postman
- curl
curl检测:
不带Cookie访问:
携带Cookie访问:
Header Route Predicate:
表示需要携带http请求头进行访问
Filter的使用
Spring Cloud GateWay的Filter
生命周期:
- pre(业务逻辑之前)
- post(业务逻辑之后)
种类:
- GatewayFilter(单一的)(31种)
- GlobalFilter(全局的)(10种)
自定义过滤器
自定义全局过滤器
两个主要接口介绍:implements GlobalFilter,Ordered
作用:
- 全局日志记录
- 统一网关鉴权
- 。。。
案例代码:
@Slf4j
@Component
public class MyLogGatewayFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
log.info("进入全局日志记录 "+new Date());
String name = exchange.getRequest().getQueryParams().getFirst("name");
if (name == null){
log.info("非法用户");
//返回请求不被接受的状态码
exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE);
}
return chain.filter(exchange);
}
@Override
public int getOrder() {
return 0;
}
}
测试:
- 启动 注册中心7001、服务提供者8001,8002、网关9527
- 访问:使用正确地址(携带用户名):http://localhost:9527/pay/lb?name=zl
- 访问通过