推薦閱讀:html
SpringCloud源碼閱讀0-SpringCloud必備知識java
SpringCloud源碼閱讀1-EurekaServer源碼的祕密算法
SpringCloud源碼閱讀2-Eureka客戶端的祕密spring
負載均衡提供客戶端的軟件負載均衡算法,理解一種負載均衡的內部結構,對理解其餘種類負載均衡意義非凡。api
負載均衡組件包括:緩存
Spring Cloud Ribbon 是對 Netflix Ribbon的封裝。服務器
Spring Cloud Ribbon 默認狀況下爲Ribbon核心組件提供以下的實現: app
對個別微服務,咱們想替換其個別組件,怎麼辦?負載均衡
1.使用@RibbonClient 指定替換請求哪些服務的哪些組件。微服務
@Configuration
@RibbonClient(name = "user", configuration = UserConfiguration.class)
public class UserRibbonConfiguration {
}
@Configuration
protected static class UserConfiguration{
@Bean
public IPing ribbonPing() {
return new MyPingUrl();
}
}
複製代碼
使用MyPingUrl 替換user對應的服務的Ribbon 客戶端 中的IPing 組件。
注意: 須要說明的是自定義的類必須加上@Configuration註解且不能包含在@componentscan註解掃描的包中,不然自定義的類將由全部加@ribbonclient註解的地方共享,若用@ComponentScan(或@SpringBootApplication),應該採起措施來避免它被包含到掃描的範圍中。
2.使用屬性配置替換 從1.2.0版本開始,Spring Cloud Netflix支持自定義Ribbon客戶端配置 支持配置的屬性以下:
在這些屬性中定義的類優先於使用@RibbonClient()定義的bean和由Spring Cloud Netflix提供的默認值
例如: application.yml.
users:
ribbon:
NIWSServerListClassName: com.netflix.loadbalancer.ConfigurationBasedServerList
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.WeightedResponseTimeRule
複製代碼
替換users服務客戶端對應的 ServerList 與LoadBalancerRule 組件
當咱們想替換全部客戶端的某個組件時,@RibbonClient就顯的力不從心了。
@RibbonClients註解用於覆蓋全部客戶端配置。
@RibbonClients(defaultConfiguration = DefaultRibbonConfig.class)
public class RibbonClientDefaultConfigurationTestsConfig {
public static class BazServiceList extends ConfigurationBasedServerList {
public BazServiceList(IClientConfig config) {
super.initWithNiwsConfig(config);
}
}
}
@Configuration
class DefaultRibbonConfig {
@Bean
public IRule ribbonRule() {
return new BestAvailableRule();
}
@Bean
public IPing ribbonPing() {
return new PingUrl();
}
@Bean
public ServerList<Server> ribbonServerList(IClientConfig config) {
return new RibbonClientDefaultConfigurationTestsConfig.BazServiceList(config);
}
@Bean
public ServerListSubsetFilter serverListFilter() {
ServerListSubsetFilter filter = new ServerListSubsetFilter();
return filter;
}
}
複製代碼
當與Eureka一同使用時,部分組件被替換:
若是沒有其餘的區域數據源,則基於客戶端配置(與實例配置相反)進行猜想。咱們將eureka.client.availabilityZones(從區域名稱映射到區域列表),並將實例本身的區域的第一個區域(即eureka.client.region,其默認爲「us-east-1」爲與本機Netflix的兼容性)。
如何使用呢:
@LoadBalanced
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
複製代碼
public class MyClass {
@Autowired
private LoadBalancerClient loadBalancer;
public void doStuff() {
ServiceInstance instance = loadBalancer.choose("stores");
URI storesUri = URI.create(String.format("http://%s:%s", instance.getHost(), instance.getPort()));
// ... do something with the URI
}
}
複製代碼
當咱們單獨使用Ribbon的時候,能夠經過禁止Eureka來使用。
application.yml.
ribbon:
eureka:
enabled: false
複製代碼
所謂緩存Ribbon配置,其實就是飢餓加載(eager-load)模式。 Ribbon在第一次啓動時,由於須要從註冊中心獲取服務列表。通常建立比較慢,針對這種狀況。 能夠經過飢餓模式來,加速客戶端上下文的建立。
application.yml
ribbon:
eager-load:
enabled: true
clients: client1, client2, client3
複製代碼
參考: