SpringCloud框架初探(五): Eureka Client客户端相互调用

源码地址:SpringCloud学习源码

前面已经讲了Eureka注册中心服务器已经客户端的搭建,接下来通过一个例子,来实现Eureka client微服务之间的调用。
RestTemplate需要配合@LoadBalanced才能通过服务名spring.application.name解析到具体的服务上。

Ribbon在Netflix组件是非常重要的一个组件,在Zuul中使用Ribbon做负载均衡,以及Feign组件的结合等。在Spring Cloud 中,作为开发中,做的最多的可能是将RestTemplate和Ribbon相结合:

@SpringBootApplication
@EnableEurekaClient
public class ConsumerMovieRibbonApplication {

  @Bean
  @LoadBalanced
  public RestTemplate restTemplate() {
    return new RestTemplate();
  }

  public static void main(String[] args) {
    SpringApplication.run(ConsumerMovieRibbonApplication.class, args);
  }
}

消费一个服务接口,可以这样写:

@RestController
public class MovieController {
  @Autowired
  private RestTemplate restTemplate;

  @GetMapping("/movie/{id}")
  public User findById(@PathVariable Long id) {
    return this.restTemplate.getForObject("http://provider-user/simple/" + id, User.class);
  }

}

对应的服务提供者定义:

@RestController
public class UserController {

  @Autowired
  private UserService userService;

  @GetMapping("/simple/{id}")
  public User findById(@PathVariable Long id) {
    return this.userService.findOne(id);
  }

}

启动Eureka Server,启动服务提供者Eureka Client 1,启动服务消费者Eureka Client2.
SpringCloud框架初探(五): Eureka Client客户端相互调用_第1张图片

访问地址:http://localhost:8010/movie/1

SpringCloud框架初探(五): Eureka Client客户端相互调用_第2张图片

可以看出服务之间调用成功。

再进一步,我们开启两个Eureka Client服务提供者,测试负载均衡效果:

SpringCloud框架初探(五): Eureka Client客户端相互调用_第3张图片

我执行了三次服务消费请求:http://localhost:8010/movie/1

然后看两个服务提供者后台日志:一个调用了2次,一个调用了1一次。

SpringCloud框架初探(五): Eureka Client客户端相互调用_第4张图片

SpringCloud框架初探(五): Eureka Client客户端相互调用_第5张图片

我们想个办法,让日志更明显一些。完善服务消费者Client:增加loadBalancerClient日志打印。

@RestController
public class MovieController {
  @Autowired
  private RestTemplate restTemplate;
  @Autowired
  private LoadBalancerClient loadBalancerClient;

  @GetMapping("/movie/{id}")
  public User findById(@PathVariable Long id) {
    ServiceInstance serviceInstance = this.loadBalancerClient.choose("provider-user");
    System.out.println("===" + ":" + serviceInstance.getServiceId() + ":" + serviceInstance.getHost() + ":" + serviceInstance.getPort());
    return this.restTemplate.getForObject("http://provider-user/simple/" + id, User.class);
  }
}

再次执行多次服务消费请求:看服务消费者日志输出效果:

SpringCloud框架初探(五): Eureka Client客户端相互调用_第6张图片

可以明显看出来,负载均衡的随机调用效果。

这里扩展一下负载均衡的策略,在服务消费者Client配置文件中,可以定义负载均衡策略。默认就是随机效果。

provider-user:
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

比较常见的就是RoundRobinRule轮训策略,还有RandomRule随机策略。

源码下载地址:SpringCloud+Eureka+Ribbon实践Demo

我在微信订阅号等你!
这里写图片描述

你可能感兴趣的:(SpringCloud框架初探)