首页 > 编程知识 正文

springcloud原理,springcloud网关原理

时间:2023-05-06 13:33:22 阅读:144420 作者:36

网关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

spring: application: name: cloud-gateway cloud: gateway: discovery: locator: enabled: true #开启从注册中心动态创建路由的功能,利用微服务名进行路由 routes: - id: payment_routh #payment_route #路由的ID,没有固定规则但要求唯一,建议配合服务名 #uri: http://localhost:8001 #匹配后提供服务的路由地址 uri: lb://cloud-payment-service #匹配后提供服务的路由地址 predicates: - Path=/payment/get/** # 断言,路径相匹配的进行路由

同时启动8001,8002
eureka注册中心:

请求9527:

6.GateWay常用的Predicate After Rote PredicateBefore Rote PredicateBetween Rote PredicateCookie Rote PredicateHeader Rote PredicateHost Rote PredicateMethod Rote PredicatePath Rote PredicateQuery Rote Predicate

示例:

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/

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。