spring cloud Hystrix

spring cloud Hystrix

pom.xml依赖

<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-netflix-hystrix -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
    <version>2.2.2.RELEASE</version>
</dependency>

开启短路器功能

要使用Hystrix服务这些功能的,需要在主启动类添加@EnableCircuitBreaker注解

@SpringBootApplication
@EnableEurekaClient
@EnableCircuitBreaker
public class PaymentApplication8003 {
    public static void main(String[] args) {
        SpringApplication.run(PaymentApplication8003.class,args);
    }

}

服务降级

服务降级,当服务器压力剧增的情况下,根据当前业务情况及流量对一些服务和页面有策略的降级,以此释放服务器资源以保证核心任务的正常运行。

处理超时,处理异常等都会触发服务降级,当某个微服务发生一些网络拥挤现象时,微服务模块未能及时返回数据时,我们就可以通过服务降级对超时等现象进行处理(如返回一些提示信息,通知用户系统繁忙稍后在试),这样就可以及时释放掉资源,以免发生过长的等待,导致资源的长时间占用。

@HystrixCommand的fallbackMethod

@HystrixCommand中的fallbackMethod指定服务降级方法

配置服务降级@HystrixCommand中的fallbackMethod属性进行配置,commandProperties属性用于设置command的配置属性。

@HystrixCommand(fallbackMethod = "createFallback",
                commandProperties = {
                    @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "3000")
    })
public int create(Payment payment) {
    return paymentDao.create(payment);
}

public int createFallback(Payment payment){
    System.out.println("创建出错");
    return Integer.MAX_VALUE;
}

配置默认的服务降级方法

通过@DefaultProperties可以配置一些默认的配置,如:defaultFallback,commandProperties等。

下面的代码中的PaymentServiceImpl配置了一个defaultFallback,当一个方法上面的@HystrixCommand没有配置相应的属性时,默认使用@DefaultProperties声明的属性。所以下面的代码中create方法使用的降级方法是createFallback,而getPaymentById则使用默认的global_fallbackfunction

注意点:服务降级的方法应该跟源配置方法一致,如:int create(Payment payment)那么它的服务降级方法返回值必须为int,传入参数必须为Payment类型。

@Service
@DefaultProperties(defaultFallback = "global_fallbackfunction")
public class PaymentServiceImpl implements PaymentService {

    @Resource
    private PaymentDao paymentDao;

    @HystrixCommand(fallbackMethod = "createFallback",commandProperties = {
            @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "3000")
    })
    public int create(Payment payment) {
        return paymentDao.create(payment);
    }

    @HystrixCommand
    public Payment getPaymentById(int id) {
        return paymentDao.getPaymentById(id);
    }

    //---------------------------------------------------------------
    public int createFallback(Payment payment){
        System.out.println("创建出错");
        return Integer.MAX_VALUE;
    }

    public Payment global_fallbackfunction(int id){
        System.out.println("全局默认fallback方法");
        return null;
    }
}

使用openfeign中的hystrix

openfeign中带有hystrix,使用openfeign也可以配置服务降级功能。
请添加图片描述


配置application.yml

通过feign.hystrix.enabled开启hystrix的功能,默认是关闭的。

feign:
  hystrix:
    enabled: true

@FeignClient的fallback属性配置服务降级的类

用过openfeign的应该都知道使用@FeignClient注解,用于定义要代理的服务端的接口,打上这个注解后,feign就会扫描这个注解生成代理类,然后通过这个代理类就能直接调用服务端的暴露的接口了。

1.服务端暴露的接口

这个服务端已经将服务注册到Eureka上,并且这个服务名称为CLOUD-PAYMENT-SERVICE

@RestController
@Slf4j
public class PaymentController {
    @Resource
    private PaymentServiceImpl paymentServiceImpl;

    @Value("${server.port}")
    private String port;

    @GetMapping("/payment/get/{id}")
    public ResponseMessage getPaymentById(@PathVariable("id") int id){
        Payment payment = paymentServiceImpl.getPaymentById(id);
        return ResultFactory.buidResult(200,"成功"+port,payment);
    }
}

2.消费端指定Feign要代理的接口

这里是消费端的代码,通过@FeignClient指定要代理服务名称,要代理的接口。然后openFeign将会生成代理对象。

//代理CLOUD-PAYMENT-SERVICE服务的接口,并指定服务降级的类
@Component
@FeignClient(value = "CLOUD-PAYMENT-SERVICE",fallback = PaymentFallback.class)
public interface PaymentOpenfeginService {
    //服务端的接口
    @GetMapping("/payment/get/{id}")
    public ResponseMessage getPaymentById(@PathVariable("id") int id);
}

3.使用代理对象

@RestController
@Slf4j
public class OrderController {
	
    //注入接口的代理对象
    @Resource
    private PaymentOpenfeginService paymentOpenfeginService;
	
    @GetMapping("/comsumer/payment/get/{id}")
    public ResponseMessage getPaymentById(@PathVariable("id") int id){
        //直接通过代理对象即可调用服务端接口
        return paymentOpenfeginService.getPaymentById(id);
    }

}

4.编写服务降级类

上面@FeignClient注解通过属性fallback指定了要降级的类,当openFeign的代理类的代理方法需要进行服务降级时,就会通过fallback中指定的类中对应的方法进行服务降级方法的调用。

@Component
public class PaymentFallback implements PaymentOpenfeginService {
    //当getPaymentById需要服务降级时,将调用其对应我服务降级方法
    public ResponseMessage getPaymentById(int id) {
        System.out.println("服务降级");
        return null;
    }
}

服务熔断

服务熔断,一种源于电子工程的断路器的概念。

微服务往往过个服务中间进行调用,而多个服务之间进行调用就会形成一个调用链。当下游服务因访问压力过大而响应变慢或失败,上游服务为了保护系统整体的可用性,可以暂时切断对下游服务的调用。

说穿了就是当某个微服务发生网络拥挤现象,而触发多次服务降级措施时,我们就可以对改服务的调用进行切断(服务恢复前调用不再调用),这就像电路的断路器一样,咔的一下断闸。等到发生故障的微服务能再次被调用的时候,再恢复调用。

@HystrixCommand配置断路器

服务熔断还是需要使用到@HystrixCommand注解。

关于@HystrixProperty的属性去哪找,我们可以通过HystrixPropertiesManager这个类去获取属性,这个类就是用于获取配置属性的。

import com.netflix.hystrix.contrib.javanica.conf.HystrixPropertiesManager;

HystrixCommandProperties的默认值可以从这个类找到

import org.springframework.cloud.netflix.hystrix.HystrixProperties;

使用案例

下面的代码配置了一个断路器,有一些特点:

  • 他的降级方法是fallbackfunction
  • 超时时间窗口为10秒
  • 统计近10请求,失败率超过60%及打开断路器

还有一点要注意的是,断路器是可以自动关闭的,如果断路器为开启状态(服务熔断了),当有一些请求到达这里时,断路器尝试开启,就是半开,如果服务恢复,

@GetMapping("/payment/get/{id}")
    @HystrixCommand(fallbackMethod = "fallbackfunction",commandProperties = {
            @HystrixProperty(name = HystrixPropertiesManager.CIRCUIT_BREAKER_ENABLED,value = "true"),//开启断路器
            @HystrixProperty(name = HystrixPropertiesManager.CIRCUIT_BREAKER_REQUEST_VOLUME_THRESHOLD,value = "10"),//请求次数
            @HystrixProperty(name = HystrixPropertiesManager.CIRCUIT_BREAKER_SLEEP_WINDOW_IN_MILLISECONDS,value = "10000"),//时间窗口
            @HystrixProperty(name = HystrixPropertiesManager.CIRCUIT_BREAKER_ERROR_THRESHOLD_PERCENTAGE,value = "60")
    })//失败率阈值
public ResponseMessage getPaymentById(@PathVariable("id") int id){
    Payment payment = paymentServiceImpl.getPaymentById(id);
    return ResultFactory.buidResult(200,"成功"+port,payment);
}


public ResponseMessage fallbackfunction(){
    return ResultFactory.buildFailResult("失败");
}

Hystrix的仪表盘

pom.xml依赖

 <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-netflix-hystrix-dashboard -->
 <dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
 </dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

启动类

@SpringBootApplication
@EnableHystrixDashboard
public class HystrixDashboardRun {
    public static void main(String[] args) {
        SpringApplication.run(HystrixDashboardRun.class,args);
    }
}

访问接口

访问接口跟你配置的服务端口有关,我这里配置的是9981

http://localhost:9981/hystrix

请添加图片描述

然后输入你要监控的服务端口即可使用,注意被监控的服务必须配置好了spring-boot-starter-actuator,要不就无法进行监控。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

监控展示

请添加图片描述

报错Unable to connect to Command Metric Stream.

请在被监控测配置一个bean,以解决无法获得监控流服务。

@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;
    }
posted @   鸭梨的药丸哥  阅读(4)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示