我们就来试一试吧,继续之前的项目。在user-server中,我们引入Ribbon的依赖spring-cloud-starter-netflix-eureka-server。

springcloud使用规范_后端

然后在RestTemplate对象上标注@LoadBalanced注解。RestTemplate对象用于提供服务间调用的功能,而@LoadBalanced注解则使得RestTemplate具有负载均衡的功能,该注解由Ribbon提供,其实现原理可以概括为下面4个步骤:

(1)Ribbon首先根据其所在Zone优先选择一个负载较少的Eureka服务器。

(2)定期从Eureka服务器更新,并过滤服务实例列表。

(3)根据指定的负载均衡策略,从可用的服务实例列表中选择一个。

(4)然后使用该地址,通过Rest客户端进行服务调用。

springcloud使用规范_springcloud使用规范_02

默认情况下,客户端负载均衡采用了轮询策略(RoundRobinRule),也就是说Ribbon会交替访问从Eureka中所获取的用户微服务实例。

二、ribbon + RestTemplate演示


可能看到这里,有的人还是疑惑,Ribbon + RestTemplate到底怎么使用,这里我们就来用具体代码演示一下。

在开始代码之前,我们做一个设定,我们给每个用户添加一个属性——喜欢的书籍,即在User实体中,用likes字段记录书籍的id,体现在UserVo中,我们又增加了private List books字段,用于存放书籍信息,通过likes存放的书籍id,我们可以在book-server中查到相对应书籍的信息。

【一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义】

浏览器打开:qq.cn.hn/FTf 开源分享

2908.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1NpbXBsZV9ZYW5nZ2Vy,size_16,color_FFFFFF,t_30)

然后我们为UserApi增加了findUserRibbon方法,该方法用于展示Ribbon + RestTemplate的服务间调用。

springcloud使用规范_java_03

这个方法,粗略一看,似乎和普通的mvc方法并没有什么不同,但似乎又有点儿不对劲。可能细心的你已经发现了,书籍信息BookVo不是存在于book-server吗,那ribbonService.findByIds(user.getLikes())又是怎么获取到book-server的数据的呢?

springcloud使用规范_springcloud使用规范_04

可以看到,只需要注入RestTemplate对象,通过RestTemplate提供的api,我们可以调用其他服务的接口,其中http://book-server/book中,我们已经指明我们要调用的是book-server,而不用具体ip地址,并且因为Ribbon,此时的调用具有负载均衡的功能。至于该方法上@HystrixCommand注解,暂时不用关心,我们稍后会说明。而在book-server中,book/ids不过是一个普通的mvc方法。

springcloud使用规范_后端_05

现在我们分别启动eureka-server、user-server、book-server,为了测试负载均衡,这里我们需要启动至少两个book-server客户端,那怎么启动两个呢,我们可以更改book-server的端口,然后分别打成jar包启动,也可以直接复制项目,更改端口进行启动。

这里我们使用jar包启动,分别准备了端口为18030与18031的jar,启动完成后,在我们的Eureka注册中心,我们可以看到服务已经成功注册到服务列表上了,且book-server有两个服务实例。

springcloud使用规范_springcloud使用规范_06

接下来我们调用swagger-ui对刚刚的接口进行测试,可以看到接口能够正常返回,并且书籍的信息也可以查询到(需要事先插入关联数据)。

springcloud使用规范_java_07

而我们多次调用,也会发现,18030和18031端口的日志输出打印上,他们是交替执行的,这说明我们的负载均衡也起到了作用。我们试着停止其中一个端口,可以发现功能依然不受影响。

springcloud使用规范_java_08

但是万一极端情况的出现,多个book-server都挂掉了,那这个时候,因为连接问题,程序必然异常,这或许并不是我们所希望的,于是这是轮到Spring Cloud的另一个组件Hystrix登场了。

三、断路器Hystrix


在微服务架构中,为了保证其高可用,单个服务通常会集群部署。由于网络原因或者自身的原因,服务并不能保证100%可用,如果单个服务出现问题,调用这个服务就会出现线程阻塞,此时若有大量的请求涌入,Servlet容器的线程资源会被消耗完毕,导致服务瘫痪。服务与服务之间的依赖性,故障会传播,会对整个微服务系统造成灾难性的严重后果,这就是服务故障的“雪崩”效应。

为了解决这个问题,业界提出了断路器模型。

Netflix开源了Hystrix组件,实现了断路器模式,Spring Cloud对这一组件进行了整合,通过该组件,可以为我们解决以下问题:

·对第三方接口/依赖服务潜在的调用失败提供保护和控制机制。

·在分布式系统中隔离资源,降低耦合,防止服务之间相互调用而导致级连失败;

·快速失败及迅速恢复。

·在合适的时机对服务进行优雅降级处理。

·对服务提供近乎实时的监控、报警和控制操作。