SpringCloud Ribbon 客户端负载均衡原理
1. Ribbon实现负载均衡
相比于nginx, nginx是在服务端进行赋值均衡,由nginx服务器通过负载均衡算法获取到某个服务提供者的节点后,再将请求转发到该节点,而ribbon是在客户端进行负载均衡,也就是服务的调用方,获取到服务的提供者的地址列表,通过某种负载均衡算法,选择其中一个服务提供者节点进行服务调用, 下面通过两个项目来学习Ribbon 负载均衡的实现以及原理;
- Ribbon实现负载均衡的两种方式
通过LoadBalancerClient 实现负载均衡
通过@LoadBalanced注解实现负载均衡
- 创建两个项目order-service user-service,一个作为服务提供者,一个作为服务消费者
服务提供者order-service:
配置文件application.properties文件中配置端口号: server.port=8080 ,启动服务,然后修改端口号为8082,再启动一个服务,这样就得到了一个服务提供者的集群
服务消费者user-service:
package com.gupaoedu.springcloud.example.springclouduserservice;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.context.annotation.Bean;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
@RestController
public class UserController {
@Autowired
RestTemplate restTemplate;
@Bean
public RestTemplate restTemplate(RestTemplateBuilder restTemplateBuilder){
return restTemplateBuilder.build();
}
@Autowired
LoadBalancerClient loadBalancerClient;
@GetMapping("/user/{id}")
public String findById(@PathVariable("id")int id){
//TODO
// 调用订单的服务获得订单信息
// HttpClient RestTemplate OkHttp JDK HttpUrlConnection
ServiceInstance serviceInstance=loadBalancerClient.choose("spring-cloud-order-service");
String url=String.format("http://%s:%s",serviceInstance.getHost(),serviceInstance.getPort()+"/orders");
return restTemplate.getForObject(url,String.class);
}
}
配置文件: 指定服务消费者端口