一、使用Ribbon实现负载均衡
1、定义:Netflix开源的客户端负载均衡器
2、使用
加依赖
<!-- 负载均衡器 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
启动类添加RestTemplate
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
修改服务调用者
@Autowired
private RestTemplate restTemplate;
@GetMapping("/test")
public String test(){
String test = this.restTemplate.getForObject(
"http://user/test",
String.class
);
return test;
}
二、细粒度配置自定义
1、java代码配置
添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
<version>2.2.5.RELEASE</version>
</dependency>
增加配置类
@Configuration
public class RibbonConfiguration {
@Bean
public IRule ribbonRule(){
return new RandomRule();
}
}
对服务提供者增加配置
@Configuration
@RibbonClient(name="user", configuration = RibbonConfiguration.class)
public class UserRibbonConfiguration {
}
2、属性配置
user:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
三、全局配置
@Configuration
@RibbonClients(defaultConfiguration = RibbonConfiguration.class)
public class RibbonConfiguration {
}
四、扩展
1、支持权重
@Slf4j
public class NacosWeightedRule extends AbstractLoadBalancerRule {
@Autowired
private NacosDiscoveryProperties nacosDiscoveryProperties;
@Override
public void initWithNiwsConfig(IClientConfig iClientConfig) {
}
@Override
public Server choose(Object key) {
BaseLoadBalancer baseLoadBalancer = (BaseLoadBalancer) this.getLoadBalancer();
//想要请求的微服务的名称
String name = baseLoadBalancer.getName();
//拿到服务发现的相关API
NamingService namingService = nacosDiscoveryProperties.namingServiceInstance();
//nacos基于权重算法选择实例
try {
Instance instance = namingService.selectOneHealthyInstance(name);
return NacosServer(instance);
} catch (NacosException e) {
return null;
}
return null;
}
}
2、同集群优先调用
3、基于元数据的版本控制