1、Gateway 简介
GateWay是什么
Spring Cloud 全家桶中有个很重要的组件:网关。在 1.x 版本中使用的是 Zuul 网关,但是到了 2.x,由于Zuul的升级不断跳票,Spring Cloud 自己研发了一套网关组件:Spring Cloud Gateway。Spring Cloud Gateway基于 Spring Boot 2.x,Spring WebFlux 和 Project Reactor 构建,使用了 Webflux 中的 reactor-netty 响应式编程组件,底层使用了 Netty 通讯框架。
GateWay能做什么
网关在微服务架构中的位置
2、Gateway%20的三大概念
Route(路由):路由是构建网关的基本模块,它由%20ID、目标%20URI、一系列的断言和过滤器组成,如果断言为%20true%20则匹配该路由Predicate(断言):参考的是%20Java8%20中的%20java.util.function.Predicate。开发人员可以匹配%20HTTP%20请求中的所有内容(例如请求头或请求参数),如果请求与断言相匹配则进行路由Filter(过滤):指的是%20Spring%20框架中%20GatewayFilter%20的实例,使用过滤器,可以在请求被路由之前或之后对请求进行修改
3、工作流程
Clients%20make%20requests%20to%20Spring%20Cloud%20Gateway.%20If%20the%20Gateway%20Handler%20Mapping%20determines%20that%20a%20request%20matches%20a%20route,%20it%20is%20sent%20to%20the%20Gateway%20Web%20Handler.%20This%20handler%20runs%20the%20request%20through%20a%20filter%20chain%20that%20is%20specific%20to%20the%20request.%20The%20reason%20the%20filters%20are%20divided%20by%20the%20dotted%20line%20is%20that%20filters%20can%20run%20logic%20both%20before%20and%20after%20the%20proxy%20request%20is%20sent.%20All%20“pre”%20filter%20logic%20is%20executed.%20Then%20the%20proxy%20request%20is%20made.%20After%20the%20proxy%20request%20is%20made,%20the%20“post”%20filter%20logic%20is%20run.
翻译:客户端向%20Spring%20Cloud%20Gateway%20发出请求。如果网关处理程序映射确定请求与路由匹配,则将其发送到网关%20Web%20处理程序。该处理程序通过特定于请求的过滤器链来运行请求。%20筛选器由虚线分隔的原因是,筛选器可以在发送代理请求之前和之后运行逻辑。所有%20“前置“%20过滤器逻辑均被执行,然后发出代理请求,发出代理请求后,将运行“%20后置%20”过滤器逻辑。总结:路由转发%20+%20执行过滤器链
4、两种配置方式
配置文件方式
以访问「百度新闻网」为例,添加如下配置
server:%20%20port:%209527spring:%20%20application:%20%20%20%20name:%20cloud-gateway9527%20%20cloud:%20%20%20%20gateway:%20%20%20%20%20%20routes:%20%20%20%20%20%20%20%20-%20id:%20news%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20#%20路由id%20%20%20%20%20%20%20%20%20%20uri:%20http://news.baidu.com%20%20%20%20#%20真实调用地址%20%20%20%20%20%20%20%20%20%20predicates:%20%20%20%20%20%20%20%20%20%20%20%20-%20Path=/guonei%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20#%20断言,符合规则进行路由
浏览器虽然输入%20localhost:9527/guonei,却会转发到指定的地址
编码方式
新增配置文件
@Configurationpublic%20class%20GatewayConfig%20{%20%20%20%20@Bean%20%20%20%20public%20RouteLocator%20routes(RouteLocatorBuilder%20builder)%20{%20%20%20%20%20%20%20%20return%20builder.routes()%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.route("news2",%20r%20->%20r.path("/guoji").uri("http://news.baidu.com"))%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.build();%20%20%20%20}}
5、动态路由
开启后,默认情况下%20Gateway%20会根据注册中心注册的服务列表,以注册中心上微服务名为路径创建动态路由进行转发,从而实现动态路由的功能
spring:%20%20cloud:%20%20%20%20gateway:%20%20%20%20%20%20discovery:%20%20%20%20%20%20%20%20locator:%20%20%20%20%20%20%20%20%20%20enabled:%20true%20#开启从注册中心动态创建路由的功能,利用微服务名进行路由%20%20%20%20%20%20routes:%20%20%20%20%20%20%20%20-%20id:%20payment_routh1%20%20%20%20%20%20%20%20%20%20#uri:%20http://localhost:8001%20%20%20%20%20#静态,写死了地址,只能调用一个服务%20%20%20%20%20%20%20%20%20%20uri:%20lb://CLOUD-PAYMENT-SERVICE%20#动态,lb://微服务名%20%20%20%20%20%20%20%20%20%20predicates:%20%20%20%20%20%20%20%20%20%20%20%20-%20Path=/payment/get/**%20%20%20%20%20%20%20%20-%20id:%20payment_routh2%20%20%20%20%20%20%20%20%20%20#uri:%20http://localhost:8001%20%20%20%20%20%20%20%20%20%20uri:%20lb://CLOUD-PAYMENT-SERVICE%20%20%20%20%20%20%20%20%20%20predicates:%20%20%20%20%20%20%20%20%20%20%20%20-%20Path=/payment/lb/**
6、Predicate%20的使用
时间相关配置
After:在指定时间之后进行路由Before:在指定时间之前进行路由Between:在指定时间之间进行路由
predicates:%20%20%20%20-%20Path=/payment/lb/**%20%20%20%20#-%20After=2020-04-25T16:30:58.215+08:00[Asia/Shanghai]%20%20%20%20#-%20Before=2020-04-25T16:40:58.215+08:00[Asia/Shanghai]%20%20%20%20-%20Between=2020-04-25T16:35:58.215+08:00[Asia/Shanghai],2020-04-25T16:40:58.215+08:00[Asia/Shanghai]
上述配置的时间格式可以通过以下代码得到
@Testpublic%20void%20test(){%20%20%20%20ZonedDateTime%20now%20=%20ZonedDateTime.now();%20%20%20%20System.out.println(now);}
请求相关配置
Cookie
配置说明:【Cookie=cookie名,%20cookie值的正则表达式规则】
predicates:%20%20-%20Path=/payment/lb/**%20%20-%20Cookie=id,%20[0-9
使用%20curl%20工具模拟携带%20cookie%20发送请求
Header
配置说明:【Header=header名,%20header值的正则表达式规则】
predicates:%20%20-%20Path=/payment/lb/**%20%20-%20Header=h,%20[a-h]
Host
配置说明:【Host=主机名(可配置多个,也可以使用通配符)】
predicates:%20%20-%20Path=/payment/lb/**%20%20-%20Host=**.a.com,**.b.cn
Method
配置说明:【Method=请求类型】
predicates:%20%20-%20Path=/payment/lb/**%20%20-%20Method=GET
Path
配置说明:【Path=请求路径】
predicates:- Path=/payment/lb/**
Query
配置说明:【Query=参数名,参数值】
predicates:- Path=/payment/lb/**- Query=name, zhangsan
7、Filter 的使用
- 生命周期:pre、post
- 种类:
GatewayFilter、GlobalFilter
GatewayFilter 在官方文档有几十种!详细配置可参考 官网,这里主要介绍自定义全局过滤器。
@Component@Slf4jpublic class MyGlobalFilter implements GlobalFilter, Ordered {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {String username = exchange.getRequest().getQueryParams().getFirst("username");//用户名为空时,给出错误响应if (username == null) {log.info("用户名为空,非法登录");exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE);return exchange.getResponse().setComplete();}return chain.filter(exchange);}@Overridepublic int getOrder() {return 0;}}


版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。


详见:官网







评论