当前位置:

gateway笔记TODO

访客 2024-04-23 1119 0

Gateway

有一部分没搞明白,路过的朋友有不错的学习资料,麻烦发一下留给我学习学习

扩展

Reactor

Reactive-Programming响应式编程、反应式编程。ES6通过Promise引入类似的异步编程方式。

spring5加入了响应式编程实现了Reactive、programming

WebFlux

SpringWebFlux是spring5.0引入的响应式框架,区别于SpringMVC(同步阻赛I/O),它不需要依赖ServletAPI,采用异步非阻赛结构,底层基于Reactor来实现响应式流规范。

后续在Servlet3.1支持了异步非阻塞。

SpringWebFlux不是SpringMVC的替代方案SpringWebFlux可以运行在Servlet3.1上,主要还是应用异步非阻塞的业务。(网关就很好的实现)

  • SpringWebFlux默认情况下使用Netty作为服务器
  • SpringWebFlux暂时不支持MySQL,支持Redis、MongoDB、PostgreSQL
  • SpringWebFlux使用的响应式流并不是用JDK9提供的,而是基于Reactor响应式流库
  • SpringWebFlux也可以使用SpringMVC注解,如@Controller,方便在两个Web框架中自由转换
  • SpringWebFlux与SpringMVC都可以使用Tomcat、Jetty、Undertow等Servlet容器(Servlet3.1)
  • SpringMVC因为是使用的同步阻塞式I/O模型,更方便开发人员开发和测试代码;一般来说,如果SpringMVC能够满足的场景,就尽量不要用SpringWebFlux

正文

SpringCloudGateway是基于Spring5.x、SpringBoot2.x、SpringWebFlux、Reactor实现的网关。

Gateway提供了统一的路由方式,基于Filter链提供了,熔断、重试、安全、监控/指标、限流等
官网

网关提供API全托管服务,协议匹配、协议转发、安全策略(WAF)、防刷、流量、监控日志等。网关对外暴露URL或接口信息,统称为路由信息。

  • 路由(route):网关的基础部分,路由信息由一个ID、一个目的URL、一组断言工厂和一组Filter组成;路由断言为真,则URL和配置路由匹配。
  • 断言(predicate):java8中的断言函数,Gateway中的断言函数输入类型是,Spring5.0中的ServerWebExchange断言函数允许开发者去定义匹配来自于HttpRequest中的任何信息,比如请求头和参数等。
  • 过滤器(filter):Gateway中的Filter分两种类,GatewayFilter和GlobalFilter,过滤器会对请求和响应进行修改处理。

  1. Gateway客户端向SpringCloudGateway发起请求
    请求被HttpWebHanderAdapter提取组成网关对上下文,传递给DispatcherHandler
  2. DispatcherHandler(请求分发处理器)吧请求分发到对应的处理器,例如RoutePredicateHandlerMapping
  3. RoutePredicateHandlerMapping(路由断言处理映射器)找到路由后返回对应的FilteringWebHandler
  4. FilteringWebHandler负责组装Filter链表并调用Filter执行一系列的Filter处理,然后把请求转到后端对应的代理服务,服务处理结束后,将Response返回到Gateway客户端
    1. Filter链虚线,是过滤前,响应返回后
    2. Pre类的Filter执行完毕后,才会将请求转发到代理服务器
    3. Post类的Fiter等代理服务器吧请求处理完后才会生效

路由断言

断言可以通过java代码的方式写成配置类,但是这种方法,可读性,维护性比较差。
这里只记录配置文件的实现

spring:cloud:gateway:routes:-id:百度_route#唯一IDuri:lb:http://www.百度.com#lb开启负载均衡,动态寻址predicates:#断言匹配可以有多个符合条件放行-Path=/百度/test/**#Path是断言类型

After请求在UTC时间之后

After路由断言会提取一个UTC时间格式参数,当请求进来的时间在配置时间之后,匹配成功

//生成时间例如前一个小时ZonedDateTime.now().minusHours(1).format(DateTimeFormatter.ISO_ZONED_DATE_TIME);spring:cloud:gateway:routes:-id:after_route#断言工厂uri:http://百度.com#匹配成功访问百度predicates:-After=2022-05-17T21:55:18.14608:00[Asia/Shanghai]

Before请求在UTC时间之前

Before路由断言工厂提取一个UTC时间格式参数,请求访问时间在配置UTC时间之后,匹配成功

spring:cloud:gateway:routes:-id:before_route#断言工厂uri:http://百度.com#匹配成功访问百度predicates:-After=2022-05-17T21:55:18.14608:00[Asia/Shanghai]

Between请求在UTC时间之间

spring:cloud:gateway:routes:-id:between_route#断言工厂uri:http://百度.com#匹配成功访问百度predicates:-After=2022-05-17T21:55:18.14608:00[Asia/Shanghai],After=2022-05-18T21:55:18.14608:00[Asia/Shanghai]#17日-18日

Cookie

根据cookie的keyvalue来匹配

例如Cookiekey=lfvalue=weixiao

spring:cloud:gateway:routes:-id:cookie_route#断言工厂uri:http://百度.com#匹配成功访问百度predicates:-Cookie=lf,weixiao

Header请求头断言

路由工厂根据配置路由header信息进行断言匹配路由,匹配成功转发。

请求头中添加X-Request-Id=Peter

spring:cloud:gateway:routes:-id:header_route#断言工厂uri:http://百度.com#匹配成功访问百度predicates:-Header=X-Request-Id,Peter

Host

访问例如:www.lf.com

spring:cloud:gateway:routes:-id:host_route#断言工厂uri:http://百度.com#匹配成功访问百度predicates:-Host=**.lf.com

Method请求方式

根据请求方式get、post、update等

spring:cloud:gateway:routes:-id:method_route#断言工厂uri:http://百度.com#匹配成功访问百度predicates:-Method=GET

Query请求中参数

例如:localhsot?lf=weixiao

spring:cloud:gateway:routes:-id:query_route#断言工厂uri:http://百度.com#匹配成功访问百度predicates:-Query=lf,weixiao

Path请求路径

/lf/weixiao/**多级匹配

/lf/weixiao/需要以/结尾lf/weixiao会匹配失败

spring:cloud:gateway:routes:-id:path_route#断言工厂uri:http://百度.com#匹配成功访问百度predicates:-Path=/lf/weixiao/**

Weight权重

添加了两个/test路由配置,把两个路由分配到同一个路由分组分组名group其中60%的流量分给V1

spring:cloud:gateway:routes:-id:provider_service-v1#断言工厂uri:http://百度.com#匹配成功访问百度predicates:-Path=/test#路径-Weight=group,60#权重-id:provider_service-v2uri:http://cn.bing.com/predicated:-Path/test-Weight=group,40

RemoteAddrip网段

通过Ipv4或Ipv6来匹配,192.168.0.1/16网段,192.168.0.1ip地址,16是子网掩码,也可以直接配置一个ip

spring:cloud:gateway:routes:-id:remoteaddr_route#断言工厂uri:http://百度.com#匹配成功访问百度predicates:-RemoteAddr=127.0.0.1

内置Filter

SpringCloudGateway中内置很多路由过滤工厂,也可以自定义过滤工厂。路由过滤工厂允许以某种方式来修改HTTP请求,或HTTP响应。主要有七类过滤器Header、Parameter、Path、Status、Redirect跳转、Hytrix熔断、RateLimiter限流

AddRequestHeader匹配的请求添加Header

@ConfigurationpublicclassCommonConfiguration{@BeanpublicRouteLocatorrouteLocator(RouteLocatorBuilderbuilder){returnbuilder.routes().route("add_request_header_route",r->r.path("/addRequestHeader").filters(f->f.addRequestHeader("X-Request-Id","Peter")).uri("http://127.0.0.1:8080/addRequestHeader/")).build();}}

AddRequestParameter匹配请求添加请求参数

@ConfigurationpublicclassCommonConfiguration{@BeanpublicRouteLocatorrouteLocator(RouteLocatorBuilderbuilder){returnbuilder.routes().route("add_request_parameter_route",r->r.path("/addRequestParameter").filters(f->f.addRequestParameter("book","java")).uri("http://127.0.0.1:8080/addRequestParameter/")).build();}}

RewritePath改写请求路径

请求结尾不能是/

访问http://127.0.0.1:9092/foo/cache/sethelp/help.html,路由会转发到http://www.百度.com/cache/sethelp/help.html,这里相当于把foo前缀去掉。

@ConfigurationpublicclassCommonConfiguration{@BeanpublicRouteLocatorrouteLocator(RouteLocatorBuilderbuilder){returnbuilder.routes().route("rewrite_path_route",r->r.path("/foo/**").filters(f->f.rewritePath("/foo/(?<segment>.*)","/$\\{segment}")).uri("http://www.百度.com")).build();}}

AddResponseHeader网关返回的响应添加Header

@ConfigurationpublicclassCommonConfiguration{@BeanpublicRouteLocatorrouteLocator(RouteLocatorBuilderbuilder){returnbuilder.routes().route("add_response_header_route",r->r.path("/addResponseHeader").filters(f->f.addResponseHeader("X-Request-Id","Peter")).uri("http://www.百度.com/")).build();}}

StripPrefix前缀

StripPrefixGatewayFilterFactoryURL前缀去除

PrefixPathGatewayFilterFactoryURL前缀增加

例如:http://localhost:8080/百度/test去除前缀后访问https://www.百度.com去除了前缀/百度/test

spring:cloud:gateway:routes:-id:百度_routeuri:http://www.百度.compredicates:-Path=/百度/test/**filters:-StripPrefix=2

Retry重试

接口需要做幂等(同一个请求多次访问)处理。

config.setRetries(2).setStatus(INTERNAL_SERVER_ERROR)重试2次,调用失败,返回状态码500

@ConfigurationpublicclassCommonConfiguration{@BeanpublicRouteLocatorrouteLocator(RouteLocatorBuilderbuilder){returnbuilder.routes().route("retry_route",r->r.path("/test/retry").filters(f->f.retry(config->config.setRetries(2).setStatuses(HttpStatus.INTERNAL_SERVER_ERROR))).uri("http://127.0.0.1:8080/retry?key=abc&count=2")).build();}}

Hystrix熔断

TODO

GlobalFilters

官网

GateWayFilterFactories是内部定义好的过滤器,一般用的不多

GlobalFilters自定义过滤规则,全局规则(生效所有接口,路由),需要实现GlobalFilter接口、Ordered接口(顺序)

底部

发表评论

  • 评论列表
还没有人评论,快来抢沙发吧~