zoukankan      html  css  js  c++  java
  • Ribbon 使用入门

    Ribbon 是 Netflix 下的负载均衡项目,在集群中为各个客户端的通信提供支持,主要实现中间层应用程序的负载均衡,提供以下特性:

    • 负载均衡器,可支持插拔式的负载均衡规则
    • 对多种协议提供支持,例如HTTP、TCP
    • 集成了负载均衡功能的客户端

    Ribbon 可以与 Eureka 服务注册中心整合使用,并且被整合到 Spring Cloud Netflix 子项目中。Ribbon 主要有三大模块,模块说明如下:

    • ribbon-core:该模块为Ribbon项目的核心,主要包括负载均衡器接口定义、客户端接口定义、内置的负载均衡实现等API
    • ribbon-eureka:为 Eureka 客户端提供的负载君均衡实现类
    • ribbon-httpclient:对 Apache 的 HttpClient 进行封装,该模块提供了含有负载均衡功能的 REST 客户端

    Ribbon 的负载均衡器主要是与集群中的各个服务器进行通信,因此负载均衡器需要提供维护服务器IP、DNS名称等信息、根据特定逻辑在服务器列表中循环的功能,为了实现这些功能 Ribbon 的负载均衡器提供了以下三大模块:

    • Rule:该组件用于处理从服务器列表中选择那个服务器实例
    • Ping:该组件主要用定时器来确保服务器网络可以连接
    • ServerList:服务器列表,可以通过静态的配置确定负载的服务器,也可以动态指定服务器列表,如果动态指定服务器列表,则会有后台线程来刷新该列表

    在使用 Ribbon 时,可以使用配置也可以使用代码设置配置项,需要使用代码来设置配置项,示例代码如下:

    ConfigurationManager.getConfigInstance()

    .setProperty("MyRibbonClient.ribbon.listOfServers","localhost:8080,localhost:8002");

    如果希望使用配置文件来设置项,在 src/main/resources 目录创建 properties 文件,并在文件中增加配置项,格式如下:

    <client>.<namespace>.<property>=<value>

    其中,<client> 表示为客户的名称,声明配置属于那个客户端,在使用 ClientFactory 时可传入客户端的名称来获取对应的实例;<namespace>为该配置的命名空间,默认为 ribbon;<property>为属性名;<value>为属性值;如果希望对全部客户端生效,则配置格式如下:

    <namespace>.<property>=<value>

       

    Ribbon使用示例

    • 创建项目

      创建 maven 项目,命名为 ribbon-client,并增加 ribbon 依赖,POM.xml 内容如下:

      <?xmlversion="1.0"encoding="UTF-8"?>

      <projectxmlns="http://maven.apache.org/POM/4.0.0"

      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

      xsi:schemaLocation="http://maven.apache.org/POM/4.0.0http://maven.apache.org/xsd/maven-4.0.0.xsd">

      <modelVersion>4.0.0</modelVersion>

      <groupId>org.lixue</groupId>

      <artifactId>ribbon-client</artifactId>

      <version>1.0-SNAPSHOT</version>

      <dependencies>

      <dependency>

      <groupId>com.netflix.ribbon</groupId>

      <artifactId>ribbon</artifactId>

      <version>2.2.2</version>

      </dependency>

      <dependency>

      <groupId>com.netflix.archaius</groupId>

      <artifactId>archaius-core</artifactId>

      <version>0.7.4</version>

      </dependency>

      <dependency>

      <groupId>com.netflix.ribbon</groupId>

      <artifactId>ribbon-loadbalancer</artifactId>

      <version>2.2.2</version>

      </dependency>

      <dependency>

      <groupId>com.netflix.ribbon</groupId>

      <artifactId>ribbon-core</artifactId>

      <version>2.2.2</version>

      </dependency>

      </dependencies>

      </project>

    • 增加配置文件

      src/main/resources 目录创建 ribbon-client.properties 文件,并增加配置项,配置如下:

      MyRibbonClient.ribbon.listOfServers=localhost:8080,localhost:8002

         

    • 增加测试类

      package org.lixue.ribbon.client;

         

      import com.netflix.client.ClientFactory;

      import com.netflix.config.ConfigurationManager;

      import com.netflix.loadbalancer.ILoadBalancer;

      import com.netflix.loadbalancer.IRule;

      import com.netflix.loadbalancer.RoundRobinRule;

      import com.netflix.loadbalancer.Server;

         

      public class RibbonClient{

      public static void main(String[]args)throwsException{

      ConfigurationManager.loadCascadedPropertiesFromResources("ribbon-client");

      ILoadBalancerloadBalancer=ClientFactory.getNamedLoadBalancer("MyRibbonClient");

      Irule chooseRule=new RoundRobinRule();

      chooseRule.setLoadBalancer(loadBalancer);

      for(inti=0;i<10;i++){

      Server server=chooseRule.choose(null);

      System.out.println("request"+server.getHostPort());

      }

      }

      }

         

    • 测试验证

      启动项目,我们代码获取了10次的服务器,地址分别为 localhost:8080 localhost:8002 ,通过输出结果可以发现,使用了轮询调度算法来选择服务器,输出结果如下:

      request localhost:8002

      request localhost:8080

      request localhost:8002

      request localhost:8080

      request localhost:8002

      request localhost:8080

      request localhost:8002

      request localhost:8080

      request localhost:8002

      request localhost:8080

         

  • 相关阅读:
    cocos2dx 3.x 集成protobuf
    Lua面向对象之三:其它一些尝试
    Lua面向对象之二:类继承
    Lua面向对象之一:简单例子
    cocos2dx lua 绑定之二:手动绑定自定义类中的函数
    向量点积、叉积的意义
    cocos2dx lua 绑定之一:自动绑定自定义类中的函数
    Lua和C++交互 学习记录之九:在Lua中以面向对象的方式使用C++注册的类
    Lua和C++交互 学习记录之八:C++类注册为Lua模块
    Lua和C++交互 学习记录之七:C++全局函数注册为Lua模块
  • 原文地址:https://www.cnblogs.com/li3807/p/8889576.html
Copyright © 2011-2022 走看看