zoukankan      html  css  js  c++  java
  • 负载均衡框架 ribbon 一

    Ribbon开源地址:https://github.com/Netflix/ribbon/wiki/Getting-Started

    1.Ribbon简介

     负载均衡框架,支持可插拔式的负载均衡规则
     支持多种协议,如HTTP, UDP等
     提供负载均衡客户端

     2.Ribbon 负载均衡器组件

     一个负载均衡器,至少要提供一下功能:
        要维护各个服务器的IP等信息
        根据特定的逻辑选取服务器

     为了实现基本的负载均衡功能,Ribbon的负载均衡器有三大子模块
      1.Rule
      2.Ping
      3.ServerList

    3. 编写ribbon 接口服务 ribbon-server-test

    (1)导入jar包

    <parent>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-parent</artifactId>
          <version>2.0.2.RELEASE</version>
      </parent>
    
      <dependencies>
        <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-web</artifactId>
          </dependency>
      </dependencies>
    
      <build>
        <pluginManagement>
          <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>                                   
                    <fork>true</fork>
                    <addResources>true</addResources>
                </configuration>
            </plugin>
          </plugins>
        </pluginManagement>
      </build>

    (2)编写测试接口

    public class Person {
    
        private Integer id;
    
        private String name;
    
        private String message;
    
        public Integer getId() {
            return id;
        }
    
        public void setId(Integer id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getMessage() {
            return message;
        }
    
        public void setMessage(String message) {
            this.message = message;
        }
    }
    @RestController
    public class TestController {
    
        @GetMapping(value = "/person")
        public Person getPerson (HttpServletRequest request) {
            Person person = new Person();
            person.setId(1);
            person.setName("delan");
            person.setMessage(request.getRequestURL().toString());
            return person;
        }
    }

    (3)编写启动类(由于要做负载均衡,此处通过动态输入端口,来开启两个服务)

    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.boot.builder.SpringApplicationBuilder;
    
    import java.util.Scanner;
    
    @SpringBootApplication
    public class Application {
        public static void main( String[] args ) {
            Scanner scan = new Scanner(System.in);
            System.out.println("请输入端口号:");
            String port = scan.nextLine();
            new SpringApplicationBuilder(Application.class).properties("server.port="+port).run(args);
        }
    }

    4. 编写ribbon 客户端 ribbon-client-test

    (1)导入jar包

    <parent>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-parent</artifactId>
          <version>2.0.2.RELEASE</version>
      </parent>
    
      <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
    
            <dependency>
                <groupId>com.netflix.ribbon</groupId>
                <artifactId>ribbon-core</artifactId>
                <version>2.3.0</version>
            </dependency>
    
            <dependency>
                <groupId>com.netflix.ribbon</groupId>
                <artifactId>ribbon-httpclient</artifactId>
                <version>2.3.0</version>
            </dependency>
    
            <!--官方文档中 未导入一下包 测试发现编写代码找不到 com.netflix.config.ConfigurationManage-->
            <dependency>
                <groupId>commons-configuration</groupId>
                <artifactId>commons-configuration</artifactId>
                <version>1.10</version>
            </dependency>
    
            <dependency>
                <groupId>com.netflix.ribbon</groupId>
                <artifactId>ribbon-loadbalancer</artifactId>
                <version>2.3.0</version>
            </dependency>
    
            <dependency>
                <groupId>com.google.guava</groupId>
                <artifactId>guava</artifactId>
                <version>18.0</version>
            </dependency>
    
            <dependency>
                <groupId>com.netflix.archaius</groupId>
                <artifactId>archaius-core</artifactId>
                <version>0.7.6</version>
            </dependency>
      </dependencies>
    
      <build>
        <pluginManagement>
          <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>                                   <!--热启动配置-->
                    <fork>true</fork>
                    <addResources>true</addResources>
                </configuration>
            </plugin>
          </plugins>
        </pluginManagement>
      </build>

    (2)编写ribbon客户端测试类

    import com.netflix.client.ClientFactory;
    import com.netflix.client.http.HttpRequest;
    import com.netflix.client.http.HttpResponse;
    import com.netflix.config.ConfigurationManager;
    import com.netflix.niws.client.http.RestClient;
    
    import java.net.URI;
    
    public class TestRibbon {
        public static void main(String[] args) throws Exception{
            //通过properties配置文件导入配置信息
            ConfigurationManager.loadPropertiesFromResources("my-ribbon.properties");
    
            //通过java代码导入配置信息
    //        ConfigurationManager.getConfigInstance().setProperty(
    //                "my-client.ribbon.listOfServers", "localhost:8080, localhost:8081");
    
            RestClient client = (RestClient) ClientFactory.getNamedClient("my-client");
            HttpRequest request = HttpRequest.newBuilder().uri(new URI("/person")).build(); // 3
            for (int i = 0; i < 10; i++)  {
                HttpResponse response = client.executeWithLoadBalancer(request); // 4
                System.out.println("返回结果为 Status code for " + response.getRequestedURI() + "  :" + response.getStatus()+"内容:"+response.getEntity(String.class));
            }
        }
    }

    (3)my-ribbon.properties

    #指定my-client 客户端的服务地址,如果不写my-client则对所有的ribbon客户端生效
    my-client.ribbon.listOfServers = localhost:8080, localhost:8081
  • 相关阅读:
    Thinphp+nginx配置伪静态
    Potyczki Algorythmiczne 2013
    接下来一段时间会对大家进行网络通信的魔鬼训练理解socket
    项目中怎样做技术选型
    面试官问我:你做事仔细吗?
    【编程一生】2021年总结数据可视化技巧
    一个反直觉的sql
    CURD系统怎么做出技术含量惊艳面试官
    深入理解函数式编程
    历史文章分类汇总
  • 原文地址:https://www.cnblogs.com/gyli20170901/p/10069837.html
Copyright © 2011-2022 走看看