Nacos笔记
什么是Nacos

Nacos 是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台,具有配置管理和服务发现两大功能
配置中心
-
系统从一个单体应用,被拆分成分布式系统上一个个服务节点后,配置文件也必须跟着迁移
-
这样配置就分散了,不仅如此,分散中还包含着冗余
为什么使用配置中心
-
应用程序在启动和运行的时候往往需要读取一些配置信息
-
配置基本上伴随着应用程序的整个生命周期
-
配置中心将配置从应用中剥离出来,再通过加载配置文件的顺序不同,实现差异化配

安装并启动 Nacos
去 github 下载 Nacos 压缩包,解压缩到本地即可,地址

以 Nacos-1.1.4 为分界线,1.1.4 之上的版本,对应的 mysql 版本为 8.0 ;1.1.4 之下对应的是 mysql 5.7 ,与 mysql 版本不匹配,无法使用
下载解压缩之后
-
首先要创建一个名为
nacos-mysql的数据库,创建数据库的sql文件位于${nacos_dir}/conf/nacos-mysql.sql -
修改其中的配置文件
${nacos_dir}/conf/application.properties,在其中添加mysql相关信息
# 链接外部mysql数据库
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://127.0.0.1/nacos-mysql?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=uour_username
db.password=your_password
- 双击
${nacos-dir}/bin/startup.cmd启动nacos,出现如下界面,启动成功

nacos的默认启动端口为8848,登录账户和密码均为nacos,登录之后,页面如下

3 Nacos 应用于微服务
3.1 读取微服务的配置
- 在微服务项目中要使用
Nacos,首先要引入依赖
<!--SpringCloud Alibaba依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--SpringCloud依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--SpringBoot依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.2.2.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--jsckson依赖需要引入,否则有概率项目无法启动-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.10.2</version>
</dependency>
<!--SpringCloud Alibaba Nacos 配置依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>2.2.0.RELEASE</version>
</dependency>
<!--SpringBoot Web依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.2.2.RELEASE</version>
</dependency>
- 在微服务项目中,
Nacos依赖于SpringCloud Alibaba、SpringCloud、SpringBoot相互依赖,需要确定一直对应的版本号,否则项目启动会出错,具体的版本对应关系如下
SpringBoot、SpringCloud、SpringCloud Alibaba 毕业版本对照表:

SpringCloud Alibaba 各组件版本对照表

- 接下来是项目中配置文件的编写(文件命名必须是
bootstrap.yml,否则读取到的配置为空)
server:
port: 8082
spring:
application:
name: service-two
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848
file-extension: yaml # dataId = name + file-extension(必须是yaml,不能是yml)
namespace: 08714022-716d-438b-8d20-1c52a9b5a205
group: SKG
注意点:
Nacos配置文件的名称必须是:bootstrap.yml,在项目中会变成一个带云朵的小绿叶

-
在
Nacos配置中心管理端,假如配置的dataId为nacos-test.yaml,那么在项目的配置文件中,name必须为nacos-test,file-extension必须为yaml,项目启动后会根据dataId = name + file-extension的形式去匹配dataId -
配置文件中的
namespace必须是那一长串号码,直接写namespace的名称(dev、public等)无效

- 配置文件写好之后,在项目中想要读取配置中心的配置,直接使用
@Value注解便可取到值
@Value("${spring.port}")
private String port;

- 使用
@Value注解拿到的值,不会根据远程配置的修改而变化,想要达到远程与项目配置同时更改的效果,需要使用环境上下文来实现
@Autowired
private ConfigurableApplicationContext applicationContext;
@GetMapping("/config1")
public String config(){
return applicationContext.getEnvironment().getProperty("spring.port");
}
3.1 自定义 dataId
-
扩展配置文件使用关键字
extension-configs定义,优先级高于shared-configs,低于name + file-extension -
共享配置文件使用关键字
shared-configs定义,优先级最低
spring:
application:
name: service-one
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848
file-extension: yaml # dataId = name + file-extension(必须是yaml,不能是yml)
namespace: 08714022-716d-438b-8d20-1c52a9b5a205
group: SKG
# 常规扩展配置文件,优先级大于 shared-configs,在 shared-configs 之后加载
extension-configs:
- data-id: nacos-config-extension-01.yml
group: EXTENSION_GROUP
refresh: true
- data-id: nacos-config-extension-02.yml
group: EXTENSION_GROUP
refresh: true
# 共享配置文件,优先级最低
shared-configs:
- data-id: shared-config-01.yml
group: SHARED_GROUP
- data-id: shared-config-02.yml
group: SHARED_GROUP
4 集群部署
使用一个电脑模拟 Nacos 集群,需要将 nacos 安装目录拷贝多份
需改每一份的端口号均不一致(例如拷贝三份,端口号分别为:8848、8847、8846),然后需要将配置文件中的 ip 进行绑定

# nacos01
server.port=8848
nacos.inetutils.ip-address=127.0.0.1
# nacos02
server.port=8847
nacos.inetutils.ip-address=127.0.0.1
# nacos03
server.port=8846
nacos.inetutils.ip-address=127.0.0.1
在安装目录 ${nacos_dir}/conf/ 下有一个名为 cluster.conf.example 文件,将其命名为 cluster.conf ,然后在里面配置所有集群的 ip 信息
127.0.0.1:8848
127.0.0.1:8847
127.0.0.1:8846
现在环境已经配置好,进入 ${$naocs_dir}/bin 路径之下(三个环境均要执行如下命令),使用如下命令启动 Nacos 集群服务
startup.cmd -m cluster
三个环境均启动成功之后,打开浏览器,随便进入一个 nacos 的控制台,点击侧边栏最后一项“节点列表”,里面出现如下信息说明集群配置成功

随便关闭一个节点,任然可以使用别的集群来进行服务
至于想要使用多个数据库,可以进行如下配置:
spring.datasource.platform=mysql
db.num=3
db.url.0=jdbc:mysql://127.0.0.1/nacos-mysql?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.url.1=jdbc:mysql://127.0.0.1/nacos-mysql?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.url.2=jdbc:mysql://127.0.0.1/nacos-mysql?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=root
5 服务发现
5.1 服务协作流程
SprigCloud 常见的集成方式是使用 Feign + Ribbon 来实现服务间的远程调用及负载均衡的
-
在微服务启动时,每个微服务都会向服务中心上报自身的实例信息(每个实例包括 IP 地址、端口号等)
-
微服务会定期从
Nacos Server获取服务实例列表 -
当
ServiceA调用ServiceB时,Ribbon组件会从本地服务实例列表中查找ServiceB实例 -
如果有多个实例,
Ribbon会通过用户配置的负载均衡策略,从中选择一个实例 -
最终,
Feign组件和通过Ribbon选取的实例发送http请求

5.2 服务发现Demo
假设现在有两个微服务,一个为服务提供者,一个为服务消费者,服务名称分别为:
nacos-provider、nacos-consumer
首先创建父子工程,两个模块(生产者、消费者),引入相关依赖
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.1.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Greenwich.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.1.3.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.13</version>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2.1.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.1.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>2.2.1.RELEASE</version>
</dependency>
</dependencies>
- 针对服务提供者:
在配置文件中配置服务名称以及 nacos 服务的地址
server:
port: 56010
spring:
application:
name: nacos-provider
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
对外暴露提供服务的地址
@RestController
public class ProviderController {
@GetMapping("/service")
public String service(){
return "invoke provider";
}
}
主启动类需要开启 Nacos 服务发现和 Fegin 客户端,消费者也一样
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class ProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderApplication.class, args);
}
}
- 针对服务消费者:
配置文件与服务提供者几乎一模一样,只需修改端口号和服务名称即可
server:
port: 56020
spring:
application:
name: nacos-consumer
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
首先,消费者需要创建服务提供者的接口类,申明调用哪个服务、调用哪个地址
@FeignClient(value = "nacos-provider")
public interface ProviderClient {
@GetMapping("/service")
public String service();
}
然后,消费者就可以通过注入服务提供者客户端的方式,来远程调用服务提供者的方法
@RestController
public class ConsumerController {
@Resource
private ProviderClient providerClient;
@GetMapping("/service")
public String service(){
String providerResult = providerClient.service();
return "consumer invoke --> " + providerResult;
}
}
- 启动两个微服务,进入
nacos管理页面,发现两个微服务都已经进行了注册

- 最后就可以模仿消费者访问服务提供者的方法,即访问
http://localhost:56020/service


浙公网安备 33010602011771号