You're the fog or the wind or the pub /not the home .

你是雾是风是酒馆,唯独不是归宿。

 

使用Ribbon做负载均衡

 


通过 Spring Cloud Ribbon 的封装,我们在微服务架构中使用客户端负载均衡调用非常简单,只需要如下两步:


 


 


服务提供者只需要启动多个服务实例并注册到一个注册中心或是多个相关联的服务注册中心。

服务消费者直接通过调用被@LoadBalanced注解修饰过的RestTemplate来实现面向服务的接口调用。

 

 

放到代码当中就是:

Spring Cloud Alibaba微服务从入门到进阶项目源码 spring cloud微服务实战_负载均衡

 

负载均衡通过某种策略调度不同的服务,得到调用的值,同时负责调用管理,注册中心靠它来知道 这个服务有没有挂掉。

 

我们来做个一个测试:

首先开启这个  同时运行一个application的按钮:

Spring Cloud Alibaba微服务从入门到进阶项目源码 spring cloud微服务实战_Server_02

 

然后修改UserApp的配置项,改完一个运行一个:

Spring Cloud Alibaba微服务从入门到进阶项目源码 spring cloud微服务实战_SpringCloud_03

 

 

Spring Cloud Alibaba微服务从入门到进阶项目源码 spring cloud微服务实战_SpringCloud_04

 

 

然后修改UserApp  的  controller 的 返回值:

@Value( "${server.port}" )
    int port;


    @GetMapping("/user/{id}")
    @ResponseBody
    public int getUser(@PathVariable("id") int id){
        if (id == 1){
            return port;
        }else if (id == 2){
            return port;
        }else {
            return  port ;
        }
    }

 

此时一次打开三个服务。You  will find , 不断刷新,传值的端口不断变化。

 

Spring Cloud Alibaba微服务从入门到进阶项目源码 spring cloud微服务实战_SpringCloud_05

Spring Cloud Alibaba微服务从入门到进阶项目源码 spring cloud微服务实战_均衡器_06

 

这是因为,负载均衡在其中做了轮次调用。

 

 

怎么样通过LoadBalance来实行 获得  服务:、

这是LoadBalance的源码:

public interface LoadBalancerClient extends ServiceInstanceChooser { 
        <T> T execute(String var1, LoadBalancerRequest<T> var2) throws IOException; // 从负载均衡器中挑选出的服务实例来执行请求内容。
        <T> T execute(String var1, ServiceInstance var2, LoadBalancerRequest<T> var3) throws IOException; // 为了给一些系统使用,创建一个带有真实host和port的URI。 // 一些系统使用带有原服务名代替host的URI,比如http://myservice/path/to/service。 // 该方法会从服务实例中取出host:port来替换这个服务名。
        URI reconstructURI(ServiceInstance var1, URI var2);
    }

可以看出:

LoadBalance可以做到

// 获取负载均衡策略
ILoadBalancer loadBalancer = getLoadBalancer(serviceId);
 // 根据负载均衡策略,获取一个服务器 
Server server = getServer(loadBalancer);

还可以做到:

public interface ILoadBalancer { 
        //向负载均衡器的实例列表中增加实例
        public void addServers(List<Server> newServers); //通过某种策略,从负载均衡器中选择一个具体的实例 
        public Server chooseServer(Object key); //用来通知和标识负载均衡器中某个具体实例已经停止服务,不然负载均衡器在下一次获取服务实例清单前都会认为服 务实例均是正常服务的。
        public void markServerDown(Server server); //获取正常服务列表
        public List<Server> getReachableServers(); //所有已知实例列表
        public List<Server> getAllServers(); 
    }

 

最后还可以做到:

转换 从 URI 到 host的地址

 

我们还可以对负载均衡的策略进行设置

 

application.yml

txy-user:
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RoundRobinRule

 

一共可以设置成多少种策略呢。

反正我知道默认的是轮次查询,上面那个是也是 轮次,可以设置随机 ,也可以设置其他 。具体的可以百度看看