一、服务实例列表ServerList

服务实例列表(ServerList)为负载均衡器(Loadbalancer)提供服务的可用实例列表。

负载均衡器(Loadbalancer)通过服务实例列表(ServerList)从注册中心(register)或者配置文件(yaml或properties)上读取全部服务实例(server),然后以服务实例过滤器(ServerListFilter)的过滤方式进行筛选留下满足条件的服务实例,进而借助负载均衡策略(IRule)选择出一个合适的服务实例。

二、ServerList实现类

NacosServerList   nacos服务发现提供的ServerList

ConfigurationBasedServerList   从配置文件读取静态的服务实例定义

StaticServerList  静态ServerList创建包含不变的服务实例(server)

三、具体代码实现

(1)NacosServerList

public class NacosServerList extends AbstractServerList<NacosServer> {private NacosDiscoveryProperties discoveryProperties;private String serviceId;public NacosServerList(NacosDiscoveryProperties discoveryProperties) {this.discoveryProperties = discoveryProperties;}@Overridepublic List<NacosServer> getInitialListOfServers() {return getServers();}@Overridepublic List<NacosServer> getUpdatedListOfServers() {return getServers();}private List<NacosServer> getServers() {try {List<Instance> instances = discoveryProperties.namingServiceInstance().selectInstances(serviceId, true);return instancesToServerList(instances);}catch (Exception e) {throw new IllegalStateException("Can not get service instances from nacos, serviceId=" + serviceId,e);}}private List<NacosServer> instancesToServerList(List<Instance> instances) {List<NacosServer> result = new ArrayList<>();if (null == instances) {return result;}for (Instance instance : instances) {result.add(new NacosServer(instance));}return result;}public String getServiceId() {return serviceId;}@Overridepublic void initWithNiwsConfig(IClientConfig iClientConfig) {this.serviceId = iClientConfig.getClientName();}
}

(2)ConfigurationBasedServerList

public class ConfigurationBasedServerList extends AbstractServerList<Server>  {private IClientConfig clientConfig;@Overridepublic List<Server> getInitialListOfServers() {return getUpdatedListOfServers();}@Overridepublic List<Server> getUpdatedListOfServers() {String listOfServers = clientConfig.get(CommonClientConfigKey.ListOfServers);return derive(listOfServers);}@Overridepublic void initWithNiwsConfig(IClientConfig clientConfig) {this.clientConfig = clientConfig;}protected List<Server> derive(String value) {List<Server> list = Lists.newArrayList();if (!Strings.isNullOrEmpty(value)) {for (String s: value.split(",")) {list.add(new Server(s.trim()));}}return list;}
}

(3)StaticServerList

public class StaticServerList<T extends Server> implements ServerList<T> {private final List<T> servers;public StaticServerList(T... servers) {this.servers = Arrays.asList(servers);}@Overridepublic List<T> getInitialListOfServers() {return servers;}@Overridepublic List<T> getUpdatedListOfServers() {return servers;}}

SpringCloud Ribbon(五)之服务实例列表ServerList相关推荐

  1. SpringCloud Ribbon(六)之服务实例过滤器ServerListFilter

    一.服务实例过滤器ServerListFilter 服务实例过滤器(ServerListFilter)为负载均衡器(Loadbalancer)提供从服务实例列表(ServerList)获取的服务实例过 ...

  2. 史上最简单的SpringCloud教程 | 第二篇: 服务消费者(rest+ribbon)

    转载请标明出处: https://www.fangzhipeng.com/springcloud/2017/07/12/sc02-rest-ribbon/ 本文出自方志朋的博客 最新Finchley版 ...

  3. SpringCloud 教程 | 第二篇: 服务消费者(rest+ribbon)

    转载请标明出处: blog.csdn.net/forezp/arti- 本文出自方志朋的博客 在上一篇文章,讲了服务的注册和发现.在服务架构中,业务都会被拆分成一个独立的服务,服务与服务的通讯是基于h ...

  4. springcloud ribbon @LoadBalance负载均衡源码流程分析

    一.编写示例 1.服务端 pom.xml <properties><java.version>1.8</java.version><spring-cloud. ...

  5. spring eureka 服务实例实现快速下线快速感知快速刷新配置解析

    背景 默认的Spring Eureka服务器,服务提供者和服务调用者配置不够灵敏,总是服务提供者在停掉很久之后,服务调用者很长时间并没有感知到变化.或者是服务已经注册上去了,但是服务调用方很长时间还是 ...

  6. SpringCloud(三) Eureka之服务注册发现以及实现工程间调用

    概述:本章节将介绍Eureka客户端如何与EurekaServer端链接,以及生产者工程如何将服务注册到Eureka注册中心中去,消费者工程怎么从EurekaServer端获取生产者工程的服务地址,并 ...

  7. 通过ribbon 根据服务名获取所有服务实例的IP和端口列表

    代码使用SpringCloud版本E3 业务场景: 今天遇到一个业务场景,要求根据服务名获取当前微服务集群中所有的对应服务实例的IP和端口,通过分析源码推算出了写法. 原理简述: 如果代码中引入了sp ...

  8. 史上最简单的SpringCloud教程 | 第二篇: 服务消费者(rest+ribbon)(Finchley版本)

    转载请标明出处: 原文首发于:https://www.fangzhipeng.com/springcloud/2018/08/30/sc-f2-ribbon/ 本文出自方志朋的博客 在上一篇文章,讲了 ...

  9. SpringCloud[04]Ribbon负载均衡服务调用

    文章目录 Ribbon负载均衡服务调用 1. 概述 1. Ribbon是什么 2. Ribbon能做什么 2. Ribbon负载均衡演示 1. 架构说明 2. Ribbon的POM依赖 3. Rest ...

最新文章

  1. 比特,比特流,IP,子网掩码,子网划分,MAC地址
  2. angular2 学习二 最简单的模板
  3. 利用正则表达式去掉html代码
  4. Linux下的静态库、动态库和动态加载库
  5. 数据与知识管理属于计算机科学研究方向中的,知识管理技术与应用
  6. redisTemplate进行自增操作例子
  7. tomee_微服务系列:MicroProfile和Apache TomEE
  8. 设置PL/SQL工具SQL窗口的字体大小及颜色
  9. mongodb添加创建修改时间_MongoDB数据库插入、更新和删除操作详解
  10. 回文字符串(51Nod-1092)
  11. dedecms读取多个类别信息
  12. js定义php中变量,JavaScript 变量
  13. 运维工具之科来网络分析系统安装和使用
  14. “茴”字有几种写法? Java 实现 WebSocket 的方式
  15. matplotlib colormap
  16. Vue项目引入移动端组件库--Mand Mobile
  17. 什么是user agent(用户代理)
  18. 嵌入式工资为什么比纯软工资低那么多?
  19. a360desktop有用吗_A360 Desktop 停用 - 2018 年 6 月 19 日
  20. Java实现之普利姆(Prim)算法

热门文章

  1. java的scanner的方法_Java Scanner reset()方法
  2. tcp拥塞控制_网络TCP的拥塞控制算法简介
  3. C++ stringstream输入方式
  4. 邻接表2 -试在邻接表存储结构上实现图的基本操作 del_vertex-数据结构-图-icoding
  5. word List 42
  6. ubuntu分解压缩包
  7. 常用加密算法(Java实现)总结
  8. Java垃圾回收日志解析
  9. B. Lynyrd Skynyrd(倍增 + 区间最小值)
  10. F - Colorful Tree(LCA,树上差分,离线处理)