spring cloud-ribbon

来源:互联网 发布:美工需要具备什么条件 编辑:程序博客网 时间:2024/06/06 03:59

我们在spring cloud-feign中提到,本篇我们将使用eureka+feign+ribbon搭建微服务的负载均衡。
ribbon是netflix发布的云中间层服务开源项目,其主要功能是提供客户端软件负载均衡算法,将netflix的中间层服务连接在一起。
eureka负责云端负载均衡,用于服务注册与发现,详情参考spring cloud-eureka。
我们用一张图展示ribbon和eureka的关系:
ribbion+eureka
通过上图我们发现,服务提供者把服务实例注册到eureka server,服务消费者获得可用服务列表,然后通过ribbon组件进行负载均衡服务请求。
如果没有ribbon,我们会用nginx或LVS搭建微服务的负载均衡,下面我们讲解如何使用ribbon实现微服务负载均衡的。
我们首先启动eureka服务,然后启动microservice-provider-user多个服务提供者实例,多个服务提供者实例的application name是相同的,统一为microservice-provider-user,唯一不同的是端口号。
eureka和服务提供者实例启动后,重头戏演示服务消费者如何使用ribbon实现负载均衡请求:
1.我们需要在服务消费者的main程序用@RibbonClient注解定义服务提供者实例的application name:

@SpringBootApplication@EnableEurekaClient@RibbonClient(name = "microservice-provider-user", configuration = TestConfiguration.class)@ComponentScan(excludeFilters = { @ComponentScan.Filter(type = FilterType.ANNOTATION, value = ExcludeFromComponentScan.class) })public class ConsumerMovieRibbonApplication {  @Bean  @LoadBalanced  public RestTemplate restTemplate() {    return new RestTemplate();  }  public static void main(String[] args) {    SpringApplication.run(ConsumerMovieRibbonApplication.class, args);  }}

2.我们在业务的Controller通过application name访问服务提供者的服务:

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

到此,我们便用ribbon实现了对服务提供者实例的负载均衡请求。
也许我们会有疑问,我们怎么知道服务消费者是负载均衡调用的服务提供者的服务呢?
为了解答上述疑问,我们使用LoadBalancerClient获得每次请求服务的host和port:

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

我们多次刷新findById接口,控制台输出不同的host、port,则证明ribbon实现了对服务的负载均衡请求。

0 0