SpringCloud(四)- Hystris简介及@EnableCircuitBreaker 和 @HystrixCommand 注解的使用

唯能极于情,故能极于剑

本文转载于http://www.codecow.cn/

此文由四部分组成(Hystris简介、@EnableCircuitBreaker 使用、实操、总结),别着急,慢慢来


问题:
1、复杂的分布式体系结构中,每个应用程序都有数十个依赖,每个依赖关系在某些时候将不可避免的失败;此时怎么办?
2、当服务之间的调用时,出现网络卡顿、超时、程序出错、甚至机房断电,此时又怎么办 ?
3、直接上图
在这里插入图片描述
这可咋办,凉拌,哈哈,不可能,此时迎来了我们的 “ 豪猪哥 — Hystris ” 带着这两个问题,小编将浅聊 Hystris

一、Hystris

1.1、Hystris 啥玩意 ?
  • 官网:Hystris 是一个处理分布式系统的 延迟容错 的开源库,在服务调用中不可避免的会调用失败,比如超时、异常等,Hystris 能够保证在一个服务出问题的情况下,不会导致整体服务失败,避免级联故障,以提高分布式系统的弹性
1.2、Hystris 能干嘛 ?

①、服务降级(fallback)
例如:当服务器超时、程序运行异常、线程池爆满的时候,立即返回一个友好提示如 “服务器忙,请稍后再试”,而不是直接给客服端整个 ERROR
②、服务熔断(break)
例如:当服务器达到最大访问量后,直接拒绝访问(例如家里的 保险丝 ),然后调用服务降级的方法并返回友好提示(过程:服务降级 —> 进而熔断 —> 恢复调用链路 )
③、服务限流(flowlimit)
例如:淘宝、京东秒杀时高并发操作时,严禁一窝蜂的过来拥挤,大家排队,一秒N个,有序进行
。。。。。。

1.3、Hystris 怎么玩 ?

官网:https://github.com/Netflix/Hystrix/wiki/How-To-Use
在这里插入图片描述

呵呵,朋友别着急,下面小编带你细品 豪猪哥

二、Hystris 实操

了解 Hystris 了,不来点 硬核 咋行呢,下面小编就结合实际开发和大家聊聊
注意:有服务端和客户端两个模块/项目

2.1、服务端 — 操作

①、首先导包


 		// 监控
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        
        // Web
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        // 服务注册与发现 Consul
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-consul-discovery</artifactId>
        </dependency>

        // 熔断器 Hystris
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
        </dependency>

②、改 YML 配置文件


server:
  port: 8888 #端口号

spring:
  application:
    name: cloud-hystrix-provider-service  #服务名
  cloud:
    consul:
      host: localhost      #consul的IP
      port: 8500           #consul启动端口默认8500
      discovery:
        service-name: ${spring.application.name}
        prefer-ip-address: true     #不写这个配置,在docker下的consul里面健康检查会失败
        healthCheckInterval: 5s     #健康检查频率
        port: ${server.port}        #注册服务所在端口
        

③、添加主启动类

/**
 *  注意:@SpringCloudApplication 注解可以代替下面三个注解
 */
@SpringBootApplication	// springboot 注解
@EnableDiscoveryClient	// 作用:能够让Consul注册中心发现,并扫描到该服务
@EnableCircuitBreaker   // SpringCloud中使用断路器,需要加上此注解
public class HystrixProviderMain8001 {

    public static void main(String[] args) {
        SpringApplication.run(HystrixProviderMain8001.class, args);
    }
}

④、业务逻辑Controller


    @Resource
    private PaymentService paymentService; //service层调用

    @GetMapping("/payment/hystrix/ok/{id}")
    public RespResult<Payment> getPaymentById(@PathVariable("id") Integer id) {
        log.info(" hystrix 8001 ok "); //使用@Slf4j打印日志
        Payment payment = paymentService.getById(id); //getById 是serviceImpl中根据id 获取 payment 实体的方法, 小编在这就不赘述了
        if(payment == null){
            return new RespResult<>(444, "查询为空");
        }
        return RespResult.success(payment);
    }

		解释 :Payment 实体就两个字段 id、desc
			   RespResult  {"code":200,"message":"成功","data":{"id":1,"desc":"我还是从前那个少年"}} 这种格式

 		    经过 小编一顿 SAO 操作, 服务端 还可以吧   ^ _ ^
 		    别急 没完事的 。。。。
 		    
2.2、客服端 / 消费端 – 操作

注意:消费端大体和客服端一样,注意细节 O ^ _ ^

①、首先导包


		<!--监控 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        
        <!--Web -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!--服务注册与发现 consul-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-consul-discovery</artifactId>
        </dependency>

        <!--服务调用 openFeign-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

        <!--熔断器 hystrix-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
        </dependency>
        

②、改 YML 配置文件


server:
  port: 80 #端口号  浏览网页服务默认的端口号都是80,因此只需输入网址即可,不用输入“: 80”了

spring:
  application:
    name: cloud-hystrix-consumer-service  #服务名
  cloud:
    consul:
      host: localhost      #consul的IP
      port: 8500           #consul启动端口默认8500
      discovery:
        service-name: ${spring.application.name}
        prefer-ip-address: true     #不写这个配置,在docker下的consul里面健康检查会失败
        healthCheckInterval: 5s     #健康检查频率
        port: ${server.port}        #注册服务所在端口

feign:
  hystrix:
    enabled: true #在feign中开启 Hystrix(熔断器)
    

③、添加主启动类


@SpringBootApplication
@EnableFeignClients 	// 作用:启用feign客服端
@EnableCircuitBreaker  //SpringCloud中使用断路器,需要加上此注解
public class HystrixConsumerMain80 {

    public static void main(String[] args) {
        SpringApplication.run(HystrixConsumerMain80.class, args);
    }
}

④、业务逻辑 Service

/**
 *  朋友 @FeignClient 此注解还不会用? 别急 小编是老中医 专治不会  哈哈
 *  看小编上一讲(地址:https://blog.csdn.net/Msxd_/article/details/105551238 
 * 						==> OpenFeign简介及@FeignClient等注解的使用)
 */
@FeignClient(value = "cloud-hystrix-provider-service", fallback = PaymentFallbackService.class)
public interface PaymentFeignService {

    @GetMapping("/payment/hystrix/ok/{id}")
    RespResult<Payment> getPaymentById(@PathVariable("id") Integer id);

//=============================================================================================

	特殊说明:上面 @FeignClient 注解中 fallback = PaymentFallbackService.class 是干嘛的 ?
			 作用:比如客服端 调用服务端时,服务端突然 “挂了”,此时需要一个降级的方法  
			 		因为,你不可能让客服端直接 来个 “ERROR” 吧
			 		
			 还不懂: 看上面 ==> 1.2、Hystris 能干嘛 ?
			 
			 PaymentFallbackService 如何写 ???
			 其实就是实现  这个 接口, 重写里面的方法  ==> 往下看  5、降级 Service(Fallback)

}

⑤、降级 Service(Fallback)


 说明: 没有,哈哈 ^ _ ^ 朋友 上面 哪一步 都说了 
 
@Service
public class PaymentFallbackService implements PaymentFeignService {

    @Override
    public RespResult<Payment> getPaymentById(Integer id) {
        return RespResult.error(500, " 服务端 getPaymentById 方法调用失败  触发熔断降级  ");
    }
}

⑥、业务逻辑 Controller


    @Resource
    private PaymentFeignService paymentFeignService; //调用第四步中的接口
    
    @GetMapping("/consumer/payment/get/{id}")
    public RespResult<Payment> getPaymentById(@PathVariable("id") Integer id){
        log.info("我是使用的Feign");	//打印日志
        return  paymentFeignService.getPaymentById(id);  // 调用里面的方法
    }
    

	
总测试步骤:
		1、启动服务端
		2、启动消费端
		3、地址栏输入url: localhost/consumer/payment/get/1  // 为什么不加端口号(回去看 消费端 Yml 配置  有说明)
		4、结果:
		
			第一次:测试一切正常(客户端和服务端 都正常启动)
			结果必然为正常结果 eg:
									{
									    "code": 200,
									    "message": "成功",
									    "data": {
										        "id": 1,
										        "desc": "我还是从前那个少年"
									    		}
									}
			
			第二次:测试不正常时(假如我们把服务端 停掉了)
			结果必然为 Fallback 结果 eg:  
										{
										    "code": 500,
										    "message": " 服务端 getPaymentById 方法调用失败  触发熔断降级 ",
										    "data": null
										}
						此结果 就是我们在 第五步(降级 Service(Fallback)) 中配置 的


 小编一顿 SAO 操作, 还可以吧   ^ _ ^  

对 Hystris 实操 总结: 其实就两点:
①、在 消费端 启动类加:@EnableCircuitBreaker 注解
②、在 @FeignClient 调用接口的属性里加: fallback = PaymentFallbackService.class 并实现此方法,即可

咋青山不改,绿水长流,不妨看看小编其他作品,很香哟,哈哈,加油 ^ _ ^

三、总结

这是 SpringCloud 的 Hystris 篇,后续小编会从 “ GateWay(网关)Config(分布式配置中心)…” 等坚持以博客的方式来分享自己对SpringCloud 的理解,并从不同角度和大家分享工作心得,并且含有相关Demo,最终小编会发布到GitHub上,供大家下载、分享、交流、指正,下面是源码地址:

GitHubhttps://github.com/msxdlb/Spring-Cloud-2020

有问题或错误请及时联系小编或关注小编公众号 “CodeCow”,小编一定及时回复和改正 啦

《 人生路上,你我都是过客,来去皆是缘分 》 随缘——但须努力

2020/04/21 晚 23:39

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值