路过的朋友,欢迎来看看通俗易懂版本的Nacos

news/2025/3/21 9:41:44/文章来源:https://www.cnblogs.com/89564f/p/18231195

一、什么是Nacos?

一个更易于构建云原生应用的动态服务发现、服务配置和服务管理平台。

 

Nacos的关键特性:

 

二、注册中心演变及其设计思想

1、RestTemplate调用远程服务

如果此时,服务端接口接口名或参数或请求方式更改了,那么就得同步修改此restTemplate方法,感觉很麻烦

 

​
@SpringBootTest
class Test {@Resourceprivate RestTemplate restTemplate;@Testvoid testSimple()  {// 请求地址String url = "http://www.nzbc.com/updateUser";// 要发送的数据对象User user = new User();user.setUserId(1);user.setName("weiwie编程");user.setMsg("读weiwei编程,品技术人生");// 发送post请求User result = restTemplate.postForObject(url, user, User.class);System.out.println(result);}
}​

2、通过Nginx维护服务列表(upStream)

 

通过Nginx维护服务列表(upStream),如果服务较多的话,在Nginx通过upStream的方式去配置的话,Nginx配置文件会变得非常的难以维护。

3、通过Nacos实现注册中心

 

这种是最简单的Nacos注册中心,有若干个服务,都注册到Nacos注册中心,调用之前,先到Nacos获取对应接口,然后进行实际的调用。

但是,思考一个问题,如果Nacos宕机了,怎么办?如果从Nacos获取到接口后,调用服务2时,服务2宕机了,怎么办?

4、心跳版Nacos

 

心跳版Nacos,服务1和服务2和Nacos之间维护一个心跳关系,每5秒跳一次,频率不能太快或者太慢,否者会嗝屁的。

如果Nacos在5秒内没有收到心跳,则表示服务挂了,Nacos会下线此服务

对于超过15秒没有收到客户端心跳的服务实例,会将它的healthy属性置为false,客户端无法调用healthy为false的服务。

如果超过30秒没有收到心跳,Nacos会直接将此服务剔除

也可以通过服务端主动注销的方式,停止注册。

服务1调用服务2时,服务1会通过定时任务到Nacos中获取在线的服务,保证所调用的服务一直都是健康在线的状态。

获取到之后,用缓存将其保存起来,然后通过负载均衡器调用服务2,此时,将不再使用服务端的负载均衡Nginx了。

三、Nacos Discovery

SpringBoot中引入Nacos Discovery,实现与Nacos的无缝连接,Nacos Discovery可以将服务自动注册到Nacos服务端,并且能够动态感知此服务,并刷新服务列表。并将服务的host、port、URL等信息注册到Nacos。

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

 

Nacos 的配置项信息:

 

四、Nacos核心功能

 

1、服务注册

Nacos Client会通过发送REST请求向Nacos Server注册自己的服务,提供自身的元数据,比如host、port、url等信息,Nacos Server在收到注册请求后,会将这些数据信息存储在一个双层的内存map中。

2、服务心跳

服务注册后,服务消费者和Nacos Server之间会维护一个心跳,定时通知server,此服务还活着,防止被剔除掉。

3、服务同步

Nacos Server集群之间会互相同步已注册的服务,用来保证服务列表的一致性。

4、服务发现

服务消费者在调用服务提供者的服务时,会发送一个REST请求到Nacos Server,获取健康的服务列表,然后将其缓存到本地,同时开启一个定时任务,定时访问Nacos Server,然后更新本地缓存。

5、服务健康检查

Nacos Server会开启一个定时任务用来检查注册服务实例的健康情况,对于超过15秒没有收到客户端心跳的服务实例,会将它的healthy属性置为false,客户端无法调用healthy为false的服务,如果超过30秒没有收到心跳,Nacos会直接将此服务剔除。

五、作为注册中心

1、Nacos目前功能最全,用的也最多;

2、Eureka,因为挺更的缘故,比较新的技术都不支持了,目前很多公司都将Eureka换成Nacos了,不推荐使用;

3、Zookeeper,用的最多的地方就是和Dubbo一起使用,不支持负载均衡策略,但可以通过其它组件实现;

4、Consul支持的也很多;

CAP,C一致性,A可用性,P分区容错性

 NacosEurekaZookeeperConsul
一致性协议 CP + AP AP CP CP
访问协议 HTTP/DNS HTTP TCP HTTP/DNS
健康检查 TCP/HTTP/MYSQL/Client Beat Client Beat Keep Live TCP/HTT[/gRPC/Cmd
负载均衡策略 权重/metadata/Seletor Ribbon - Fabio
雪崩保护
自动注销 支持 支持 支持 支持
监听 支持 支持 支持 支持
多数据中心 支持 支持 支持 不支持
跨注册中心同步 支持 不支持 不支持 支持
Spring Cloud集成 支持 支持 支持 支持
Dubbo集成 支持 不支持 支持 支持
K8S集成 支持 不支持 支持 不支持

 

六、作为配置中心

1、SpringBoot集成Nacos

Nacos使用key/value形式存储配置信息,为分布式系统中的外部化配置提供服务支持。

(1)maven文件

<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

(2)配置文件

spring.application.name=nacos-config
spring.cloud.nacos.config.server-addr=127.0.0.1:8848blog.name=哪吒编程
blog.language=java

(3)主方法启动类

@SpringBootApplication
public class ProviderApplication {public static void main(String[] args) {ConfigurableApplicationContext applicationContext = SpringApplication.run(ProviderApplication.class, args);String name = applicationContext.getEnvironment().getProperty("blog.name");String language = applicationContext.getEnvironment().getProperty("blog.language");System.err.println("公众号 :"+name+"; 擅长技术: "+language);}
}

2、支持配置的动态更新

一秒刷新一次。

@SpringBootApplication
public class ProviderApplication {public static void main(String[] args) {ConfigurableApplicationContext applicationContext = SpringApplication.run(ProviderApplication.class, args);while(true) {//当动态配置刷新时,会更新到 Enviroment中,因此这里每隔一秒中从Enviroment中获取配置String name = applicationContext.getEnvironment().getProperty("blog.name");String language = applicationContext.getEnvironment().getProperty("blog.language");System.err.println("公众号 :"+name+"; 擅长技术: "+language);TimeUnit.SECONDS.sleep(1);}}
}

 

3、可支持profile粒度的配置

4、支持自定义 namespace 的配置

开发测试环境和生产环境的资源(如配置、服务)隔离等,比如dev和prod。

5、支持自定义 Group 的配置

在没有明确指定 ${spring.cloud.nacos.config.group}配置的情况下, 默认使用的是 DEFAULT_GROUP 。如果需要自定义自己的 Group,可以通过以下配置来实现:

spring.cloud.nacos.config.group=DEVELOP_GROUP

 

6、配置优先级

profile > 默认配置文件 > extension-configs(下标越大优先级越高) > shared-configs(下标越大优先级越高)

7、@RefreshScope

一般都是通过@Value的形式读取配置文件中的信息,但是无法感知修改后的值,需要利用@RefreshScope动态刷新

8、Spring Cloud Config 横向对比Nacos

(1) Spring Cloud Config需要结合Git使用,动态变更需要配合Bus 消息总线来通知所有的客户端变化;

(2)Spring Cloud Config没有可视化界面;

(3)Nacos使用长轮询更新配置,速度上秒杀Spring Cloud Config;

                                          - EOF -

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入解读Prometheus Adapter:云原生监控的核心组件

本文详述了Prometheus Adapter的部署与配置,通过三个实践案例展示其在Kubernetes环境中的应用,帮助用户实现基于自定义指标的自动扩展和跨集群统一监控。关注作者,分享AI全维度知识。作者拥有10+年互联网服务架构、AI产品研发经验、团队管理经验,同济本复旦硕,复旦机器人智…

智能农业:农业现代化的新引擎

在科技日新月异的今天,智能农业正迅速崛起为引领农业现代化的重要力量。借助物联网、大数据和人工智能等尖端技术,智能农业为农业生产带来了前所未有的智能监测、精准控制和高效管理,极大地提升了农业生产的效率和质量。智能农业的技术支撑是其成功的关键。其中,智能感知、…

STM32系列 PWM输出

#include "led.h" #include "delay.h" #include "key.h" #include "sys.h" #include "usart.h" #include "timer.h" //ALIENTEK战舰STM32开发板实验9 //PWM输出实验 //技术支持:www.openedv.com //广州市星翼电…

为什么想做副业???还不是因为穷

为什么那一刻突然想做副业???: 1、没有门路,没有渠道,害怕被骗,担心赚不到钱。 2、免费的怕被骗,要钱的却直接支付了,真豪爽(结果都没有赚到本钱) 我听到最搞笑的一句是:别人在哪个平台能找到我的店铺呢。。。不行动钱自己送上门???那为什么有些人想做却做不来呢…

node.js,在Azure Cosmos DB中批量删除数据

1.删除数据操作: 对于数据,不做逻辑删除,仅作标记删除,即将数据的isDelete属性置为true,因此删除数据实际上是修改数据。 某个item如图const item = await container.item(id, partitionKey).read() // 根据id和partitionKey读取数据 let Item = item.resource //获取数据…

配置枚举处理器

在application.yaml文件中添加配置: mybatis-plus:configuration:default-enum-type-handler: com.baomidou.mybatisplus.core.handlers.MybatisEnumTypeHandler 测试 @Test void testService() {List<User> list = userService.list();list.forEach(System.out::printl…

Error running ‘Application’Command line is too long

按照网上的说法 需要一个一个修改测试方法 或者 应用,比较麻烦 !!!!! 这里介绍一个一次设置的方法 第一步 2第二步3第三部 把这两个都修改下 应该就OK了

免费的项目管理系统哪个好?2024年值得关注的6大项目管理系统

对于预算有限的小企业和创业公司来说,免费的项目管理系统不仅可以帮助节省成本,还能提高工作效率。本文将分享2024年值得关注的6大项目管理系统:PingCode、Worktile、Asana、Trello、Jira、Monday.com。对于预算有限的小企业和创业公司来说,免费的项目管理系统不仅可以帮助…

java什么时候声明static方法

声明为static的方法有以下典型使用场景工具方法(Utility Methods):当你有一个方法不需访问对象状态,即不需要访问类的非静态成员变量,那么这个方法可以声明为static。这样,你无需创建类的实例就可以通过类名直接调用该方法。很多工具类如Math, Arrays, Collections中的方…

2024年9大主流提效个人项目管理工具分享

本文将介绍市场上几款受欢迎的个人项目管理软件,帮助你选择适合自己需求的最佳工具。本文将分享9大主流提效个人项目管理工具:PingCode、Worktile、Smartsheet、Celoxis、Wrike、QuickBase、Miro、FigJam、Nifty。个人项目管理软件作为提高生产力、组织任务和跟踪进度的强大工…

璞华科技获《数据产品登记证书》,璞华易表入数据资产运营市场

根据地方政策、深入地方市场、为地方客户提供专业的数据资产入表、数据资产运营管理服务!随着数字经济时代的飞速发展,数据要素在社会经济中的地位也变得越来越重要,成为超越传统土地、劳动力、技术和资金的新型关键资源,被誉为“第五要素”。这一变化不仅凸显了数据在当今…

进制转换

void decToBinary(int decimal) {int binary[32];int cnt = 0;while (decimal > 0){binary[cnt] = decimal % 2; // 取模放在低位decimal = decimal / 2; // 更新参数cnt++;}printf("Binary equivalent: ");for (int i = cnt - 1; i >= 0; i--) // 逆向输出…