Ribbon 客户端负载均衡

写在前面:最好的文档是官网和源码。

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

Ribbon主要模块

  • ribbon-balancer:负载均衡模块,可独立使用。内置的负载均衡算法都在里面,其实也可以自己实现IRule,自定义负载均衡策略
  • ribbon-eureka:集成Eureka的包
  • ribbon-core:核心包。
  • ribbon-httpclient: 基于 Apache HttpClient 封装的REST客户端,集成了 ribbon-balancer 模块。
  • ribbon-transport:基于Netty实现多协议的支持,比如:Http,Tcp,Udp等。
  • ribbon-example:Ribbon代码的使用示例。

Ribbon的单独使用

  • maven依赖
<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>
  • main函数
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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容