Nacos 是什么

Nacos(Naming and Configuration Service)是阿里巴巴的一个开源项目,也是 Spring Cloud Alibaba 的一个重要组件。专注于服务发现和配置管理领域。

Nacos 官方文档

注意:如果中途发现操作过程一样但还是报错,很有可能是版本号不一致(新版本不一定兼容老版本)。


部署 Nacos 服务器

Nacos 作为 Spring Cloud Alibaba 的一个组件,版本号自然也一定要选择正确,参考 官方版本说明

Spring Cloud Alibaba Version Sentinel Version Nacos Version RocketMQ Version Dubbo Version Seata Version
2021.0.1.0* 1.8.3 1.4.2 4.9.2 2.7.15 1.4.2
2.2.7.RELEASE 1.8.1 2.0.3 4.6.1 2.7.13 1.3.0
2.2.6.RELEASE 1.8.1 1.4.2 4.4.0 2.7.8 1.3.0
2021.1 or 2.2.5.RELEASE or 2.1.4.RELEASE or 2.0.4.RELEASE 1.8.0 1.4.1 4.4.0 2.7.8 1.3.0
2.2.3.RELEASE or 2.1.3.RELEASE or 2.0.3.RELEASE 1.8.0 1.3.3 4.4.0 2.7.8 1.3.0
2.2.1.RELEASE or 2.1.2.RELEASE or 2.0.2.RELEASE 1.7.1 1.2.1 4.4.0 2.7.6 1.2.0
2.2.0.RELEASE 1.7.1 1.1.4 4.4.0 2.7.4.1 1.0.0
2.1.1.RELEASE or 2.0.1.RELEASE or 1.5.1.RELEASE 1.7.0 1.1.4 4.4.0 2.7.3 0.9.0
2.1.0.RELEASE or 2.0.0.RELEASE or 1.5.0.RELEASE 1.6.3 1.1.1 4.4.0 2.7.3 0.7.1

Nacos 软件直接上 GitHub 下载即可,项目地址为 Releases · alibaba/nacos (github.com)

下载完毕后解压,进入 bin 目录,然后运行单机模式

1
2
3
4
sh startup.sh -m standalone  //Linux
bash startup.sh -m standalone //Ubuntu

startup.cmd -m standalone //Windows

启动成功后,浏览器输入 http://localhost:8848/nacos 即可打开 Nacos 管理面板,账号和密码默认都是 nacos



搭建 Nacos 客户端

由于 Spring Cloud Alibaba 版本控制器中默认集成了 Nacos,所以在导入时不需要提供版本号

1
2
3
4
5
<!--导入Nacos注册与发现中心-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

修改 application.yml 配置文件

1
2
3
4
5
6
7
8
9
10
11
12
server:
port: 9002
spring:
application:
name: stock-service #模块名
cloud:
nacos:
server-addr: 127.0.0.1:8848 #nacos地址
discovery:
username: nacos #用户名
password: nacos #密码
namespace: public #命名空间

当有了此配置后,当服务启动时就会自动注册进入 Nacos 注册中心

image-20220517213516550

增加配置类

当有消费者要调用注册中心的服务时,必须配置一个负载均衡策略,Spring Cloud Alibaba 默认的负载均衡器是 Ribbon,只需要在 RestTemplate 的 Bean 上加上 @LoadBalanced 注解即可开启它的负载均衡器

1
2
3
4
5
6
7
8
@Configuration
public class RestConfig {
@Bean
@LoadBalanced
public RestTemplate restTemplate(RestTemplateBuilder restTemplateBuilder) {
return restTemplateBuilder.build();
}
}

此时就可以通过服务名调用 Nacos 注册中心中已经注册的服务了


在 controller 中调用注册中心的模块

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@RestController
@RequestMapping("/order")
public class OrderController {

@Autowired
RestTemplate restTemplate;

@GetMapping("add")
public String add() {
System.out.println("下单成功");

String msg = restTemplate.getForObject("http://stock-service/stock/reduct", String.class); //注意此处不是ip地址,是服务名

return "下单成功<hr/>" + msg;
}
}

至此,Nacos-Client 环境搭建成功



Nacos 配置参数

Nacos 参数的配置主要在 application.yml 中进行,文档可参考 Nacos-discovery/wiki,主要配置项如下:

配置项 Key 默认值 说明
服务端地址 spring.cloud.nacos.discovery.server-addr Nacos Server 启动监听的ip地址和端口
服务名 spring.cloud.nacos.discovery.service ${spring.application.name} 给当前的服务命名
服务分组 spring.cloud.nacos.discovery.group DEFAULT_GROUP 设置服务所处的分组
权重 spring.cloud.nacos.discovery.weight 1 取值范围 1 到 100,数值越大,权重越大
网卡名 spring.cloud.nacos.discovery.network-interface 当IP未配置时,注册的IP为此网卡所对应的IP地址,如果此项也未配置,则默认取第一块网卡的地址
注册的IP地址 spring.cloud.nacos.discovery.ip 优先级最高
注册的端口 spring.cloud.nacos.discovery.port -1 默认情况下不用配置,会自动探测
命名空间 spring.cloud.nacos.discovery.namespace 常用场景之一是不同环境的注册的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。
AccessKey spring.cloud.nacos.discovery.access-key 当要上阿里云时,阿里云上面的一个云账号名
SecretKey spring.cloud.nacos.discovery.secret-key 当要上阿里云时,阿里云上面的一个云账号密码
Metadata spring.cloud.nacos.discovery.metadata 使用Map格式配置,用户可以根据自己的需要自定义一些和服务相关的元数据信息
日志文件名 spring.cloud.nacos.discovery.log-name
集群 spring.cloud.nacos.discovery.cluster-name DEFAULT 配置成Nacos集群名称
接入点 spring.cloud.nacos.discovery.enpoint UTF-8 地域的某个服务的入口域名,通过此域名可以动态地拿到服务端地址
是否集成Ribbon ribbon.nacos.enabled true 一般都设置成true即可
是否开启Nacos Watch spring.cloud.nacos.discovery.watch.enabled true 可以设置成false来关闭 watch


Nacos 集群部署

之前使用的 ./startup.sh -m standalone 命令就是以单机模式启动 nacos 服务器。但是当我们用到微服务架构时,往往是项目规模达到了一定的程度。所以在真正使用的时候,大部分情况下都是以集群方式进行部署的,参考文档


下载若干个 nacos 服务器

这里以三个为例,给他们重命名,建议在名字后面加上端口号方便区分:

注意:单机集群启动的时候不能使用连续的端口了,会报错

image-20220819112031363


修改 application.properties 配置文件

在这一步需要配置数据源为 MySQL,因为 Nacos 内部使用的数据源 Hikari。我们要想搭建集群,就必须使用同一数据源(类似于 Scrapy 的分布式爬虫)

如下配置:

1
2
3
4
5
6
7
8
9
10
11
#*************** Config Module Related Configurations ***************#
### If use MySQL as datasource:
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=root
db.password.0=Pu2003..

修改三个 nacos 的端口:

1
2
### Default web server port:
server.port=[8840/8850/8860]

修改 cluster.conf.example

先将其复制一份为 cluster.conf,然后再进行修改

主要就是添加 nacos 集群节点

例如:

1
2
3
4
5
#it is ip
#example
192.168.0.108:8849
192.168.0.108:8850
192.168.0.108:8851

创建 MySQL 数据库

按照其要求创建 MySQL 数据库,并执行他所提供的 sql 文件(nacos-mysql.sql)

执行完之后表结构大致如下:

image-20220520212757077


修改项目 application.yml 文件

官方推荐集群部署后使用VIP或者域名访问,不过也可以使用直连模式:

1
2
3
4
spring:
cloud:
nacos:
server-addr: 127.0.0.1:8840, 127.0.0.1:8850, 127.0.0.1:8860

至此,就实现了 Nacos 的集群部署。接下来,我们也可以使用负载均衡软件如 Nginx 来进行集群的负载均衡。


使用 nginx 进行反向代理

修改 /etc/nginx/nginx.conf 文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# Nacos
upstream nacoscluster {
server 127.0.0.1:8840;
server 127.0.0.1:8850;
server 127.0.0.1:8860;
}

server {
listen 8847;
server_name localhost;

location /nacos/{
proxy_pass http://nacoscluster/nacos/;
}
}

启动所有 nacos 服务器,并启动 nginx,理论上打开浏览器 http://localhost:8847/nacos

登录后即可看到如下效果:

image-20220819121740445

nginx 默认的负载均衡机制是轮询方式,所以理论上请求时就会在三台服务器之间来回跳


至此,Nacos 集群环境就搭建好了,修改项目的 Nacos 地址配置文件:

1
2
3
4
spring:
cloud:
nacos:
server-addr: 192.168.220.1:8847

启动对应服务,OK,日常报错

image-20220520222915533


查看官方文档,发现 2.x 版本和 1.x 版本还不太一样:

Nacos2.0版本相比1.X新增了gRPC的通信方式,因此需要增加2个端口。新增端口是在配置的主端口(server.port)基础上,进行一定偏移量自动生成。

端口 与主端口的偏移量 描述
9847 1000 客户端gRPC请求服务端端口,用于客户端向服务端发起连接和请求
9848 1001 服务端gRPC请求服务端端口,用于服务间同步等

使用VIP/nginx请求时,需要配置成TCP转发,不能配置http2转发,否则连接会被nginx断开。

nacos

(图片来源于网络,侵删)

注意:使用 Nginx 配置 tcp 转发时需要用到 stream 模块,而 Nginx 在安装时是默认不编译 stream 模块的,需要我们手动安装

成功安装之后查看:

image-20220819114704082


接下来配置 nginx 的 tcp 转发:

  • 修改 nginx.conf,在最后一行加上 include /usr/local/nginx/tcp.d/*.conf;,注意不要写在 http 里
  • 新建 /usr/local/nginx/tcp.d/tcp.conf
  • 编辑 tcp.conf 文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# tcp.conf

stream {

# Nacos集群配置grpc
upstream nacoscluster {
server 127.0.0.1:9840;
server 127.0.0.1:9850;
server 127.0.0.1:9860;
}

server {
listen 9847;
proxy_pass nacoscluster;
}
}
  • 修改项目的 Nacos 地址配置文件:
1
2
3
4
spring:
cloud:
nacos:
server-addr: 192.168.220.1:8847

启动服务,完成!