SpringCloud基于nacos注册中心的三种本地负载均衡实现方式
第一种:采用 RestTemplate + @LoadBalanced注解// 1. 编写配置类将RestTemplate 注册到spring容器中@Bean@LoadBalancedpublic RestTemplate restTemplate() {return new RestTemplate();}// 2.消费者调用@GetMapping(...
·
第一种:
采用 RestTemplate + @LoadBalanced注解
// 1. 编写配置类将RestTemplate 注册到spring容器中
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
// 2.消费者调用
@GetMapping("/restTemplate")
public String restTemplate() {
// url 直接写生产者在nacos中注册的服务名称+方法名即可
String result = restTemplate.getForEntity("http://server-member/getMember",String.class).getBody();
return "restTemplate 方式获取会员服务结果:" + result;
}
第二种:
采用 RestTemplate + LoadBalancerClient
// 1. 编写配置类将RestTemplate 注册到spring容器中
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
// 2. 消费者调用
@GetMapping("/loadBalancerClient")
public String loadBalancerClient() {
// 根据生产者在nacos中注册的服务名称本地通过负载均衡策略获取一个服务实例
ServiceInstance serviceInstance = loadBalancerClient.choose("server-member");
// 此时的url是最终访问服务器的ip+port
String result = restTemplate.getForEntity(serviceInstance.getUri()+"/getMember",String.class).getBody();
return "loadBalancerClient方式获取会员服务结果:" + result;
}
第三种:
采用@EnableFeignClients + @FeignClient
// 1. 启动类增加@EnableFeignClients注解
@SpringBootApplication
@EnableFeignClients
public class OrderApp {
public static void main(String[] args) {
SpringApplication.run(OrderApp.class);
}
}
// 2. 消费者编写MemberServiceFeign 接口(注意接口一定要和生产者的接口一致)
// value为生产者在nacos中注册的服务名称
@FeignClient(value = "server-member")
public interface MemberServiceFeign {
@GetMapping("/getMember")
String getMember(@RequestParam("id") Long id);
}
// 3.MemberServiceFeign 远程调用
@GetMapping("/memberRpc")
public String memberRpc() {
String result = memberServiceFeign.getMember(10L);
return "消费者调用会员服务接口返回结果:" + result;
}
注意:
上述的本地负载均衡都是Robin的默认轮训策略,以下列举Robin负载均衡实现类:
- RoundRobinRule 轮询
- RandomRule 随机
- AvailabilityFilteringRule 会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,还有并发的连接数超过阈值的服务,然后对剩余的服务列表进行轮询
- WeightedResponseTimeRule 权重 根据平均响应时间计算所有服务的权重,响应时间越快服务权重越大被选中的概率越高。
- RetryRule 重试 先按照轮询策略获取服务,如果获取失败则在指定时间内重试,获取可用服务
- BestAvailableRule 选过滤掉多次访问故障而处于断路器跳闸状态的服务,然后选择一个并发量最小的服务
- ZoneAvoidanceRule 符合判断server所在区域的性能和server的可用性选择服
指定默认的负载策略:
//配置类 将IRule 的实现类注册到spring容器中即可
@Bean
public IRule myRule(){
// return new RoundRobinRule();//轮询
// return new RetryRule();//重试
// return new BestAvailableRule();
// return new WeightedResponseTimeRule();// 权重
return new RandomRule();
}
pom.xml
<dependencies>
<!-- springboot 整合web组件-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>0.2.2.RELEASE</version>
</dependency>
<!-- 采用@FeignClient实现rpc调用时引用 -->
<!--
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>2.0.0.RELEASE</version>
</dependency>
-->
</dependencies>
更多推荐
已为社区贡献1条内容
所有评论(0)