Spring Cloud Alibaba Nacos
一、Nacos介绍
Nacos 英文全称为 Dynamic Naming and Configuration Service,是由阿里巴巴使用 Java 语言开发的开源项目。Nacos 是一个更易于帮助构建云原生应用的动态服务发现、配置和服务管理平台(参考自 Nacos 官网)。Nacos 的命名是由 3 部分组成:
| 组成部分 | 全称 | 描述 |
|---|---|---|
| Na | Naming/nameServer | 服务注册中心,与 Spring Cloud Eureka 的功能类似。 |
| co | Configuration | 配置中心,与 Spring Cloud Config+Spring Cloud Bus 的功能类似。 |
| s | Service | 服务,表示 Nacos 实现的服务注册中心和配置中心都是以服务为核心的 |
Nacos 可以理解成服务注册中心和配置中心的结合,它可以替换 Eureka 作为服务注册中心,实现服务的注册与发现;还可以替换 Spring Cloud Config 作为配置中心,实现配置的动态刷新。
Nacos 官网:https://nacos.io/zh-cn/
Github:https://github.com/alibaba/nacos
二、Nacos 具有的优点
Nacos 提供了一系列简单易用的特性,能够帮助我们快速地实现动态服务发现、服务配置等功能。
-
服务发现:Nacos 支持基于 DNS 和 RPC 的服务发现。当服务提供者使用原生 SDK、OpenAPI 或一个独立的 Agent TODO 向 Nacos 注册服务后,服务消费者可以在 Nacos 上通过 DNS TODO 或 HTTP&API 查找、发现服务。
-
服务健康监测:Nacos 提供对服务的实时健康检查,能够阻止请求发送到不健康主机或服务实例上。Nacos 还提供了一个健康检查仪表盘,能够帮助我们根据健康状态管理服务的可用性及流量。
-
动态配置服务:动态配置服务可以让我们以中心化、外部化和动态化的方式,管理所有环境的应用配置和服务配置。动态配置消除了配置变更时重新部署应用和服务的需要,让配置管理变得更加高效、敏捷。配置中心化管理让实现无状态服务变得更简单,让服务按需弹性扩展变得更容易。Nacos 提供了一个简洁易用的 UI 帮助我们管理所有服务和应用的配置。Nacos 还提供包括配置版本跟踪、金丝雀发布、一键回滚配置以及客户端配置更新状态跟踪在内的一系列开箱即用的配置管理特性,帮助我们更安全地在生产环境中管理配置变更和降低配置变更带来的风险。
-
动态 DNS 服务:Nacos 提供了动态 DNS 服务,能够让我们更容易地实现负载均衡、流量控制以及数据中心内网的简单 DNS 解析服务。Nacos 提供了一些简单的 DNS APIs TODO,可以帮助我们管理服务的关联域名和可用的 IP:PORT 列表。
-
服务及其元数据管理:Nacos 能让我们从微服务平台建设的视角管理数据中心的所有服务及元数据,包括管理服务的描述、生命周期、服务的静态依赖分析、服务的健康状态、服务的流量管理、路由及安全策略、服务的 SLA 以及 metrics 统计数据。
三、Nacos 组件说明
Nacos 和Eureka 类似也是 CS架构,它包含客户端和服务端
| 组件 | 描述 | 功能 |
|---|---|---|
| Nacos Server | Nacos 服务端,与 Eureka Server 不同,Nacos Server 由阿里巴巴团队使用 Java 语言编写,用户只需要下载并运行即可。 | Nacos Server 作为服务注册中心,帮助 Nacos Client 实现服务的注册与发现。 |
| Nacos Server 作为配置中心,帮助 Nacos Client 在不重启的情况下,实现配置的动态刷新。 | ||
| Nacos Client | Nacos 客户端,通常指的是微服务架构中的各个服务,由用户自己搭建,可以使用多种语言编写。 | Nacos Client 通过添加依赖 spring-cloud-starter-alibaba-nacos-discovery,在服务注册中心(Nacos Server)中实现服务的注册与发现。 |
| Nacos Client 通过添加依赖 spring-cloud-starter-alibaba-nacos-config,在配置中心(Nacos Server)中实现配置的动态刷新。 |
四、Nacos服务注册和发现
Nacos 实现服务注册与发现的流程如下:
- 从 Nacos 官方下载 Nacos Server 并运行。
- 服务提供者 Nacos Client 启动时,会把服务以服务名(spring.application.name)的方式注册到服务注册中心(Nacos Server);
- 服务消费者 Nacos Client 启动时,也会将自己的服务注册到服务注册中心;
- 服务消费者在注册服务的同时,它还会从服务注册中心获取一份服务注册列表信息,该列表中包含了所有注册到服务注册中心上的服务的信息(包括服务提供者和自身的信息);
- 在获取了服务提供者的信息后,服务消费者通过 HTTP 或消息中间件远程调用服务提供者提供的服务。
五、Nacos安装和运行
1. 使用浏览器访问 Nacos Server 下载页面,并在页面最下方点击链接 nacos-server-2.0.0.zip,如下图。

2.下载完成后,解压 nacos-server-2.0.0.zip,目录结构如下。

Nacos Server 下各目录说明如下:
- bin:用于存放 Nacos 的可执行命令。
- conf:用于存放 Nacos 配置文件。
- target:用于存放 Nacos 应用的 jar 包。
3. 打开命令行窗口,跳转到 Nacos Server 安装目录的 bin 下,执行以下命令,以单机模式启动 Nacos Server。
startup.cmd -m standalone
4. Nacos Server 启动日志如下
5. 使用浏览器访问 http://localhost:8848/nacos,打开 Nacos Server 登陆页面

6. 在登陆页输入登录名和密码都是 nacos),点击提交按钮,跳转到 Nacos Server 控制台主页

到这里就完成了 Nacos Server 的下载、安装和运行工作。
六、Nacos作为服务注册中心
6.1.基于Nacos的服务提供者
6.1.1.新建module:cloudalibaba-provicer-payment9001
创建maven模块,设置模块名:

6.1.2.在pom.xml中引入依赖
这里需要引入nacos注册中心依赖
<dependencies>
<!--nacos服务注册中心引入内容-->
<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-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.augus.springcloud</groupId>
<artifactId>cloud-api-common</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
6.1.3.创建配置文件
创建配置文件application.yml,内容如下:
server: port: 9001 spring: application: name: nacos-payment-provider cloud: nacos: discovery: # 指定注册访问的nacos server-addr: localhost:8848 # 暴露所有端点 management: endpoints: web: exposure: include: "*"
6.1.4.创建主启动类
在com.augus.cloud包下创建主启动类 NacosProviderMain9001
package com.augus.cloud; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; @SpringBootApplication @EnableDiscoveryClient //开启服务发现功能 public class NacosProviderMain9001 { public static void main(String[] args) { SpringApplication.run(NacosProviderMain9001.class,args); } }
6.1.5.controller
创建 PaymentController,代码如下:
package com.augus.cloud.controller; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/payment") public class PaymentController { @Value("${server.port}") public String serverPort; @RequestMapping("/getPayment/{id}") public String getPayment(@PathVariable("id") Integer id){ return "<h2>服务访问成功!</h2>服务名:spring-cloud-alibaba-provider<br /> 端口号: " + serverPort + "<br /> 传入的参数:" + id; } }
6.1.6.启动模块
在浏览器访问:http://localhost:9001/payment/getPayment/1,如下图:

在nacos注册列表查看,如下图,即可发现上述9001已经注册到了nacos

注意:后续为了演示方便,还需创建服务提供者者9002,和9001一致,根据上述创建即可,没有在列出。
6.2.基于Nacos的服务消费者
6.2.1.新建module:cloudalibaba-consumer-nacos-order83
创建maven模块,设置模块名:

6.2.2.在pom.xml中引入依赖,如下
这里需要引入nacos注册中心的依赖
<dependencies>
<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-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.augus.springcloud</groupId>
<artifactId>cloud-api-common</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
</dependencies>
6.2.3.在创建配置文件
application.yml 内容如下:
server: port: 83 spring: application: name: cloud-nacos-order cloud: nacos: discovery: # 指定注册进入的nacos地址 server-addr: localhost:8848 #消费者将要去访问的微服务名称 server-url: nacos-user-service: http://nacos-payment-provider
6.2.4.创建主启动类
主启动类:NacosOrderMain83 代码如下:
package com.augus.cloud; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; @SpringBootApplication @EnableDiscoveryClient public class NacosOrderMain83 { public static void main(String[] args) { SpringApplication.run(NacosOrderMain83.class, args); } }
6.2.5.创建配置类
在com.augus.cloud 下创建config包中新建配置类:ApplicationContextConfig 代码如下:
package com.augus.cloud.config; import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.client.RestTemplate; @Configuration public class ApplicationContextConfig { @Bean @LoadBalanced //负载均衡 默认轮询 public RestTemplate getRestTemplate(){ return new RestTemplate(); } }
6.2.6.创建controller
创建 OrderNacosController 去作为消费者去调用服务提供者,代码如下:
package com.augus.cloud.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; @RestController public class OrderNacosController { @Autowired private RestTemplate restTemplate; @Value("${server-url.nacos-user-service}") private String url; @GetMapping("/order/getPayment/{id}") public String getPaymentInfo(@PathVariable("id") Long id) { return restTemplate.getForObject(url+"/payment/getPayment/"+id,String.class); } }
6.2.7.测试
启动项目模块,然后浏览器访问:http://localhost:83/order/getPayment/1,如下图:

会发现,9001和9002服务提供者会交替出现,这里就是负载均衡实现的效果,同时会发现nacos注册中心出现了刚刚83服务消费者

七、Nacos服务配置中心
Nacos Server 还可以作为配置中心,对 Spring Cloud 应用的外部配置进行统一地集中化管理。只需要在应用的 POM 文件中引入 spring-cloud-starter-alibaba-nacos-config 即可实现配置的获取与动态刷新。从配置管理的角度看,Nacos 可以说是 Spring Cloud Config 的替代方案,但相比后者 Nacos 的使用更简单,操作步骤也更少。
7.1.Nacos作为配置中心--基础配置
7.1.1.新建module:
创建模块:cloudalibaba-config-nacos-client3377

7.1.2.在pom中引入依赖
除了引入注册中心依赖之外,还需要在引入 spring-cloud-starter-alibaba-nacos-config 才能作为配置中心使用
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</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-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.augus.springcloud</groupId>
<artifactId>cloud-api-common</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
7.1.3.创建配置文件
Nacos和springcloud config一样,在项目初始化的时候,要保证先从配置中心拉取配置,拉取配置后,才能保证项目的成功启动,所有需要创建两个配置文件,分别是bootstrap和application,需要注意的是bootstrap的优先级要高于application。
创建bootstrap.yml 内容如下:
server: port: 3377 spring: application: name: nacos-config-client cloud: nacos: discovery: server-addr: localhost:8848 #Nacos服务注册中心地址 config: server-addr: localhost:8848 #Nacos作为配置中心地址 file-extension: yaml #指定yaml格式的配置
创建application.yml 内容如下:
spring:
profiles:
# 指定读取是dev开发环境
active: dev
7.1.4.创建一个controller包
在下面创建一个名为 ConfigClientController 的 Controller 类,并在该类上使用 @RefreshScope 注解实现配置的自动更新,代码如下。
package com.augus.cloud.controller; import org.springframework.beans.factory.annotation.Value; import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RefreshScope //动态刷新配置 public class ConfigClientController { //指定读取的配置信息 @Value("${config.info}") private String ConfigInfo; @GetMapping("/config/info") public String getConfigInfo(){ return ConfigInfo; } }
7.1.5.创建主启动类
在主启动类上,使用 @EnableDiscoveryClient 注解开启服务发现功能,代码如下。
package com.augus.cloud; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; @SpringBootApplication @EnableDiscoveryClient public class ConfigNacosMain3377 { public static void main(String[] args) { SpringApplication.run(ConfigNacosMain3377.class,args); } }
7.1.6.启动 Nacos Server,添加配置文件:
启动 Nacos Server,并在 Nacos Server 控制台的“配置管理”下的“配置列表”中,点击“+”按钮,新建如下配置。
Data ID: config-config-client-dev.yaml
Group : DEFAULT_GROUP
配置格式: YAML
配置内容: config:
info: com.augus.cloud
如下图所示:

在 Nacos Server 中,配置的 dataId(即 Data ID)的完整格式如下:
${prefix}-${spring.profiles.active}.${file-extension}
dataId 格式中各参数说明如下:
- ${prefix}:默认取值为微服务的服务名,即配置文件中 spring.application.name 的值,我们可以在配置文件中通过配置 spring.cloud.nacos.config.prefix 来指定。
- ${spring.profiles.active}:表示当前环境对应的 Profile,例如 dev、test、prod 等。当没有指定环境的 Profile 时,其对应的连接符也将不存在, dataId 的格式变成 ${prefix}.${file-extension}。
- ${file-extension}:表示配置内容的数据格式,我们可以在配置文件中通过配置项 spring.cloud.nacos.config.file-extension 来配置,例如 properties 和 yaml。
7.1.7.启动项目进行测试
启动模块并使用浏览器访问“http://localhost:3377/config/info”,结果如下图。

在 Nacos Server 中,将 config-config-client-dev.yaml 中的配置修改成如下内容:
config:
info: helloworld
在不重启 项目的情况下,使用浏览器再次访问“http://localhost:3377/config/info”,结果如下图,会发现会自动获取修改过后的配置,自带动态刷新功能。

7.2.Nacos作为配置中心--分类配置
在项目开发的时候,通常一个项目会准备:dev开发环境、test测试环境、prod生成环境。怎么样保证指定的环境启动时服务能正确读取到Nacos上相应环境的配置文件就显得至关重要,而nacos提供了三种配置方式:1.DataID方案、2.Group方案、3.Namespace方案,下面就分别进行演示。
7.2.1.DataID方案
此方案在application.yml中spring.profile.active的值,配置文件的DataID来使不同环境下读取不同的配置,
- 在默认空间、默认分组中新建dev和test两个DataID,模拟一个项目的dev、test环境的配置信息,内容分别如下图:
dev:这个上一节已经创建,只需要修改即可
Data ID: config-config-client-dev.yaml Group : DEFAULT_GROUP 配置格式: YAML 配置内容: config: info: info: This is the dev environment
test:
Data ID: config-config-client-dev.yaml Group : DEFAULT_GROUP 配置格式: YAML 配置内容: config: info: This is the test environment
创建后如下图:

- 通过spring.profile.active属性就能进行多环境下的配置文件的读取

- 浏览器访问:http://localhost:3377/config/info
如下图所示,显示的测试环境的配置信息:

7.2.2.Group方案
- 通过Group分组实现环境区分,在nacos图形界面控制台上面新建配置文件DataID,但是在不同组中:
配置1:
Data ID: config-config-client-info.yaml Group : DEV_GROUP 配置格式: YAML 配置内容: config: info: This is the DEV_GROUP environment
配置2:
Data ID: config-config-client-info.yaml Group : TEST_GROUP 配置格式: YAML 配置内容: config: info: This is the TEST_GROUP environment
创建后如下图所示:

- 在bootstrap和application指定读取的内容
在bootstrap中指定读取的组信息,添加如下内容:
group: DEV_GROUP # 指定读取的组信息

在application中指定的环境信息,nacos中后面写的是info,所以active的值写info

- 测试
重启项目,通过浏览器访问 http://localhost:3377/config/info,如下图所示:

7.2.3.Namespace方案
- 新建dev和test的namespace

创建后如下图:

- 回到服务管理-服务列表查看
会发现除了,默认的public之外,多了dev和test两个空间

- 按照域名配置填写
在刚刚创建的test下创建配置管理:

创建两个配置文件:
配置文件1
Data ID: config-config-client-test.yaml Group : TEST_GROUP 配置格式: YAML 配置内容: config:
info: id-81dc2e65-4f9b-4f0a-ba50-3c0dbb2d3e2a TEST_GROUP
配置文件2
Data ID: config-config-client-dev.yaml
Group : DEV_GROUP
配置格式: YAML
配置内容: config:
info: id-81dc2e65-4f9b-4f0a-ba50-3c0dbb2d3e2a DEV_GROUP
创建后如下图:

- 修改yml配置文件
修改bootstrap,指定读取配置的命名空间的id,和对应配置的组信息

修改application,指定读取配置的active的值为dev

- 测试
重启项目,在浏览器访问:http://localhost:3377/config/info,如下图:

八、Nacos持久化
当我们使用默认配置启动Nacos时,所有配置文件都被Nacos保存在了内置的数据库中。如果使用内嵌数据库,注定会有存储上限,在0.7版本之前,在单机模式时nacos使用嵌入式数据库derby实现数据的存储,不方便观察数据存储的基本情况。0.7版本增加了支持mysql数据源能力,下面就演示使用切换到MySQL保存配置信息。需要注意的是目前Nacos仅支持Mysql数据库,且版本要求:5.6.5+
8.1.初始化数据库
Nacos的数据库脚本文件在我们下载Nacos-server时的压缩包中就有,进入nacos\nacos\conf目录,初始化文件:mysql-schema.sql,在MySQL中创建一个名为 mynacos 的数据库,然后执行初始化脚本创建表,如图所示:

8.2.修改配置文件
需要修改Nacos-server的配置文件,Nacos-server其实就是一个Java工程,也可以说是一个Springboot项目,他的配置文件在nacos\conf目录下,名为 application.properties,在文件底部添加数据源配置:
spring.datasource.platform=mysql db.num=1 db.url.0=jdbc:mysql://127.0.0.1:3306/mynacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true db.user=root db.password=123456
8.3.启动Nacos-server
先启动Nacos-server,启动方式不变
startup.cmd -m standalone
启动成功后进入Nacos控制台,此时的Nacos控制台中焕然一新,之前的数据都不见了,因为加入了新的数据源,Nacos从mysql中读取所有的配置文件,而我们刚刚初始化的数据库是没有数据的,就不会有信息显示。如下图所示:

8.4.启动Nacos-server
还是利用之前的3377模块进行测试,先利用public公共空间,新建一个配置文件DataID配置内容如下:
Data ID: config-config-client-dev.yaml Group : DEFAULT_GROUP 配置格式: YAML 配置内容: config: info: This is the dev environment
再启动3377模块。服务启动成功后,观察Nacos控制台如下:

验证是否持久化到数据库中,观察数据库mynacos中的数据库表 config_info , 如下

九、Nacos Server 集群化部署
在实际的项目开发中,一个微服务系统往往由十几,几十个甚至几百个微服务组成。 这些服务若全部注册到同一台 Nacos Server,就极有可能导致 Nacos Server 因为不堪重负而崩溃,最终导致整个微服务系统瘫痪。解决这个问题最直接的办法就是使用 Nacos Server 集群。Nacos Server 的集群化部署有一个十分明显的优点,那就是可以保障系统的高可用性。在集群化部署中,只要不是所有的 Nacos Server 都停止工作,Nacos Client 就还可以从集群中正常的 Nacos Server 上获取服务信息及配置,而不会导致系统的整体瘫痪,这就是 Nacos Server 集群化部署的高可用性。环境如下图:
安装环境:
操作系统:CentOS7.3 x86_64,使用MySQL5.7进行持久化部署,本文以安装nacos2.0.3为例进行演示吗,本机ip是192.168.42.130 通过docker安装Nginx、MySQL、nacos集群(均在同一个机器):
9.1.创建自定义网络
docker network create --subnet 172.19.0.0/16 nacos-net
9.2.创建MySQL容器
Linux服务器上mysql数据库配置,进行持久化存储配置,
docker run -d --name mysqldb -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
下载nacos初始化sql:也可以使用Windows下载的nacos下 conf目录中的mysql-schema.sql
wget https://raw.githubusercontent.com/alibaba/nacos/develop/distribution/conf/nacos-mysql.sql
连接MySQL数据库,创建数据库 nacos,执行mysql-schema.sql,但是一定注意要和自己所需要的nacos版本一直生成表,如下图:

9.3.创建nacos
这里创建的nacos的时候,就开始指定连接的MySQL数据库信息,需要注意的是目前nacos默认需要2g内存,为了避免引起卡顿,所以调整了jvm大小
- nacos1
docker run -d \ --network nacos-net --ip 172.19.0.11 --name nacos1 \ -e PREFER_HOST_MODE=hostname \ -e MODE=cluster \ -e NACOS_SERVERS="172.19.0.11:8848 172.19.0.12:8848 172.19.0.13:8848" \ -e SPRING_DATASOURCE_PLATFORM=mysql \ -e MYSQL_SERVICE_HOST=192.168.42.130 \ -e MYSQL_SERVICE_PORT=3306 \ -e MYSQL_SERVICE_USER=root \ -e MYSQL_SERVICE_PASSWORD=123456 \ -e MYSQL_SERVICE_DB_NAME=nacos \ -e NACOS_SERVER_IP=172.19.0.11 \ -e JVM_XMS=256m -e JVM_XMX=512m \ -p 18848:8848 \ nacos/nacos-server:v2.2.0
- nacos2
docker run -d \ --network nacos-net --ip 172.19.0.12 --name nacos2 \ -e PREFER_HOST_MODE=hostname \ -e MODE=cluster \ -e NACOS_SERVERS="172.19.0.11:8848 172.19.0.12:8848 172.19.0.13:8848" \ -e SPRING_DATASOURCE_PLATFORM=mysql \ -e MYSQL_SERVICE_HOST=192.168.42.130 \ -e MYSQL_SERVICE_PORT=3306 \ -e MYSQL_SERVICE_USER=root \ -e MYSQL_SERVICE_PASSWORD=123456 \ -e MYSQL_SERVICE_DB_NAME=nacos \ -e NACOS_SERVER_IP=172.19.0.12 \ -e JVM_XMS=256m -e JVM_XMX=512m \ -p 28848:8848 \ nacos/nacos-server:v2.2.0
- nacos3
docker run -d \ --network nacos-net --ip 172.19.0.13 --name nacos3 \ -e PREFER_HOST_MODE=hostname \ -e MODE=cluster \ -e NACOS_SERVERS="172.19.0.11:8848 172.19.0.12:8848 172.19.0.13:8848" \ -e SPRING_DATASOURCE_PLATFORM=mysql \ -e MYSQL_SERVICE_HOST=192.168.42.130 \ -e MYSQL_SERVICE_PORT=3306 \ -e MYSQL_SERVICE_USER=root \ -e MYSQL_SERVICE_PASSWORD=123456 \ -e MYSQL_SERVICE_DB_NAME=nacos \ -e NACOS_SERVER_IP=172.19.0.13 \ -e JVM_XMS=256m -e JVM_XMX=512m \ -p 38848:8848 \ nacos/nacos-server:v2.2.0
- 这里需要允许端口访问,设置防火墙过滤:
需要开放MySQL3306端口和三个nacos的端口18848、28848、38848,参考网页:https://www.cnblogs.com/auguse/articles/13325522.html
- 访问地址:
http://192.168.42.130:18848/nacos/
http://192.168.42.130:28848/nacos/
http://192.168.42.130:38848/nacos/
初始用户名:nacos
初始密码:nacos
9.4.安装nginx
- 创建本地目录:
mkdir -p /data/nginx/conf/
mkdir -p /data/nginx/logs
- 启动临时nginx容器,用于拷贝配置文件到本地:
docker run -d --name nginx_temp nginx
- 拷贝配置文件:
docker cp nginx_temp:/etc/nginx/conf.d /data/nginx/conf/
- 删除临时nginx容器:
docker rm -f nginx_temp
- 修改配置文件:
使用命令打开配置文件:vi /data/nginx/conf/conf.d/default.conf,修改后内容如下:
upstream nacos-server-cluster { server 192.168.123.120:18848; server 192.168.123.120:28848; server 192.168.123.120:38848; } server { listen 80; server_name localhost; access_log /var/log/nginx/host.access.log main; location / { proxy_pass http://nacos-server-cluster; } }
如下图所示:

- 启动正式nginx容器:
docker run -d --name nginx -p 80:80 \ -v /data/nginx/conf/conf.d:/etc/nginx/conf.d \ -v /data/nginx/logs:/var/log/nginx \ nginx
- 访问地址:
在浏览器访问:http://192.168.42.130/nacos 初始用户名:nacos 初始密码:nacos (会发现访问的时候,就不需要在写端口号了,因为Nginx默认端口是80,然后配置负载均衡后,默认采用轮询策略),访问如下图:


浙公网安备 33010602011771号