Spring Cloud 核心组件 Ribbon

Spring Cloud 核心组件 Ribbon

  • 作者:DecaMinCow
  • 博客:http://blog.csdn.net/m0_37567301
  • 邮箱:decamincow#gmail.com (#->@)

什么是 Eureka

Ribbon 是 Netflix 发布的负载均衡器。Eureka 一般配合 Ribbon 进行使用,Ribbon 利用从 Eureka 中读取到 服务信息,在调用服务提供者提供的服务时,会根据一定的算法进行负载。

负载均衡策略

负载均衡策略描述
RoundRobinRule:轮询 策略默认超过10次获取到的server都不可用,会返回一个空的server
RandomRule:随机策略如果随机到的server为null或者不可用的话,会while不停的循环选 取
RetryRule:重试策略一定时限内循环重试。默认继承RoundRobinRule,也支持自定义 注入,RetryRule会在每次选取之后,对选举的server进行判断, 是否为null,是否alive,并且在500ms内会不停的选取判断。而 RoundRobinRule失效的策略是超过10次,RandomRule是没有失 效时间的概念,只要serverList没都挂。
BestAvailableRule:最小 连接数策略遍历serverList,选取出可用的且连接数最小的一个server。该算 法里面有一个LoadBalancerStats的成员变量,会存储所有server 的运行状况和连接数。如果选取到的server为null,那么会调用 RoundRobinRule重新选取。1(1) 2(1) 3(1)
AvailabilityFilteringRule: 可用过滤策略扩展了轮询策略,会先通过默认的轮询选取一个server,再去判断 该server是否超时可用,当前连接数是否超限,都成功再返回。
ZoneAvoidanceRule:区 域权衡策略(默认策略)扩展了轮询策略,继承了2个过滤器:ZoneAvoidancePredicate和 AvailabilityPredicate,除了过滤超时和链接数过多的server,还会 过滤掉不符合要求的zone区域里面的所有节点,AWS --ZONE 在一 个区域/机房内的服务实例中轮询

自己练习的 DEMO 核心部分

在上一个博客中的 Eureka demo 基础上做修改,provider 增加了实例,这里就不赘述了,大家复制一份修改一下端口号就好了

因为 ribbon 是客户端负载均衡器,可以理解在 eureka client 的 consumer 部分做相应修改就可以了

consumer 启动类

@SpringBootApplication
@EnableDiscoveryClient
public class AutodeliverApplcation {
    public static void main(String[] args) {
        SpringApplication.run(AutodeliverApplcation.class, args);
    }

	// 增加 @LoadBalanced
    @Bean
    @LoadBalanced
    public RestTemplate getRestTemplate() {
        return new RestTemplate();
    }
}

consumer controller 类

@RestController
@RequestMapping("/autodeliver")
public class AutodeliverController {

    @Autowired
    private RestTemplate restTemplate;

    @Autowired
    private DiscoveryClient discoveryClient;

    // /autodeliver/checkState/1545132
        @GetMapping("/checkState/{userId}")
    public Integer findResumeOpenState(@PathVariable Long userId) {

        // 使用负载均衡的实现方式
        // 这里面第一个 resume 是 provider 的 application name
        String url = "http://resume/resume/openstate/" + userId;
        Integer forObject = restTemplate.getForObject(url, Integer.class);
        System.out.println("======>>从 Eureka 获取的 url:" + url);
        return forObject;

//        // 不适用负载均衡的实现方式
//        // 1, 获取 Eureka 实例列表
//        List<ServiceInstance> serviceInstances = discoveryClient.getInstances("resume");
//        // 2, 选择一个实例,这是负载均衡的过程
//        ServiceInstance serviceInstance = serviceInstances.get(0);
//        // 3, 从元数据取 host port
//        String host = serviceInstance.getHost();
//        int port = serviceInstance.getPort();
//
//        String url = "http://"+ host +":"+ port +"/resume/openstate/" + userId;
//        Integer forObject = restTemplate.getForObject(url, Integer.class);
//        System.out.println("======>>从 Eureka 获取的 url:" + url);
//        return forObject;
    }

    @GetMapping("/instances")
    public List<ServiceInstance> showInfo() {
        return this.discoveryClient.getInstances("resume");
    }
}

consumer 配置文件

server:
  port: 8090
spring:
  application:
    name: autodeliver

eureka:
  client:
    serviceUrl: # eureka server的路径
      defaultZone: http://EurekaServerA:8761/eureka/,http://EurekaServerB:8762/eureka/ #把 eureka 集群中的所有 url 都填写了进来,也可以只写一台,因为各个 eureka server 可以同步注册表
    # 每隔多久拉取一次服务列表
    registry-fetch-interval-seconds: 30
  instance:
    #使用ip注册,否则会使用主机名注册了(此处考虑到对老版本的兼容,新版本经过实验都是ip)
    prefer-ip-address: true #自定义实例显示格式,加上版本号,便于多版本管理,注意是ip-address,早期版本是ipAddress
    instance-id: ${spring.cloud.client.ip-address}:${spring.application.name}:${server.port}:@project.version@

# 根据 application name 修改负载均衡策略,如果全部生效则去掉 resume 便可
resume:
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule #负载策略调整
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值