Ribbon 客户端负载均衡

2019-11-01  本文已影响0人  磨飞
写在前面:最好的文档是官网和源码。

一般来说负载均衡,分俩种。一种属于集中式负载均衡,在服务器和客户端之间提供独立的代理实现负载,有硬件的(如F5),也有软件的(Nginx);一种属于客户端负载均衡,客户端自己根据请求做负载,其实Ribbon就是Netflix开源的一种客户端负载均衡的工具。

Ribbon主要模块

Ribbon的单独使用

<dependency>
      <groupId>com.netflix.ribbon</groupId>
      <artifactId>ribbon</artifactId>
      <version>2.2.5</version>
</dependency>
<dependency>
      <groupId>com.netflix.ribbon</groupId>
      <artifactId>ribbon-core</artifactId>
      <version>2.2.5</version>
</dependency>
<dependency>
      <groupId>com.netflix.ribbon</groupId>
      <artifactId>ribbon-loadbalancer</artifactId>
      <version>2.2.5</version>
</dependency>
<dependency>
      <groupId>io.reactivex</groupId>
      <artifactId>rxjava</artifactId>
      <version>1.0.10</version>
</dependency>
public class RibbonTest {
    public static void main(String[] args) {
        // 服务列表
        List<Server> serverList = Arrays.asList(new Server("localhost", 8081), new Server("localhost", 8083));
        // 构建负载实例
        BaseLoadBalancer loadBalancer = LoadBalancerBuilder.newBuilder().buildFixedServerListLoadBalancer(serverList);
//      loadBalancer.setRule(new RoundRobinRule());
        loadBalancer.setRule(new RandomRule());
        // 调用5次来测试效果
        for (int i = 0; i < 5; i++) {
            String result = LoadBalancerCommand.<String>builder().withLoadBalancer(loadBalancer).build()
                    .submit(new ServerOperation<String>() {
                        public Observable<String> call(Server server) {
                            try {
                                String addr = "http://" + server.getHost() + ":" + server.getPort() + "/house/data?name=";
                                System.out.println("调用地址:" + addr);
                                URL url = new URL(addr);
                                HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                                conn.setRequestMethod("GET");
                                conn.connect();
                                InputStream in = conn.getInputStream();
                                byte[] data = new byte[in.available()];
                                in.read(data);
                                return Observable.just(new String(data));
                            } catch (Exception e) {
                                return Observable.error(e);
                            }
                        }
                    }).toBlocking().first();
            System.out.println("调用结果:" + result);
        }

    }

}
调用地址:http://localhost:8081/house/data?name=
调用结果:Test
调用地址:http://localhost:8083/house/data?name=
调用结果:Test
调用地址:http://localhost:8081/house/data?name=
调用结果:Test
调用地址:http://localhost:8081/house/data?name=
调用结果:Test
调用地址:http://localhost:8081/house/data?name=
调用结果:Test

Ribbon整合Spring Cloud

其实上一章 Eureka 注册中心已经整合了Ribbon了,此次不再赘述。

参考资料

  1. Spring Cloud微服务:入门、实战与进阶-第4章 客户端负载均衡Ribbon
  2. springcloud.cc
上一篇 下一篇

猜你喜欢

热点阅读