SpringCloud——Day04
SpringCloud Day04前两天要考科二,没有学习,呜呜呜科二还没过。文章总结自B站狂神说JAVA1.Hystrix多个微服务之间相互调用的时候,如果某个链路上的微服务响应时间过长或者不可用,对调用其它微服务的该微服务就会被占用过多的资源,进而引起系统崩溃,被称为雪崩效应。Hystrix是用于处理分布式系统的延迟和容错的开源库,它能保证在一个依赖出现问题的情况下,不会导致整体服务失败,避免
SpringCloud Day04
前两天要考科二,没有学习,呜呜呜科二还没过。
文章总结自B站狂神说JAVA
1.Hystrix
多个微服务之间相互调用的时候,如果某个链路上的微服务响应时间过长或者不可用,对调用其它微服务的该微服务就会被占用过多的资源,进而引起系统崩溃,被称为雪崩效应。
Hystrix是用于处理分布式系统的延迟和容错的开源库,它能保证在一个依赖出现问题的情况下,不会导致整体服务失败,避免级联故障,提高分布式系统的弹性。这种保护机制叫做服务熔断,当某个微服务不可用或者响应时间太长时会对微服务进行降级,进而熔断节点微服务的调用,快速返回错误的响应信息。一般在5s内20次响应失败就启用降级机制。
1.1 搭建环境
新建端口为8001的module,可以复制之前8001端口的项目module
引入依赖:
<!-- 熔断依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>
1.2 编写配置文件
在之前的8001的服务提供者的基础上修改模块id即可:instance-id: springcloud-provider-hystrix-dept
1.3 编写controller
@RestController
public class DeptController {
@Autowired
private DeptService deptService;
@GetMapping("/dept/get/{id}")
// 添加备用方法的注解
@HystrixCommand(fallbackMethod = "hystrixGet")
public Dept getId(@PathVariable Long id){
Dept dept = deptService.getById(id);
if (dept == null){
throw new RuntimeException("id=>"+id+"不存在");
}
return dept;
}
// 备用方法
public Dept hystrixGet(@PathVariable Long id){
return new Dept().setDname("不存在").setDb_source("没有数据库").setDeptno(id);
}
}
这样如果查找一个id不存在的数据,不会抛出异常,而会调用备用方法。
1.4 给启动类添加注解
在这个微服务的启动类中添加:
@EnableCircuitBreaker // 对熔断的支持
1.5 服务降级
如果客户端的某个服务熔断或者关闭之后,服务无法被调用可以在客户端准备一个服务回调。
/**
* @date 2020/8/9 14:52
* 服务降级
*/
@Component
public class DeptClientServiceFallBackFactory implements FallbackFactory {
@Override
public DeptClientService create(Throwable cause) {
return new DeptClientService() {
@Override
public List<Dept> list() {
return null;
}
@Override
public Dept getId(Long id) {
return new Dept().setDeptno(id).setDname(id+"不存在").setDb_source("不存在");
}
};
}
}
1.6 服务监控
创建一个客户端module
引入依赖
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>
<!-- 实体类-->
<dependency>
<groupId>org.example</groupId>
<artifactId>springcloud-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!-- web-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 热部署-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
<!-- Ribbon-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>
<!-- eureka-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>
</dependencies>
编写配置文件
server:
port: 9001
给要监视的服务添加hystrix依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>
在要被监视的服务上添加开启依赖的注解@EnableDiscoveryClient
,并且在bean中注入servlet。
// 注册servlet
@Bean
public ServletRegistrationBean hystrixServletRegistrationBean(){
ServletRegistrationBean registrationBean = new ServletRegistrationBean(new HystrixConfigSseServlet());
registrationBean.addUrlMappings("/actuator/hystrix.stream");
return registrationBean;
}
访问http://localhost:9001/hystrix
出现:
输入被监视的url和心跳间隔以及title即可看到监视的界面。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)