65-82-springcloud-gateway-config-bus:
Gateway
gateway官网:https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.1.RELEASE/reference/html/
1、什么是gateway
Gateway是在Spring生态系统之上构建的API网关服务,基于Spring 5,Spring Boot 2和Project Reactor等技术。
Gateway旨在提供一种简单而有效的方式来对API进行路由,以及提供一些强大的过滤器功能,例如:熔断、限流、重试等。
SpringCloud Gateway旨在为微服务架构提供—种简单有效的统一的API路由管理方式。
目标:提供统一的路由方式且基于 Filter链的方式提供了网关基本的功能,例如:安全,监控/指标,和限流。
作用:方向代理,鉴权,流量控制,熔断,日志监控
微服务架构中网关的位置
2、GateWay非阻塞异步模型
因为netflix的zuul2.0一直不发布,并且Gateway是基于异步非阻塞模型上进行开发的,性能更好。
SpringCloud Gateway具有如下特性
1、基于Spring Framework 5,Project Reactor和Spring Boot 2.0进行构建;
2、动态路由:能够匹配任何请求属性;
3、可以对路由指定Predicate (断言)和Filter(过滤器);
4、集成Hystrix的断路器功能;
5、集成Spring Cloud 服务发现功能;
6、易于编写的Predicate (断言)和Filter (过滤器);
7、请求限流功能;
8、支持路径重写。
Gateway模型
其实就是异步非阻塞
WebFlux: https://docs.spring.io/spring-framework/docs/current/reference/html/web-reactive.html#spring-webflux
传统的Web框架,比如说: Struts2,SpringMVC等都是基于Servlet APl与Servlet容器基础之上运行的。
但是在Servlet3.1之后有了异步非阻塞的支持。而WebFlux是一个典型非阻塞异步的框架,它的核心是基于Reactor的相关API实现的。相对于传统的web框架来说,它可以运行在诸如Netty,Undertow及支持Servlet3.1的容器上。非阻塞式+函数式编程(Spring 5必须让你使用Java 8)。
Spring WebFlux是Spring 5.0 引入的新的响应式框架,区别于Spring MVC,它不需要依赖Servlet APl,它是完全异步非阻塞的,并且基于Reactor来实现响应式流规范。
3、Gateway工作流程三大核心概念
三大核心概念:
Route(路由) :路由是构建网关的基本模块,它由ID,目标URI,一系列的断言和过滤器组成,如断言为true则匹配该路由;
Predicate(断言) :参考的是Java8的java.util.function.Predicate,开发人员可以匹配HTTP请求中的所有内容(例如请求头或请求参数),如果请求与断言相匹配则进行路由;
Filter(过滤) :指的是Spring框架中GatewayFilter的实例,使用过滤器,可以在请求被路由前或者之后对请求进行修改。
web请求,通过一些匹配条件,定位到真正的服务节点。并在这个转发过程的前后,进行一些精细化控制。比如url
predicate就是我们的匹配条件,例如path路由匹配,after,between等;
fliter,就可以理解为一个无所不能的拦截器。有了这两个元素,再加上目标uri,就可以实现一个具体的路由了
gateway工作流程
https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.1.RELEASE/reference/html/#gateway-how-it-works
客户端向Spring Cloud Gateway发出请求。然后在Gateway Handler Mapping 中找到与请求相匹配的路由,将其发送到GatewayWeb Handler。
Handler再通过指定的过滤器链来将请求发送到我们实际的服务执行业务逻辑,然后返回。
过滤器之间用虚线分开是因为过滤器可能会在发送代理请求之前(“pre”)或之后(“post")执行业务逻辑。
Filter在“pre”类型的过滤器可以做参数校验、权限校验、流量监控、日志输出、协议转换等,在“post”类型的过滤器中可以做响应内容、响应头的修改,日志的输出,流量监控等有着非常重要的作用。
核心逻辑:路由转发 + 执行过滤器链。
cloud-gateway-gateway9527
4、GateWay常用的Predicate
https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.1.RELEASE/reference/html/#gateway-request-predicates-factories
Spring Cloud Gateway将路由匹配作为Spring WebFlux HandlerMapping基础架构的一部分。
Spring Cloud Gateway包括许多内置的Route Predicate工厂。所有这些Predicate都与HTTP请求的不同属性匹配。多个RoutePredicate工厂可以进行组合。
Spring Cloud Gateway创建Route对象时,使用RoutePredicateFactory 创建 Predicate对象,Predicate 对象可以赋值给Route。Spring Cloud Gateway包含许多内置的Route Predicate Factories。
所有这些谓词都匹配HTTP请求的不同属性。多种谓词工厂可以组合,并通过逻辑and。
常用的Route Predicate Factory
The After Route Predicate Factory
The Before Route Predicate Factory
The Between Route Predicate Factory
The Cookie Route Predicate Factory
The Header Route Predicate Factory
The Host Route Predicate Factory
The Method Route Predicate Factory
The Path Route Predicate Factory
The Query Route Predicate Factory
The RemoteAddr Route Predicate Factory
The weight Route Predicate Factory
5、GateWay的Filter
https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.1.RELEASE/reference/html/#gatewayfilter-factories
路由过滤器可用于修改进入的HTTP请求和返回的HTTP响应,路由过滤器只能指定路由进行使用。Spring Cloud Gateway内置了多种路由过滤器,他们都由GatewayFilter的工厂类来产生。
Spring Cloud Gateway的Filter:
GatewayFilter - 有31种
GlobalFilter - 有10种
常用的GatewayFilter:AddRequestParameter GatewayFilter
自定义全局GlobalFilter,两个主要接口介绍:
GlobalFilter和Ordered
能干什么:
- 全局日志记录
- 统一网关鉴权
- …
config
官网:https://cloud.spring.io/spring-cloud-static/spring-cloud-config/2.2.1.RELEASE/reference/html/
cloud-config-center-3344 cloud-config-center-3355 cloud-config-center-3366
1、什么是config
分布式系统面临的配置问题,微服务要将单体应用中的业务拆分成一个个子服务,每个服务的粒度相对较小,因此系统中会出现大量的服务。由于每个服务都需要必要的配置信息才能运行,所以一套集中式的、动态的配置管理设施是必不可少的。SpringCloud提供了ConfigServer来解决这个问题,否则每个微服务都有一个application.yml,难以管理
SpringCloud Config为微服务架构中的微服务提供集中化的外部配置支持,配置服务器为各个不同微服务应用的所有环境提供了一个中心化的外部配置。
SpringCloud Config分为服务端和客户端两部分。
服务端也称为分布式配置中心,它是一个独立的微服务应用,用来连接配置服务器并为客户端提供获取配置信息,加密/解密信息等访问接口。
客户端则是通过指定的配置中心来管理应用资源,以及与业务相关的配置内容,并在启动的时候从配置中心获取和加载配置信息配置服务器默认采用git来存储配置信息,这样就有助于对环境配置进行版本管理,并且可以通过git客户端工具来方便的管理和访问配置内容。
springcloud config 能干嘛
1、集中管理配置文件
2、不同环境不同配置,动态化的配置更新,分环境部署比如dev/test/prod/beta/release
3、运行期间动态调整配置,不再需要在每个服务部署的机器上编写配置文件,服务会向配置中心统一拉取配置自己的信息
4、当配置发生变动时,服务不需要重启即可感知到配置的变化并应用新的配置
5、将配置信息以REST接口的形式暴露 - post/crul访问刷新即可…
参考:https://www.bilibili.com/video/BV18E411x7eT?p=76
2、配置读取规则
- /{name}-{profiles}.yml
- /{label}-{name}-{profiles}.yml
- label:分支(branch)
- name:服务名
- profiles:环境(dev/test/prod)
https://cloud.spring.io/spring-cloud-static/spring-cloud-config/2.2.1.RELEASE/reference/html/#_quick_start
1、/{label}/{application}-{profile}.yml(推荐)
- http://config-3344.com:3344/master/config-dev.yml
2、/{application}-{profile}.yml
- http://config-3344.com:3344/config-dev.yml
3、/{application}/{profile}[/{label}]
- http://config-3344.com:3344/config/dev/master
Bus
1、什么是bus
Spring Cloud Bus 配合Spring Cloud Config 使用可以实现配置的动态刷新。用来将分布式系统的节点与轻量级消息系统链接起来的框架,它整合了Java的事件处理机制和消息中间件的功能。Spring Clud Bus目前支持RabbitMQ和Kafka。
Spring Cloud Bus能管理和传播分布式系统间的消息,就像一个分布式执行器,可用于广播状态更改、事件推送等,也可以当作微服务间的通信通道。
2、为何被称为总线
即:所有人都听总部的命令,总部发生什么变化,监听的服务都会知道,被动接收到通知。
总线:在微服务架构的系统中,通常会使用轻量级的消息代理来构建一个共用的消息主题,并让系统中所有微服务实例都连接上来。由于该主题中产生的消息会被所有实例监听和消费,所以称它为消息总线。在总线上的各个实例,都可以方便地广播一些需要让其他连接在该主题上的实例都知道的消息。
基本原理
ConfigClient实例都监听MQ中同一个topic(默认是Spring Cloud Bus)。当一个服务刷新数据的时候,它会把这个信息放入到Topic中,这样其它监听同一Topic的服务就能得到通知,然后去更新自身的配置。
设计思想
1.利用消息总线触发一个客户端/bus/refresh,而刷新所有客户端的配置(不够好,客户端应当单一。只做客户端的事情。通知其他客户端由服务端处理更加合适)
2.利用消息总线触发一个服务端ConfigServer的/bus/refresh端点,而刷新所有客户端的配置
图—不适合的原因有:
1、打破了微服务的职责单一性,因为微服务本身是业务模块,它本不应该承担配置刷新的职责。
2、破坏了微服务各节点的对等性。
3、有一定的局限性。例如,微服务在迁移时,它的网络地址常常会发生变化,此时如果想要做到自动刷新,那就会增加更多的修改。
测试
启动
EurekaMain7001
ConfigcenterMain3344
ConfigclientMain3355
ConfigclicntMain3366
运维工程师
修改Github上配置文件内容,增加版本号
发送POST请求
curl -X POST “http://localhost:3344/actuator/bus-refresh”
—次发送,处处生效
配置中心
http://config-3344.com:3344/config-dev.yml
客户端
http://localhost:3355/configlnfo
http://localhost:3366/configInfo
获取配置信息,发现都已经刷新了
3、通知总结图
学习路径:https://space.bilibili.com/302417610/,如有侵权,请联系q进行删除:3623472230