客户端负载均衡
客户端负载均衡就是服务端负载均衡而言的。
服务端负载均衡:就是传统的Nginx的方式,用Nginx做负载均衡,我们称之为服务端负载均衡。
这种负载均衡,我们称为服务器负载均衡,它的特点是,就是调用的客户端不知道具体是哪一个server提供的服务,他也不关心,反正请求发送给Nginx,Nginx再将请求转发给服务器,客户端只需要记住Nginx的地址即可。
客户端负载均衡则是另外一种情形:
客户端负载均衡,就是调用客户端本身所知道所有的Server的详细信息的,当需要调用Server上的接口时,客户端从自身所维护的Server列表中,根据提前配置好的负载均衡策略,自己挑选一个Server来调用,此时,客户端知道他所调用的是哪一个Server。
在RestTemplate中,要想使用负载均衡功能,只需要在RestTemplate实例上添加一个@LoadBalanced注解即可,此时,RestTemplate就会自动具备负载均衡功能,这就是客户端负载均衡。
负载均衡的原理:
在Spring Coloud中,实现负载均衡很容易,只需要添加上@LoadBalanced注解即可,只要添加了该注解,一个原本普普通通的做Rest请求的工具,RestTemplate就具备了负载均衡的功能,这是怎么实现的呢?
整体上来说,这个功能的实现主要分为三个核心点:
1、从Eureka Client本地缓存的服务注册信息中,选择一个可以调用的服务
2、根据 1 中所选的服务,重构URL地址
3、将 1、 2、的功能嵌入到RestTemplate中
在RestTemplate实例上添加@LoadBalanced注解,我们进入注解中看一下
它的介绍,标记要配置为使用LoadBalancerClient的restemplate,也就是说,凡是加了@LoadBalanced注解的bean会自动配置一个LoadBalancerClient,那LoadBalancerClient又是什么呢?我们来搜索一下
我们可以看到,这个接口中有三个方法,execute是要执行的方法,那么reconstructURI这个方法,就是要重构URI,就是把restTemplate.getForObject(“http://provider/hello”, String.class);这个地址给你重构成为一个真正可以调用的地址,将provider替换成ip:端口号;
另外,我们看到这个接口继承了ServiceInstanceChooser接口;
那么choose方法就是选择可以调用的实例,返回了一个ServiceInstance,书不是感觉很熟悉