Nacos注册中心实战(一)

本文涉及的产品
云原生内存数据库 Tair,内存型 2GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
传统型负载均衡 CLB,每月750个小时 15LCU
简介: Nacos注册中心实战

环境:Nacos 1.4.2

什么是Nacos

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

通俗解释就是:Nacos是一个注册中心&配置中心

关键特性

  1. 服务发现和服务健康监测
  2. 动态配置服务
  3. 动态 DNS 服务
  4. 服务及其元数据管理

更多详细内容请关注Nacos官方文档

什么是注册中心

我们说Nacos是一个注册中心,那么,什么是注册中心呢?通过上面的关键特性不难发现,注册中心提供了服务注册,服务发现,服务健康检查等基础能力,使开发者能够轻松地管理服务,在Spring Cloud家族中,代表性的有Spring Cloud Eureka, Spring Cloud Consul,以及早期Apache的Zookeeper, 这些都能称之为注册中心,如果之前没有接触过微服务的小伙伴可能有疑问,为什么需要注册中心呢?

注册中心的由来

我们先来看看最原始的服务与服务之间的调用方式

Http远程调用

相信这是最简单的也是大家最熟悉的调用方式,在同一个公司中,A项目组(简称订单服务)想要使用B项目组(简称商品服务)提供的能力时,往往就会采用这样的方式,只需简单的发送一个Http请求,即能获取到对方的能力。

这样的方式比较简单,但同样有一些问题,比如:

  • 商品服务做服务迁移时,订单服务将不得不跟随着修改请求地址,然后重启服务
  • 商品服务做了集群时,订单服务需要有负载均衡策略,不然就会造成商品服务单节点压力过大

这时,有开发经验的小伙伴就会说:搞个Nginx做负载均衡不就好啦!没错,当服务上到生产环境时,我们都会改成这样的方式。

Nginx负载

基于Http请求直接调用的问题,我们只需稍稍改变一下调用策略:中间增加一个Nginx,订单服务不再直接调用商品服务,而且访问Nginx,由Nginx进行转发到商品服务上,此时,

如果商品服务ip地址发生变更:改动Nginx的代理配置即可

如果商品服务发生扩缩容:改动Nginx的负载均衡配置即可

完美解决Http请求直接调用的问题

一般来说,寻常的项目到这里就可以了,但是随着业务的不断迭代,需要的能力也逐渐增多,此时不仅仅只有订单和商品服务,还出现了物流,积分,库存,支付等等服务,不仅如此,这些服务与服务之间还会发生相互调用的情况,订单调积分,物流调库存,订单调支付....此时服务与服务之间的调用情况就会像下面这样:

不难想象,此时的Nginx配置将会打动每一位运维小哥。后续每一个服务配置发生改动,或者增加一个服务,运维小哥的心都将颤一颤。

直到有一天,开发:今天再加一个服务。

阿鉴在之前的公司就有幸目睹过运维小哥配置服务时nginx的样子,三台nginx的配置满满当当,令人头皮发麻,不知道有没有小伙伴遇到过这种情况呢

使用MySQL记录地址信息

使用Nginx负载的方式确实是一个比较好的方式,但就是有些费运维小哥,我们不妨思考一下,除了运维小哥知道服务的地址信息,还有谁知道呢?

没错,就是服务本身!

我们将运维小哥配置服务地址的动作转化成:服务启动时向MySQL中插入一条数据。

Nginx路由转发的动作改为:订单服务到数据库中查询商品服务的地址,再发起调用。

Nginx负载均衡改为:订单服务查询出商品服务列表,自己选择其中一个地址。

改变为的方式如下图:

表结构中有个server_name字段,调用商品服务时使用server_name='goods-server'为条件查询即可。

这样子,我们就可以把运维小哥解放(kaichu)了。

善于思考的小伙伴不难看出其中带来的问题:

  1. 所有的服务都需要连接这个MySQL,一但MySQL跪了,那咱也跪了。
  2. 每次服务发起调用时都需要查询一次MySQL。
  3. 服务如果挂了,MySQL中的记录仍旧存在。

那么我们现在就来着手解决这些问题吧

  1. 既然MySQL不行,我们就把它换成Redis,所有服务连一个MySQL不太现实,连Redis总行吧
  2. 每次调用前都要查询一次,改成查询后缓存到服务本地,同时启动定时任务,每30秒更新缓存,服务调用时从缓存中获取地址信息。
  3. 服务如果挂了,MySQL中的记录仍旧存在:插入到Redis的数据有过期时间,而且服务启动后开启定时任务,每30秒就更新缓存,如果服务挂了,缓存自动过期。

嘿,现在在看这个方案,是不是比较完美了呢~

偷偷告诉小伙伴,Dubbo使用Redis做注册中心时,就是这么玩的

虽然看起来完美,但是第二和第三点在真正使用时,产生的问题产生的足以让人自闭,现在阿鉴给大家模拟一下自闭场景。

环境:订单服务:一个实例,商品服务,两个实例,A和B

时间:1分00秒

订单服务调用商品服务,正常。

A商品服务缓存过期时间剩余:29S

时间:1分01秒

A商品服务同步Redis缓存信息,Redis剩余过期时间:30S。

同时,A商品服务下线(挂了)

时间:1分02秒

订单服务调用商品服务,由于A商品服务已下线,此时的调用时好时坏(调用B时正常)。

A商品服务在本地缓存过期时间剩余:28S

A商品服务Redis剩余过期时间: 29S

时间:1分29秒

本地缓存更新,刷新A商品服务缓存时间:30S

A商品服务Redis剩余过期时间: 1S,下一秒过期

时间:1分59秒

本地缓存更新,刷新A商品服务缓存:此时Redis缓存中已没有A商品服务信息,所以本地缓存也将不再存在A商品服务信息。

订单服务调用商品服务,正常(此时缓存里只有B商品服务信息)

模拟完毕

大家可以看到,在1分01秒时,A商品服务已经下线了,但是直到1分59秒时,订单服务才能反应过来,这其中的58秒的服务调用时好时坏,怎么样,要是在生产环境足够让人自闭了吧。

当然,如果在订单服务上加上一个重试策略:在调用A商品服务失败后,重试,调用B商品服务,就能较好的解决这个问题,但是假设A商品服务没挂,它只是抖了一下,订单服务又去调用了B商品服务,这等于一个接口同时调了两次,这时又要考虑接口幂等性的问题了。

这时可能有小伙伴会说:幂等性的问题有啥的,Easy! 但一个项目的开发人员水平参差不齐,要求人人都做到这是不太现实的,不说了,说多了该被喷了。

这个问题的关键在于:被调用的服务挂了,调用方能不能及时感知到这个变化。

嘿,最早的Zookeeper(简称zk)就是来干这活的~ zk的临时节点机制能使服务下线后,zk能够立即感知,watch机制能够使其他服务立即收到所监听数据的变化。过多内容阿鉴这里就不再展开说了,有兴趣的小伙伴可以自己研究一下,Zookeeper官网

注册中心

聊了那么多,相信小伙伴已经有些感觉什么是注册中心了哈,没错,以上都是注册中心的能力,当我们把这些能力进行抽象,做成了一个服务时,那么这个服务,就叫做注册中心!

下面这张阿鉴画的图还是有些好看哈

可以看到,注册中心的基础接口有4个:服务注册,服务发现(获取),心跳检测,服务注销

以下为使用注册中心时服务的调用过程

  1. 订单服务|商品服务启动时,调用服务注册接口,将自己的地址信息发送给注册中心
  2. 订单服务调用商品服务时,调用服务获取接口,获取到商品服务的地址信息,放入缓存
  3. 使用调用组件进行负载均衡,发起调用
  4. 商品服务下线,调用服务注销接口,注册中心剔除商品服务信息

当然,这样的方式还是没能解决被调用的服务挂了,调用方能不能及时感知到这个变化这个问题,到底该如何解决,我们放到后面再聊~

相信小伙伴已经明白了注册中心的原理,那么现在我们就来手写一个注册中心吧,开始使用Nacos吧。

Nacos安装

Nacos支持三种部署模式

  • 单机模式 - 用于测试和单机试用。
  • 集群模式 - 用于生产环境,确保高可用。
  • 多集群模式 - 用于多数据中心场景。

单机模式

环境:Ubuntu 18.04 LTS 一台

下载安装包

Releases notes

这里选择版本1.4.2

wget https://github.wuyanzheshui.workers.dev/alibaba/nacos/releases/download/1.4.2/nacos-server-1.4.2.tar.gz
tar -xf nacos-server-1.4.2.tar.gz 

配置

Nacos支持两种数据存储方式

  • 使用内置数据源实现数据的存储,使用这种方式直接启动Nacos即可
  • 使用MySQL进行数据存储,这种方式需要先有个MySQL

为了方便观察数据存储的基本情况,这里我们使用MySQL的存储方式。

变变变,变出一台MySQL,没有MySQL的小伙伴可以参考安装MySQL

  1. 执行初始化SQL脚本
    脚本地址
  2. 修改配置文件
vim nacos/conf/application.properties
spring.datasource.platform=mysql
### Count of DB:
db.num=1
### Connect URL of DB:
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=nacos
db.password.0=nacos
nacos.core.auth.enabled=true
nacos.core.auth.enable.userAgentAuthWhite=false
nacos.core.auth.server.identity.key=abcd
nacos.core.auth.server.identity.value=123456

其中db相关配置修改为自己的MySQL配置,nacos.core.auth.server.identity.keynacos.core.auth.server.identity.value自行定义

启动

bash nacos/bin/startup.sh -m standalone

ubuntu系统需要使用bash命令,其他系统使用sh命令即可

此时在浏览器中输入以下地址即可打开Nacos控制台

127.0.0.1:8848/nacos/index.html

初始账号密码为:nacos | nacos

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
2月前
|
NoSQL Java Nacos
SpringCloud集成Seata并使用Nacos做注册中心与配置中心
SpringCloud集成Seata并使用Nacos做注册中心与配置中心
72 3
|
4天前
|
负载均衡 Java Nacos
SpringCloud基础1——远程调用、Eureka,Nacos注册中心、Ribbon负载均衡
微服务介绍、SpringCloud、服务拆分和远程调用、Eureka注册中心、Ribbon负载均衡、Nacos注册中心
SpringCloud基础1——远程调用、Eureka,Nacos注册中心、Ribbon负载均衡
|
29天前
|
Cloud Native Java Nacos
微服务注册中心-Nacos概述
该博客文章提供了对Nacos的全面概述,包括其基本介绍、与Spring Cloud集成的优势、主要功能以及如何在Spring Cloud Alibaba项目中作为服务注册中心使用Nacos。文章解释了Nacos是一个动态服务发现、配置管理和服务管理平台,支持服务发现、健康监测、动态配置、DNS服务和元数据管理。还介绍了如何下载和启动Nacos服务器,以及如何将微服务注册到Nacos中,包括修改pom.xml文件引入依赖、配置application.properties文件和使用@EnableDiscoveryClient注解开启服务注册发现功能。
微服务注册中心-Nacos概述
|
1月前
|
Java Nacos Docker
"揭秘!Docker部署Seata遇上Nacos,注册成功却报错?这些坑你不得不防!一网打尽解决秘籍,让你的分布式事务稳如老狗!"
【8月更文挑战第15天】在微服务架构中,Nacos搭配Seata确保数据一致性时,Docker部署Seata后可能出现客户端连接错误,如“can not connect to services-server”。此问题多由网络配置不当、配置文件错误或版本不兼容引起。解决策略包括:调整Docker网络设置确保可达性;检查并修正`file.conf`和`registry.conf`中的Nacos地址和端口;验证Seata与Nacos版本兼容性;修改配置后重启服务;参考官方文档和最佳实践进行配置。通过这些步骤,能有效排除故障,保障服务稳定运行。
35 0
|
1月前
|
Kubernetes Nacos 微服务
【技术难题破解】Nacos v2.2.3 + K8s 微服务注册:强制删除 Pod 却不消失?!7步排查法+实战代码,手把手教你解决Nacos Pod僵死问题,让服务瞬间满血复活!
【8月更文挑战第15天】Nacos作为微服务注册与配置中心受到欢迎,但有时会遇到“v2.2.3 k8s 微服务注册nacos强制删除 pod不消失”的问题。本文介绍此现象及其解决方法,帮助开发者确保服务稳定运行。首先需检查Pod状态与事件、配置文件及Nacos配置,确认无误后可调整Pod生命周期管理,并检查Kubernetes版本兼容性。若问题持续,考虑使用Finalizers、审查Nacos日志或借助Kubernetes诊断工具。必要时,可尝试手动强制删除Pod。通过系统排查,通常能有效解决此问题。
41 0
|
1月前
|
Dubbo Java Nacos
【实战攻略】破解Dubbo+Nacos+Spring Boot 3 Native打包后运行异常的终极秘籍——从零开始彻底攻克那些让你头疼不已的技术难题!
【8月更文挑战第15天】Nacos作为微服务注册与配置中心受到欢迎,但使用Dubbo+Nacos+Spring Boot 3进行GraalVM native打包后常遇运行异常。本文剖析此问题及其解决策略:确认GraalVM版本兼容性;配置反射列表以支持必要类和方法;采用静态代理替代动态代理;检查并调整配置文件;禁用不支持的功能;利用日志和GraalVM诊断工具定位问题;根据诊断结果调整GraalVM配置。通过系统排查方法,能有效解决此类问题,确保服务稳定运行。
52 0
|
1月前
|
安全 Nacos 数据库
【技术安全大揭秘】Nacos暴露公网后被非法访问?!6大安全加固秘籍,手把手教你如何保护数据库免遭恶意篡改,打造坚不可摧的微服务注册与配置中心!从限制公网访问到启用访问控制,全方位解析如何构建安全防护体系,让您从此告别数据安全风险!
【8月更文挑战第15天】Nacos是一款广受好评的微服务注册与配置中心,但其公网暴露可能引发数据库被非法访问甚至篡改的安全隐患。本文剖析此问题并提供解决方案,包括限制公网访问、启用HTTPS、加强数据库安全、配置访问控制及监控等,帮助开发者确保服务安全稳定运行。
72 0
|
1月前
|
安全 Nacos 数据安全/隐私保护
【技术干货】破解Nacos安全隐患:连接用户名与密码明文传输!掌握HTTPS、JWT与OAuth2.0加密秘籍,打造坚不可摧的微服务注册与配置中心!从原理到实践,全方位解析如何构建安全防护体系,让您从此告别数据泄露风险!
【8月更文挑战第15天】Nacos是一款广受好评的微服务注册与配置中心,但其连接用户名和密码的明文传输成为安全隐患。本文探讨加密策略提升安全性。首先介绍明文传输风险,随后对比三种加密方案:HTTPS简化数据保护;JWT令牌减少凭证传输,适配分布式环境;OAuth2.0增强安全,支持多授权模式。每种方案各有千秋,开发者需根据具体需求选择最佳实践,确保服务安全稳定运行。
71 0
|
1月前
|
Java Nacos 开发工具
【Nacos】心跳断了怎么办?!8步排查法+实战代码,手把手教你解决Nacos客户端不发送心跳检测问题,让服务瞬间恢复活力!
【8月更文挑战第15天】Nacos是一款广受好评的微服务注册与配置中心。然而,“客户端不发送心跳检测”的问题时有发生,可能导致服务实例被视为离线。本文介绍如何排查此类问题:确认Nacos服务器地址配置正确;检查网络连通性;查看客户端日志;确保Nacos SDK版本兼容;调整心跳检测策略;验证服务实例注册状态;必要时重启应用;检查影响行为的环境变量。通过这些步骤,通常可定位并解决问题,保障服务稳定运行。
52 0
|
1月前
|
网络安全 Nacos 开发者
【Nacos】神操作!节点提示暂时不可用?别急!7步排查法+实战代码,手把手教你解决Nacos服务实例状态异常,让服务瞬间满血复活!
【8月更文挑战第15天】Nacos作为微服务注册与配置中心,虽广受好评,但仍可能遇到“节点提示暂时不可用”的问题。本文解析此现象及其解决之道。首先需理解该提示意味着服务实例未能正常响应。解决步骤包括:检查服务状态与网络、审查Nacos配置、调整健康检查策略、重启服务及分析日志。通过系统化排查,可有效保障服务稳定运行。
38 0