小工具      在线工具  汉语词典  css  js  c++  java

Nacos服务跨组调用

微服务,spring cloud 额外说明

收录于:40天前

Nacos服务跨分组调用

一、 问题背景

Nacos 有两种服务隔离机制。一是命名空间。一般我们使用命名空间来区分环境。另一个是团体。 nacos默认的调用机制是,只有同一命名空间下同组的服务才能互相调用;

那现在有个问题: 在测试阶段,由于测试环境和开发环境数据库不一致,在测试中发现bug后,开发人员需要多线路连接测试环境来定位bug。但如果开发者在本地启动测试环境,会导致测试环境中的服务过多。本地实例,这样当测试调用这个服务时,很有可能会访问这个本地服务,导致服务异常,所以一般我们会使用本地服务自定义组来注册;

一般来说,如果一个服务与多个其他服务相关,开发者需要将所有相关服务注册到一个自定义组中,以保证接口正常。但是启动很多服务会造成巨大的电脑内存消耗,所以我就想是否可以只启动有问题的服务,而使用测试环境的服务来进行其他相关的服务。基于这样的考虑,我想实现跨组调用,减少不相关服务的启动。

二、实现方案

1.版本要求
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    <version>2021.0.4.0</version>
</dependency>

在这里插入图片描述

如果 Java 项目的 nacos discovery 版本用的是 2021以上,则不需要重写 Ribbon 的负载均衡类,因为该版本的 Nacos 不依赖 Ribbon,只需要重写服务发现即可

2.重写服务发现
public class NacosServiceDiscoveryV2 extends NacosServiceDiscovery {
    

    public NacosServiceDiscoveryV2(NacosDiscoveryProperties discoveryProperties, NacosServiceManager nacosServiceManager) {
    
        super(discoveryProperties, nacosServiceManager);
        this.discoveryProperties = discoveryProperties;
        this.nacosServiceManager = nacosServiceManager;
    }

    private NacosDiscoveryProperties discoveryProperties;
    private NacosServiceManager nacosServiceManager;

  	// 重写该方法
    public List<ServiceInstance> getInstances(String serviceId) throws NacosException {
    
        String group = this.discoveryProperties.getGroup();
      	// 优先保证同分组下的服务调用
        List<Instance> instances = this.namingService().selectInstances(serviceId, group, true);
        if (CollUtil.isEmpty(instances)) {
    
          	// 如果同分组下找不到服务,那么就从默认分组下找服务
            instances = this.namingService().selectInstances(serviceId, "DEFAULT_GROUP", true);
        }
        return hostToServiceInstanceList(instances, serviceId);
    }

    public List<String> getServices() throws NacosException {
    
        String group = this.discoveryProperties.getGroup();
        ListView<String> services = this.namingService().getServicesOfServer(1, Integer.MAX_VALUE, group);
        return services.getData();
    }

    public static List<ServiceInstance> hostToServiceInstanceList(List<Instance> instances, String serviceId) {
    
        List<ServiceInstance> result = new ArrayList(instances.size());
        Iterator var3 = instances.iterator();

        while (var3.hasNext()) {
    
            Instance instance = (Instance) var3.next();
            ServiceInstance serviceInstance = hostToServiceInstance(instance, serviceId);
            if (serviceInstance != null) {
    
                result.add(serviceInstance);
            }
        }

        return result;
    }

    public static ServiceInstance hostToServiceInstance(Instance instance, String serviceId) {
    
        if (instance != null && instance.isEnabled() && instance.isHealthy()) {
    
            NacosServiceInstance nacosServiceInstance = new NacosServiceInstance();
            nacosServiceInstance.setHost(instance.getIp());
            nacosServiceInstance.setPort(instance.getPort());
            nacosServiceInstance.setServiceId(serviceId);
            nacosServiceInstance.setInstanceId(instance.getInstanceId());
            Map<String, String> metadata = new HashMap();
            metadata.put("nacos.instanceId", instance.getInstanceId());
            metadata.put("nacos.weight", instance.getWeight() + "");
            metadata.put("nacos.healthy", instance.isHealthy() + "");
            metadata.put("nacos.cluster", instance.getClusterName() + "");
            if (instance.getMetadata() != null) {
    
                metadata.putAll(instance.getMetadata());
            }

            metadata.put("nacos.ephemeral", String.valueOf(instance.isEphemeral()));
            nacosServiceInstance.setMetadata(metadata);
            if (metadata.containsKey("secure")) {
    
                boolean secure = Boolean.parseBoolean((String) metadata.get("secure"));
                nacosServiceInstance.setSecure(secure);
            }

            return nacosServiceInstance;
        } else {
    
            return null;
        }
    }

    private NamingService namingService() {
    
        return this.nacosServiceManager.getNamingService();
    }

}
3.重写自动配置类,更早的加载到Nacos容器中
@Configuration(proxyBeanMethods = false)
@ConditionalOnDiscoveryEnabled
@ConditionalOnNacosDiscoveryEnabled
@AutoConfigureBefore({
    NacosDiscoveryAutoConfiguration.class})
public class NacosDiscoveryAutoConfigurationV2 {
    

    @Bean
    @ConditionalOnMissingBean
    public NacosServiceDiscovery nacosServiceDiscovery(NacosDiscoveryProperties nacosDiscoveryProperties, NacosServiceManager nacosServiceManager) {
    
        return new NacosServiceDiscoveryV2(nacosDiscoveryProperties, nacosServiceManager);
    }
}

对于其他版本的nacos,您可能需要使用Ribbon负载均衡来处理跨组调用。详情请参考以下内容:

参考:

  • https://blog.csdn.net/m0_71777195/article/details/128350690

我是1024,一个专注Java技术、记录生活的博主。

欢迎扫描二维码关注“1024公众号”,一起学习,一起进步,看更多路,少走弯路。

在这里插入图片描述

. . .

相关推荐

额外说明

Maven中可选标签详解

这一篇文章应该是全网讲解optional最细致的,因为我都是拿我自己的试验来证明,从试验当中也发现了很多出乎意外的知识!感兴趣的跟着小编一块来学习呀! 目录 一、前言 二、依赖传递代码演示 三、为啥common的jar包下没有BOOT-INF呢? 四、是

额外说明

Redis-Springboot集成Redis实现发布订阅(简单)

文章目录 测试环境 依赖导入 配置yml 编写启动类 消息发送服务类 消息接收(订阅) 编写配置类,实现关联 编写数据发布测试类 案例测试 测试代码 注意(`*`) 测试环境 idea 2020.1.1 Springboot:2.1.4.RELEASE

额外说明

使用IE的HttpWatch查看访问URL的流量

从IE的“查看”—“浏览器栏”—“HttpWatch”启动HttpWatch。如下图所示: 这是流量:  与下载的另存为全部的流量差不多大小。

额外说明

《PostgreSQL开发指南》第十六章常用函数(一)

《PostgreSQL 开发指南》专栏目录 第 01 篇 课程介绍 第 02 篇 PostgreSQL 简介 第 03 篇 PostgreSQL 安装 第 04 篇 角色与用户 第 05 篇 数据库与模式 第 06 篇 管理数据表 第 07 篇 管理表空

额外说明

flutter 解压 zip 中文乱码问题处理

前言 很简单的一个 zip 包解压缩的功能,但是 windows 平台中文显示乱码,很糟心,搜了一圈没找到现成的方法,在此贴上我的解决方式。 实现 导入需要的包 flutter pub add archive flutter pub add fast_

额外说明

机器学习进阶 第一节 第一课

什么是机器学习 概述 机器学习的价值 机器学习的数据 数据集的结构 可用数据集 结构组成 特征工程 概述 机器学习是从数据中自动分析获得规律 (模型). 并利用规律对位置数据进行预测. 机器学习的价值 领域: 医疗, 航空, 物流, 电商… 目的: 让机

额外说明

HNU-小学期工训-STC-B测试记录表

说明1“分类I”为检测电路板硬件测试案例,“分类ⅡI、Ⅲ、IV”为不同层次综合应用案例。"分类1、Ⅱ、Ⅲ”必做,“分类TV”选做。 说明2:“测试/故障现象记录”栏:记录实际测量效果并与案例说明对比,并记录;有故障时,记录所见异常现象,填写维修表申请维修

额外说明

leetcode 1562. 查找大小为 M 的最新分组

给你一个数组 arr ,该数组表示一个从 1 到 n 的数字排列。有一个长度为 n 的二进制字符串,该字符串上的所有位最初都设置为 0 。 在从 1 到 n 的每个步骤 i 中(假设二进制字符串和 arr 都是从 1 开始索引的情况下),二进制字符串上位

额外说明

1222 - The used SELECT statements have a different number of columns

使用MySQL的union all 或者onion查询时报如下错误: 1222 - The used SELECT statements have a different number of columns 翻译过来的意思是:使用的select语句有不同

额外说明

【Jmeter】界面详解:工作区介绍

目录 一、工作区划分截图 二、区域(1):【目录树】 三、区域(2):【元件编辑区域】

ads via 小工具