Nacos简介
Nacos
是阿里巴巴开源的服务注册中心以及配置中心。 学过Spring Cloud
的小伙伴肯定都接触过Eureka
、Config
、Bus
。
Eureka
、Config
这两个组件相信大家都用过,有什么感受?
感受就是繁琐:
- 无论是Eureka还是Config都必须自己搭建个服务
- 英文界面不是那么友好
用过Nacos的开发者都说很爽,不用自己搭建服务,阿里给你准备好了服务,只需要启动即可;界面中英文都有,很适合初学者。当然最重要的原因就是以上组件很可能面临
停更
、比如Eureka已经停更了,谁知道后面其他的组件会不会如此呢?
Nacos主要提供以下四大功能
- 服务发现和健康监测
- 动态配置服务
- 动态DNS服务
- 服务及其元数据管理
Docker安装Nacos服务
下载镜像
shell
docker pull nacos/nacos-server:1.4.3
单机版部署
shell
docker run -d --name nacos -p 8848:8848 -e MODE=standalone -e NACOS_SERVER_IP=ip
nacos/nacos-serve:1.4.3
参数:
MODE:单节点模式
NACOS_SERVER_IP:服务ip地址
- 通过
http://ip:port/nacos
即可访问nacos
服务

应用注册到Nacos上
Dubbo实现服务生产者
- 创建父工程进行统一的依赖管理
xml
<!-- 进行依赖管理-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>${spring.boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring.cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring.cloud.alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.26</version>
</dependency>
</dependencies>
</dependencyManagement>
- 编写公共模块,我们使用的是
Dubbo
进行远程调用,service
层和controller
层都需要引入公共模块,在公共模块需要编写接口,在service
层将接口注册到nacos
上,在controller
层远程调用
eg:
JAVA中接口引用指向其实现类对象,比如ArrayList实现了List接口则生成了ArrayList对象,也就是
List list = new ArrayList();
也就是所有实现类List接口的类,都可以用List接口来声明对象类型,然后用实现类进行实例化。
- 编写服务生产者
service
xml
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
<version>2.6.3</version>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-dubbo</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>com.xiaoxiao</groupId>
<artifactId>cloud-common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
接口实现类
java
@DubboService(timeout = 5000,
methods = {@Method(name = "index",retries = 2)},cluster = "failfast",version = "1.0.0")
public class IProviderPaymentServiceImpl implements IPaymentService {
@Override
public String index() {
return "支付成功";
}
}
- 编写服务消费者
xml
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-dubbo</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
<version>2.6.3</version>
</dependency>
<dependency>
<groupId>com.xiaoxiao</groupId>
<artifactId>cloud-common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
业务层
java
@Service
public class PaymentServiceImpl {
@DubboReference(version = "1.0.0",
mock = "com.xiaoxiao.service.fallback.PaymentServiceImplFallBack",
cluster = "failfast")
private IPaymentService paymentService;
public String index(){
String name = this.paymentService.index();
return name;
}
}
服务降级策略
java
/**
* 服务降级策略
*/
public class PaymentServiceImplFallBack implements IPaymentService {
@Override
public String index() {
return "服务器繁忙请稍后重试.....";
}
}
分布式配置中心
上面我们了解了Nacos
可以当作服务注册中心进行服务治理,Nacos
还可以当作分布式配置中心。
为什么需要分布式配置中心
在Spring
的项目中,默认会提供一个application.properties/application.yml
。

主要缺点:
不支持配置文件动态更新: 在实际的业务开发过程中,需要动态地更新配置文件,比如切换业务功能开关、变更图片服务器地址、变更数据库连接信息等。在传统配置模式下,需要修改本地配置文件并重新打包,然后重启应用并发布,这样才能保证配置文件能够生效。但这样会导致该服务在重启阶段不可用,从而影响服务整体的可用率。
不支持配置集中式管理: 在微服务架构中,为了保证某些核心服务的高性能会部署几百个节点。如果在每个节点上都维护一个本地配置文件,则不管是对运维人员或者开发人员而言,成本都是巨大的。
不支持多环境部署: 如果通过底层框架来维护不同环境的信息,则成本也是非常高的。
分布式配置管理就是弥补上述不足的方法
Namespace命名空间
Namespace
主要进行多环境下的管理和隔离,现如今,在微服务体系中,一个系统往往被拆分成多个服务,每个服务都有自己的配置文件,每个系统还会准备 开发环境、测试环境、生产环境(线上环境) 进行多环境配置。
不足:
假设我们游一个系统,该系统有十个微服务,那么至少需要10个配置文件,还需要进行多环境配置,三个环境(
dev、test、prod
),那就有30个配置文件需要进行管理。
Namespace
就是解决上述问题的
在不同的命名空间下,可以配置相同环境的Group
或者DataID
的配置。Namespace
的常用场景之一是不同环境的配置进行区分隔离。
Nacos给的最佳实践表明,最外层的namespace是可以用于区分部署环境的,比如test,dev,prod
等。

注意:
命名空间可用于进行不同环境的配置隔离。一般一个环境划分到一个命名空间。

查看命名空间

DataID配置
DataID拼接形式
${prefix}-${spring.profiles.active}-${file.extension}
解释:
prefix:默认为 spring.application.name 的值。
spring.profiles.active:即为当前环境对应的 profile(环境名)。
file-extension:文件后缀
Nacos集群架构
默认Nacos使用嵌入式数据库Derby实现数据的存储。所以,如果启动多个默认配置下的Nacos节点,数据存储是存在一致性问题的。为了解决这个问题,Nacos采用了集中式存储的方式来支持集群化部署,目前只支持MySQL的存储。
Nacos支持三种部署模式
- 单机模式 - 用于测试和单机试用。
- 集群模式 - 用于生产环境,确保高可用。
- 多集群模式 - 用于多数据中心场景。

Nacos数据持久化
初始化数据库
Nacos的数据库脚本文件在我们下载Nacos-server时的压缩包中就有进入\nacos\conf
目录,初始化文件:nacos-mysql.sql
此处我创建一个名为 mynacos
的数据库,然后执行初始化脚本,成功后会生成 11
张表;
修改配置文件
这里是需要修改Nacos-server的配置文件Nacos-server其实就是一个Java工程或者说是一个Springboot项目,他的配置文件在nacos\conf目录下,名为 application.properties,在文件底部添加数据源配置:
shell
spring.datasource.platform=mysql
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000
&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=nacos
启动Nacos-server和Nacos-config
先启动Nacos-server,启动成功后进入Nacos控制台,此时的Nacos控制台中焕然一新,之前的数据都不见了。
注意:
因为加入了新的数据源,Nacos从mysql中读取所有的配置文件,而我们刚刚初始化的数据库是干干净净的,自然不会有什么数据和信息显示。
在公共空间(public)中新建一个配置文件DataID: order-consumer-dev.yml
, 配置内容如下:

验证是否持久化到数据库中:

Nacos集群配置
模拟三台机器,端口号分别为8848、8858、8868
修改各自的application.properties
文件
将各自的conf
文件夹下的cluster.conf.example
重命名为cluster.conf
,文件内容为:
shell
192.168.66.101:8848
192.168.66.101:8858
192.168.66.101:8868
使用Nginx做负载均衡反向代理访问Nacos集群
安装c语言编译器
shell
yum -y install gcc make automake pcre-devel zlib zlib-devel openssl openssl-devel
安装Nginx
shell
# 生产MakeFile文件
./configure
# 依赖安装生成nginx文件夹
make && make install
配置nginx.conf文件
shell
#指定上游服务器列表
upstream nacos{
#指定后端服务器地址
server 192.168.66.101:8848;
server 192.168.66.101:8858;
server 192.168.66.101:8868;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://nacos; #引用upstream
}
}
启动Nginx

通过Nginx
访问Nacos
浏览器输入:http://ip:port/nacos
Nginx
默认端口为80
