Spring Cloud微服务架构学习-4
Posted 等闲'
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring Cloud微服务架构学习-4相关的知识,希望对你有一定的参考价值。
文章目录
一、Hystrix简介
熔断机制
是解决微服务架构中因等待出现故障的依赖方响应而形成任务挤压,最终导致自身服务瘫痪的一种机制,它的功能类似电路的保险丝,其目的是为了阻断故障
,从而保护系统稳定性。Hystrix
作为Spring Cloud中实现了熔断机制的组件,具有服务容错保护功能
。
1、什么是Hystrix
概述:Hystrix是Netflix开源的一款针对分布式系统延迟和容错的库
。
作用:通过添加延迟容忍和容错逻辑,从而控制分布式服务之间的交互
。
2、为什么用Hystrix
对于一个复杂的分布式系统,包含的应用可能多达数十个,这些应用有许多依赖项目,每个依赖项目在某个时刻不可避免会失败导致故障,如果不对这些故障进行隔离,整个分布式系统都可能会崩溃。
为什么不隔离就会使系统奔溃呢?Hystrix是怎么解决的呢?
当分布式系统中其中有一个系统有延迟时,它可能阻塞整个用户请求。
分布式系统中服务高流量下请求情况
在高流量情况
下,一个后端的依赖延迟可能会导致所有服务的资源在数秒内变的饱和,这也就意味着,后续如果再有请求将无法提供服务,应用会出现故障。比故障更糟糕的是,这些应用程序还可能导致服务之间的延迟增加,从而备份队列、线程和其他资源,从而导致整个系统出现更多级联故障
.如图:
分布式系统中Hystrix解决服务请求堵塞情况
Hystrix
的出现就是为了解决上述问题的,它封装了每个依赖项,每个依赖项彼此隔离,当延迟发生时,它会被限制在资源中,并包含回退逻辑
,该逻辑决定在依赖发生任何类型故障时应作出何种响应。
二、Hystrix快速入门
基本流程:1.创建eureka-server项目
2. 创建hystrix-client项目
3. 改造provider项目
4. 项目测试
这里使用之前创建的eureka-server和eureka-provider模块等等
0.改造lesson02-eureka-provider和lesson02-eureka-provider-another的Controller
①增加一个http访问接口,该接口能够接收请求参数。
1.在父级目录下创建一个新的模块lesson05-hystrix-client
2.添加pom依赖
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
<version>2.2.9.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
3.填写配置信息
4.创建主包HystrixClient和启动类HystrixClientApplication(注意层级关系)
①添加@EnableHystrix注解启动熔断功能
5.创建Config包和HystrixClientConfig类(注意层级关系)
-
创建Service包和HystrixClientService类(注意层级关系)
①被@HystrixCommand
注解修饰的stu()方法就启动了Hystrix熔断器
的功能fallbackMethod
属性定义的是处理回退(fallback)逻辑的方法。
②如果必须在fallback逻辑方法中远程调度其他服务,最好在远程调度其他服务时,也加上熔断器。
-
创建Controller包和HystrixClientConfig类(注意层级关系)
8.测试运行
确保eureka-server,eureka-server-another,provider,provider-another都启动成功,在网址中输入127.0.0.1:8766/stu?id=自己的学号,显示如下,不断刷新网页看到有7006和7007变化。
关闭provider和provider-another服务,再次在网址中输入127.0.0.1:8766/stu?id=自己的学号,如果出现如下图即为实验成功。
总结:
当服务提供者hystrix-provider不可用的情况下,如果服务消费者hystrix-client调用服务提供者eureka-provider的“/student”方法,就会失败,此时会开启熔断器。熔断器打开后,请求会直接执行fallbackMethod
逻辑,通过快速失败,做到及时处理请求,避免线程被阻塞。
三、Feign结合Hystrix实现熔断
基本流程:1.开启Hystrix熔断
2. 开启Feign Client功能
3. 修改项目中接口
4. 项目测试
1.在父级目录下创建模块lesson05-feign-hystrix
2.添加pom依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
<version>2.2.9.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies>
3.添加配置文件
①Feign自带熔断功能
,默认情况下,熔断功能是关闭的。如果要开启熔断,只需在配置文件中将feign.circuitbreaker.enabled
设置为true
即可。
②因为在Feign的起步依赖中引入了Hystrix依赖,所以在Feign中使用Hystrix不需要引入任何的依赖,只需要在配置文件中开启即可。
4.创建主包FeignHystrix和启动类FeignHystrixApplication(注意层级)
①在启动类添加@EnableFeignClients
开启Feign Client功能
5.创建Service包和FeignHystrix接口(注意层级)
①在FeignHystrix 接 口 上 方 的@FeignClient
注解中,增加fallback属性配置,指定FeignHystrixImpl类为失败逻辑处理类。
②!使用fallback属性指定的用于处理回退逻辑的类,必须实现@FeignClient
注解修饰的接口。
6.重写接口中的stu方法
①失败逻辑处 理类FeignHystrixImpl,实现被@FeignClient修饰的FeignHystrix接口。
②FeignHystrixImpl实现了FeignHystrix接口,并定义了一个stu()方法用于编写处理熔断的具体逻辑。这里,我们使用@Component
注解修饰类FeignHystrixImpl,其目的是将该类交给Spring容器管理。
- 创建Controller包和FeignHystrixController类(注意层级)
8.测试运行
确保eureka-server,eureka-server-another,provider,provider-another都启动成功,在网址中输入127.0.0.1:8768/stu?id=自己的学号,显示如下,不断刷新网页看到有7006和7007变化。
关闭provider和provider-another服务,再次在网址中输入127.0.0.1:8768/stu?id=自己的学号,如果出现如下图即为实验成功。
总结:
当服务提供者eureka-provider不可用的情况下,如果服务消费者feign-hystrix-client调用服务提供者eureka-provider的“/stu”方法,就会失败,此时会开启熔断器。熔断器打开后,请求会直接执行fallback
属性指定的用于处理回退逻辑的类,通过快速失败,做到及时处理请求,避免线程被阻塞。
四、Hystrix监控面板
基本流程:1.添加依赖
2.开启Hystrix Dashboard
3. 创建hystrix.stream的Servlet配置
4. 项目测试
1.首先改造一下lesson05-feign-hystrix,使其具备被监控的功能添加Config包和FeignHystrixConfig类。
①Spring Boot 2.x版本开启Hystrix Dashboard与Spring Boot 1.x的方式略有不同,需要增加一个HystrixMetricsStreamServlet的配置。
②加入Hystrix.stream的Servlet配置,在FeignHystrixConfig类中添加如下代码:
这段代码是固定写法,用servlet对外开放/actuator/hystrix.stream接口,用于将本服务的一些监控信息传输出去,在豪猪的这个界面就是通过这个接口获取服务的信息
2.在父级目录下添加模块lesson05-hystrix-dashboard
3.添加pom依赖
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
<version>2.2.9.RELEASE</version>
</dependency>
</dependencies>
4.添加配置
5.创建主包HystrixDashboard和启动类HystrixDashboardApplication
①增加@EnableHystrixDashboard注解启用Hystrix Dashboard功能。
6.启动服务,并在网页输入127.0.0.1:8767/hystrix,出现如下豪猪Logo的界面说明监控面板搭建成功。
7.利用面板监控feign-hystrix服务
确保eureka-server,eureka-server-another,provider,provider-another,feign-hystrix,dashboard都启动成功,然后在以下位置输入http://127.0.0.1:8768/actuator/hystrix.stream,并点击“Monitor Stream”按钮。
如果一直显示如下Loading界面时,需要新开一个网页,然后在网址栏输入127.0.0.1:8768/stu?id=自己的学号。
正常情况下会实时出现监控界面。
8.新开一个网页,并在地址栏输入127.0.0.1:8768/stu?id=自己的学号,然后一直刷新,看监控面板中的圆圈和数字是否有变化。
关闭其中一个provider,继续刷新,看有什么变化。
总结:
五、Turbine聚合监控
1.feign-hystrix-another模块
为了直观感受聚合监控,我们需要再添加一个feign-hystrix模块。
(1)在父级目录下新建模块lesson05-feign-hystrix-another
(2)添加pom依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
<version>2.2.9.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies>
(3)添加配置文件
(4)创建主包FeignHystrixAnother和启动类FeignHystrixAnotherApplication
(5)分别新建Config、Controller、Service三个包以及他们下面的代码如下:
2.搭建聚合监控服务
基本流程:1.添加依赖
2.开启聚合监控功能
3. 在配置文件进行配置
4. 项目测试
(1)在父级目录下新建lesson05-turbine-server
2)添加pom依赖
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-turbine</artifactId>
<version>2.2.9.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies>
(3)添加配置文件
(4)创建主包TurbineServer和启动类TurbineServerApplication
①添加@EnableTurbine注解,开启聚合监控功能。
②此时可以将服务进行启动。
3.接下来测试聚合监控
(1)确保eureka-server,eureka-server-another,provider,provider-another,feign-hystrix,feign-hystrix-another,dashboard,turbine-server都启动成功。
(2)在网页中输入http://127.0.0.1:8767/hystrix 进入豪猪界面
(3)在豪猪界面的地址栏输入:http://127.0.0.1:8770/turbine.stream
此时会跳转到以下监控界面。
注意:如果出现一直Loading或者不是以上界面显示的三个接口,这时需要手动再开启一个网页,在地址栏中依次访问http://127.0.0.1:8768/stu?id=自己学号、http://127.0.0.1:8769/stu?id=自己学号、http://127.0.0.1:8769/port,逐个访问后就会出现以上图片所示的面板,如果没有出现则说明实验失败。
另外:
1.因为单独写了一个dashboard模块,所以在hystrix和turnine模块中都不需要再添加dashboard依赖。
2.在实验中如果删除了一个模块后需要再创建一个与删除模块相同名字的模块,此时需要File->Project Settings—>Modules中进行移除,并且在父级模块的pom文件里对该模块进行删除。
19 张思维导图学习 Spring Cloud
本文用 19 张思维导图描述微服务相关的概念和架构,建议收藏。包括什么是微服务、架构演进、微服务架构、微服务解决方案、SpringCloud概览、Eureka、Ribbon、Feign、Hystrix、Zuul、Gateway、Config、Bus、OAuth2、Sleuth、什么是SpringCloud、SpringCloud主要组件。
1、什么是微服务
架构的发展历程是从单体式架构,到分布式架构,到SOA架构,再到微服务架构。
单体架构:未做任何拆分的Java Web程序
分布式架构:按照业务垂直划分,每个业务都是单体架构,通过API互相调用。
图3:分布式架构示意图
SOA架构:SOA是一种面向服务的架构。其应用程序的不同组件通过网络上的通信协议向其它组件提供服务或消费服务,所以也是分布式架构的一种。
1.2、微服务架构
微服务架构在某种程度上是SOA架构的进一步的发展。
微服务目前并没有比较官方的定义。微服务 Microservices 之父,马丁.福勒,对微服务大概的概述如下:
就目前而言,对于微服务业界并没有一个统一的、标准的定义(While there is no precise definition of this architectural style ) 。
但通常在其而言,微服务架构是一种架构模式或者说是一种架构风格,它提倡将单一应用程序划分成一组小的服务,每个服务运行独立的自己的进程中,服务之间互相协调、互相配合,为用户提供最终价值。
服务之间采用轻量级的通信机制互相沟通(通常是基于 HTTP 的 RESTful API ) 。每个服务都围绕着具体业务进行构建,并且能够被独立地部署到生产环境、类生产环境等。
另外,应尽量避免统一的、集中式的服务管理机制,对具体的一个服务而言,应根据业务上下文,选择合适的语言、工具对其进行构建,可以有一个非常轻量级的集中式管理来协调这些服务。可以使用不同的语言来编写服务,也可以使用不同的数据存储。
图5:微服务定义思维导图
图6:微服务架构示意图
1.3、微服务解决方案
目前最流行的两种微服务解决方案是Spring Cloud和Dubbo。
2、SpringCloud概览
2.0、什么是SpringCloud
Spring Cloud 作为 Java 言的微服务框架,它依赖于 Spring Boot ,有快速开发、持续交付和容易部署等特点。Spring Cloud 的组件非常多,涉及微服务的方方面面,井在开源社区 Spring、Netflix Pivotal 两大公司的推动下越来越完善。
Spring Cloud是一系列组件的有机集合。
图7:SpringCloud技术体系
图8:SpringCloud技术体系思维导图
2.1、SpringCloud主要组件
2.1.1、Eureka
Netflix Eureka 是由 Netflix 开源的一款基于 REST 的服务发现组件,包括 Eureka Server 及 Eureka Client。
2.1.2、Ribbon
Ribbon Netflix 公司开源的一个负载均衡的组件。
2.1.3、Feign
Feign是是一个声明式的Web Service客户端。
2.1.4、Hystrix
Hystrix是Netstflix 公司开源的一个项目,它提供了熔断器功能,能够阻止分布式系统中出现联动故障。
2.1.5、Zuul
Zuul 是由 Netflix 孵化的一个致力于“网关 “解决方案的开源组件。
2.1.6、Gateway
Spring Cloud Gateway 是 Spring 官方基于 Spring 5.0、 Spring Boot 2.0 和 Project Reactor 等技术开发的网关, Spring Cloud Gateway 旨在为微服务架构提供简单、 有效且统一的 API 路由管理方式。
2.1.7、Config
Spring Cloud 中提供了分布式配置中 Spring Cloud Config ,为外部配置提供了客户端和服务器端的支持。
2.1.8、 Bus
使用 Spring Cloud Bus, 可以非常容易地搭建起消息总线。
2.1.9、OAuth2
Sprin Cloud 构建的微服务系统中可以使用 Spring Cloud OAuth2 来保护微服务系统。
2.1.10、Sleuth
Spring Cloud Sleuth是Spring Cloud 个组件,它的主要功能是在分布式系统中提供服务链路追踪的解决方案。
本文中对架构的演进及Spring Cloud 构建微服务的基本组件进行了概览。
链接:cnblogs.com/three-fighter/p/13485459.html
【1】:朱荣鑫、张天、黄迪璇编著《Spring Cloud微服务架构进阶》
【2】:翟永超著 《Spring Cloud 微服务实战》
【3】:许进等著《重新定义SpringCloud实战》
【4】: 方志朋著 《深入理解SpringCloud微服务构建》
【5】:SOA架构设计分析
【6】:【12张手绘图】我搞懂了微服务架构!
【7】:微服务架构深度解析与最佳实践
-END- 如果看到这里,说明你喜欢这篇文章,请 转发、点赞。 ↓扫描二维码进群↓
以上是关于Spring Cloud微服务架构学习-4的主要内容,如果未能解决你的问题,请参考以下文章
spring cloud微服务分布式云架构 - Spring Cloud集成项目简介
spring cloud微服务分布式云架构 - Spring Cloud集成项目简介
spring cloud微服务分布式云架构 - Spring Cloud集成项目简介
spring cloud微服务分布式云架构 - Spring Cloud集成项目简介