当前位置: 欣欣网 > 码农

工作5年,没用过Nacos,正常吗?

2024-06-04码农

嗨,你好呀,我是哪吒。

公司想招聘一个5年开发经验的后端程序员,看了很多简历,发现一个共性问题, 普遍都没用过Nacos,这正常吗?

下面是已经入职的一位小伙伴的个人技能包,乍一看,还行,也没用过Nacos。

午休的时候,和她聊了聊,她之前在一家对日的公司。

  1. 需求是产品谈好的;

  2. 系统设计、详细设计是PM做的;

  3. 接口文档、数据库设计书是日本公司提供的;

  4. 最夸张的是, 就连按钮的颜色,文档中都有标注...

  5. 她需要做的,就只是照着接口文档去编码、测试就ok了。

有的面试者工作了5年,做的都是自家产品,项目只有两个, 翻来覆去的改BUG,加需求,做运维 。技术栈很老,还是SSM那一套,最近在改造,终于用上了SpringBoot... 微服务、消息中间件、分布式锁根本没用过...

还有的面试者,在XX大厂工作, 中间做了一年C#,一年Go ,一看简历很华丽, 精通三国语言 ,其实不然,都处于入门阶段,毫无竞争力可言。

一时兴起,说多了,言归正传,总结一篇Nacos的文章, 丰富个人简历,提高面试level,给自己增加一点谈资,秒变面试小达人,BAT不是梦。

一、什么是Nacos?

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

Nacos的关键特性:

Nacos的关键特性

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

1、RestTemplate调用远程服务

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

RestTemplate调用远程服务

@SpringBootTest
classTest{
@Resource
private RestTemplate restTemplate;
@Test
voidtestSimple(){
// 请求地址
String url = "http://www.nzbc.com/updateUser";
// 要发送的数据对象
User user = new User();
user.setUserId(1);
user.setName("哪吒编程");
user.setMsg("读哪吒编程,品技术人生");
// 发送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宕机了,怎么办?如果从Nacos获取到接口后,调用服务2时,服务2宕机了,怎么办?

4、心跳版Nacos


心跳版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核心功能

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分区容错性

Nacos Eureka Zookeeper Consul
一致性协议 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:8848
blog.name=哪吒编程
blog.language=java

(3)主方法启动类

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

2、支持配置的动态更新

一秒刷新一次。

@SpringBootApplication
public classProviderApplication{
publicstaticvoidmain(String[] args){
ConfigurableApplicationContext applicationContext = SpringApplication.run(ProviderApplication. classargs);
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 -

最后给大家推荐一个ChatGPT 4o国内网站,是我们团队一直在使用的,我们对接的是OpenAI官网的账号,给大家打造了一个一模一样的ChatGPT,很多粉丝朋友现在也都通过我拿这种号,价格不贵,关键还有售后 。

一句话说明 用官方一半价格的钱,用跟官方 ChatGPT4.0 一模一样功能的工具,而且不需要魔法,直接使用,不用担心网络问题。

功能简介:O penAI最新大模型GPT-4o、ChatGPT4.0知识问答、最强代码大模型Code Copilot、DALL-E AI绘画、写论文大模型Consensus、论文降重大模型(中文论文降重)、图片自动识别、联网查询、BUG解决、代码优化、上传文件、数据分析等。

国内直接使用 ChatGPT4o

  1. 支持OpenAI最新的ChatGPT4o。

  2. 无需魔法, 同时支持 PC、手机、平板,浏览器直接使用

  3. 一个账号一个专属授权码,保护个人隐私,使用记录长期保存。

  4. ChatGPT3.5永久免费, 提供免费共享GPT3.5授权码 。

  5. 官方独立账户规定每3小时40次 4.0提问,我们这个不限制4.0提问次数。

  6. 我们这个不会出现封号的情况,避免你因为封号多花冤枉钱。

  7. 联系站长 18640839506 ,备注AI,直接使用ChatGPT4o,拉你进ChatGPT售后群,群公告有使用说明和注意事项,有任何问题群里交流,群里有专业的技术支持

ChatGPT4o

NOW 6 .3

回复gpt,获取ChatGPT4o直接使用地址

点击阅读原文,国内直接使用ChatGpt4o