本地负载均衡
本地负载均衡器基本的概念:我们的消费者服务从我们的注册中心获取到集群地址列表,缓存到本地,让后本地采用负载均衡策略(轮训、随机、权重、hash等),实现本地的rpc远程的。
本地负载均衡器与Nginx 的区别
- Nginx是客户端所有的请求统一都交给我们的Nginx处理,然后再由Nginx实现负载均衡转发,属于服务器端负载均衡器。
- 本地负载均衡器是从注册中心获取到集群地址列表,本地实现负载均衡算法,既本地负载均衡器。
应用场景:
- Nginx属于服务器负载均衡,应用于Tomcat/Jetty服务器等,
- 本地负载均衡器,应用于在微服务架构中rpc框架中,rest、openfeign、dubbo。
代码改造:
我本地并没有引入ribbon的包,但是springcloud二代默认集成了ribbon
在启动类中添加代码:
| 1 2 3 4 5 6 7 8 9 10 11 | ```
/** * 加上LoadBalanced注解就可以实现我们的本地负载均衡 * * SpringCloud rest或者openfeign客户端默认都是ribbon实现调用 * @return */ @Bean @LoadBalanced public RestTemplate restTemplate(){ return new RestTemplate(); }
| -------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
在order模块中:
| ```
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
``` | ```
/** * @Classname OrderController * @Description * @Date 2020/8/5 3:44 下午 * @Created by jinping */ @RestController public class OrderController { @Autowired private DiscoveryClient discoveryClient; @Autowired private RestTemplate restTemplate; @Autowired private LoadBalancer loadBalancer; /** * 基于ribbon实现本地负载均衡 * @return */ @GetMapping("/orderToRibbonMember") public Object orderToRibbonMember(){ String result = restTemplate.getForObject("http://tinner-member/getUser", String.class); return "订单调用会员返回结果:"+ result; } }
``` |
| -------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
orderToRibbonMember方法省略了之前两步,我们可以通过服务名称直接拿到服务器地址和host,然后让restTemplate通过自身的算法给我们挑选出一个服务器进行服务的调用。
| ```
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
``` | ```
/** * @Classname OrderController * @Description * @Date 2020/8/5 3:44 下午 * @Created by jinping */ @RestController public class OrderController { @Autowired private LoadBalancerClient loadBalancerClient; /** * 默认是default,轮询的算法 * @return */ @GetMapping("/orderByLoadbalancerClient") public Object orderByLoadbalancerClient(){ ServiceInstance result = loadBalancerClient.choose("tinner-member"); return result; } }
``` |
| -------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
以上代码可以看到会给我们返回服务器相关信息

### [](#LoadBalancerClient "LoadBalancerClient")LoadBalancerClient
源码:
| ```
1 2 3 4 5 6 7 8
``` | ```
package org.springframework.cloud.client.loadbalancer; import org.springframework.cloud.client.ServiceInstance; public interface ServiceInstanceChooser { ServiceInstance choose(String serviceId); }
``` |
| ------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
LoadBalancerClient是spring自己实现的一套负载均衡策略器,choose方法通过serviceId拿到所有的服务器列表,然后内部通过默认的轮询策略挑选出一个表服务器返回出去。
| ```
1 2 3
``` | ```
protected Server getServer(ILoadBalancer loadBalancer) { return loadBalancer == null ? null : loadBalancer.chooseServer("default"); }
``` |
| -------------- | -------------------------------------------------------------------------------------------------------------------------------------------------- |