网关1 .背景说明: SpringCloud Gateway是一个新的SpringCloud项目,是基于Spring5.0 Spring Boot 2.0和项目reactor等技术开发的网关SpringCloud网关作为SpringCloud生态系统中的网关,以Zuul的替代为目标。 Spring Cloud 2.0和更高版本没有集成Zuul2.0和更高版本的最高性能版本,仍然需要很长时间才能使用Zuul1.x非Reactor模式的早期版本。 为了提高网关的性能,SpringCloud Gateway是基于WebFlux框架实现的,但在WebFlux框架的基础上使用了高性能的Reactor模式通信框架Netty。 一句话概括地说,spring云网关使用WebFlux的Reactor-Netty响应表达式,spring云网关的目标提供了统一的路由方式,以及安全性、监控和指标2. Zuul与网关的区别1、Zuul 1.x基于阻止I/O的API网关2,Zuul 1.x基于servlet 2.5使用块体系结构,WebSocket等长Zul的设计模式与Nginx相似,每次I请求线程都在工作线程完成之前被阻止,但差异在Nginx到c中实现,Zuul在java中实现。 JVM本身可能第一次加载很慢。 是的,Zuul的性能相对较差3、Zuul2.x理念更先进,基于Netty非数据块和迄今为止的长连接,但SpringCloud目前尚未集成。 zul2.2性能方面,根据官方提供的基准,SpringCloud Gateway的RPS (每秒请求数)是Zuul的1.6倍4,SpringCloud Gateway是spring framement 用Spring Boot2.x构建3. Gateway概念1. Route )路由是构建网关的基本模块,由ID、目标URL、一系列断言和过滤器注册。 如果断言为true,则与此路由2. Predicate匹配。 断言引用的是JAVA8的函数编程,开发人员在可以与HTTP请求匹配的请求与断言匹配的情况下,进行路由的3. Filter (过滤器)在Spring框架内的HTTP 4 .工作流核心逻辑:路由转发执行过滤器链5 .总结: web请求通过一些匹配条件被定位到真正的服务节点,在这个转发过程前后进行一些精细化控制。 predicate是我们的匹配条件,但过滤器可以理解为无能为力的拦截器。 除了这两个元素之外,还有目标uri。 具体路由可实现4 .实操网关4.1配置文件方式spring : application : name :云网关云3360网关:路由3360-id : 建议根据服务名uri:http://localhost33608001#提供服务的路由地址predicates :-path=/payment/get/* *
网关9527端口请求
4.2网关代码配置@ configurationpublicclassgatewayconfig { @ beanpublicroutelocatorcustomroutelocator (路由布局构建模块构建器) 外网转到百度新闻国内routes.route(path_route_guonei )、r-r.path )/guonei ) http://news.baidu.com/guonei ) r-r.path )/guoji ).uri ) )转发到http://news.baidu.com/guoji的return routes.build (; }效果:
可以看到,地址为http://localhost:9527/guonei,确跳到了百度新闻国内板块 5.动态路由以上的配置文件配置,可以看出地址,端口写死了,这种方式在多服务的集群部署方式中并不可取,所以需要配置动态配置,并实现负载均衡
修改yml开启动态路由: 增加discovery.locator.enabled: true
同时启动8001,8002
eureka注册中心:
请求9527:
示例:
After Rote Predicate 如下配置,在predicates:下加入After 设置某个时间,当时间未到时,访问接口返回404,时间到了之后,可正常访问- id: payment_routh2 #payment_route #路由的ID,没有固定规则但要求唯一,建议配合服务名 #uri: http://localhost:8001 #匹配后提供服务的路由地址 uri: lb://cloud-payment-service #匹配后提供服务的路由地址 predicates: - Path=/payment/payment-getPaymentLb/** # 断言,路径相匹配的进行路由 - After=2021-07-21T15:51:37.485+08:00[Asia/Shanghai]After效果:
用途:此设置可结合服务降级等方案,设计例如秒杀活动接口路径,未到时间不可访问,秒杀开始后方可访问秒杀详情页面。
predicate总结:Predicate就是为了实现一组匹配规则,让请求过来找到对应的Route进行处理
7.GateWay的Filter过滤器简单案例,实现用户访问日志:
7.1 Filter过滤器类实现GlobalFilter, Ordered 7.2 代码 @Component@Slf4jpublic class MyLogGateWayFilter implements GlobalFilter, Ordered { @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { log.info("************** come in MyLogGateWayFilter : " + DateUtil.date()); String username = exchange.getRequest().getQueryParams().getFirst("username"); if (StringUtils.isEmpty(username)) { log.error("***********用户非法,禁止访问!o(╥﹏╥)o"); exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE); return exchange.getResponse().setComplete(); } log.info("当前用户:" + username); return chain.filter(exchange); } @Override public int getOrder() { return 0; }} 7.3 实现效果:不带username访问接口
带username访问时:访问成功,打印日志
以上:SpringCloud GateWay整理完毕。
本文根据尚硅谷阳哥springCloud视频整理,视频地址:https://www.bilibili.com/video/BV18E411x7eT
个人学习代码仓库地址:https://gitee.com/javaeelhb/cloud2021/tree/haibo.li/