負載均衡Ribbon
實際環境中,我們往往會開啓很多個bubbletg-provider的集羣。此時我們獲取的服務列表中就會有多個,到底該訪問哪一個呢?
一般這種情況下我們就需要編寫負載均衡算法,在多個實例列表中進行選擇。
不過Eureka中已經幫我們集成了負載均衡組件:Ribbon,簡單修改代碼即可使用。
啓動兩個服務實例
Eureka監控面板:
開啓負載均衡
因爲Eureka中已經集成了Ribbon,所以我們無需引入新的依賴,直接修改代碼。
修改bubbletg-consumer的引導類,在RestTemplate的配置方法上添加@LoadBalanced
註解:
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
修改調用方式,不再手動獲取ip和端口,而是直接通過服務名稱調用:
@Controller
@RequestMapping("consumer/user")
public class UserController {
@Autowired
private RestTemplate restTemplate;
//@Autowired
//private DiscoveryClient discoveryClient; // 注入discoveryClient,通過該客戶端獲取服務列表
@GetMapping
@ResponseBody
public User queryUserById(@RequestParam("id") Long id){
// 通過client獲取服務提供方的服務列表,這裏我們只有一個
// ServiceInstance instance = discoveryClient.getInstances("service-provider").get(0);
String baseUrl = "http://service-provider/user/" + id;
User user = this.restTemplate.getForObject(baseUrl, User.class);
return user;
}
}
訪問頁面,查看結果:
負載均衡策略
Ribbon默認的負載均衡策略是簡單的輪詢,我們可以測試一下:
package cn.bubbletg.service;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.netflix.ribbon.RibbonLoadBalancerClient;
import org.springframework.test.context.junit4.SpringRunner;
/**
* @author www.bubbletg.cn * BubbleTg
* @version 1.0
* @date 2019/8/24 1:00
*/
@RunWith(SpringRunner.class)
@SpringBootTest(classes = ServiceConsumerApplication.class)
public class LoadBalanceTest {
@Autowired
private RibbonLoadBalancerClient client;
@Test
public void testLoadBalance(){
for (int i = 0; i < 100; i++) {
ServiceInstance instance = this.client.choose("service-provider");
System.out.println(instance.getHost() + ":" +instance.getPort());
}
}
}
我們是否可以修改負載均衡的策略呢?
SpringBoot也幫我們提供了修改負載均衡規則的配置入口,在bubbletg-consumer的application.yml中添加如下配置:
server:
port: 80
spring:
application:
name: service-consumer
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10086/eureka
service-provider:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
格式是:{服務名稱}.ribbon.NFLoadBalancerRuleClassName
,值就是IRule的實現類。
再次測試:,發現結果變成了隨機:
以上即是負載均衡實戰了。