spring cloud-ribbon

我们在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访问服务提供者的服务:

@RestController
public 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:

@Autowired
private 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
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值