1.nacos注册与发现及源码注册流程

news2024/9/24 17:18:40

目录

  • 概述
  • nacos工程案例
    • nacos服务注册案例
      • 版本说明
      • 本地启动 nacos-server
      • 搭建 spring cloud alibaba 最佳实践
        • 服务注册案例
        • 服务订阅案例
    • nacos注册源码流程
      • 源码关键点
      • 技巧
  • 结束

概述

通过本文,学会如何确定项目组件版本(减少可能出现的jar包冲突),nacos的注册与发现及其源码执行流程。

重点如下:

  • 如何确定微服务工程组件版本
  • 如何服务注册
  • 如何阅读源码

nacos工程案例

nacos服务注册案例

  • 源码地址:https://github.com/alibaba/spring-cloud-alibaba
  • 版本说明:https://github.com/alibaba/spring-cloud-alibaba/wiki/版本说明
  • 本地启动 nacos-server
  • 搭建 spring cloud alibaba 最佳实践
  • long-cloud-provider 关键 pom 引用

版本说明

后续组件使用的版本如下:
在这里插入图片描述在这里插入图片描述

**总结:**spring cloud 2021.0.5 、spring-cloud-alibaba 2021.0.5.0、spring-boot 2.6.13、nacos 2.2.0(因为本地mac系统版本低报错)、sentinel 、rocket mq 、seata 会根据约束自动加载。

本地启动 nacos-server

nacos源码搭建将使用 nacos 2.0.0 版本,

mac 系统低于此版本,2.x 出现如下问题。
在这里插入图片描述
所以暂时不提供,如果编译过程中有问题,欢迎留言。

搭建 spring cloud alibaba 最佳实践

服务注册案例

pom.xml 重要配置如下:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.6.13</version>
</parent>

<properties>
    <maven.compiler.source>11</maven.compiler.source>
    <maven.compiler.target>11</maven.compiler.target>
    <spring-cloud.version>2021.0.5</spring-cloud.version>
    <spring-cloud-alibaba.version>2021.0.5.0</spring-cloud-alibaba.version>
</properties>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring-cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
            <version>${spring-cloud-alibaba.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

main 方法

@SpringBootApplication
@EnableDiscoveryClient
public class NacosRegistryProviderApplication {
    public static void main(String[] args) {
        SpringApplication.run(NacosRegistryProviderApplication.class);
    }
}

controller

@RestController
public class NacosRegistryProviderController {

    @GetMapping("/hello/{id}")
    public String echo(@PathVariable String id) {
        return "NacosProvider receive args: id=" + id + ",date:"
                + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
    }
}

配置文件

spring:
  application:
    name: nacos-provider
  cloud:
    nacos:
      discovery:
        server-addr: 10.xx.xx.142
server:
  port: 9010

pom.xml 配置

 <dependencies>
     <dependency>
         <groupId>com.alibaba.cloud</groupId>
         <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
     </dependency>
     <dependency>
         <groupId>org.springframework.cloud</groupId>
         <artifactId>spring-cloud-starter-bootstrap</artifactId>
     </dependency>
     <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-web</artifactId>
     </dependency>
 </dependencies>

在这里插入图片描述

服务订阅案例

服务订阅 与 服务注册案例基本上配置相同

main 方法

@SpringBootApplication
@EnableDiscoveryClient
public class NacosConsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(NacosConsumerApplication.class);
    }
    
	@LoadBalanced
    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

controller

@RestController
public class NacosDiscoveryConsumerController {

    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("/hello/{id}")
    public String echo(@PathVariable String id) {
        return restTemplate.getForObject("http://nacos-provider/hello/" + id, String.class);
    }
}

pom.xml

注意加上一个jar包,否则不能识别 微服务

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

在这里插入图片描述

nacos注册源码流程

源码关键点

注意: 为了解决其它流程影响正常 debug 源码,参考以下断点。通过下面关键断点,可以避开其它流程的影响,然后查看堆栈,基本可以理清 nacos 源码注册流程。

org.springframework.cloud.client.serviceregistry.AbstractAutoServiceRegistration#onApplicationEvent
com.alibaba.cloud.nacos.registry.NacosServiceRegistry#register

涉及监听器相关源码请移步 spring boot 事件机制
在这里插入图片描述
在这里插入图片描述

技巧

源码阅读是有一定的技巧的,在以后的文章中会慢慢讲述,今天讲述一个报错查看 nacos 源码注册流程。

org.springframework.boot.SpringApplication.run(SpringApplication.java:1317) ~[spring-boot-2.6.13.jar:2.6.13]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1306) ~[spring-boot-2.6.13.jar:2.6.13]
	at com.fun.ms.NacosRegistryProviderApplication.main(NacosRegistryProviderApplication.java:11) ~[classes/:na]
Caused by: java.lang.reflect.UndeclaredThrowableException: null
	at org.springframework.util.ReflectionUtils.rethrowRuntimeException(ReflectionUtils.java:147) ~[spring-core-5.3.23.jar:5.3.23]
	at com.alibaba.cloud.nacos.registry.NacosServiceRegistry.register(NacosServiceRegistry.java:83) ~[spring-cloud-starter-alibaba-nacos-discovery-2021.0.5.0.jar:2021.0.5.0]
	at com.alibaba.nacos.client.naming.remote.gprc.NamingGrpcClientProxy.registerService(NamingGrpcClientProxy.java:123) ~[nacos-client-2.2.0.jar:na]
	at com.alibaba.nacos.client.naming.remote.NamingClientProxyDelegate.registerService(NamingClientProxyDelegate.java:98) ~[nacos-client-2.2.0.jar:na]
	at com.alibaba.nacos.client.naming.NacosNamingService.registerInstance(NacosNamingService.java:152) ~[nacos-client-2.2.0.jar:na]
	at com.alibaba.cloud.nacos.registry.NacosServiceRegistry.register(NacosServiceRegistry.java:75) ~[spring-cloud-starter-alibaba-nacos-discovery-2021.0.5.0.jar:2021.0.5.0]
	... 27 common frames omitted

在这里插入图片描述
上术方法就是源码调试时,走的流程。

结束

nacos 注册与发现及源码注册流程至此就结束了,如有疑问,欢迎评论区留言。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Python】创建简单的Python微服务Demo与FastAPI

创建简单的Python微服务Demo与FastAPI 在微服务架构中&#xff0c;通过FastAPI框架创建一个简单的Python微服务Demo涉及多个步骤&#xff0c;包括定义服务、使用框架、进行通信等。在这篇文章中&#xff0c;我们将使用FastAPI框架创建两个简单的微服务&#xff0c;它们通过RES…

12月5日星期二今日早报简报微语报早读

12月5日星期二&#xff0c;农历十月廿三&#xff0c;早报微语早读。 1、国家卫健委&#xff1a;各地基层医卫机构要全面向儿童开放&#xff0c;不得拒诊&#xff1b; 2、五月天演唱会被指假唱&#xff0c;上海文旅局执法总队&#xff1a;已要求五月天演唱会主办方配合调查&am…

The Sandbox 携手 Sandsoft,与 Nuqtah 合作推动沙特阿拉伯的 Web3 发展

新的合作伙伴关系将增强创作者的能力&#xff0c;促进区块链生态系统的包容性。 The Sandbox 及其合作伙伴 Sandsoft 是移动游戏开发商和发行商&#xff0c;也是 AAA 人才驱动的投资者&#xff0c;他们非常高兴地宣布与 Nuqtah 建立新的合作伙伴关系&#xff0c;Nuqtah 是中东和…

MybatisPlus中的使用Wrapper自定义SQL

一、条件构造器 条件构造器提供了一种更加简洁和直观的方式来构建复杂的查询条件。它提供了一组静态方法&#xff0c;用于构建各种类型的查询条件&#xff0c;包括等于、不等于、大于、小于、包含等。使用条件构造器可以避免手动拼接SQL语句的麻烦&#xff0c;提高代码的可读性…

树莓派Python程序开机自启动(Linux下Python程序开机自启动)

前一阵子用python编写了一个驱动I2C程序读写屏幕&#xff0c;输出IP的小程序&#xff0c;程序编好后需要树莓派使能程序开机自启动。其实这些方法对任何Linux系统都适用。 方法一&#xff1a;此方法的缺点是不进入默认pi的账号&#xff0c;甚至不开hdmi开启桌面的话&#xff0…

关于栈的简单理解

1. 栈(Stack) 1.1 文字讲解 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出LIFO&#xff08;Last In First Out&#xff09;的原则&a…

IP5316 2.4A 充电、2.4 A 放电、集成 DCP 功能移动电源 SOC

IP5316 2.4A 充电、 2.4 A 放电、集成 DCP 功能移动电源 SOC 简介&#xff1a; IP5316 是一款集成升压转换器、锂电池充电管理、电池电量指示的多功能电源管理 SOC&#xff0c;为移动电源提供完整的电源解决方案。得益于 IP5316 的高集成度与丰富功能&#xff0c;使其在应用时…

零信任组件和实施

零信任是一种安全标准&#xff0c;其功能遵循“从不信任&#xff0c;始终验证”的原则&#xff0c;并确保没有用户或设备受信任&#xff0c;无论他们是在组织网络内部还是外部。简而言之&#xff0c;零信任模型消除了信任组织安全边界内任何内容的概念&#xff0c;而是倡导严格…

外包干了2个月,技术明显退步了...

先说一下自己的情况&#xff0c;大专生&#xff0c;19年通过校招进入广州某软件公司&#xff0c;干了接近5年的功能测试&#xff0c;今年11月份&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测…

JS实现成才网注册系统(网页数据验证)

主代码 <!DOCTYPE htmlPUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns"http://www.w3.org/1999/xhtml"><head><meta http-equiv"Conten…

OpenGL ES 帧缓冲对象介绍和使用示例

一、介绍 1. 帧缓冲对象 默认情况下&#xff0c;OpenGL渲染的目标是屏幕&#xff0c;但如果你不想直接渲染到屏幕上&#xff0c;还需要对渲染结果做某些后期处理、渲染到纹理、阴影映射等操作&#xff0c;便可以使用帧缓冲对象&#xff0c;实现离屏渲染。 帧缓冲对象&#x…

DC电源模块的常见故障有哪些?

BOSHIDA DC电源模块的常见故障有哪些&#xff1f; DC电源模块是电子设备中常见的电源供应模块&#xff0c;它可以将交流电转化为直流电供给设备使用。然而&#xff0c;由于长期的使用和外界环境等因素的影响&#xff0c;DC电源模块也会出现各种故障。下面我们来介绍一下常见的…

【go语言开发】编写单元测试

本文主要介绍使用go语言编写单元测试用例&#xff0c;首先介绍如何编写单元测试&#xff0c;然后介绍基本命令的使用&#xff0c;最后给出demo示例 文章目录 前言命令示例 前言 在go语言中编写单元测试时&#xff0c;使用说明 测试文件命名&#xff1a;在 Go 语言中&#xff0…

蓝桥杯网络安全组竞赛

竞赛规则及说明 选拔赛时长&#xff1a;4h 决赛时长&#xff1a;4h 竞赛形式&#xff1a;线上比赛&#xff1a; 个人赛&#xff1a;一人一机&#xff0c;全程机考 大赛制定竞赛系统&#xff0c;在时间内提交答案到比赛系统&#xff0c;超时无法提交 机器环境&#xff1a; 电脑…

CSRF之pikachu靶场DW

1&#xff0c;登录皮卡丘靶场&#xff0c;get请求&#xff1b; 2&#xff0c;抓包并修改标记后的个人信息 最后放通一下&#xff0c;发现账号信息被修改 2&#xff0c;post请求 1提交post数据并使用bp抓包 2.利用工具改包&#xff0c;并生成url 3&#xff0c;点击提交后&#…

应用在触摸开关触控屏中的电容式触摸芯片

触摸开关是一种电子开关&#xff0c;使用时轻按开关按钮即可打开开关。松开手时&#xff0c;开关断开&#xff0c;内部结构由金属弹片受力弹动断开或者由电容值&#xff0c;电阻值等电气参数改变而控制。触摸开关一般是指应用触摸感应芯片原理设计的一种墙壁开关&#xff0c;是…

ArkUI组件--Button组件

1.声明Button组件 Button(label?:ResourceStr) #label是按钮上显示的文本 ①label是文字类型 所写文字会在按钮上显示 ②不输入label内容&#xff0c;需要额外定义一些描述。例如插入图片&#xff08;需要定义图片属性&#xff09; Button(){Image($r(app.media.xxx)).wi…

风靡万千软件开发者:揭秘华为研发代码大模型是如何实现的?

作者&#xff1a;陈泰红 秉持“自己的降落伞&#xff0c;自己先跳”的原则&#xff0c;由公司装备部门牵头&#xff0c;携手华为云PaaS作为基础能力提供方&#xff0c;与公司各产品线共同研发面向产业的代码大模型。在研发过程中&#xff0c;我们已取得初步成果&#xff0c;为…

LeetCode:1038. 从二叉搜索树到更大和树(反向中序遍历 C++、Java)

目录 1038. 从二叉搜索树到更大和树 题目描述&#xff1a; 实现代码与解析&#xff1a; dfs 原理思路&#xff1a; 1038. 从二叉搜索树到更大和树 题目描述&#xff1a; 给定一个二叉搜索树 root (BST)&#xff0c;请将它的每个节点的值替换成树中大于或者等于该节点值的所…

_____面试题_____(持续更新)

连表的链接方式 # 左连接 left join on # 右连接 right join on # 内连接 inner join on # 全连接 full join on # 笛卡尔积 join ------------------------------------------------ 上面讲的都是连表方式&#xff0c;连表的目的是查询&#xff0c;连表的依据是表和表…