在实战三中,我们曾说到,我们需要一种机制,可以在访问服务的时候不需要关心IP,并且还能提供类似Nginx的负载均衡的功能,其实在上一篇文章中我们已经使用过spring-cloud的负载均衡功能了,还记得我们在配置restTemplate的时候加的注解吗?

springcloud loadbalance自定义负载均衡策略 springcloud负载均衡配置_微服务

@LoadBalanced就是告诉restTemplate,需要使用负载均衡,并且,在eureka-client消费者消费服务的时候,只能通过@LoadBalanced才能使用eureka-server中的服务application-name来访问服务.eureka中的负载均衡,是借助ribbon来实现的,让我们来试一试.老规矩,通过前面这么多次的实践,我们会发现使用spring-cloud的功能一般有三个步骤:

1.配置maven依赖

2.配置application.properties

3.进行代码编码.

首先配置maven:

springcloud loadbalance自定义负载均衡策略 springcloud负载均衡配置_负载均衡_02

但其实如果使用了eureka,就不需要这个步骤了,因为eureka中已经内置了ribbon了:

springcloud loadbalance自定义负载均衡策略 springcloud负载均衡配置_spring cloud_03

默认情况下,@LoadBalanced的负载均衡策略是轮询,我们使用producer修改代码,启动三个微服务注册到eureka,然后在consumer来验证一下:

springcloud loadbalance自定义负载均衡策略 springcloud负载均衡配置_java_04

可以看到,我们已经注册了三个producer微服务,然后使用consumer来访问一下:

springcloud loadbalance自定义负载均衡策略 springcloud负载均衡配置_微服务_05

再刷新一下:

springcloud loadbalance自定义负载均衡策略 springcloud负载均衡配置_spring_06

再刷新一下:

springcloud loadbalance自定义负载均衡策略 springcloud负载均衡配置_负载均衡_07

再刷新一下:

springcloud loadbalance自定义负载均衡策略 springcloud负载均衡配置_java_08

可以看到,默认情况下采用的是轮询的方式,那么如果我们要自定义负载均衡策略能实现吗?答案当然是可以,自定义负载策略分为两种:
1.全局负载均衡策略
2.针对某个微服务定制个性化的负载均衡策略

全局负载均衡

要实现全局的负载均衡策略很简单,我们只需要如下代码即可:

springcloud loadbalance自定义负载均衡策略 springcloud负载均衡配置_负载均衡_09

然后重启consumer刷新试一试,可以发现,采用的是随机的负载均衡策略.

个性化的负载均衡策略

个性化的负载均衡策略相对于全局负载均衡策略更复杂一些,首先,需要在spring扫描不到的位置,比如和主类不在同一个目录下:

springcloud loadbalance自定义负载均衡策略 springcloud负载均衡配置_微服务_10

然后修改启动类:

springcloud loadbalance自定义负载均衡策略 springcloud负载均衡配置_java_11

如果有多个需要自定义的服务,可以使用@RibbonClients用数组来处理.

那么,如果脱离eureka来使用ribbon还能使用吗?答案当然是可以的,只不过相对而言更复杂,我们需要自己编写代码来实现,比如:

springcloud loadbalance自定义负载均衡策略 springcloud负载均衡配置_负载均衡_12

介绍完了ribbon,下一篇文章,我们会介绍feign接口服务,敬请期待.