前面在配置服务注册中心的时候说到,一个服务可以有多个实例,那么问题来了,当你去调用服务的时候,怎么决定调用哪个呢?想雨露均沾,那得靠负载均衡了。
spring cloud 负载均衡当然不用 nginx,走的是客户端负载均衡,就是要不一样,工具包有两种,Ribbon 和 Feign。
== 因为本实验走的是 Feign,本文将着重描述 Feign 的负载均衡和 Feign 的断路器,至于 Ribbon,戳这里。
Feign 比较简单,完全是写接口的形式,所以其实我想这货是不是可以放在配置中心上,在各个服务实例启动的时候自行下载 class 并加载进 vm,如此各个服务的接口只需要维护一套即可,还不会出现对接问题,不过这是后话啦。
要是用 feign,创建一个跟 SleepCare-TestingServices 差不多的项目( 记得另外起个服务名称,就怕有些人厉害到直接复制项目什么都不改 ),然后给的 pom.xml 加个菜:
<!-- 使用 feign 做负载均衡 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
然后在启动类加上 @EnableFeignClients
注解。
然后后面随便写个接口,比如之前已经创建了 SleepCare-TestingServices 服务。
记得 feign 接口的参数是要写@RequestParam
,因为feign也仅仅是代理,也是要知道参数名称的,还有就是 @RequesstMapping
要写对应接口完整的 uri,最后,@FeignClient
注解这里写的是要调用的服务名称。(其实这里已经帮你做了负载均衡,feign 会去服务注册中心获取指定服务的所有实例地址按策略调用
到这里其实已经完成负载均衡,那么问题来了,如果对应的服务整个都歇菜了或者在做超耗时的任务,每秒的请求数又多,而之前的每一个请求都还没超时,很有可能导致雪崩式的拒绝服务,那是不是有点danger?
所以这里到断路器上场了,类似保险丝一样的东西,要是调用失败或者短时间内超时,那直接跑到对应的处理方法而不是虾等。( 断路器策略可能是 fast-fail ? 反正没看源码不清楚 )
继续给 pox.xml 加菜:
<!-- 断路器 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
然后在启动类加上@EnableCircuitBreaker
注解
其实 feign 本身就集成了断路器,所以也不用做多少,接下来我们对 Testing 接口进行改造。
fallback 参数指定当前接口的断路器,切记 feign 的断路器必须继承对应的接口,并且写上@Component
,feign 也仅仅是去 spring 里找实例而已,本身不会帮你把 fallback
的类实例化。
最后一步最关键,在你的 properties 文件加上feign.hystrix.enabled = true
。在旧版本这个属性默认是 true,新版默认是 false,别百度找 blog 了,那都是旧版本的。
然后先调用 host:port/call/add?a=2&b=1 会有这么个效果。
然后把 SleepCare-TestingServices 关掉再重新访问接口。
看到没,成功走到 fallback 的实例上,说明断路器已经配好并且生效了。
就酱,又愉快地把负载均衡和断路器给配上来了,至于有什么玩法,就看各位玩家啦。