前言

前面在注册中心已经注册了一个服务microservice-springcloud-user,这里我们在microservice-springcloud-movie中通过注册中心调用microservice-springcloud-user用户查询服务,并且实现负载均衡能力。


注意:这里不是直接通过microservice-springcloud-movie调用,是通过Eureka Server。

microservice-springcloud-movie增加eureka client的依赖

1
2
3
4
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>

application.yml增加eureka配置

1
2
3
4
5
6
7
8
9
10
11
12
server:
port: 7901
spring:
application:
name: microservice-springcloud-movie
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka
instance:
prefer-ip-address: true
instanceId: ${spring.application.name}:${vcap.application.instance_id:${spring.application.instance_id:${random.value}}}

MovieController修改

1
2
3
4
@GetMapping("/user/{userId}")
public User getUser(@PathVariable Long userId) {
return restTemplate.getForObject("http://microservice-springcloud-user/sample/" + userId,User.class);
}

这里是通过注册到注册中心的服务名称来调用(microservice-springcloud-user中spring.application.name)。

启动类修改

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@SpringBootApplication
@EnableEurekaClient
public class App
{
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
public static void main( String[] args )
{
SpringApplication.run(App.class,args);
}
}

启动类2处修改:

  • 增加@EnableEurekaClient;
  • RestTemplate增加@LoadBalanced,表示开启客户端负载均衡。

负载均衡测试

  • 1.启动microservice-discovery-eureka;
  • 2.启动microservice-springcloud-user;
  • 3.修改microservice-springcloud-user的application.yml中server.port为其他值(比如7903),再启动microservice-springcloud-user;
  • 4.启动microservice-springcloud-movie
    浏览器输入http://localhost:8761/,可以看到2个user的service。如图:

浏览器输入http://localhost:7901/user/1,看控制台日志
microservice-springcloud-user其中一个打印了查询的SQL,刷新浏览器,可以看到microservice-springcloud-user另外一个打印了查询的SQL。多次执行,都是按顺序依次调用,实现了负载均衡。

Ribbon

springcloud的负载均衡是通过Ribbon实现的,是一个客户端的负载均衡组件,Ribbon实现了客户端的一些负载均衡算法,包括轮询(Round-Robin)、随机选择、最大可用策略等多种策略。
Ribbon负载均衡策略

  • RoundRobinRule: 轮询策略,Ribbon以轮询的方式选择服务器,这个是默认值。所以示例中所启动的两个服务会被循环访问;
  • RandomRule: 随机选择,也就是说Ribbon会随机从服务器列表中选择一个进行访问;
  • BestAvailableRule: 最大可用策略,即先过滤出故障服务器后,选择一个当前并发请求数最小的;
  • WeightedResponseTimeRule: 带有加权的轮询策略,对各个服务器响应时间进行加权处理,然后在采用轮询的方式来获取相应的服务器;
  • AvailabilityFilteringRule: 可用过滤策略,先过滤出故障的或并发请求大于阈值一部分服务实例,然后再以线性轮询的方式从过滤后的实例清单中选出一个;
  • ZoneAvoidanceRule: 区域感知策略,先使用主过滤条件(区域负载器,选择最优区域)对所有实例过滤并返回过滤后的实例清单,依次使用次过滤条件列表中的过滤条件对主过滤条件的结果进行过滤,判断最小过滤数(默认1)和最小过滤百分比(默认0),最后对满足条件的服务器则使用RoundRobinRule(轮询方式)选择一个服务器实例。
    参考:https://www.jianshu.com/p/df9393755a05

Spring Cloud官方文档Ribbon的介绍:http://cloud.spring.io/spring-cloud-static/Edgware.SR1/single/spring-cloud.html#spring-cloud-ribbon


注意:Spring Cloud官方文档中在How to Include Ribbon一节中说,要加入Ribbon的starter依赖。实际上是不需要的,在spring-cloud-dependencies依赖中已经包含了Ribbon的starter。
或者idea模块依赖中也可以看到已经有Ribbon的依赖了。如图: