上一篇 <<<feign和openfeign的区别
下一篇 >>>OpenFeign实现负载均衡代码演示
1.引入依赖包
<!-- springboot 整合web组件,不需要引入ribbon的jar包-->
<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>
2.Bean初始化
//RestTemplate的bean初始化时增加注解@LoadBalanced
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
3.代码直接使用
/**
* 订单调用会员服务,使用时直接使用服务名称即可
*/
@RequestMapping("/orderToLoadBalancerMember")
public String orderToLoadBalancerMember() {
/**RestTemplate不是SpringCloud写的,是Spring内部的,它本身支持http协议调用。*/
String result = restTemplate.getForObject("http://member-service/test", String.class);
return "订单调用会员获取结果:" + result;
}
4.源码分析
4.1 LoadBalanced注解的真实调用
注解里其实是调用了LoadBalancerClient,而这个接口下面有Ribbon负载均衡客户端的实现。
![]()
4.2真正调用的方法
根据serviceId获得其中一个具体Server地址
public ServiceInstance choose(String serviceId) {
Server server = this.getServer(serviceId);
return server == null ? null : new RibbonLoadBalancerClient.RibbonServer(serviceId, server, this.isSecure(server, serviceId), this.serverIntrospector(serviceId).getMetadata(server));
}
调用下来方法:
protected Server getServer(String serviceId) {
return getServer(getLoadBalancer(serviceId));
}
//加载服务对应的地址列表信息
@Override
public <C> C getInstance(String name, Class<C> type) {
C instance = super.getInstance(name, type);
if (instance != null) {
return instance;
}
IClientConfig config = getInstance(name, IClientConfig.class);
return instantiateWithConfig(getContext(name), type, config);
}

//根据地址列表和默认负载均衡策略获取具体的具体数据
protected Server getServer(ILoadBalancer loadBalancer) {
if (loadBalancer == null) {
return null;
}
return loadBalancer.chooseServer("default"); // TODO: better handling of key
}
4.3路由算法

推荐阅读:
<<<本地负载均衡和nginx负载均衡
<<<SpringCloud中负载均衡客户端的使用
<<<如何选择ribbon还是loadbalancer
<<<feign和openfeign的区别
<<<OpenFeign实现负载均衡代码演示
<<<Feign超时配置
网友评论