客户端负载均衡 Spring Cloud Ribbon(二)使用笔记

服务消费与Ribbon负载均衡

在spring-cloud-demo工程中添加module:demo-service-ribbon
在pom.xml文件中加入依赖:

<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-eureka</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-ribbon</artifactId>
    </dependency>

</dependencies>

在resource目录下增加application.properties文件,添加如下内容:

################## 服务配置 ###############
server.port=9136
spring.application.name=demo-service-ribbon
#注册到注册中心
eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/,http://localhost:8762/eureka/

创建一个启动类:ServiceRibbonApplication.java,添加如下内容:

@SpringBootApplication
@EnableDiscoveryClient
public class ServiceRibbonApplication {

    public static void main(String[] args) {
        SpringApplication.run(ServiceRibbonApplication.class, args);
    }

    @Bean
    @LoadBalanced ////负载均衡配置
    RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

添加Service类:DemoRibbonService.java,添加如下内容:

@Service
public class DemoRibbonService {

    @Autowired
    RestTemplate restTemplate;

    public String port() {
        return restTemplate.getForObject("http://demo-service/port", String.class);
    }
}

添加Controller类:DemoRibbonController.java,添加如下内容:

@RestController
public class DemoRibbonController {

    @Autowired
    DemoRibbonService demoRibbonService;

    @RequestMapping("hello")
    public String port() {
        return demoRibbonService.port();
    }
}

分别使用9806、9807端口运行之前构建的demo-service工程
在运行demo-service-ribbon项目,访问:http://localhost:9136/hello,显示如下:
I am demo-service, I'm from port : 9806
再次访问http://localhost:9136/hello,显示如下:
I am demo-service, I'm from port : 9807

说明demo-service-ribbon工程中加了@LoadBalanced注解的restTemplate在访问demo-service服务时使用了Ribbon的负载均衡功能

Ribbon负载均衡策略配置

Ribbon的负载均衡常用的策略有

  1. RandomRule:从服务列表中随机取一个服务实例

  2. RoundRobinRule:从服务列表中以轮询的方式取实例

  3. RetryRule:根据maxRetryMillis最大重试时间参数在获取服务实例失败时重试获取服务实例

  4. WeightedResponseTimeRule
    该策略是对RoundRobinRule的扩展, 增加了根据实例的运行情况来计算权重, 并根据权重来挑选实例, 以达到更优的分配效

  5. ClientConfigEnabledRoundRobinRule
    这个策略跟RoundRobinRule功能相同,其作用是可以继承这个策略重写choose()方法,当自定义的选择策略无法实施时可以用父类的策略作为备选方案

  6. BestAvailableRule
    该策略继承自ClientConfigEnabledRoundRobinRule, 在实现中它注入了负载均衡器的统计对象LoadBalancerStats , 同时在具体的choose 算法中利用LoadBalancerStats 保存的实例统计信息来选择满足要求的实例。从源码中看出, 它通过遍历负载均衡器中维护的所有服务实例,会过滤掉故障的实例, 并找出并发发请求数最小的一个, 所以该策略的特性是可选出最空闲的实例。

  7. PredicateBasedRule
    一个抽象策略,基于Google Guava Collection过滤条件接口Predicate实现的策略,基本实现的是“先过滤清单, 再轮询选择”
  8. AvailabilityFilteringRule
    基于PredicateBasedRule实现的,使用线性选择,符合条件就使用,不符合条件就找下一个,而不像父类需要遍历所有服务计算再选择
  9. ZoneAvoidanceRule
    待补充。。

具体配置步骤

以配置随机策略为例
在启动类文件ServiceRibbonApplication.java中加入方法:

//新增随机策略
@Bean
public IRule ribbonRule() {
    return new RandomRule();    //这里选择随机策略,对应配置文件
}

分别使用9806、9807端口运行之前构建的demo-service工程
再运行demo-service-ribbon项目,访问:http://localhost:9136/hello,多访问几次就会发现返回的端口就是随机的了
I am demo-service, I'm from port : 9806
I am demo-service, I'm from port : 9807
I am demo-service, I'm from port : 9806
I am demo-service, I'm from port : 9806

猜你喜欢

转载自www.cnblogs.com/yhongyin/p/11183850.html
今日推荐