之前,我已经学习过Nacos的下载和启动。
Nacos 介绍
官网说明:https://nacos.io/docs/latest/quickstart/quick-start/
github地址:https://github.com/alibaba/nacos
Nacos: Dynamic Naming And Configuration Service , 动态命名和配置服务 。一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。Nacos = 注册中心 + 配置中心,功能上等于前面学到的Consul。
各种注册中心比较
据说 Nacos 在阿里巴巴内部有超过 10 万的实例运行,已经过了类似双十一等各种大型流量的考验,Nacos默认是AP模式,
但也可以调整切换为CP,我们一般用默认AP即可。
服务注册与发现框架 | CAP模型 | 控制台管理 | 社区活跃度 |
---|---|---|---|
Eureka | AP | 支持 | 低(2.X版本闭源) |
Zookeeper | CP | 不支持 | 中 |
Consul | CP | 支持 | 高 |
Nacos | AP | 支持 | 高 |
Nacos下载与安装
下载地址:https://nacos.io/download/nacos-server/#稳定版本
Nacos的下载安装和启动之前用到,这里就不详细说明了。
要启动时,我们只需要使用费集群模式启动即可,启动命令:startup.cmd -m standalone
。默认账号密码都是nacos,默认访问地址:http://localhost:8848/nacos
关闭服务器,则运行:shutdown.cmd。
Nacos Discovery服务注册中心
服务提供者
接下来,我们需要新建一个支付子模块,作为基于Nacos的服务提供者。
- 新建Module
- 改POM
- 写YAM
- 主启动
- 业务类
新建Module,子模块名称:cloudalibaba-provider-payment9001
改POM,POM除了通用的依赖引用外,还需引用Nacos Discovery
<!--nacos-discovery-->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
写YAM,spring.cloud.nacos.discovery.server-addr
,配置Nacos地址。
server:port: 9001
spring:application:name: nacos-payment-providercloud:nacos:discovery:server-addr: localhost:8848 # 配置Nacos地址
主启动,主启动类平平无奇,与我们前面见到过的无数SpringBoot主启动类一样
@SpringBootApplication
@EnableDiscoveryClient
public class Main9001 {public static void main(String[] args) {SpringApplication.run(Main9001.class, args);}
}
业务类。新建一个接口,用于测试。
/*** 接口* @Author:lyj* @Date:2025/1/2 09:44*/
@RestController
public class PayAlibabaController {@Value("${server.port}")private String serverPort;@GetMapping("/pay/nacos/{id}")public ResultData<String> getPayInfo(@PathVariable("id") Integer id){return ResultData.success("nacos registry,serverPort:"+serverPort + "\t id:" + id);}
}
测试:启动nacos服务和9001, 发现nacos-payment-provider
,以添加到nacos服务中心。此时,服务列表已经成功添加至nacos。
服务消费者
作为Consumer的应用,并不是想提供者应用那么简单——只需要将微服务注册到Nacos。因为Consumer需要去调用Provider端提供的REST服务。接下来的例子,会使用最原始的方式,即显示的使用LoadBalanceClient和RestTemplate结合的方式来访问。
接下来,我们需要新建一个订单子模块,作为基于Nacos的服务消费者,步骤如下:
- 新建Module
- 改POM
- 写YAM
- 主启动
- 业务类
建Module,子模块名称cloudalibaba-consumer-nacos-order83。
改POM,除了常规依赖外,需要引入nacos-discovery和负载均衡loadbalancer 。
<!-- nacos-discovery-->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- loadbalancer-->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
写YAML,提供Nacos服务地址和需要访问的微服务名称。
server:port: 83
spring:application:name: nacos-order-consumercloud:nacos:discovery:server-addr: localhost:8848 # nacos地址
#消费者将要去访问的微服务名称(nacos微服务提供者叫什么你写什么)
server-url:nacos-user-service: http://nacos-payment-provider
主启动
@EnableDiscoveryClient
@SpringBootApplication
public class Main83
{public static void main(String[] args){SpringApplication.run(Main83.class,args);}
}
业务类,配置RestTemplate
@Configuration
public class RestTemplateConfig
{@Bean@LoadBalanced //赋予RestTemplate负载均衡的能力public RestTemplate restTemplate(){return new RestTemplate();}
}
新增测试方法:
@RestController
public class OrderNacosController
{@Resourceprivate RestTemplate restTemplate;@Value("${service-url.nacos-user-service}")private String serverURL;@GetMapping("/consumer/pay/nacos/{id}")public String paymentInfo(@PathVariable("id") Integer id){String result = restTemplate.getForObject(serverURL + "/pay/nacos/" + id, String.class);return result+"\t"+" 我是OrderNacosController83调用者。。。。。。";}
}
可以测试nacos请求,也可以同时生成多个提供者(9001/9002/9003),测试负载均衡。
Nacos服务配置中心
nacos可以替代consul8500,作为服务配置中心。
中文说明文档位置:https://nacos.io/docs/v2/ecology/use-nacos-with-spring-cloud/?spm=5238cd80.2ef5001f.0.0.3f613b7cqocuR8
具体步骤如下:
- 建Module,Module名称
cloudalibaba-config-nacos-client3377
- POM,引入nacos依赖
- 写YAML
- 主启动
- 业务类
- 在nacos中添加配置信息(重点)
POM引入nacos-config和 nacos-discovery依赖
<!--nacos-config-->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!--nacos-discovery-->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
写YAML,bootstrap.yaml
添加nacos配置
# nacos配置
spring:application:name: nacos-config-clientcloud:nacos:discovery:server-addr: localhost:8848 #Nacos服务注册中心地址config:server-addr: localhost:8848 #Nacos作为配置中心地址file-extension: yaml #指定yaml格式的配置# nacos端配置文件DataId的命名规则是:
# ${spring.application.name}-${spring.profile.active}.${spring.cloud.nacos.config.file-extension}
# 本案例的DataID是:nacos-config-client-dev.yaml
application.yaml
,设置端口和环境
server:port: 3377spring:profiles:active: dev # 表示开发环境#active: prod # 表示生产环境#active: test # 表示测试环境
主启动,新建主启动
@EnableDiscoveryClient
@SpringBootApplication
public class NacosConfigClient3377
{public static void main(String[] args){SpringApplication.run(NacosConfigClient3377.class,args);}
}
业务类,新建测试业务类
@RefreshScope //在控制器类加入@RefreshScope注解使当前类下的配置支持Nacos**的动态刷新功能。
新建控制器NacosConfigClientController
@RestController
@RefreshScope //在控制器类加入@RefreshScope注解使当前类下的配置支持Nacos的动态刷新功能。
public class NacosConfigClientController
{@Value("${config.info}")private String configInfo;@GetMapping("/config/info")public String getConfigInfo() {return configInfo;}
}
在naocos中添加配置信息(重点)
Nacos中的匹配规则,按照DataId的组成格式,参考地址:https://nacos.io/docs/v2/ecology/use-nacos-with-spring-cloud/?spm=5238cd80.2ef5001f.0.0.3f613b7cqocuR8
完整格式
${prefix}-${spring.profiles.active}.${file-extension}
prefix
默认为spring.application.name
的值,也可以通过配置项spring.cloud.nacos.config.prefix
来配置spring.profies.active
即为当前环境的profile。当spring.profiels.active
为空时,对应的连接符-
也将不存在,dataId的拼接格式编程${prefix}.${file-extension}
file-exetension
为配置内容的数据格式,可以通过配置项spring.cloud.nacos.config.file-exetension
来配置。目前只支持properties
和yaml
类型。
如何创建配置呢?首先打开nacos浏览器端,点击【配置管理】→【配置列表】,点【创建配置】。
根据dataId规则,我们创建的文件名称为nacos-config-client-dev.yaml
,配置要测试的属性config.info
。
测试
启动Nacos且按照前文配置成功配置管理,运行cloud-config-nacos-client3377
,查看接口调用的配置信息: http://localhsot3377/config/info。
测试返回值
修改配置信息,查看是否动态刷新是否使用成功。
nacos会记录配置文件的历史版本,默认保留30天,此外还有一键回滚的功能:happy:。会触发配置更新。位置:【配置管理】→【历史版本】。
Nacos数据模型之Namespace-Group-DataId(命名空间-分组-DataId)
实际开发中,通常一个系统会准备:dev开发环境、test测试环境、prod生产环境,如果保证指定环境,启动时,能够读取到Nacos上环境的配置文件呢?
一个大型分布式微服务系统会有很多微服务子项目,每个微服务项目又都会有相应的开发环境、测试环境、预发环境、正式环境……那么,这些微服务配置如何分组和命名空间管理呢?
![nacos命名空间](E:\临时\SpringCloud\SpringCloud Alibaba\Nacos三元命名空间.png)
Namespace+Group+DataId是什么?类似于Java中额package名和类名,最外层的Namespace是可以用于区分部署环境的,Group和DataID逻辑上区分两个目标对象。
默认值。默认情况下Namespace=public,Group=DEFAULT_GROUP。Nacos默认的命名空间时public,Namespace主要用来实现隔离。例如,我们现在有三个环境:开发、测试、生产环境,我们就可以创建三个Namespace,不同的Namespace之间是隔离的。Group默认时DEFAULT_Group
,Group可以把不同的微服务划分同一个分组里面去。
Service就是微服务。一个Service可以包含一个或多个Cluster(集群),Nacos默认Cluster是DEFAULT,Cluster是指定微服务的一个虚拟划分。
三种配置方案加载配置,可以根据实际需要进行设置
- DataID方案,1️⃣默认空间public + 默认分组DEFAULT_GROUP_ 新建DataId
- Group方案,2️⃣默认空间品历程+新建PROD_GROUP+新建DataId
- Namespace方案,3️⃣Prod_Namespace+新建PROD_GROUP+新建DataId
Nacos持久化为mysql数据库
Nacos配置默认是持久化的,默认将配置信息持久化存储与嵌入式数据库(Derby)来保存配置数据。
Nacos服务发现持久化,它会将服务的注册信息持久化存储。即是Nacos服务出现短暂的故障重启后,之前的服务信息依赖存在,能够保证系统正常运行。
Nacos如何将默认的嵌入式数据切换为外部的MySql等关系型数据库呢?
打开{nacos.home}/conf文件下的 application.properties ,增加支持mysql数据源。
# db mysql
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://localhost:3306/ry-config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user=root
db.password=password
持久化的数据库如何初始化?打开{nacos.home}/conf文件下的mysql-schema.sql
,初始化到自己的mysql数据库即可。