04、第一个Ribbon程序

95 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第4天,点击查看活动详情

04、第一个Ribbon程序

1、Ribbon介绍

1.1、Ribbon简介

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

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

1.2、Ribbon子模块

Ribbon主要有以下三大子模块:

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

1.3、负载均衡组件

Ribbon的负载均衡器主要与集群中的各个服务器进行通讯 负载均衡器主要提供以下基础功能:

维护服务器的IP、DNS名称等信息 根据特定的逻辑在服务器列表中循环 为实现负载均衡的基础功能,Ribbon的负载均衡器有以下三大子模块:

  • Rule:一个逻辑组件,这些逻辑将会决定,从服务器列表中返回哪个服务器实例
  • Ping:该组件主要使用定时器,来确保服务器网络可以连接
  • ServerList:服务器列表,可以通过静态的配置确定负载的服务器,也可以动态指定服务器列表。如果动态指定服务器列表,则会有后台的线程来刷新该列表

编写请求客户端: POM:

<dependency>
    <groupId>com.netflix.ribbon</groupId>
    <artifactId>ribbon-httpclient</artifactId>
</dependency>
<!-- ribbon消费者的依赖 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
    /**
     * 客户端使用了RestClient 在发送请求时,会使用负载均衡器ILoadBalancer接口,根据特定的逻辑来选择服务器。
     */
    @Test
    public void RestClientTest() throws Exception {
        //ConfigurationManager来配置请求的服务器列表
//        ConfigurationManager.getConfigInstance().setProperty("my-client.ribbon.listOfServers",
//                "localhost:9999,localhost:8888");

        //通过配置文件的方式指定 客户端
        ConfigurationManager.loadCascadedPropertiesFromResources("application-ribbon");

        //获取REST请求的客户端
        RestClient client = (RestClient) ClientFactory.getNamedClient("my-client");
        //创建请求实例
        HttpRequest request = HttpRequest.newBuilder().uri("/person/8").build();
        //
        for (int i = 0; i < 6; i++) {
            HttpResponse response = client.executeWithLoadBalancer(request);
            String result = response.getEntity(String.class);
            System.out.println(result);
        }
    }

配置文件指定客户端:

#配置格式   <client>.<nameSpace>.<property>=<value>         支持.yml文件
#其中<client>为客户的名称,声明该配置属于哪一个客户端,在使用 ClientFactory时传入客户端的名称,即可返回对应的“请求客户端”实例 \
#<nameSpace>配置的命名空间,默认为ribbon, <properties> 为属性名,<value>为属性值。
# 如果想对全部客户端生效,可以将客户端名称去掉,直接 <namespace>.<property>的格式进行配置。以下的配置为客户端指定了服务器列表
my-client.ribbon.listOfServers=localhost:8888,localhost:9999