一、API网关
网关就是所有项目的一个统一入口
api网关作用就是把各个服务对外提供的api汇聚起来,让外接看起来是一个统一的接口,同事也可以在网关中提供额外的功能。
1 网关 = 路由转发 + 过滤器
2 Spring Cloud 中提供的网关解决方案
2.1 Spring Cloud Netflix Zuul
现在为啥会被替换:
- 主要原因是因为,他的跟新替换是有 Netflix所主导的,为了适配 spring cloud 其发版具有延迟性。
- 版本依赖于 Netflix zuul
2.2 Spring Cloud Gateway
- spring 自己退出的网关产品,完全依赖于spring自家产品,版本由spring把控
2.3 Gateway 组成
- route 路由
- Predicate 谓词
- filter
spring: cloud: # 网关配置 gateway: # 打印请求日志(自定义) requestLog: true discovery: # 配置网关发现机制 locator: # 配置处理机制 # 只要请求地址符合规则: http://gatewayIP:gatewayPort/微服务名称/微服务请求地址 # 网关自动映射。把请求转发到 http://微服务名称/微服务请求地址 # 如:有微服务,命名是 ribbon-app-service # 请求地址是: http://localhost:9999/ribbon-app-service/getArgs?name=admin&age=20 # 自动转发到: http://ribbon-app-service/gatArgs?name=admin&age=20 # 商业开发中,enabled一般不设置,使用默认值false。避免不必要的自动转发规则。 lowerCaseServiceId: true # 开启服务名称大小写转化 enabled: true # 开启网关自动映射逻辑 routes: # 配置网关中的一个完整路由,包括命名、地址、谓词集合(规则)、过滤器集合 # 认证中心 - id: first # 路由定义的命名,唯一可用,命名规则符合Java中的变量符命名规则 # lb - 代表loadbalance uri: lb://ribbon-app-server # 当前路由定义对应的微服务转发地址 # 谓词,命名是有套路的,是GatewayPredicate接口实现的命名前缀,XxxRoutePredicateFactory predicates: - Path=/api/** # 定义一个谓词,格式:谓词名称=参数 或者 name:名字 args:参数 filters: # 配置过滤器集合 # 过滤转发地址前缀,过滤1节 # 如:请求地址 - http://localhost:9999/api/*** # 对应的谓词,规则是/api 符合 # 对应的uri是 lb://ribbon-app-server 转换成 http://ribbon-app-server 且包含负载均衡 # 转发地址是: http://ribbon-app-server/api/*** # 过滤器是 过滤转发地址前缀,过滤1节,即删除/api -> http://ribbon-app-server/*** - StripPrefix=1 # 定义一个过滤器。格式:过滤器名字=参数 或者 name:名字 args:参数
过滤器 Filter
内置filter 都是GatewayFilter 实现类
自定义filter
- 实现 GlobalFilter 下的 filter接口
public
Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {}
ServerHttpRequest newRequest = exchange .getRequest() .mutate() // 为请求追加 Id-Token 参数 .header(SaIdUtil.ID_TOKEN, SaIdUtil.getToken()) .build(); ServerWebExchange newExchange = exchange.mutate().request(newRequest).build();
- 最后要
return chain.filter(newRequres);
- 他会下去接着去找其他的过滤