1、hystrix 服务熔断器 监控服务组件
a.当满足一定的阈值的时候(默认 10 秒内超过 20 个请求次数)
b.当失败率达到一定的时候(默认 10 秒内超过 50%的请求失败)
注意:一旦断路器开启之后所有到这个服务的请求均不可用,只有在断路关闭之后才可用
2、Hystrix 监控流程 触发熔断器机制流程
整个流程:当 Hystrix 监控到对该服务接口调用触发 1 2 两个阈值是,会在系统中自动触发熔断 器,在熔断器打开期间内,任何到该接口的请求均不可用,同时在断路器打开 5s 后断 路器会处于半开状态,此时断路器允许放行一个请求到该服务接口,如果该请求执行 成功,断路器彻底关闭,如果该请求执行失败断路器重新打开。
3、在实战过程中断路器使用
a.为每一个调用接口提供自定义备选处理
@HystrixCommand(fallbackMethod = "demoFallBack") 熔断之后的处理 书写快速失败的方法名
b.使用 Hystrix 提供默认备选处理
@HystrixCommand(fallbackMethod = "方法名",defaultFallback = "默认处理方法名")
openfeign调用服务过程集成 Hystrix 实现默认备选处理
1.引入 Hystrix 依赖
注意:openfeign 组件底层自动依赖 Hystrix 依赖项目中无须显示引入
2.开启 openfegin 对 Hystrix 支持
# 开启 openfeign 在调用服务过程中 开启hystrix 支持 默认:就是没有开启
feign hystrix enabled=true
3.开发 openfeign 服务调用失败默认处理的实现类
4、在 OpenFeign 的客户端接口中的@FeignClients(value="服务 id",fallBack=默认处理.class)
5、当前调用服务不可用时,直接会执行自定义默认处理
Hystrix DashBord(仪表盘)
1、Hystrix DashBoard
仪表盘:用来显示状态信息
作用:监控每一个@HystrixCommond 注解创建一组度量,构建一组信息,然后通过图形化 方式展示当前方法@HystrixCommond 的状态信息
2、构建 Hystrix DashBoard 仅仅是一个仪表盘应用
a.创建 springboot 应用
b.引入 hystrixdashboard 依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId> </dependency>
c.在入口类加入注解 开启仪表盘应用
@EnableDiscoveryClient // 注意:默认只要引入 discovery client 依赖,该注解无须显示声明 自动注册 consul zk nacos 都是如此
@SpringBootApplication
@EnableHystrixDashboard // 注意:这个注解作用用来开启当前应用为仪表盘应用
public class HystrixDashBoardApplication {
public static void main(String[] args) {
SpringApplication.run(HystrixDashBoardApplication.class,args);
}
}
d.访问仪表盘 web 界面
http://localhost:当前应用端口号/hystrix
1、第一个问题解决 直接引入配置 (加入要监控的微服务里边)
@Configuration
public class BeansConfig {
// 入口类中加入配置
@Bean
public ServletRegistrationBean getServlet(){
HystrixMetricsStreamServlet streamServlet = new HystrixMetricsStreamServlet();
ServletRegistrationBean registrationBean = new ServletRegistrationBean(streamServlet);
registrationBean.setLoadOnStartup(1);
registrationBean.addUrlMappings("/hystrix.stream");
registrationBean.setName("HystrixMetricsStreamServlet");
return registrationBean;
}
}
2、第二个问题 改 jar 包文件
jar包路径:/Users/zhang/devTools/apache-maven-3.8.4/maven-repo/org/springframework/cloud/spring-cloud-netflix-hystrix-dashboard/2.2.3.RELEASE
文件名称:monitor.ftlh 里边的两个 $(window).load(function() 要改成 $(window).on("load",function()
http://localhost/hystrix.stream
监控hystrix 断路器状态信息
Hystrix & Hystrix DashBoard
1、目前状态
a.Hystrix 不再处于积极开发中,目前处于维护模式
b.Hystrix DashBoard 已经被废弃
The hystrix-dashboard component of this project has been deprecated and moved to 替换产品: Netflix-Skunkworks/hystrix-dashboard
2、日后如何解决服务雪崩
a.Hystrix(版本 1.5.18)足够稳定,可以满足 Netflix 对我们现有的应用程序需求
b.resilience4j 替换 Hystrix 实时自适应系统熔断 Springcloud resilience4j
c.sentinel 流量卫兵 流量控制 降低策略(根据异常) 推荐 Sentinel & sentinel dashboard
组件快速回顾
1.微服务
定义:单体应用基于项目业务进行拆分,拆分出一个个微小服务,每一个服务都是一个独立 的应用,独立开发 独立部署 独立运行在自己的计算机进程里面,针对于这些服务都是分布式管理
2.springcloud 工具集
a. 服务注册中心 netflix Eureka Go Consul java zk nacos
作用:1. 管理所有的服务健康状态 2. 存储所有微服务元数据信息
b. 服务间通信问题
手段: http 协议:使用 rest 方式通信 效率低 解耦合 推荐
RPC 技术:使用传输层协议通信 效率高 Dubbo 框架 同一种语言通信 使用 rest 方式通信:
1.RestTemplate + Ribbon(netflix 负载均衡客户端组件)
2.OpenFeign(spring -----> Feign(netflix)) 伪Http 客户端组件 调用存在负载均衡 支持 springmvc 注解
c. 服务雪崩(某一个服务不可用,并将不可用逐渐放大导致整个系统服务不可用服务雪崩)
1.Hystrix --- 服务熔断
2.Hystrix DashBoard Hystrix 仪表盘 用来显示 Hystrix 断路器状态信息
GateWay 网关 组件
1、什么是网关 Getway(Service Gateway)服务网关
网关统一服务入口,可方便实现对平台众多服务接口进行管控
2、网关作用
a.网关统一所有微服务入口
b.网关可以实现请求路由转发(router dispatcher)以及请求过程负载均衡
c. 访问服务的身份认证、防报文重放与防数据篡改、功能调用的业务鉴权、响应数据的脱敏、流量与并发控制,甚至基于 API 调用的计量或者计费等等
3、springcloud 提供网关组件
1.netflix zuul . x(效率) zuul2.x(近两年)
2.spring cloud gateway 组件(WebFlux 异步非阻塞 IO 模型)推荐
特性:1.基于 springboot2.x 和 spring webFLux 和 Reactor 构建 响应式异步非阻塞 IO模型;2.动态路由;3.请求过滤。
4、springcloud gateway
gateway:动态路由 服务统一管理 请求过滤
gatway = 路由转发(router)+请求过滤(filter)
5、Gateway 网关使用
a.开发独立 springboot 应用
b.引用网关依赖 注意:需要去除 项目中的 spring-boot-starter-boot-webyilai
c.配置编写
server:
port: 7979
spring:
application:
name: GATEWAY
cloud:
consul:
host: localhost
port: 8500
gateway:
routes:
- id: category_router # 路由对象唯一标识
uri: http://localhost:8787 # 用来类别服务地址
predicates: # 断言 用来配置路由规则
- Path=/category
- id: product_router # 路由对象唯一标识
uri: http://localhost:8788 # 用来类别服务地址
predicates: # 断言 用来配置路由规则
- Path=/list
网关配置细节
1、网关 gateway 组件(spring)netfilx zuul1.x=====>zuul2.x
gateway 使用 webflux 底层使用异步非阻塞 IO 模型
2、网关在微服务架构作用
a.统一所有微服务总入口
b.实现请求负载均衡
c.过滤处理(鉴权 日志 流量统计 数据防篡改)
总结:网关 gatway = 路由 router + filter(过滤)
3、网关第一配置
a.配置文件方式配置网关 推荐 完全展开方式
b.java代码方式配置网关 了解 注意:java 配置优先于配置文件
网关路由解析规则
1、访问网关路径
2、Path 规则可以写一个,写多个,支持通配符
网关在路由转发时如何实现请求负载均衡
1、现有的网关配置存在问题?
问题:现有网关配置方式在 uri 的属性中路径直接写死为服务的某一个节点,这样没有办法实现请求的负载均衡
2、如何配置网关转发实现负载均衡
网关细节 断言 和 过滤
1、断言 Predicate 过滤 Filter
2、网关 gateway
网关 gateway - 断言 predicate + 过滤(后置 filter)
断言:当请求到达网关时,网关前置处理 满足断言放行请求 不满足断言立即返回
过滤:当请求满足断言的所有条件之后,会向后端服务转发之前会经过一些过滤
3、网关断言使用 Route Predicate Factories
a. - Path=/category 路径断言
b. - After=2017-01-20T17:42:47.789-07:00[America/Denver] 代表该路由必须在指定时间之后才能生效
c. - Before=2022-07-20T17:37:14.777+08:00[Asia/Shanghai] 代表该路由必须在指定时间之前才能生效,过了时间失效。
d. - BetWeen=2022-07-20T17:37:14.777+08:00[Asia/Shanghai, 2022-07-20T17:37:14.777+08:00[Asia/Shanghai] 代表路由规则在某个时间段有效
e. - Cookies=name, chenyn 携带指定 cookie 请求才能访问 注意:必须配合 curl 工具使用
- Cookies=name,[A-Za-z0-9]+ 大 A到大 Z,小 a 到小 z,0 到 9 之间的都可以访问,+代表多个
f. - Header=X-Request-Id, \d+ 请求头必须含有指定请求头才行 后边是任意字符d 代表数字
g. - Method=GET,POST # 限定指定的请求方式可用
4、网关过滤使用 GatewayFilter Factories
gateway filter 过滤
1、内置 filter
a. - AddRequestHeader=User-Name,chenyn 用来给路由对象的所有请求加入指定请求头信息
b. - AddRequestParameter=color, blue 用来给路由对象的所有请求加入指定请求参数
c. - AddResponseHeader=X-Response-Red, Blue 用来给路由对象的所有转发请求的响应加入指定头信息
d. - PrefixPath=/mypath 用来给路由对象的所有转发请求的url加入指定前缀信息
如:浏览器访问网关地址 /list 前缀路径、mypath 转发到后端服务地址为:uri+前缀路径+地址栏路径 ----> uri+/mypath/list
e. StringPrefix Filter - StripPrefix=2 用来给路由对象的所有转发请求的 浏览器url 去掉指定的 2 个前缀
如:浏览器访问网关地址:/product/list StripPrefix=1 ====> /list 后端接口:list
2、自定义全局 filter 所有的请求都必须经过全局 filter 之后在转发到后端服务
3、通过网关提供 web 路径查看路由详细规则
a. http://localhost:7979/actuator/gatway/routes
b. 查看网关路由规则详细路径必须在网关配置文件中暴露当前路径
config 组件 (配置)统一配置中心
1、config 组件 统一配置中心
作用:用来实现微服务系统中服务配置统一管理组件 netflix config ====> spring config
组件:统一配置中心服务端(集中管理配置文件)、统一配置中心客户端 client
2、config 组件使用 config client ---------> config server --------> 远端 git 仓库
a.选择一个远端 git 仓库
1.使用 github、gitee、gitlab,其中之一
2.创建新仓库
3.获取仓库地址 https://github.com/Lovely-Zhang/configs.git
b.搭建 config server 统一配置中心服务
1. 独立的 springboot 应用
2. 引入依赖 springcloud-config-server
<!-- springcloud-config-server -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
3、配置 application properties 远程仓库地址
4、开启统一配置中心 在入口类加入注解
@SpringBootApplication
@EnableDiscoveryClient
@EnableConfigServer //代表我是一个统一配置中心服务
public class ConfigServerApplication{......}
config client 配置客户端组件
1、config client 微服务
2、创建一个独立 springboot 应用
3、将自身配置交给远端 git 仓库管理
4、引用 config client 相关依赖
<!-- 引入config client相关依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
5、配置文件的编写 告诉 config server 地址
6、启动 configclient
config client 手动配置刷新
1、手动配置刷新
当远端 git 仓库中配置发生变化时,不需要重启微服务就可以直接读取远端修改之后配置信息,这种就叫手动配置刷新
2、当前项目支持手动配置刷新
3、修改完远端 git 仓库配置文件之后,向每一个微服务发送一个 post 请求
必须 post 方式 curl -x POST http://localhost:8990/actuator/refresh
4、必须在微服务配置文件中暴露远端刷新端点(endpoint)
management.endpoints.web.exposure.include=*
问题:每一个微服务节点如果要加载最新配置信息,必须向每一个服务手动发送 post 方式请求,才能加载最新配置
springcloud bus组件
1、简介 Bus(消息总线)
Spring Cloud Bus links nodes of a distributed systems with a lightweight message broker.
直接翻译:springcloud 消息总线链接所有节点(微服务用户服务 商品服务)在一个分布式系统中使用轻量级消息中间件
翻译:springcloud bus 利用轻量级消息中间件将分布式系统中所有服务连接到一起
SpringCloud 总结
1、微服务
定义:micro service 微服务是一种服务架构
特点:基于单体应用基于业务进行拆分,拆分出来每一个服务独立项目 独立运行独立部署 运行在自己计算机进程里面,针对于拆分 拆分出来微服务都是基于分布式管理
2、为什么选择微服务
优势:
1.拆分每个服务各司其职 解耦合
2.每个服务高度自治(管理团队 c)
3.不会因为一个问题导致其他服务不可用
4.新员工面对单一服务,不会面对整体应用代码的复杂度,上手程度相对比较快
5.方便在项目增加新的业务功能
缺点:
1.开发人员面对微服务部署复杂性
2.开发人员面对分布式系统复杂性(服务间通信 请求负载均衡....高可用)
3、springcloud 微服务工具集
作用:提供了一站式微服务工具,帮助我们解决了分布式系统中的各种问题(服务注册,服务通信,服务熔断,网关,配置中心)让开发人员更专注自己的业务开发
4、spring cloud 工具集核心组件
a. 服务注册中心:用来管理微服务架构中每一个服务健康状态以及服务元数据存储
1.Eureka(EurekaServer EurekaClient)2.Netflix Consul(go)3.zookeeper(Java)4.Nacos(alibaba)
b. 服务间通信问题:RestTemplate 如何解决请求负载均衡问题
两种手段:Http rest 推荐、RPC:Dubbo
两种通信方式:
1.RestTemplate 如何解决请求负载均衡问题 Ribbon(NetFlix)实现请求负载均衡
2. OpenFeignc(springcloud)====>Feign(netflix) 伪http 客户端 实现请求负载均衡,解决 restTemplate 路径写死,灵活 推荐
c.服务熔断器: 用来解决服务雪崩 Hystrix(netflix)豪猪&Hystrix DashBoard 状态:进入维护模式
服务雪崩问题:调用链路中的某一个服务不可用,并导致上有服务不可用,并将这种不可用逐渐放大最终导致整个系统服务不可用这种称之为服务雪崩
服务熔断:当服务触发异常,或者执行业务逻辑超时等待触发服务熔断,一旦触发服务熔断后,当前服务不可用
服务降级:站在系统整体负荷角度进行考虑 一般都是人为干预 服务熔断属于服务降级的一种
d. 服务网关组件:用来统一服务总入口(路由转发+过滤) Zuul1.x zuul2.x------>SpringCloud Gateway(路由转发 请求负载均衡) 断言 predicate 过滤 filters
e. 统一配置中心:用来将微服务的配置文件进行远端仓库统一管理
config 组件(ConfigServer(用来获取远端仓库配置,并存入本地仓库)、Configclient(根据 configserver 读取自身配置))
bus 组件:消息总线 作用:用来通过 MQ 将微服务的所有节点连接到一起 通过消息总线实现自动配置