作者:天蝎丿冷傲丨 | 来源:互联网 | 2023-08-17 17:38
API网关SpringcloudGateway一、概述二、springcloudgateway三、网关搭建四、核心概念1、架构2、内置路由谓词工厂详解3、自定义路由谓词工厂4、内置
API网关SpringcloudGateway 一、概述 二、spring cloud gateway 三、网关搭建 四、核心概念 1、架构 2、内置路由谓词工厂详解 3、自定义路由谓词工厂 4、内置过滤器工厂 5、自定义过滤器工厂 6、全局过滤器 五、整合容错服务 六、监控 七、限流 八、总结
一、概述
服务发现,让内容中心总能找到与用户中心 内容中心整合ribbon,实现负载均衡 使用feign,让HTTP的远程调用更加优雅 使用sentinel,提升应用的可用性以及容错性 使用spring消息编程模型、stream消息编程模型,实现了基于rocketMQ的通信 下图为小程序直接调用微服务:
认证复杂,登录需要验证,若使用此模式,则需要在内容中心、用户中心上做登录认证 导致客户端难以重构,随着项目迭代,可能需要重新划分微服务,若微服务域名什么都变了,则客户端就要做大量的改动 其他微服务使用了某种浏览器不友好协议,直接访问访问不了 使用服务(API)网关:
可以在API网关做统一认证&#xff0c;再将请求进行转发到后端微服务 采用这样的方式&#xff0c;对外暴露的永远是一个域名&#xff0c;不论内部微服务如何拆分&#xff0c;域名都不会变&#xff0c;这样客户端重构成本大大降低 其他微服务为浏览器不友好协议&#xff0c;可以在网关上边转换为有好的协议&#xff0c;如HTTP、websocket 二、spring cloud gateway 是spring cloud的网关&#xff08;第二代&#xff09;&#xff0c;未来取代Zuul&#xff08;第一代&#xff09; 基于Netty、Reactor以及WebFlux构建 ① Netty&#xff1a;网络通信框架&#xff0c;可以实现高性能的服务端以及客户端 ② Reactor&#xff1a;是一个Reactive模型的编程实现 优点&#xff1a; ① 性能强劲&#xff0c;是zuul的1.6倍 性能PK ② 功能强大&#xff0c;内置了很多实用功能&#xff0c;比如转发、监控、限流等 ③ 设计优雅&#xff0c;易扩展 缺点&#xff1a; ① 依赖Netty与Webflux&#xff0c;不是Servlet编程模型&#xff0c;有一定的学习成本 ② 不能在Servlet容器中工作&#xff0c;无法构建war包&#xff08;只能打成jar包&#xff09;&#xff0c;部署到tomcat ③ 不支持spring boog 1.x 三、网关搭建 < ! -- 添加spring gateway 依赖 -- > < dependency> < groupId> org. springframework. cloud< / groupId> < artifactId> spring- cloud- starter- gateway< / artifactId> < / dependency>
server: port: 8040 # 应用程序名称 spring: application: name: gatewaycloud: # 服务发现nacos: discovery: server- addr: localhost: 8848 gateway: discovery: locator: # 让gateway通过服务发现找到其他的微服务enabled: true # actuator management: # 展示详细信息endpoint: health: show- details: always# 暴露所有端点endpoints: web: exposure: include: &#39;*&#39;
以上&#xff0c;已通过spring cloud gateway实现了对微服务的反向代理&#xff0c;并且还能总结转发规律
四、核心概念 route&#xff08;路由&#xff09;&#xff1a;spring cloud gateway 基础元素&#xff0c;可简单理解成一条转发规则。包含如下
id 目标url predicate&#xff08;谓词&#xff09;&#xff1a;即java.util.function.predicate&#xff0c;spring cloud gateway使用predicate实现路由的匹配条件 filter&#xff08;过滤器&#xff09;&#xff1a;修改请求即响应 配置示例&#xff1a;
1、架构
gateway client&#xff1a;不是严格意义上的客户端&#xff0c;泛指外部请求 proxied service&#xff1a;被代理的微服务 gateway mapping&#xff1a;会判断请求的路径是否匹配路由的配置 gateway Handler&#xff1a;如果mapping匹配成功&#xff0c;Handler会读取这个路由上的所有过滤器&#xff0c;然后把请求交给过滤器处理 2、内置路由谓词工厂详解 &#xff08;route predicate factories&#xff09;使用手记
3、自定义路由谓词工厂
写配置
代码示例
&#64;Component public class TimeBetweenRoutePredicateFactory extends AbstractRoutePredicateFactory < TimeBetweenConfig> { public TimeBetweenRoutePredicateFactory ( ) { super ( TimeBetweenConfig. class ) ; } &#64;Override public Predicate< ServerWebExchange> apply ( TimeBetweenConfig config) { LocalTime start &#61; config. getStart ( ) ; LocalTime end &#61; config. getEnd ( ) ; return serverWebExchange - > { LocalTime now &#61; LocalTime. now ( ) ; return now. isAfter ( start) && now. isBefore ( end) ; } ; } &#64;Override public List< String> shortcutFieldOrder ( ) { return Arrays. asList ( "start" , "end" ) ; } } &#64;Data class TimeBetweenConfig { private LocalTime start; private LocalTime end; }
配置不生效问题解决&#xff1a; 对 url:lb://user-center 使用理解错误
错误理解是带user-center都会匹配此规则 正确理解是http://localhost:8040将会被转发到http://user-center 通过nacos自动获取地址 4、内置过滤器工厂 Spring Cloud Gateway-过滤器工厂详解&#xff08;GatewayFilter Factories&#xff09;
5、自定义过滤器工厂 写配置 代码示例 &#64;Slf4j &#64;Component public class PreLogGatewayFilterFactory extends AbstractNameValueGatewayFilterFactory { public PreLogGatewayFilterFactory ( ) { } public GatewayFilter apply ( NameValueConfig config) { GatewayFilter filter &#61; ( ( ( exchange, chain) - > { log. info ( "请求进来了...{}&#61;{}" , config. getName ( ) , config. getValue ( ) ) ; ServerHttpRequest modifiedRequest &#61; exchange. getRequest ( ) . mutate ( ) . build ( ) ; ServerWebExchange modifiedExchange &#61; exchange. mutate ( ) . request ( modifiedRequest) . build ( ) ; return chain. filter ( modifiedExchange) ; } ) ) ; return new OrderedGatewayFilter ( filter, 1000 ) ; } }
6、全局过滤器 Spring Cloud Gateway-全局过滤器&#xff08;Global Filters&#xff09;
过滤器顺序
order越小越靠前执行 局部过滤器的order&#xff0c;会按照配置顺序&#xff0c;按1开始递增 若配置了默认过滤器&#xff0c;会按照配置顺序&#xff0c;按1开始递增&#xff0c;默认过滤器会比局部过滤器优先 如需自行控制order&#xff0c;可返回OrderedGatewayFilter 五、整合容错服务 1、gateway默认整合Hystrix&#xff0c;配置如下
六、监控 Spring Cloud Gateway监控
排错、调试技巧总结
七、限流 Spring Cloud Gateway限流详解
八、总结