spring cloud备忘笔记-5-熔断器

spring cloud备忘笔记-5-熔断器

    • 服务雪崩
    • Ribbon添加熔断器
    • Feign使用熔断
    • 监控熔断


笔记索引:
spring cloud备忘笔记-0-目录索引

服务雪崩

  在微服务架构中,我们是根据业务来拆分成一个个服务,而服务与服务之间可以通过 RPC 相互调用,比如Spring Cloud : RestTemplate + Ribbon 、 Feign 。
  为了保证其高可用,单个服务通常会集群部署。由于网络震荡或者自身的原因,服务并不能保证 100% 可用,如果单个服务出现问题,调用这个服务就会出现线程阻塞,此时若有大量的请求涌入,Servlet 容器的线程资源会被消耗完毕,导致服务瘫痪。服务与服务之间由于具有依赖性(RPC同步通信方式),故障会传播,对整个微服务系统造成灾难性后果,这就是服务故障的 “雪崩” 效应。
  而Spring cloud 采取一种熔断器的方式来防止雪崩,它主要是整合了Netflix 开源的 Hystrix 组件。
一个请求可能会调用多个服务,而我们RPC采用的是同步的链式调用方式,

Ribbon添加熔断器

pom依赖添加到ribbon项目中

<dependency>
    <groupId>org.springframework.cloudgroupId>
    <artifactId>spring-cloud-starter-netflix-hystrixartifactId>
dependency>

  然后再入口类上增加注解开启熔断器@EnableHystrix
  之后我们在service中写一个熔断方法

package com.momomian.hi.spring.cloud.web.admin.ribbon.service;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

@Service
public class AdminService {

    @Autowired
    private RestTemplate restTemplate;

    @HystrixCommand(fallbackMethod = "hiError")
    public String sayHi(String message) {
        return restTemplate.getForObject("http://HI-SPRING-CLOUD-SERVICE-ADMIN/hi?message=" + message, String.class);
    }

    public String hiError(String message) {
        return String.format("your message is : %s but request fail",message);
    }
}

  在你实际的方法上增加注解@HystrixCommand,表示这个方法启动了熔断器,fallbackMethod 是指定回调方法,一旦连不上了就会返回这个hiError方法。
  你可以自己测试一下,将服务提供者项目停掉即可测试是否调用了熔断方法。

Feign使用熔断

  feign自带了熔断的机制,默认是关闭的。因此我们只需要在配置文件中将其开启,实际开发中也会使用feign。

application.yml添加

feign:
  hystrix:
    enabled: true

  此时由于feign是接口的service,我们要自己创建一个熔断器类来实现这个接口,我们在service包下创建一个hystrix包

package com.momomian.hi.spring.cloud.web.admin.feign.service.hystrix;

import com.momomian.hi.spring.cloud.web.admin.feign.service.AdminService;
import org.springframework.stereotype.Component;

@Component
public class AdminServiceHystrix implements AdminService {
    @Override
    public String sayHi(String message) {
        return String.format("your message is : %s but request fail",message);
    }
    
}

  我们只要重写这个需要熔断器的方法,这里重写的方法就是熔断后执行的方法。记住这里这个实现类要交给spring管理。
  然后我们只是实现了这个接口,但是service接口本身不知道有这个熔断类的存在,我们必须回到接口处,将原先接口的注解改为:以便告知回调方法。

@FeignClient(value = "hi-spring-cloud-service-admin",fallback = AdminServiceHystrix.class)

  在实际开发的时候我们就用feign,它相当于把ribbon封装了一下。这里我们也能看出单一职责原则,一个类只做一件事。面向接口编程等编程思想。

监控熔断

  使用熔断器仪表盘监控熔断的地方,方便我们管理检测。

在项目feign中增加一个依赖

	
    org.springframework.cloud
    spring-cloud-starter-netflix-hystrix-dashboard
    

  然后我们在入口类增加注解:@EnableHystrixDashboard
  由于我们使用的是Spring Boot 2.x 这里还需要增加配置一个servlet。
  我们在feign包下增加一个包config,
HystrixDashboardConfiguration .java

package com.momomian.hi.spring.cloud.web.admin.feign.config;

import com.netflix.hystrix.contrib.metrics.eventstream.HystrixMetricsStreamServlet;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class HystrixDashboardConfiguration {

    @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;
    }
}

  这里我们使用spring boot web servlet提供的ServletRegistrationBean 类,然后配置servlet的启动顺序、访问路径、name。然后将这个对象返回给spring管理。
  这样我们就配置好了。
  重新启动全部项目,浏览器进入http://localhost:8785/hystrix出现以下画面。
spring cloud备忘笔记-5-熔断器_第1张图片  这里长框填入我们servlet配置的映射。title随便启。点击Monitor Stream。然后我们要去触发熔断器。我们调用写的接口:http://localhost:8785/hi?message=hello
  我们可以通过关闭服务提供者项目模拟触发熔断,观察下面的变化就可以检测熔断了。
spring cloud备忘笔记-5-熔断器_第2张图片
  这里接口的代码可以参考前面的博客
笔记索引:
spring cloud备忘笔记-0-目录索引

你可能感兴趣的:(java技术知识,微服务)