Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service的首字母简称,一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。
Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。
Nacos主要功能有以下两种:
配置中心是一种集中化管理配置的服务。
主要作用如下:
注册中心是微服务架构中的一个重要组件,用于实现不同服务实例的注册与发现
主要作用如下:
通过注册中心,服务提供者和消费者只需与注册中心交互即可,从而实现服务的注册与发现,降低了服务间的耦合度。
Nacos有三种部署方式;
环境准备:
安装方式:
编译压缩包安装流程:
unzip nacos-server-$version.zip
或者tar -xvf nacos-server-$version.tar.gz
cd nacos/bin
sh startup.sh -m standalone
cmd startup.cmd -m standalone
启动成功后可以使用:localhost:8848/nacos
进行访问Nacos的控制台,如下图所示:
集群部署说明:https://nacos.io/zh-cn/docs/v2/guide/admin/cluster-mode-quick-start.html
Nacos单机模式下默认使用的数据源是内置的嵌入式数据库Derby作为数据库,但是Derby不适合承载生产环境大规模部署,因为有以下限制:
- 数据存储容量只有2GB;
- 不支持集群模式下的高可用复制;
- 性能和并发能力有限制
因此在生产环境中使用单机模式时,可以使用外置数据库作为数据存储,例如MySQL。
在0.7版本之前,在单机模式时nacos使用嵌入式数据库实现数据的存储,不方便观察数据存储的基本情况。0.7版本增加了支持mysql数据源能力,具体的操作步骤:
安装MySQL,版本要求:5.6.5+;
初始化MySQL数据库,数据库初始化文件:sql语句源文件;
修改Nacos安装目录中conf/application.properties
文件,增加支持MySQL数据源配置,配置如下:
spring.datasource.platform=mysql
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
参考文档:application.properties配置文件
再以单机模式启动nacos,nacos所有写嵌入式数据库的数据都写到了mysql
最后,重新启动Nacos服务。
对于集群模式下的部署可参考官方文档:集群模式下运行Nacos
首先找到Nacos安装目录中conf/application.properties
文件,修改以下内容:
nacos.core.auth.enabled=true
nacos.core.auth.system.type=nacos
nacos.core.auth.plugin.nacos.token.secret.key=${自定义,保证所有节点一致}
nacos.core.auth.server.identity.key=${自定义,保证所有节点一致}
nacos.core.auth.server.identity.value=${自定义,保证所有节点一致}
注意,文档中的默认值
SecretKey012345678901234567890123456789012345678901234567890123456789
和VGhpc0lzTXlDdXN0b21TZWNyZXRLZXkwMTIzNDU2Nzg=
为公开默认值,可用于临时测试,实际使用时请务必更换为自定义的其他有效值。
至此,我们Nacos集群环境就搭建成功了,接下来就是使用Nacos服务的两个核心功能了。
参数说明:
实现步骤:
- 添加
nacos-config
依赖。- 在配置文件(
application.properties
)中设置Nacos相关信息。- 使用
@Value
和@RefreshScope
实现配置的读取和自动更新。
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-configartifactId>
dependency>
# Nacos认证信息
spring.cloud.nacos.config.username=nacos
spring.cloud.nacos.config.password=nacos
spring.cloud.nacos.config.contextPath=/nacos
# 设置配置中心服务端地址
spring.cloud.nacos.config.server-addr=localhost:8848
# Nacos 配置中心的namespace。需要注意,如果使用 public 的 namcespace ,请不要填写这个值,直接留空即可
# spring.cloud.nacos.config.namespace=
spring.config.import=nacos:nacos-config-example
# 配置文件类型
spring.cloud.nacos.config.file-extension=properties
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RefreshScope
public class TestController {
@Value("${myconfig}")
private String myconfig;
@RequestMapping("/getconfig")
public String getMyconfig(){
return myconfig;
}
}
注册中心的交互流程:
注册中心通常有两个角色:
生产者实现有以下3步:
- 添加
nacos-discovery
依赖- 配置
nacos
服务端信息- 编写调用接口
添加依赖
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-configartifactId>
<version>${latest.version}version>
dependency>
设置服务端信息
spring:
application:
name: nacos-discovery-demo #nacos服务名
cloud:
nacos:
discovery:
server-addr: localhost:8848
username: nacos
password: nacos
编写调用接口
@RestController
@RequestMapping("/user")
public class UserController {
@RequestMapping("/getnamebyid")
public String getNameById(Integer id) throws InterruptedException {
return "name: "+ id;
}
}
实现过程:消费者首先调用生产者的HTTP接口,需要引入Spring Cloud OpenFeign
进行HTTP调用,其次为了实现负载均衡,我们还需要引入客户端负载均衡器:Spring Cloud LoadBalancer
。
具体的OpenFeign
和LoadBalancer
的功能,将会在后续文章中进行详细介绍。
因此消费者实现有以下步骤:
- 引入依赖(Nacos注册中心、OpenFeign、Spring Cloud LoadBalancer)
- 配置Nacos服务端信息
- 在项目中开启OpenFeign
- 编写OpenFeign调用代码
- 通过OpenFeign调用生产者
引入依赖
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-loadbalancerartifactId>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-openfeignartifactId>
dependency>
配置Nacos服务端信息
spring:
application:
name: nacos-consumer-demo
cloud:
nacos:
discovery:
server-addr: localhost:8848
username: nacos
password: nacos
register-enabled: false # 消费者(不需要注册到nacos中)
在项目中开启OpenFeign
在启动类文件中添加@EnableFeignClients
注解即可
编写OpenFeign调用代码
@Service
@FeignClient("nacos-discovery-demo") // 表示调用 nacos 中的 nacos-discovery-demo 服务
public interface UserService {
@RequestMapping("/user/getnamebyid") // 调用生产者的"/user/getnamebyid"接口
public String getNameById(@RequestParam("id") int id);
}
通过OpenFeign调用生产者
@RestController
public class BusinessController {
@Autowired
private UserService userService;
@RequestMapping("/getnamebyid")
public String getNameById(Integer id){
return userService.getNameById(id);
}
}
启动服务后,我们就可以在Nacos控制台看到生产者的服务
进入详情页面后可以看到服务的相关信息
在服务详情页面中,可以看到有许多的参数信息
**分组:**注册服务的所在的组名,默认是DEFAULT_GROUP
**保护阈值:**健康节点要求的最小百分比。用于在服务出现不健康实例时,阻止流量过度向少量健康实例中,保护服务的整体可用性。保护阈值的范围是0到1之间的浮点数,默认为0。当集群中健康的实例占比小于设置的保护阈值时,就会触发阈值保护功能。触发阈值保护后,Nacos会将全部实例(健康实例+不健康实例)全部返回给调用者,虽然损失了一部分流量,但是保证了集群中剩余的健康实例能正常工作。
**服务路由类型:**由于实现不同的路由需求,常见的路由类型有以下两种:
**临时实例:**Nacos会将服务分为临时实例和永久实例,临时实例的生命周期和服务运行周期相同,服务停止运行,Nacos会将临时实例删除;而永久实例即使程序运行停止,也会在Nacos中。
- 临时实例(Temporary instances):是指注册到注册中心的服务实例,其注册信息在实例下线或不可用时会自动删除。如果服务实例下线、断开连接或主动注销,Nacos会自动从注册表中删除实例的信息。临时实例适用于临时性的服务实例。
- 永久实例(Permanent Instance):是指注册到注册中心的服务实例,其注册信息一直保存在Nacos服务器上,直到主动注销或被删除。意味着当服务下线或不可用时,它的注册信息仍保留在Nacos上,直到显示取消注册。永久实例适用于需要长期存在的服务。
对于永久实例实现,通过在配置文件中ephemeral: true
实现(yaml文件中于nacos.discover.username同级)
**权重:**用于实现负载均衡,取值范围为0到10000,数值越大,权重越大,负载均衡分配的概率就越高。设置0表示下线。
Nacos中健康检测机制是用来检测服务健康状态的,只要健康的节点才能被服务端调用,这样程序才能正常的、稳定的运行。
在Nacos中有两种健康检测机制:
如何设置健康检测机制:
在Nacos中健康检测机制不能主动设置,但健康检测机制是和Nacos的服务实例类型强相关的。在Nacos中的两种服务实例分别对应不同的健康检测机制:
客户端主动上报机制
临时实例每隔5秒会主动上报一次自己的健康状况,发送的数据包叫做心跳包,发送心跳包的机制叫做心跳机制。如果心跳包的间隔时间超过了15秒,那么Nacos服务器端就会将此服务实例标记为非健康实例,如果超过了30秒,那么Nacos服务器端将会把此服务实例从服务列表中删除掉。
服务端反向探测机制
永久实例使用的是服务器端反向探测机制,它的探测周期是2000毫秒+随机数(5000毫秒以内),如果检测异常会将此服务实例标记为非健康实例,但不会把实例删除。
Nacos服务器反向探测目前内置了3中探测协议:HTTP探测、TCP探测、MySQL探测。默认使用的是TCP探测。
关于Nacos更多的使用可以参考Nacos官方手册:https://nacos.io/zh-cn/docs/architecture.html
以上是博主对Nacos的介绍,制作不易,看完留下你的一键三连吧!
的间隔时间超过了15秒,那么Nacos服务器端就会将此服务实例标记为非健康实例,如果超过了30秒,那么Nacos服务器端将会把此服务实例从服务列表中删除掉。
服务端反向探测机制
永久实例使用的是服务器端反向探测机制,它的探测周期是2000毫秒+随机数(5000毫秒以内),如果检测异常会将此服务实例标记为非健康实例,但不会把实例删除。
Nacos服务器反向探测目前内置了3中探测协议:HTTP探测、TCP探测、MySQL探测。默认使用的是TCP探测。
关于Nacos更多的使用可以参考Nacos官方手册:https://nacos.io/zh-cn/docs/architecture.html
以上是博主对Nacos的介绍,制作不易,看完留下你的一键三连吧!