Nacos——服务订阅

Nacos服务订阅流程全解析 Nacos服务订阅流程解析 本文基于源码分析了Nacos客户端订阅服务的完整流程。主要内容包括: 客户端发起订阅: 通过NamingService.subscribe()方法发起订阅请求 代理类NamingClientProxyDelegate处理请求,先检查本地缓存,未命中则发起RPC请求 服务端处理订阅服务端通过grpcCommonRequestAcceptor接收请求 使用SubscribeServiceRequestHandler处理订阅请求 返回订阅服务的实例信息 客户端处理响应: 将实例信息 阅读详情

Nacos——服务订阅

1. 前提

当服务提供者注册实例到Nacos服务端后,服务消费者就需要订阅提供者服务来进行调用。常见的服务消费者有Dubbo消费者,Spring Cloud消费者,但由于没有使用过Dubbo和Spring Cloud从Nacos中订阅服务,而使用过Spring Cloud Gateway结合Nacos做服务化路由,所以会结合Spring Cloud Gateway来讲Nacos的服务订阅。

2. maven依赖

spring-cloud-starter-gateway: 2.2.5.RELEASE

spring-cloud-starter-alibaba-nacos-discovery: 2.2.4.RELEASE

nacos-client: 1.4.2

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    <exclusions>
        <exclusion>
            <groupId>com.alibaba.nacos</groupId>
            <artifactId>nacos-client</artifactId>
        </exclusion>
    </exclusions>
</dependency>

<dependency>
    <groupId>com.alibaba.nacos</groupId>
    <artifactId>nacos-client</artifactId>
    <version>1.4.2</version>
</dependency>

3. 流程图

在这里插入图片描述

  • 服务提供者注册实例到Nacos服务端集群
  • 网关需要服务化路由时,订阅服务提供者的实例集合
  • 根据负载均衡策略从实例集合中选择一个实例进行路由

4. 源码分析

  • 启动时订阅自己

    NacosDiscoveryClientConfiguration初始化NacosWatch

    @Bean
    @ConditionalOnMissingBean
    @ConditionalOnProperty(value = "spring.cloud.nacos.discovery.watch.enabled",
                           matchIfMissing = true)
    public NacosWatch nacosWatch(NacosServiceManager nacosServiceManager,
                                 NacosDiscoveryProperties nacosDiscoveryProperties,
                                 ObjectProvider<ThreadPoolTaskScheduler> taskExecutorObjectProvider) {
         
         
        return new NacosWatch(nacosServiceManager, nacosDiscoveryProperties,
                              taskExecutorObjectProvider);
    }
    

    NacosWatch实现了SmartLifecycle接口,即在Spring容器生命周期启动和销毁时执行相关操作,对应start()stop()

    private final AtomicBoolean running = new AtomicBoolean(false);
    private Map<String, EventListener> listenerMap = new ConcurrentHashMap<>(16);
    
    @Override
    public void start() {
         
         
        if (this.running.compareAndSet(false, true)) {
         
         
            // 事件监听处理器
            EventListener eventListener = listenerMap.computeIfAbsent(buildKey(),
                         event -> new EventListener() {
         
         
                             @Override
                             public void onEvent(Event event) {
         
         
                                 if (event instanceof NamingEvent) {
         
         
                                     List<Instance> instances = ((NamingEvent) event)
                                         .getInstances();
                                     // 筛选出当前实例
                                     Optional<Instance> instanceOptional = selectCurrentInstance(
                                         instances);
                                     // 更新元数据
                                     instanceOptional.ifPresent(currentInstance -> {
         
         
                                         resetIfNeeded(currentInstance);
                                     });
                                 }
                             }
                         });
    
            // 获取NamingService
            NamingService namingService = nacosServiceManager
                .getNamingService(properties.getNacosProperties());
            try {
         
         
                // 订阅自己
                namingService.subscribe(properties.getService(), properties.getGroup(),
                                        Arrays.asList(properties.getClusterName()), eventListener);
            }
            catch (Exception e) {
         
         
                log.error("namingService subscribe failed, properties:{}", properties, e);
            }
    
            // 发布HeartbeatEvent事件
            this.watchFuture = this.taskScheduler.scheduleWithFixedDelay(
                this::nacosServicesWatch, this.properties.getWatchDelay());
        }
    }
    
    /**
     * 从实例集合中筛选出当前ip和端口的实例
     */
    private Optional<Instance> selectCurrentInstance(List<Instance> instances) {
         
         
        return instances.stream()
            .filter(instance -> properties.getIp().equals(instance.getIp())
                    && properties.getPort() == instance.getPort())
            .findFirst();
    }
    
    /**
     * 订阅到的实例元数据不同则更新
     */
    private void resetIfNeeded(Instance instance) {
         
         
        if (!properties.getMetadata().equals(instance.getMetadata())) {
         
         
            properties.setMetadata(instance.getMetadata());
        }
    }
    
    /**
     * 发布HeartbeatEvent事件用于消费者进行更新操作
     * 比如 Spring Cloud Gateway中的RouteRefreshListener
     */
    public void nacosServicesWat
Linux下libdrm实战:从零搭建一个简单的DRM显示程序(附完整代码) 本文是一份Linux下libdrm的实战指南,详细介绍了如何从零开始搭建一个简单的DRM显示程序。通过对比传统Framebuffer的局限性,阐述了现代DRM架构的核心优势与核心对象(FrameBuffer、Plane、CRTC等)的协作流程。文章提供了完整的代码示例,演示了如何打开设备、创建并填充Dumb Buffer、设置CRTC以依次显示红绿蓝纯色画面,并涵盖了编译、运行及进阶开发要点,为嵌入式Linux图形开发提供了扎实的入门基础。 阅读详情

相关推荐

单细胞专题(1) | 单细胞转录组研究样本准备指南(上)

单细胞RNA测序(scRNA-seq)是目前最前沿,能进行大规模实验的转录组研究技术,为理解细胞组成和动态生物学过程提供了很多新的见解。单细胞研究已经为我们理解发育过程,老化和疾病(如癌症)等提供了大量数据。在这里,小编主要就前期的样本准备与保存需注意问题给大家进行讲解,以备大家在不同的研究场景和研究背景下,走好单细胞转录组学研究的第一步。

bioyigene的博客 4186

Nacos 服务发现(订阅)源码分析(服务端)

前文我们分析了 Nacos 服务发现(订阅)的流程,从 Nacos Client 端的源码分析了服务发现的过程,服务发现最终还是要调用 Nacos Server 端来获取服务信息,缓存到客户端本地,并且会定时向 Nacos Server 端发送请求,获取服务信息,本篇我们从 Nacos Server 来分析一下服务订阅源码。InstanceController#doSrvIpxt 方法的源码比较多,大概拆分一下重要步骤,做了如下事情。欢迎提出建议及对错误的地方指出纠正。

weixin_42118323的博客 2574

Nacos源码之配置管理 二】Nacos中的事件发布与订阅--观察者模式

EventDispatcher EventDispatcher在Nacos中是一个事件发布与订阅的类,也就是我们经常使用的Java设计模式——事件驱动模式(观察者模式) 一般发布与订阅主要有三个角色 事件: 表示某些类型的事件动作,例如Nacos中的 本地数据发生变更事件 LocalDataChangeEvent 事件源 : 事件源可以看成是一个动作,某个事件发生的动作,例如Naco...

石臻说AI(szzdzhp001) 【原名 石臻臻的杂货铺】 1万+

深入理解Nacos源码注册中心之服务发现(订阅拉取)

Nacos服务发现功能有两种实现方式,一种是客户端主动请求服务端拉取注册的实例,另一种是客户端对服务端进行订阅之后,当服务端注册的实例发生变更之后,服务端会主动推送注册实例给客户端。第一种主动拉取的模式比较简单其实就是客户端发起拉取请求之后然后服务端根据请求的内容去双层map结构中找到对应的注册实例返回给客户端,而第二种方式则比较复杂,需要服务端去进行数据的推送,那么下面我们就来看下Nacos订阅拉取服务是如何实现的 1.Nacos客户端发起拉取服务请求 我们先来看下订阅拉取服务这个功能在客户端是.

我神级欧文的博客 7485

献给Nacos小白的一篇好文:服务的发布与订阅

这里的发布订阅机制针对的是注册在nacos中的服务而言,如果服务A被另一个服务B所订阅(subscribe),那么,当服务A的某些参数变化时,订阅服务B会监听到服务A的某些变更。实际使用时,某些业务场景下,这种发布订阅模式比较灵活实用。......

云水之路的专栏 6541

Nacos服务的发现和订阅总结】

服务发现是指 服务提供者(Provider)自动注册到 Nacos服务消费者(Consumer)可以通过 Nacos 获取最新的服务实例列表,实现动态调用。Nacos 服务发现流程1.服务提供者注册启动时,将自己的信息(IP、端口、元数据等)注册到 Nacos。2.Nacos 维护服务实例,Nacos 维护一个服务实例列表,并定期进行健康检查。3.服务消费者发现,消费者从 Nacos 获取可用实例列表,调用合适的实例。

weixin_47068446的博客 1371

Nacos无压力源码领读】(一) Nacos 服务注册与订阅原理

本文将详细介绍 Nacos 客户端在启动时进行自动注册原理, 以及Nacos服务器是如何处理客户端的注册与订阅请求的;本文会附带源码解读, 但不会死抠每一行代码, 主要是梳理整个流程, 过程中的关键步骤, 都会由思维导图的形式展现出来;

wdx7770的博客 1231

基于 Python 对于Nacos 服务订阅流程的深度剖析

本文详细介绍了Nacos服务发现与配置管理平台的演进历程和核心功能。Nacos起源于阿里巴巴2015年为解决大规模微服务治理痛点而开发的内部组件,2018年开源后迅速成为国内微服务领域的主流技术,2020年成为Apache顶级项目。文章通过类比城市交通系统,形象解析了Nacos的架构设计,包括服务注册、订阅、健康检查等核心机制,并提供了Python实现服务订阅的代码示例。特别强调了Nacos在国内数字化转型中的独特优势,包括适应国产化需求、支持多种一致性模式等。最后给出了生产环境部署建议和性能优化方案,指出

你的天空阅读专栏 1386

Nacos客户端服务订阅的事件机制剖析

​ 整体服务订阅的事件机制还是比较复杂的,因为用到了事件的形式,逻辑比较绕,并且其中还有守护线程,死循环,阻塞队列等。​ 需要重点理解NotifyCenter对事件发布者、事件订阅者和事件之间关系的维护,而这一关系的维护的入口就位于NacosNamingService的init方法当中。

埃泽漫笔 883

Nacos - 服务订阅流程全解析

Nacos - 服务订阅流程全解析

weixin_46619605的博客 1233

Nacos客户端服务订阅的事件机制剖析 - 4

​ 整体服务订阅的事件机制还是比较复杂的,因为用到了事件的形式,逻辑比较绕,并且其中还有守护线程,死循环,阻塞队列等。​ 需要重点理解NotifyCenter对事件发布者、事件订阅者和事件之间关系的维护,而这一关系的维护的入口就位于NacosNamingService的init方法当中。​ ServiceInfoHolder类,顾名思义,服务信息的持有者。

zhiqiang_cao的博客 1330

基于Nacos服务注册与订阅的实时通知机制设计

胡弦,视频号2023年度优秀创作者,互联网大厂P8技术专家,Spring Cloud Alibaba微服务架构实战派(上下册)和RocketMQ消息中间件实战派(上下册)的作者,资深架构师,技术负责人,极客时间训练营讲师,四维口袋KVP最具价值技术专家,技术领域专家团成员,2021电子工业出版社年度优秀作者,获得2023电子工业出版技术成长领路人称号,荣获2024年电子工业出版社博文视点20周年荣誉专家称号。

huxian1234的专栏 1125

nacos 服务列表中,服务订阅者的含义是什么?

Nacos 是比较常用的微服务注册中心,社区版基本够用,能管理简单的微服务、命名空间等。本文来分析一个问题:服务列表中,每个服务后面的“订阅者”是什么意思呢?怎么确定某个微服务订阅者是谁呢?......

本博客纯属个人网络笔记,如对阁下有用,甚喜;否则,关掉即可,不喜勿喷。专心写代码,不做键盘侠! 6021

nacos配置发布和服务订阅

nacos总结

weixin_41987908的博客 2848

服务提供者无法注册到nacos服务

问题可能是这样的 get service name from nacos server fail //或 No service to register for nacos client... // 或 nacos NoSuchMethodError // 或 nacos registry, qit-service-provider register failed...NacosRegistration{nacosDiscoveryProperties=NacosDiscoveryProperties{ser

日日留心的技术专栏 2万+

Nacos 服务端健康检查及客户端服务订阅机制源码分析(三)

整体服务订阅的事件机制还是比较复杂的,因为用到了事件的形式,逻辑比较绕,并且其中还有守护线程、死循环、阻塞队列等;重点理解的是 NotifyCenter 对事件发布者、事件订阅者和事件之间关系的维护,而这一关系维护的入口就位于 NacosNamingService#init 方法当中,以下是核心流程:事件发布、事件处理流程图如下分析:ServiceInfoHolder 中通过 NotifyCenter 发布了 InstancesChangeEvent 事件。

vnjohn 博主 > 主线分享后端领域业务设计知识、源码思想、架构设计 3622

Spring Cloud Nacos源码讲解(八)- Nacos客户端服务订阅的事件机制剖析

​ 整体服务订阅的事件机制还是比较复杂的,因为用到了事件的形式,逻辑比较绕,并且其中还有守护线程,死循环,阻塞队列等。​ 需要重点理解NotifyCenter对事件发布者、事件订阅者和事件之间关系的维护,而这一关系的维护的入口就位于NacosNamingService的init方法当中。

持续学习,持续更新 1535

nacos 启动报错 [check-update]get changed dataId error, code: 408/get service name from nacos server fail

nacos 启动报错 [check-update]get changed dataId error, code: 408/get service name from nacos server fail

寂夜了无痕的博客 4322

Spring Gateway集成 Nacos注册中心不能够发现服务的问题解决

一、问题描述 我们现在是在用Nacos替换Eureka,原来Eureka和Spring gateway运行正常,可以通过Spring gateway调用注册到Eureka中的服务。 当前Spring cloud的版本是Hoxton.SR8,Nacos discovery的版本为0.9.0.RELEASE,使用的Nacos版本为2.0.3。 Nacos替换Eureka改动的地方如下: 1、去掉POM中Eureka的引入; 2、去掉主类中引入的@EnableEurekaClient注解; 3、引入N

冯立彬的博客 1万+

关于nginx指向nacos遇到的坑

刚入职的时候一直在用正式服务器进行开始,项目上线后,还有东西要改就要放到测试服务器上,测试服务器是个新服务器,里面没有东西,我一想,简单啊,正式的往测试上面一放项目部署上去不就行了么,我想的太简单了。 部署时遇到的问题,项目里使用到了nacos,我就直接把正式上面的nacos和nginx都下载下来放到测试服务器上面,因为测试服务器上面只开放了8848端口,那就用nginx做代理指向nacos把,然后不出意外的出现问题了。 先把nacos的端口改成8849端口 然后做了个代理指向nacos .

qq_40472999的博客 4779

PB版code128条形码图片生成

PB版code128条形码图片生成,PB9开发的

上一篇: Nacos——服务注册和心跳机制
下一篇: Nacos——Distro一致性协议
Tarzan写bug
博客等级 码龄9年 5粉丝 35原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值