推荐阅读: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
复制代码
参考: