一:SpringCloud之Hystrix断路器
- 分布式系统面临的问题
复杂分布式体系结构中的应用程序有数十个依赖关系,每个依赖关系在某些时候将不可避免的失败。
- 什么是Hystrix?
- 什么是服务熔断?
二:将Hystrix熔断器整合到项目中去(参考之前的8001提供者部门
微服务,这个新的提供者微服务加了熔断器)
- 创建子模块microservicecloud-provider-dept-hystrix-8001微服务
- 在pom.xml中添加依赖(这个文件与之前的8001基本没有区别,只有新增了spring-cloud-starter-hystrix依赖)
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>com.topcheer</groupId> <artifactId>microservicecloud</artifactId> <version>0.0.1-SNAPSHOT</version> </parent> <artifactId>microservicecloud-provider-dept-hystrix-8001</artifactId> <dependencies> <!--引入hystrix依赖 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-hystrix</artifactId> </dependency> <!--这里我们引入自己自定义的api通用包,就可以使用Dept部门实体 --> <dependency> <groupId>com.topcheer</groupId> <artifactId>microservicecloud-api</artifactId> <version>${project.version}</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-core</artifactId> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jetty</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> </dependency> <!--修改后立即热部署 --> <dependency> <groupId>org.springframework</groupId> <artifactId>springloaded</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> </dependency> <!--将微服务provider注册进eureka --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency> <!--添加actuator监控信息完善 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> </dependencies> </project>
- 修改application.yml文件内容(这个文件与之前的8001基本没有区别,只有instance-id名称编号了)
server: port: 8001 #设置端口为8001 mybatis: config-location: classpath:mybatis/mybatis.cfg.xml #设置mybatis配置文件所在的路径 type-aliases-package: com.topcheer.springcloud.entities #扫描所有实体类所在包 mapper-locations: - classpath:mybatis/mapper/**/*.xml #扫描mybatis的映射文件 spring: application: name: microservicecloud-dept datasource: type: com.alibaba.druid.pool.DruidDataSource #设置当前数据源 driver-class-name: org.gjt.mm.mysql.Driver #设置mysql驱动包 url: jdbc:mysql://localhost:3306/cloudDB01 #设置数据库名称 username: root password: 897570 dbcp2: min-idle: 5 #设置数据库连接池的最小维持连接数 initial-size: 5 #设置初始化链接数 max-total: 5 #设置最大连接数 max-wait-millis: 200 #设置链接获取的最大超时时间 eureka: #这个就是将8001服务端注册进入注册中心,下面的就是注册中心的注册地址 client: service-url: defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/ instance: instance-id: microservicecloud-dept8001-hystrix #自定义服务名称信息 prefer-ip-address: true #访问路径可以显示IP地址 info: app.name: topcheer-microservicecloud company.name: com.topcheer build.artifactId: $project.artifactId$ build.version: $project.version$
- 将之前8001的java代码拷贝过来,部分进行修改
a:修改DeptController.java类,我们对这个类中的get方法进行改造,我们在调用
这个方法进行查询的时候,传递一个参数,数据库中查询不到,如果返回null,
那么我们就人为的抛出一个异常,那么我们这里就可以使用hystrix去解决这个
问题,代码如下:
b:修改启动类DeptProvider_hystrix_8001_App.java
- 测试,首先启动3个Eureka的注册中心,再启动microservicecloud-provider-dept-hystrix-8001这个新建的带Hystrix
的提供者微服务,最后启动我们的80消费者微服务。
a:访问7001
b:访问我们刚刚创建的get方法,先访问一个存在的数据
c:访问一个不存在的数据
三:Hystrix之服务降级
c:修改microservicecloud-consumer-dept-feign整合了feign的消费者微服务中application.yml文件
d:测试,首先启动3个Eureka的服务,再启动microservicecloud-provider-dept-8001这个没有加Hystrix的
提供者微服务,以及后面启动microservicecloud-consumer-dept-feign消费者微服务
①首先正常访问get方法
②下面我们故意关闭microservicecloud-provider-dept-8001微服务
- 什么叫做服务降级?(并且上面的Hystrix的@HystrixCommand方式会导致,每多一个方法,就需要
创建一个fallbackMethod对应的方法,比较麻烦)。
简单点说:就是比如现在我们存在3个微服务A,B,C,现在微服务A访问量特别大,销耗的内存特别大,导致
整体服务器内存不够,那么现在为了维持服务器的运行不会崩溃,那么我们可以先将微服务C先
关掉,等待A的访问量小了,再开启C.
注意:服务降级处理是在客户端完成的,与服务端没有关系。 - 实现步骤如下:
a:修改microservicecloud-api工程,根据已有的DeptClientService接口,新建一个实现了FallbackFactory接口的类。
b:修改DeptClientService这个对应提供者服务端方法调用的接口类
四:服务监控之hystrixDashboard
- 简介
- 项目实例步骤
⑴新建微服务microservicecloud-consumer-hystrix-dashboard
⑵修改pom.xml文件,添加依赖
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>com.topcheer</groupId> <artifactId>microservicecloud</artifactId> <version>0.0.1-SNAPSHOT</version> </parent> <artifactId>microservicecloud-consumer-hystrix-dashboard</artifactId> <dependencies> <!--引入hystrix-dashboard依赖 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-hystrix</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-hystrix-dashboard</artifactId> </dependency> <!--这里我们引入自己自定义的api通用包,就可以使用Dept部门实体 --> <dependency> <groupId>com.topcheer</groupId> <artifactId>microservicecloud-api</artifactId> <version>${project.version}</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--修改后立即热部署 --> <dependency> <groupId>org.springframework</groupId> <artifactId>springloaded</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> </dependency> <!--Ribbon相关的依赖 ,ribbon需要和eureka整合,所以需要这个eureka依赖 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-ribbon</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency> </dependencies> </project>
⑶修改application.yml文件
⑷创建启动类DeptConsumer_DashBoard_App
⑸我们需要监控所有的提供者微服务,那么我们需要在这些微服务中进行配置,都要添加一个actuator依赖
(8001,8002,8003都添加 即可)
⑹下面我们单独启动刚刚新建的这个microservicecloud-consumer-hystrix-dashboard微服务,看看是否可以正常启动
-
上面可以发现我们的hystrix-dashboard已经成功启动,下面我们可以启动其他微服务进行测试了
a:首先启动3个Eureka注册中心,再启动带hystrix熔断降级的微服务microservicecloud-provider-dept-hystrix-8001,
最后启动我们新建的microservicecloud-consumer-hystrix-dashboard微服务
b:效果
c:那么现在我们要使用hystrixdashboard去监控这个8001提供者微服务,该如何做呢?
地址:http://ip:要监控微服务的端口/hystrix.stream
d:让效果图形化
e: 图形化的效果如下
-
上面图形化的结果看不懂怎办?
a:7种颜色一一对应
b:一圈一线
c:下面我们多次通过http://localhost:8001/dept/get/1地址访问,看看图形变化
d:图形中含义