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即可看到监视的界面。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐