是一个客户端的负载均衡工具,解决消费者如何均匀的选择提供者,
跨服务调用技术,它和feign的使用基本一致。
使用RestTemplate实现负载均衡,它是调用方的负载均衡
使用RestTemplate有多种方式:这里说明三种
ctrl + shift + t 可以搜索源码中的文件
public class TestApplication {
public static void main(String[] args) {
SpringApplication.run(TestApplication.class, args);
}
@LoadBalanced
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
@Autowired
private RestTemplate restTemplate;
@GetMapping("/test")
public Object test(@RequestParam("id")String id){
Object obj = restTemplate.getForObject("http:/yss/test?id=" + id,Object.class);
return obj;
}
不需要在主函数中添加RestTemplete,这里使用的是choose()
@Autowired
private LoadBalancerClient loadBalancerClient;
@GetMapping("/test")
public Object test(@RequestParam("id")String id){
Object obj = "";
// Object obj = restTemplate.getForObject("http:/yss/test?id=" + id,Object.class);
//方式二:
//选择系统中服务的实例,已经实现了负载均衡,然后调用即可
ServiceInstance instance = loadBalancerClient.choose("服务名");
String url = String.format("http://%s:%s/yss/add?id=" + id,instance.getHost(),instance.getPort());
RestTemplate restTemplate = new RestTemplate();
obj = restTemplate.getForObject(url,Object.class);
return obj;
}
import org.springframework.boot.web.client.RestTemplateBuilder;
public class ServerApplication {
public static void main(String[] args) {
SpringApplication.run(ServerApplication.class, args);
}
@Bean
public RestTemplate restTemplate(RestTemplateBuilder builder) {
return builder.build();
}
}
这种方法和第一种方法一样都是通过execute()方法来初始化一个节点,然后根据节点的ip和port来访问
说明@LoadBalanced配置了LoadBalancerClient(负载均衡器),在原来的基础上进行了加强进入LoadBalancerClient中,可以看到它有三个方法,其中reconstructURI()方法用来重构URL,还有一个execute()方法,这两个方法是为了定义节点的, LoadBalancerClent只有一个实现类RibbonLoadBalancerClient,继承结构:
其中我们在第二种方式使用的choose()方法是实现的ServiceInstanceChooser
进入choose()实现的方法中:这里的serviceId作用是通过服务的id来找到对应的负载均衡
点击getServer(),可以看到这里传递的参数是"default","default"其实代表的就是默认的负载均衡中的轮询机制
然后进入到chooseServer方法中
它使用的是子类BaseLoadBalancer中重写的方法,在这里可以看到”return rule.choose(key);“,我们来看一下rule是什么:
这里"new RoundRobinRule()"就是定义的轮询策略
我们看一下IRule里面:
其实IRule是专门定义负载均衡策略的,其中比如说:RandomRule(随机策略),RoundRobinRule(轮询),WeightedResponseTimeRule(权重),这里使用的是默认的RoundRobinRule,在RoundRobinRule类中会调用查询服务列表的方法,若启动了三个服务,在这里就会获取到三个服务的ip和port
然后再根据轮询来拿到相应的服务信息返回Server也就是方式二中的instance,若使用的是方式一,那么它会调用上面我们说的RibbonLoadBalancerClient类中的reconstructURI()和execute()方法来初始化一个节点,然后根据节点的ip和port来访问
总结:
官方文档:
其中users指的是被调用的服务注册名称,在这里我们只需要配置圈出来的部分就可以,其中"com.netflix.loadbalancer"是不变的,只需要配置后面的类名就可以了,你可以再IRule.java中选择对应的策略类名
策略选择: