Ribbon簡介
參考:https://blog.csdn.net/chengqiuming/article/details/80711168
Ribbon是Netflix發布的負載均衡器,它有助於控制HTTP和TCP的客戶端的行為。為Ribbon配置服務提供者地址后,Ribbon就可基於某種負載均衡算法,自動地幫助服務消費者去請求。Ribbon默認為我們提供了很多負載均衡算法,例如輪詢、隨機等。當然,我們也可為Ribbon實現自定義的負載均衡算法。
在Spring Cloud中,當Ribbon與Eureka配合使用時,Ribbon可自動從Eureka Server獲取服務提供者地址列表,並基於負載均衡算法,請求其中一個服務提供者實例。展示了Ribbon與Eureka配合使用時的架構
客戶端負責均衡
負載均衡又區分了兩種類型:
- 客戶端負載均衡(Ribbon)
服務實例的清單在客戶端,客戶端進行負載均衡算法分配。
(從上面的知識我們已經知道了:客戶端可以從Eureka Server中得到一份服務清單,在發送請求時通過負載均衡算法,在多個服務器之間選擇一個進行訪問) - 服務端負載均衡(Nginx)
服務實例的清單在服務端,服務器進行負載均衡算法分配
客戶端負責均衡ribbon
graph TD
服務消費者-->ribbon
ribbon-->服務清單1
ribbon-->服務清單2
ribbon-->服務清單3
服務清單1-->eureka里的服務1
服務清單2-->eureka里的服務2
服務清單3-->eureka里的服務3
使用
@EnableDiscoveryClient
@SpringBootApplication
public class ConsumerMovieApplication {
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(ConsumerMovieApplication.class, args);
}
}
程序代碼,使用負載均衡
@RestController
public class MovieController {
private static final Logger LOGGER = LoggerFactory.getLogger(MovieController.class);
@Autowired
private RestTemplate restTemplate;
@Autowired
private LoadBalancerClient loadBalancerClient;
@GetMapping("/user/{id}")
public User findById(@PathVariable Long id) {
//VIP:virtual IP
return this.restTemplate.getForObject("http://microservice-provider-user/" + id, User.class);
}
@GetMapping("/log-user-instance")
public void logUserInstance() {
ServiceInstance serviceInstance = this.loadBalancerClient.choose("microservice-provider-user");
// 打印當前選擇的是哪個節點
MovieController.LOGGER.info("{}:{}:{}", serviceInstance.getServiceId(), serviceInstance.getHost(), serviceInstance.getPort());
}
}
配置
server:
port: 8010
spring:
application:
name: microservice-consumer-movie
eureka:
client:
serviceUrl:
defaultZone:http://localhost:8761/eureka/
instance:
prefer-ip-address: true
測試
- 啟動eureka微服務
- 啟動movie-ribbon微服務
- 啟動一個user微服務
- 啟動第二個user微服務
- 觀察eureka的變化