SpringCloud微服务实战---服务容错保护

服务容错保护:Spring Cloud Hystrix

         在微服务架构中,系统被分成了很多服务单元,各服务的应用间通过服务注册与订阅的方式相互依赖。每个单元都在不同的进程中运行,依赖通过远程调用的方式执行,这样就有可能因为网络原因或是依赖服务自身问题出现调用故障或延迟,这些问题会直接导致调用方的对外服务也出现延迟,若此时调用方的请求不断增加,最后就会因为等待出现故障的依赖方响应形成任务积压,最终导致自身服务的瘫痪。

         在微服务架构中,存在着那么多的服务单元,若一个单元出现故障,就很容易因为依赖关系而引发故障的蔓延,最终导致整个系统的瘫痪,为了解决问题,产生了断路器等一系列服务保护机制。

         Spring Cloud Hystrix实现了断路器,线程隔离等一系列服务保护功能,它是基于Netflix的开源框架Hystrix实现的,具备服务降级,服务熔断,线程和信号隔离,请求缓存,请求合并以及服务监控等供能。

         依赖隔离

         Hystrix使用“舱壁模式”实现线程池的隔离,为每个依赖服务创建一个独立的线程池,这样就算某个依赖服务出现延迟过高的情况,也只是对改依赖服务调用产生影响,而不会拖慢其他的依赖服务。

         通过实现对依赖服务的线程池隔离,可以带来如下优势:

  1.      应用自身得到完全保护,不会受不可控的依赖的服务影响,即便给依赖服务分配的线程池被填满,也不会影响应用自身的其余部分

2.       有效降低接入新服务的风险。如果新服务接入后运行不稳定或存在问题,完全不会影响应用其他的请求。

3.       当依赖的服务从失效恢复正常后,它的线程池会被清理并且能够马上恢复健康的服务,相比之下,容器级别的清理恢复速度要慢很多。

4.       当依赖的服务出现配置错误的时候,线程池会快速反映出此问题(通过失败次数,延迟,超时,拒绝等指标的增加情况)。同时,可以在不影响应用功能的情况下通过实时的动态属性刷新来处理它。

5.       当依赖的服务因实现机制调整等原因造成其性能出现很大变化的时候,线程池的监控指标信息会反映出这样的变化。同时,可以通过实时动态刷新自身应用对依赖服务的阈值进行调整以适应依赖方的改变。

6.       每个专有线程池都提供了内置的并发实现,可以利用它为同步的依赖服务构建异步访问。

 

声明式服务调用:Spring Cloud Feign

         它基于Netflix Feign实现,整合了Spring Cloud Ribbon和Spring Cloud Hystrix,还提供了一种声明式的Web服务客户端定义方式。

         示例:

1.       创建Spring Boot基础工程,在pop.xml引用Spring-cloud-starter-eureka和spring-cloud-starter-feign依赖

2.       创建应用主类Application,并通过@EnableFeignClients注解开启Spring Cloud  Feign的支持功能

 

 

3.  定义HelloService接口,通过@FeignClient注解指定服务名来绑定服务,然后在使用Spring MVC注解绑定具体该服务提供的REST接口

 

 

 

4.  创建Controller来实现Feign客户端调用。使用@Autowired直接注入HelloService实例,并在函数中调用绑定了hello-service服务接口的客户端来想该服务发起/heelo接口

 

5.  在.properties文件中指定服务注册中心,定义自身服务名

 

 

测试验证:

            先启动服务注册中心以及两个HEELO-SERVICE,然后启动FEIGN-CONSUMER,发送几次GET请求到http://localhost:9001/feign-consumer,可以看到如之前Ribbon实现时一样的效果。

            使用Spring Cloud Feign继承特性的优点很明显,可以将接口的定义从Controller中剥离,同时配合Maven私有仓库就可以轻易实现接口定义的共享,实现构建期接口绑定,从而有效减少服务客户端的绑定配置。这样做虽然可以很方便实现接口定义和依赖的共享,但是由于接口在构建期间就建立起了依赖,那么接口变动就会对项目构建造成影响。

         Ribbon配置

         全局配置

         使用ribbon.<key>=<value>方式来设置ribbon的各项默认参数。比如修改默认的客户端调用超时时间:

 

 

指定服务配置

             大多数情况下,我们对于的服务调用的超时时间可能会根据实际服务的特性做一些调整,所以仅仅依靠默认的全局配置是不行的。在使用Spring Cloud Feign的时候,针对各个服务客户端进行个性化配置的方式与使用Spring Cloud Ribbon时的配置方式是一样的,都采用<client>.ribbon.key=value的格式进行设置。

             之前的示例中,使用@FeignClient(VALUE = “HELLO-SERVICE”)来创建Feign客户端的时候,同时也创建了一个名为HELLO-SERVICE的Ribbon客户端。就可以使用@FeignClient注解中的name或value属性值来设置对应的ribbon参数,比如:

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值