源码地址: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.
访问地址:http://localhost:8010/movie/1
可以看出服务之间调用成功。
再进一步,我们开启两个Eureka Client服务提供者,测试负载均衡效果:
我执行了三次服务消费请求:http://localhost:8010/movie/1
然后看两个服务提供者后台日志:一个调用了2次,一个调用了1一次。
我们想个办法,让日志更明显一些。完善服务消费者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);
}
}
再次执行多次服务消费请求:看服务消费者日志输出效果:
可以明显看出来,负载均衡的随机调用效果。
这里扩展一下负载均衡的策略,在服务消费者Client配置文件中,可以定义负载均衡策略。默认就是随机效果。
provider-user:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
比较常见的就是RoundRobinRule轮训策略,还有RandomRule随机策略。
源码下载地址:SpringCloud+Eureka+Ribbon实践Demo
我在微信订阅号等你!