Ribbon用于负载均衡
运行微服务的一个实例,URL是硬编码在客户端中,以及服务与服务间的调用中。现实情况中,此办法不
妥,因为服务的实例可以有多个,此时,我们应当使用一个load balancer或一个本地DNS服务器来抽象
掉实际实例的位置,在客户端中配置的就应该是一个别名或load balancer的地址。load balancer
之后接收到别名,将其解析成可用实例中的一个。用此方式,我们就能配置许多实例,它还帮助处理
服务器失败问题,这对于客户端来说是透明的。
上面说的主意可以用Spring Cloud Netflix Ribbon来实现。Ribbon是一个客户端load balancer,
它可以在一组服务器上执行round-robin load balancing。Ribbon库也可以有其他负载均衡算法。
Spring Cloud提供来一种声明的方式来配置和使用Ribbon client。
如上图所示,Ribbon客户端从Config服务器获取所有可用微服务实例的一个列表,并且,默认运用
round-robin负载均衡算法。
为了使用Ribbon客户端,需添加如下maven依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>
修改Booking微服务配置文件,booking-service.properties,添加一个新的属性用来配置
一组Fare微服务:
fares-proxy.ribbon.listOfServers=localhost:8080,localhost:8081
此时要修改原先的FareServiceProxy类,以便使用Ribbon客户端,注意到原先@RequestMapping
中的value需要从/get改成/fares/get,这样的话,就很容易把host name和port移到配置文件中:
@FeignClient(name="fares-proxy")
@RibbonClient(name="fares")
public interface FareServiceProxy {
@RequestMapping(value = "fares/get", method=RequestMethod.GET)
这个时候,我们就能运行2个Fares微服务实例,一个在8080,一个在8081:
java -jar -Dserver.port=8080 fares-1.0.jar
java -jar -Dserver.port=8081 fares-1.0.jar
运行Booking微服务,当它启动时,它的CommandLineRunner会自动插入一个booking记录,这会走
第一个服务器。
当运行website项目,它调用Booking服务,该请求走第2个服务器。