美文网首页
springcloud-ribbon

springcloud-ribbon

作者: 王诗林 | 来源:发表于2020-06-08 14:26 被阅读0次

    Ribbon简介

    Ribbon是Netflix发布的负载均衡器,它可以帮我们控制HTTP和TCP客户端的行为。只需为Ribbon配置服务提供者地址列表,Ribbon就可基于负载均衡算法计算出要请求的目标服务地址。

    Ribbon默认为我们提供了很多的负载均衡算法,例如轮询、随机、响应时间加权等——当然,为Ribbon自定义负载均衡算法也非常容易,只需实现 IRule 接口即可。

    Ribbon入门

    新建提供者模块spring-cloud-provider:
    pom:
    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="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.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <parent>
            <groupId>com.example</groupId>
            <artifactId>spring-cloud-wsl</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </parent>
        <groupId>com.example</groupId>
        <artifactId>spring-cloud-provider</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <name>spring-cloud-provider</name>
        <description>Demo project for Spring Cloud Provider</description>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <!-- eureka服务端依赖jar包 -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
            </dependency>
        </dependencies>
    </project>
    
    application.yml配置文件:
    server:
      port: 8880
    spring:
      application:
        name: provider
    #eureka客户端连接配置
    eureka:
      client:
        service-url:
          #注册中心地址
          defaultZone: http://localhost:8761/eureka/
      instance:
        #将ip注册到eureka上
        prefer-ip-address: true
    
    controller:
    @RestController
    public class TestController {
        @Value("${server.port}")
        private String port;
    
        // 注入配置文件上下文
        @Autowired
        private ConfigurableApplicationContext applicationContext;
    
        @GetMapping(value = "/test/{name}")
        public String test(@PathVariable String name) {
            return "success! hello: " + name + " i am from port " + port;
        }
    
        // 从上下文中读取配置
        @GetMapping(value = "/hi")
        public String sayHi() {
            return "Hello " + applicationContext.getEnvironment().getProperty("user.name");
        }
    }
    
    启动spring-cloud-provider模块

    先启动spring-cloud-eureka,再启动spring-cloud-provider


    打开http://localhost:8761/ 红框部分说明已经注册到注册中心
    输入http://localhost:8880/test/wangshilin
    提供者调用成功
    创建消费者模块spring-cloud-consumer-ribbon:
    pom:
    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="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.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <parent>
            <groupId>com.example</groupId>
            <artifactId>spring-cloud-wsl</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </parent>
        <groupId>com.example</groupId>
        <artifactId>spring-cloud-consumer-ribbon</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <name>spring-cloud-consumer-ribbon</name>
        <description>Demo project for Spring Cloud Consumer Ribbon</description>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <!-- eureka客户端依赖jar包 -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
            </dependency>
        </dependencies>
    </project>
    
    配置文件application.yml:
    server:
      port: 8882
    spring:
      application:
        name: consumer-ribbon
    #eureka客户端连接配置
    eureka:
      client:
        service-url:
          #注册中心地址
          defaultZone: http://localhost:8761/eureka/
      instance:
        #将ip注册到eureka上
        prefer-ip-address: true
    
    配置RestTemplate:
    @Configuration
    public class ConsumerConfiguration {
        @Bean
        @LoadBalanced
        public RestTemplate restTemplate() {
            return new RestTemplate();
        }
    }
    
    controller:
    @RestController
    public class TestController {
    
        @Autowired
        private RestTemplate restTemplate;
    
        @Value("${spring.application.name}")
        private String appName;
    
        @GetMapping(value = "/test/app/name")
        public String test() {
            return restTemplate.getForObject("http://provider/test/{name}", String.class, appName);
        }
    }
    
    启动spring-cloud-consumer-ribbon模块:
    启动成功
    浏览器输入地址http://localhost:8882/test/app/name
    先启动eureka、provider模块
    为了测试负载均衡,我们修改provider启动配置

    在Allow parallel run处打√


    修改provider端口号为8881
    再启动provider模块

    目前启动了两个provider模块,一个是8880端口,一个是8881端口

    启动consumer模块:
    浏览器中输入:http://localhost:8882/test/app/name

    刷新浏览器发现端口号变化

    ribbon其实还有很多负载均衡的策略,在此不多说,网上教程一大堆,这里只讲各个模块如何搭建

    相关文章

      网友评论

          本文标题:springcloud-ribbon

          本文链接:https://www.haomeiwen.com/subject/hdlvzhtx.html