这是我参与11月更文挑战的第8天,活动详情查看:2021最后一次更文挑战
学习视频(B站):www.bilibili.com/video/BV1Mt…
GitHub 源码地址:github.com/tyronczt/sp…
简介:
Spring Cloud Ribbon 是一个基于 HTTP 和 TCP 的客户端负载均衡工具,它基于 Netflix Ribbon 实现。通过 Spring Cloud 的封装,可以让我们轻松地将面向服务的 REST 模版请求自动转换成客户端负载均衡的服务调用。
整合ribbon
由于在consumer的pom中已经引入 spring-cloud-starter-alibaba-nacos-discovery
, 它已经引入ribbon:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
<version>2.2.2.RELEASE</version>
<scope>compile</scope>
</dependency>
复制代码
所以只需要在 restTemplate 的 bean 中添加 @LoadBalanced
注解,即可以使用ribbon
@Configuration
public class ConsumerConfig {
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
复制代码
ConsumerController 调用接口,默认采用 轮询 方式
@RestController
public class ConsumerController {
@Autowired
private RestTemplate restTemplate;
@GetMapping("/index")
public String index() {
return "consumer远程调用provier:" + this.restTemplate.getForObject("http://provider/index", String.class);
}
}
复制代码
设置调用方式为 随机【只需在yml配置文件中添加已经定好的规则即可】:
provider:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
复制代码
设置调用方式为 Nacos 权重
@Slf4j
public class NacosWeightedRule extends AbstractLoadBalancerRule {
@Autowired
private NacosDiscoveryProperties nacosDiscoveryProperties;
@Override
public void initWithNiwsConfig(IClientConfig iClientConfig) {
//读取配置文件
}
@Override
public Server choose(Object o) {
ILoadBalancer loadBalancer = this.getLoadBalancer();
BaseLoadBalancer baseLoadBalancer = (BaseLoadBalancer) loadBalancer;
//获取要请求的微服务名称
String name = baseLoadBalancer.getName();
//获取服务发现的相关API
NamingService namingService = nacosDiscoveryProperties.namingServiceInstance();
try {
Instance instance = namingService.selectOneHealthyInstance(name);
log.info("选择的实例是port={},instance={}",instance.getPort(),instance);
return new NacosServer(instance);
} catch (NacosException e) {
e.printStackTrace();
return null;
}
}
}
复制代码