嗨,你好呀,我是哪吒。
公司想招聘一个5年开发经验的后端程序员,看了很多简历,发现一个共性问题, 普遍都没用过Nacos,这正常吗?
下面是已经入职的一位小伙伴的个人技能包,乍一看,还行,也没用过Nacos。
午休的时候,和她聊了聊,她之前在一家对日的公司。
需求是产品谈好的;
系统设计、详细设计是PM做的;
接口文档、数据库设计书是日本公司提供的;
最夸张的是, 就连按钮的颜色,文档中都有标注...
她需要做的,就只是照着接口文档去编码、测试就ok了。
有的面试者工作了5年,做的都是自家产品,项目只有两个, 翻来覆去的改BUG,加需求,做运维 。技术栈很老,还是SSM那一套,最近在改造,终于用上了SpringBoot... 微服务、消息中间件、分布式锁根本没用过...
还有的面试者,在XX大厂工作, 中间做了一年C#,一年Go ,一看简历很华丽, 精通三国语言 ,其实不然,都处于入门阶段,毫无竞争力可言。
一时兴起,说多了,言归正传,总结一篇Nacos的文章, 丰富个人简历,提高面试level,给自己增加一点谈资,秒变面试小达人,BAT不是梦。
一、什么是Nacos?
一个更易于构建云原生应用的动态服务发现、服务配置和服务管理平台。
Nacos的关键特性:
二、注册中心演变及其设计思想
1、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获取到接口后,调用服务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分区容错性
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. class, args);
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. 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 -
最后给大家推荐一个ChatGPT 4o国内网站,是我们团队一直在使用的,我们对接的是OpenAI官网的账号,给大家打造了一个一模一样的ChatGPT,很多粉丝朋友现在也都通过我拿这种号,价格不贵,关键还有售后 。
一句话说明 : 用官方一半价格的钱,用跟官方 ChatGPT4.0 一模一样功能的工具,而且不需要魔法,直接使用,不用担心网络问题。
功能简介:O penAI最新大模型GPT-4o、ChatGPT4.0知识问答、最强代码大模型Code Copilot、DALL-E AI绘画、写论文大模型Consensus、论文降重大模型(中文论文降重)、图片自动识别、联网查询、BUG解决、代码优化、上传文件、数据分析等。
国内直接使用 ChatGPT4o :
支持OpenAI最新的ChatGPT4o。
无需魔法, 同时支持 PC、手机、平板,浏览器直接使用 。
一个账号一个专属授权码,保护个人隐私,使用记录长期保存。
ChatGPT3.5永久免费, 提供免费共享GPT3.5授权码 。
官方独立账户规定每3小时40次 4.0提问,我们这个不限制4.0提问次数。
我们这个不会出现封号的情况,避免你因为封号多花冤枉钱。
联系站长 18640839506 ,备注AI,直接使用ChatGPT4o,拉你进ChatGPT售后群,群公告有使用说明和注意事项,有任何问题群里交流,群里有专业的技术支持
ChatGPT4o
NOW 6 .3
回复gpt,获取ChatGPT4o直接使用地址
点击阅读原文,国内直接使用ChatGpt4o