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

2023-11-04

代码使用SpringCloud版本E3

 

业务场景:

今天遇到一个业务场景,要求根据服务名获取当前微服务集群中所有的对应服务实例的IP和端口,通过分析源码推算出了写法。

 

原理简述:

如果代码中引入了spring-cloud-netflix-core(版本1.4.4.RELEASE),则在代码初始化的时候,会通过RibbonAutoConfiguration类创建一个SpringClientFactory的bean,通过该bean可以获取服务实例的IP和端口列表。

代码中的 DomainExtractingServerList对象 是 DynamicServerListLoadBalancer 类中的属性,该属性保存的是全量的服务实例,不过却是私有的,所以只能通过反射来获取了。

 

 

具体代码:

 

package com.liuyx;

import com.netflix.loadbalancer.DynamicServerListLoadBalancer;
import com.netflix.loadbalancer.ILoadBalancer;
import com.netflix.loadbalancer.Server;
import com.netflix.loadbalancer.ServerList;
import com.netflix.niws.loadbalancer.DiscoveryEnabledServer;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.cloud.netflix.ribbon.SpringClientFactory;
import org.springframework.cloud.netflix.ribbon.eureka.DomainExtractingServerList;
import org.springframework.context.ApplicationContext;

import java.lang.reflect.Field;
import java.util.List;

/**
 * Created by liu.yuxiang on 2017/10/12.
 */
@SpringBootApplication//(exclude = {ConfigClientAutoConfiguration.class})
public class PortalZuulApplication {


    public static void main(String[] args) {
        ApplicationContext ctx = new SpringApplicationBuilder(PortalZuulApplication.class).web(true).run(args);

        SpringClientFactory springClientFactory = ctx.getBean(SpringClientFactory.class);
        ILoadBalancer loadBalancer = springClientFactory.getLoadBalancer("[服务名]");
        List<Server> servers = loadBalancer.getReachableServers();
        for(Server server:servers){
            //如果服务有设置zone,此处获取的可能并不是所有的实例
            System.out.println("---:"+server.getHostPort());
        }

        DynamicServerListLoadBalancer<DiscoveryEnabledServer> dynamicServerListLoadBalancer = (DynamicServerListLoadBalancer)loadBalancer;

        ServerList<DiscoveryEnabledServer> serverListImpl = dynamicServerListLoadBalancer.getServerListImpl();

        DomainExtractingServerList domainExtractingServerList1 = (DomainExtractingServerList) serverListImpl;

        try {
            Field field = domainExtractingServerList1.getClass().getDeclaredField("list");
            field.setAccessible(true);
            ServerList<DiscoveryEnabledServer> list = (ServerList<DiscoveryEnabledServer>)field.get(domainExtractingServerList1);

            for(DiscoveryEnabledServer server:list.getUpdatedListOfServers()){
                //此处获取的是所有的实例
                System.out.println("%%%:"+server.getHostPort());
            }

            /*for(DiscoveryEnabledServer server:list.getInitialListOfServers()){
                System.out.println("+++:"+server.getHostPort());
            }*/
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

 

代码中的"[服务名]"请换成你自己的。

因项目中使用了zone(即 eureka.instance.metadata-map.zone=xxx),所以只能通过反射,才能获取真正的所有服务实例,否则只能获取zone为xxx的服务实例。

如果还不明白,参看 区域亲和

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过ribbon 根据服务名获取所有服务实例的IP和端口列表 的相关文章

随机推荐

  • Django-模型层(单表操作)

    目录 1 ORM简介 2 单表操作 2 1创建表 2 2添加表纪录 2 3查询表纪录 2 4删除表纪录 2 5修改表纪录 1 ORM简介 MVC或者MVC框架中包括一个重要的部分 就是ORM 它实现了数据模型与数据库的解耦 即数据模型的设计
  • 2019 前端框架对比及评测

    Jacek Schae 原作 授权 LeanCloud 翻译 我们将基于 RealWorld 示例应用对比前端框架 RealWorld 示例应用的特点 RealWorld 应用 比待办事项类应用更复杂 通常待办事项类应用不足以传达足够多的知
  • 最详细的Python接单思路和方法

    首先讲下python爬虫怎么接单挣钱 Python爬虫挣钱方法大致如下 有些需要的技术并不难 这种大部分都可以做 有些可能对技术要求比较高 门槛相对就高一点 爬虫技术挣钱方法1 接外包爬虫项目 这是网络爬虫最通常的的挣钱方式 通过外包网站
  • LeetCode-环形链表-简单

    标题 141环形链表 简单 题目 给你一个链表的头节点 head 判断链表中是否有环 如果链表中有某个节点 可以通过连续跟踪 next 指针再次到达 则链表中存在环 为了表示给定链表中的环 评测系统内部使用整数 pos 来表示链表尾连接到链
  • IDEA中配置Maven常见问题每次都需要更改setting设置,否则使用默认Maven,完美解决Maven的配置问题!

    废话不说 直接上图 你是否也遇到这种情况呢 创建maven无模板项目时 maven总是idea自带 如何解决呢 点开系统setting 1 取消默认打开上一次项目 2 重启IDEA 在全局设置就可以了 完美解决 创作不易 问题解决的给个鼓励
  • 520,我会处理回文数了,你会了么?(dp+中心扩散)

    给定一个字符串 s 找到 s 中最长的回文子串 你可以假设 s 的最大长度为 1000 示例 1 输入 babad 输出 bab 注意 aba 也是一个有效答案 示例 2 输入 cbbd 输出 bb 方法一 暴力匹配 Brute Force
  • git commit-m 与 git commit -a -m

    转自 https segmentfault com q 1010000005900988 字面解释的话 git commit m用于提交暂存区的文件 git commit am用于提交跟踪过的文件 要理解它们的区别 首先要明白git的文件状
  • python二级第一套答案

    python二级第一套答案 46 考生文件夹下存在3个Python源文件 分别对应3个问题 1个文本文件 作为本题目输入数据 请按照源文件内部说明修改代码 实现以下功能 命运 是著名科幻作家倪匡的作品 这里给出 命运 的一个网络版本文件 文
  • 华为笔记本转轴坏了修复指南记录

    华为笔记本转轴坏了修复指南记录 前言 记录一下 华为笔记本MeteBookD MRC W50 转轴破裂导致屏幕翻盖时 转轴出开裂 记录维修全过程 由于之前电脑坏掉的图片找不到了 我这里就先大致描述一下吧 看下图 上面我就是简单的描述了一些我
  • 行列式的英文翻译

    行列式的英文翻译 行列式的英文翻译是 determinant 行列式的英文定义为 从定义可以看出 只有方阵才会有行列式的定义
  • applicationContext.xml文件如何调用外部properties等配置文件

  • 记一次计算机20春招的过程

    今年秋招没有参加 因为考研 等到考研成绩出来 发现无缘复试 便开始准备春招 基本是从2月初就开始准备了 刚开始没有确定企业类型 胡乱投了一下 有百度大厂等 最后还是决定投银行 对于女生来说 还是比较稳定 主要投了中信银行 上海银行 苏州银行
  • C++继承和多态

    C 继承和多态 继承 继承的本质 代码的复用 在基类中给所有派生类提供统一的虚函数接口 让派生类进行重写 然后就可以使用多态了 类和类的关系 a part of 一部分关系 继承 a kind of 一种的关系 继承引入了一些概念 基类 父
  • es6~解构赋值

    ES6允许按照一定模式 从数组和对象中提取值 对变量进行赋值 这被称为解构 以前 为变量赋值 只能直接指定值 let a 1 let b 2 let c 3 ES6 允许写成下面这样 let a b c 1 2 3 上面代码表示 可以从数组
  • 微信小程序实现附件(图片/视频)上传及附件(图片/视频)预览

    微信小程序的图片 视频上传功能 小程序官网是提供了相关的API语法 本例使用了 wx chooseMedia 选择或拍摄图片 视频附件 通过 wx uploadFile 方法上传至服务器 在需要的地方将服务器存储的附件地址查询出来提供展示预
  • 分糖果(c++)

    传送门 这道题真是简单到不能再简单 思路 判断L n是否小于R N 如果是 输出n 1 最大余数 否则输出R N 余数尽量大 因为L N R N 且L lt R 本题代码最多10行 include
  • MSVCRTD.lib(crtexew.obj) : error LNK2019: 无法解析的外部符号 _WinMain@16,该符号在函数 ___tmainC

    一 问题描述 MSVCRTD lib crtexew obj error LNK2019 无法解析的外部符号 WinMain 16 该符号在函数 tmainCRTStartup 中被引用 Debug jk exe fatal error L
  • 两个C++编译异常及解决方法-does not name a type和field `XX' has incomplete type

    两个C 编译错误及解决办法 does not name a type和field XX has incomplete type 编译错误一 XX does not name a type 编译错误二 field XX has incompl
  • CH1-数字逻辑基础

    文章目录 一 数制和码制 1 1 数字量和模拟量 1 2 数制和码制 一 数制 二 数制转换 三 码制 二 逻辑代数中的基本运算 与门 或门 非门 与非门 或非门 与或非门 异或门 同或门 三 基本和常用公式 3 1 基本公式 3 2 常用
  • 通过ribbon 根据服务名获取所有服务实例的IP和端口列表

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