SpringCloud Ribbon(五)之服务实例列表ServerList
一、服务实例列表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相关推荐
- SpringCloud Ribbon(六)之服务实例过滤器ServerListFilter
一.服务实例过滤器ServerListFilter 服务实例过滤器(ServerListFilter)为负载均衡器(Loadbalancer)提供从服务实例列表(ServerList)获取的服务实例过 ...
- 史上最简单的SpringCloud教程 | 第二篇: 服务消费者(rest+ribbon)
转载请标明出处: https://www.fangzhipeng.com/springcloud/2017/07/12/sc02-rest-ribbon/ 本文出自方志朋的博客 最新Finchley版 ...
- SpringCloud 教程 | 第二篇: 服务消费者(rest+ribbon)
转载请标明出处: blog.csdn.net/forezp/arti- 本文出自方志朋的博客 在上一篇文章,讲了服务的注册和发现.在服务架构中,业务都会被拆分成一个独立的服务,服务与服务的通讯是基于h ...
- springcloud ribbon @LoadBalance负载均衡源码流程分析
一.编写示例 1.服务端 pom.xml <properties><java.version>1.8</java.version><spring-cloud. ...
- spring eureka 服务实例实现快速下线快速感知快速刷新配置解析
背景 默认的Spring Eureka服务器,服务提供者和服务调用者配置不够灵敏,总是服务提供者在停掉很久之后,服务调用者很长时间并没有感知到变化.或者是服务已经注册上去了,但是服务调用方很长时间还是 ...
- SpringCloud(三) Eureka之服务注册发现以及实现工程间调用
概述:本章节将介绍Eureka客户端如何与EurekaServer端链接,以及生产者工程如何将服务注册到Eureka注册中心中去,消费者工程怎么从EurekaServer端获取生产者工程的服务地址,并 ...
- 通过ribbon 根据服务名获取所有服务实例的IP和端口列表
代码使用SpringCloud版本E3 业务场景: 今天遇到一个业务场景,要求根据服务名获取当前微服务集群中所有的对应服务实例的IP和端口,通过分析源码推算出了写法. 原理简述: 如果代码中引入了sp ...
- 史上最简单的SpringCloud教程 | 第二篇: 服务消费者(rest+ribbon)(Finchley版本)
转载请标明出处: 原文首发于:https://www.fangzhipeng.com/springcloud/2018/08/30/sc-f2-ribbon/ 本文出自方志朋的博客 在上一篇文章,讲了 ...
- SpringCloud[04]Ribbon负载均衡服务调用
文章目录 Ribbon负载均衡服务调用 1. 概述 1. Ribbon是什么 2. Ribbon能做什么 2. Ribbon负载均衡演示 1. 架构说明 2. Ribbon的POM依赖 3. Rest ...
最新文章
- 比特,比特流,IP,子网掩码,子网划分,MAC地址
- angular2 学习二 最简单的模板
- 利用正则表达式去掉html代码
- Linux下的静态库、动态库和动态加载库
- 数据与知识管理属于计算机科学研究方向中的,知识管理技术与应用
- redisTemplate进行自增操作例子
- tomee_微服务系列:MicroProfile和Apache TomEE
- 设置PL/SQL工具SQL窗口的字体大小及颜色
- mongodb添加创建修改时间_MongoDB数据库插入、更新和删除操作详解
- 回文字符串(51Nod-1092)
- dedecms读取多个类别信息
- js定义php中变量,JavaScript 变量
- 运维工具之科来网络分析系统安装和使用
- “茴”字有几种写法? Java 实现 WebSocket 的方式
- matplotlib colormap
- Vue项目引入移动端组件库--Mand Mobile
- 什么是user agent(用户代理)
- 嵌入式工资为什么比纯软工资低那么多?
- a360desktop有用吗_A360 Desktop 停用 - 2018 年 6 月 19 日
- Java实现之普利姆(Prim)算法
热门文章
- java的scanner的方法_Java Scanner reset()方法
- tcp拥塞控制_网络TCP的拥塞控制算法简介
- C++ stringstream输入方式
- 邻接表2 -试在邻接表存储结构上实现图的基本操作 del_vertex-数据结构-图-icoding
- word List 42
- ubuntu分解压缩包
- 常用加密算法(Java实现)总结
- Java垃圾回收日志解析
- B. Lynyrd Skynyrd(倍增 + 区间最小值)
- F - Colorful Tree(LCA,树上差分,离线处理)