Nacos源码分析,Nacos gRPC服务端通信渠道是如何启动的?

作为SpringCloudAlibaba微服务架构实战派上下册和RocketMQ消息中间件实战派上下册的作者胡弦,我来给大家带来Nacos源码分析的技术文章。

Nacos默认会启动两个gRPC服务端通信渠道,一个用于Nacos集群节点之间的交互(GrpcClusterServer),另外一个用于客户端与Nacos服务器之间的交互(GrpcSdkServer)。这个也满足架构设计中的隔离原则,也就是客户端(特指接入Nacos中的服务实例)和Nacos集群自身是解耦合的。

 public static final Integer SDK_GRPC_PORT_DEFAULT_OFFSET = 1000;
    
 public static final Integer CLUSTER_GRPC_PORT_DEFAULT_OFFSET = 1001;

利用Java的注解@PostConstruct自动地启动

其实很简单,Nacos就是利用Java的注解 @PostConstruct来自动地启动,关于这个注解@PostConstruct这里可以简单的解释一下。

/**
 * 用于标记方法的注解,该方法将在一个Bean实例化后,但在其被实际使用前调用。
 * 这使得开发者能够执行一些初始化逻辑,而无需手动管理对象的生命周期。
 * 
 * @author Java平台
 * @since Java EE 5.0
 */
public @interface PostConstruct {
}

Nacos用注解@PostConstruct来标记抽象类BaseRpcServer的方法start()。


/**
 * 在服务器构建之后立即调用此方法,用于启动RPC服务器。
 * 该方法不接受参数且没有返回值。
 * 启动过程中,首先记录启动日志,然后启动服务器本身,接着如果存在SSL上下文刷新器,则刷新SSL上下文。
 * 最后,注册一个关闭钩子,以便在应用程序关闭时能够优雅地停止RPC服务器。
 * 
 * @throws Exception 如果启动过程中遇到任何错误,则抛出异常。
 */
@PostConstruct
public void start() throws Exception {
    String serverName = getClass().getSimpleName();
    // 记录启动日志
    Loggers.REMOTE.info("Nacos {} Rpc server starting at port {}", serverName, getServicePort());
    
    startServer();
    
    // 如果存在SSL上下文刷新器,则刷新SSL上下文
    if (RpcServerSslContextRefresherHolder.getInstance() != null) {
        RpcServerSslContextRefresherHolder.getInstance().refresh(this);
    }
    
    // 记录启动成功日志
    Loggers.REMOTE.info("Nacos {} Rpc server started at port {}", serverName, getServicePort());
    // 注册关闭钩子,以优雅地停止服务器
    Runtime.getRuntime().addShutdownHook(new Thread(() -> {
        // 记录停止日志
        Loggers.REMOTE.info("Nacos {} Rpc server stopping", serverName);
        try {
            // 停止服务器
            BaseRpcServer.this.stopServer();
            // 记录停止成功日志
            Loggers.REMOTE.info("Nacos {} Rpc server stopped successfully...", serverName);
        } catch (Exception e) {
            // 记录停止失败日志
            Loggers.REMOTE.error("Nacos {} Rpc server stopped fail...", serverName, e);
        }
    }));
    
}

抽象类BaseRpcServer的具体实现类如下图所示,分别是GrpcClusterServer和GrpcSdkServer。

 

 其中BaseRpcServer的方法start()会调用BaseGrpcServer类的 startServer() 方法。

而GrpcClusterServer和GrpcSdkServer会使用Spring注解@Service完成Bean的初始化,这样就可以利用Java的注解 @PostConstruct来自动地启动这两个服务端通信渠道。

@Service
public class GrpcSdkServer extends BaseGrpcServer {
}
@Service
public class GrpcClusterServer extends BaseGrpcServer {
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/548496.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python爬虫之实践(!福利!动态IP免费送!)

Python爬虫是一种强大的工具,它允许我们自动从互联网上收集数据。通过编写Python脚本,我们可以模拟浏览器的行为,发送HTTP请求,获取网页内容,并提取所需的数据。本文将指导你如何进行Python爬虫,包括准备环…

雨天充电桩使用攻略:雨中电动汽车充电必看!

随着电动车的普及,雨天使用充电桩已成为常态。 然而,在恶劣天气条件下充电需格外谨慎,否则可能会带来安全隐患。以下是使用充电桩的安全须知和操作技巧,让您在雨天充电时更加安心: 警惕水患风险:避免在积水…

Python高质量函数编写指南

The Ultimate Guide to Writing Functions 1.视频 https://www.youtube.com/watch?vyatgY4NpZXE 2.代码 https://github.com/ArjanCodes/2022-funcguide Python高质量函数编写指南 1. 一次做好一件事 from dataclasses import dataclass from datetime import datetimedatacl…

Python-VBA函数之旅-classmethod函数

目录 一、装饰器的定义: 二、装饰器类型: 三、装饰器的主要用途: 四、classmethod常用场景: 1、classmethod函数: 1-1、Python: 1-2、VBA: 2、相关文章: classmethod是 Pyth…

MySQL查询重复数据获取最新数据

方法一: 1055 - Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column ‘se_jck的博客-CSDN博客 这个错误是由于 MySQL 的新版本中默认开启了ONLY_FULL_GROUP_BY模式,即在 GROUP BY 语句中的 SELECT 列表中&…

数据湖技术选型——Flink+Paimon 方向

文章目录 前言Apache Iceberg存储索引metadataFormat V2小文件 Delta LakeApache Hudi存储索引COWMOR元数据表 Apache PaimonLSMTagconsumerChangelogPartial Update 前言 对比读写性能和对流批一体的支持情况,建议选择Apache Paimon截止2024年1月12日数据湖四大开…

【LAMMPS学习】八、基础知识(2.5)恒压器

8. 基础知识 此部分描述了如何使用 LAMMPS 为用户和开发人员执行各种任务。术语表页面还列出了 MD 术语,以及相应 LAMMPS 手册页的链接。 LAMMPS 源代码分发的 examples 目录中包含的示例输入脚本以及示例脚本页面上突出显示的示例输入脚本还展示了如何设置和运行各…

基于混合博弈的配电网与多综合能源微网优化运行

该文研究了同一配电网下的多个综合能源微网 (integrated energy microgrids,IEM)的协同管理问题,旨在通 过配电网运营商(distribution system operator,DSO)制定电能 价格以协调 IEM 联盟的机组调度、需求响应和成员间的点 对点(peer-to-peer…

使用Scrapy选择器提取豆瓣电影信息,并用正则表达式从介绍详情中获取指定信息

本文同步更新于博主个人博客:blog.buzzchat.top 一、Scrapy框架 1. 介绍 在当今数字化的时代,数据是一种宝贵的资源,而网络爬虫(Web Scraping)则是获取网络数据的重要工具之一。而在 Python 生态系统中,S…

Oracle和PG数据库临时表的差异,PG数据库如何删除临时表

现实的开发过程中使用 PG 数据库删除临时表发现如下报错,提示表 xxx 不存在: 问题原因: 调用删除语句,但是临时表不存在了。 解决方案: PG下用下面的方式来删除临时表或不进行删除(会话级临时表会自动删除…

线性表的链式存储

文章目录 前言一、概念及特点二、链表术语及分类三、单链表1.特点2.C语言实现3.头结点作用4.基本操作的具体实现 总结 前言 T_T此专栏用于记录数据结构及算法的(痛苦)学习历程,便于日后复习(这种事情不要啊)。所用教材…

Cannot access ‘androidx.activity.FullyDrawnReporterOwner‘

Android Studio新建项目就报错: Cannot access ‘androidx.activity.FullyDrawnReporterOwner’ which is a supertype of ‘cn.dazhou.osddemo.MainActivity’. Check your module classpath for missing or conflicting dependencies 整个类都报错了。本来原来一直…

文献学习-37-动态场景中任意形状针的单目 3D 位姿估计:一种高效的视觉学习和几何建模方法

On the Monocular 3D Pose Estimation for Arbitrary Shaped Needle in Dynamic Scenes: An Efficient Visual Learning and Geometry Modeling Approach Authors: Bin Li,† , Student Member, IEEE, Bo Lu,† , Member, IEEE, Hongbin Lin, Yaxiang Wang, Fangxun Zhong, Me…

使用arthas查看java项目resources目录下面的文件内容

有一次在测试环境想看resources下面的mapper文件内容(代码执行和预期不一致,所以想排查一下是不是打上去的包有问题,没有通过下载jar的方式解压查看),然后想到了使用arthas来弄,这里记录一下怎么个查看法。…

【Textin.com】智能文档处理系列 - 电子文档解析技术全格式解析

一、引言 在当今的数字化时代,电子文档已成为信息存储和交流的基石。从简单的文本文件到复杂的演示文档,各种格式的电子文档承载着丰富的知识与信息,支撑着教育、科研、商业和日常生活的各个方面。随着信息量的爆炸性增长,如何高效…

listpack

目录 为什么有listpack? listpack结构 listpack的节点entry 长度length encoding编码方式 listpack的API 1.创建listpack 2.遍历操作 正向遍历 反向遍历 3.查找元素 4.插入/替换/删除元素 总结 为什么有listpack? ziplist是存储在连续内存空间,节省…

Spring Boot 2.x 将 logback 1.2.x 升级至 1.3.x

场景 安全部门针对代码进行漏洞扫描时,发现 logback-core 和 logback-classic 都属于 1.2.x 版本,这个版本存在 CVE 漏洞,并且建议升级到 1.3.x 版本。 问题 将两个包直接升级到 1.3.x 版本时,Spring Boot Web 服务启动直接出现…

基于Springboot+Vue+mysql仓库管理系统仓库进销存管理系统

博主介绍: 大家好,本人精通Java、Python、C#、C、C编程语言,同时也熟练掌握微信小程序、Php和Android等技术,能够为大家提供全方位的技术支持和交流。 我有丰富的成品Java、Python、C#毕设项目经验,能够为学生提供各类…

nfs服务器详解

nfs(网络文件系统)---------- 其实就是通过网络将文件共享出去。 通过TCP/IP网络去共享资源的。在NFS的应用中,本地NFS的客户端应用可以透明地读写位于远端NFS服务器上的文件,就像访问本地文件一样。 客户端和服务端需要去读写共…

五分钟搞定什么是系统的平均负载

平均负载定义 平均负载是指单位时间内,系统处于可运行状态和不可中断状态的平均进程数,也就是平均活跃进程数,和CPU使用率没有直接关系。简单理解就是平均负载其实就是平均活跃进程数。 使用uptime命令查看系统平均负载 在linux中&#xf…