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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
2021-11-15 time头文件