目录
一、前置条件
二、基本概念
二、启动服务注册与发现
三、启动配置管理
四、数据持久化到MySQL
本篇主要是以面向?Spring Cloud?的使用者为主,通过两个示例来介绍如何使用 Nacos 来实现分布式环境下的配置管理和服务注册发现。本篇Nacos版本为1.1.4
- 通过 Nacos Server 和 spring-cloud-starter-alibaba-nacos-config 实现配置的动态变更。
- 通过 Nacos Server 和 spring-cloud-starter-alibaba-nacos-discovery 实现服务的注册与发现。
一、前置条件
1、需要先下载 Nacos 并启动 Nacos server。操作步骤参见 Nacos 快速入门。
2、已有spring cloud的基础项目环境。(spring cloud微服务搭建步骤略,如有需要自行百度)
这里需要注意Spring Cloud、Spring Cloud Alibaba、Spring boot版本依赖问题,版本依赖信息查询
二、基本概念
以下只为本篇即将使用到的Nacos中的部分概念做说明,更多详细概念请参加Nacos文档。
1、命名空间:用于进行租户粒度的配置隔离。不同的命名空间下,可以存在相同的 Group 或 Data ID 的配置。Namespace 的常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。
在没有明确指定?${spring.cloud.nacos.config.namespace} ?配置的情况下, 默认使用的是 Nacos 上 Public 这个namespae。如果需要使用自定义的命名空间,可以通过以下配置来实现:
//此处仅为展示该配置项,如何使用参见下文
spring.cloud.nacos.config.namespace=b3404bc0-d7dc-4855-b519-570ed34b62d7
2、配置集id:Nacos 中的某个配置集的 ID。配置集 ID 是组织划分配置的维度之一。Data ID 通常用于组织划分系统的配置集。一个系统或者应用可以包含多个配置集,每个配置集都可以被一个有意义的名称标识。Data ID 通常采用类 Java 包(如 com.taobao.tc.refund.log.level)的命名规则保证全局唯一性。此命名规则非强制。
//此处仅为展示该配置项命名规则,如何使用参见下文
DataID:Data ID需要严格遵守${prefix}-${spring.profile.active}.${file-extension}官方提供的格式,必须以.yaml结尾!.yml结尾会报错
3、配置分组:Nacos 中的一组配置集,是组织配置的维度之一。通过一个有意义的字符串(如 Buy 或 Trade )对配置集进行分组,从而区分 Data ID 相同的配置集。当在 Nacos 上创建一个配置时,如果未填写配置分组的名称,则配置分组的名称默认采用 DEFAULT_GROUP 。配置分组的常见场景:不同的应用或组件使用了相同的配置类型,如 database_url 配置和 MQ_topic 配置。 ? ??在没有明确指定 ${spring.cloud.nacos.config.group} 配置的情况下, 默认使用的是 DEFAULT_GROUP 。如果需要自定义自己的 Group,可以通过以下配置来实现:
//此处仅为展示该配置项,如何使用参见下文
spring.cloud.nacos.config.group=DEVELOP_GROUP
二、启动服务注册与发现
1、添加依赖
在需要Nacos 提供服务注册的微服务module的pom文件中添加以下坐标依赖:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>${latest.version}</version>
</dependency>
这里需要注意:添加的nacos-discovery依赖版本需要与自己项目工程spring cloud Alibaba相对应。版本对应关系可参见官方说明:版本说明 Wiki。
2、配置服务提供者(生产者)
服务提供者可以通过 Nacos 的服务注册发现功能将其服务注册到 Nacos server 上,Nacos对该服务进行管理。
① 在?application.properties ?中配置 Nacos server 的地址、该服务名字基本信息;还可配置服务namespace命名空间、group分组自定义配置信息:
其中,namespace命名空间、group分组信息的配置Nacos中有默认的配置,开发人员可以不指定;若开发人员需要自定义配置信息,需要结合Nacos用户使用的控制台进行。
<---基本信息配置----->
server.port=9001
spring.application.name=nacos-payment-provider
spring.cloud.nacos.discovery.server-addr=localhost:8848
<-----此处没有指定namespace命名空间、group分组信息,则会采用Nacos的默认配置信息>
自定义namespace命名空间、group分组配置信息如下:
Ⅰ、首先,通过Nacos用户使用的控制台进行创建命名空间,创建后可得到该命名空间的ID。
注:该截图为nacos2.0.0 ALPHA.2版的。除此之外均为Nacos1.1.4版本的。
Ⅱ、其次,使用上面得到的namespace ID 在自己项目工程model 的application.properties 配置文件中配置注册中心的namespace:
<---基本信息配置----->
server.port=9001
spring.application.name=nacos-payment-provider
spring.cloud.nacos.discovery.server-addr=localhost:8848
<-----此处指定namespace命名空间、group分组,该服务则会采用Nacos的自定义配置信息>
spring.cloud.nacos.discovery.namespace=0851e92e-6687-471d-a4af-460a00868b5d
<---分组信息在这里可直接进行自定义配置,而不需要像namespace一样先使用Nacos控制台进行新建再使用---->
<---一般使用有意义的字符串-->
spring.cloud.nacos.discovery.group=Payment
注册中心使用的配置文件:application/bootstrap . properties/yml/yaml 均可以。与下文中的配置管理中使用的配置文件做区分。
② 通过 Spring Cloud 原生注解 @EnableDiscoveryClient 开启服务注册发现功能:
@SpringBootApplication
@EnableDiscoveryClient
public class PaymentMain {
public static void main(String[] args) {
SpringApplication.run(PaymentMain.class,args);
}
}
以上配置完成后,启动服务,若正常即可在Nacos控制台看到该服务注册到Nacos注册中心的信息。如下:
业务组件:
@RestController
public class PaymentController {
@Value("${server.port}")
private String serverPort;
@GetMapping(value = "payment/nacos/{id}")
public String getPayment(@PathVariable("id") Integer id){
return "nacos registry ,serverPort: " +serverPort+"\t id " +id;
}
}
3、配置服务消费者
服务消费者可以通过 Nacos 的服务注册发现功能从 Nacos server 上获取到它要调用的服务。
① 在?application.properties ?中配置 Nacos server 的地址、服务名称、namespace、group等信息。
此处需注意:服务消费者的namespace需要与服务提供者的namespace保持一致,group也需要与服务提供者group 一致。只有服务消费者与服务提供者处于同一namespace、同一group下 才可进行服务间的调用。
server.port=84
spring.application.name=nacos-order-consumer
spring.cloud.nacos.discovery.server-addr=localhost:8848
spring.cloud.nacos.discovery.namespace=0851e92e-6687-471d-a4af-460a00868b5d
spring.cloud.nacos.discovery.group=Payment
② 通过 Spring Cloud 原生注解?@EnableDiscoveryClient ?开启服务注册发现功能。
@EnableDiscoveryClient
@SpringBootApplication
public class OrderNacosMain84 {
public static void main(String[] args) {
SpringApplication.run(OrderNacosMain84.class,args);
}
}
服务启动后即可注册到Nacos服务注册中心了。
③ 调用服务提供者的服务。
RestTemplate配置类(自定义)实例添加?@LoadBalanced ?注解,开启?@LoadBalanced ?与?Ribbon?的集成:
@Configuration
public class ApplicationContextConfig {
@Bean
@LoadBalanced
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
业务组件:
@RestController
public class OrderController {
@Autowired
private RestTemplate restTemplate;
@GetMapping(value = "/consumer/payment/nacos/{id}")
public String paymentInfo(@PathVariable("id") Integer id){
// "http://nacos-payment-provider" 是服务提供者注册到注册中心的地址
// "/payment/nacos/" + id 是访问服务提供者的哪个资源
return restTemplate.getForObject("http://nacos-payment-provider"+"/payment/nacos/"+id,String.class);
}
4、消费者调用生产者服务
启动服务提供者(生产者)服务:http://localhost:9001/payment/nacos/1
启动服务消费者服务:http://localhost:84/consumer/payment/nacos/1,返回数据来源于服务提供者
至此,服务注册与消费简单使用已完毕。更多使用请参见 nacos-discovery.doc。
三、启动配置管理
1、添加依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>${latest.version}</version>
</dependency>
这里需要注意:添加的nacos-config依赖版本需要与自己项目工程spring cloud Alibaba相对应。版本对应关系可参见官方说明:版本说明 Wiki。
2、项目工程添加配置信息
Ⅰ、在 bootstrap.properties 中配置 Nacos server 的地址和应用名:
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
spring.application.name=nacos-config-client
说明:之所以需要配置 spring.application.name ,是因为它是构成 Nacos 配置管理 dataId字段的一部分。在 Nacos Spring Cloud 中,dataId 命名规则 的完整格式如下:
${prefix}-${spring.profiles.active}.${file-extension}
- prefix 默认为 spring.application.name 的值,也可以通过配置项 spring.cloud.nacos.config.prefix来配置。
- spring.profiles.active 即为当前环境对应的 profile,详情可以参考 Spring Boot文档。 注意:当 spring.profiles.active 为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成 ${prefix}.${file-extension}
- file-exetension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。目前只支持 properties 和 yaml 类型。
这里添加配置需要注意:该配置文件的作用为:找到Nacos配置中心里对应的配置文件(下文会介绍如何新建这个配置文件)。找到Nacos配置中心的配置文件,也需要有找配置文件的配置文件,即本步骤的这个配置文件:项目工程中的配置文件bootstrap.properties。Nacos 官方目前只支持在工程项目中使用bootstrap.properties/yaml/yml配置文件查找Nacos配置中心的配置文件。与上文中注册中心使用的配置文件做区分。
Ⅱ、Nacos用户管理控制台新建配置文件:
这里配置文件的建立也会涉及到namespace、group配置项的配置。与上文注册中心该部分内容含义相同。
新建好该配置文件后可从配置列表该命名空间下看到,如上图。此时点击命名空间,可看到该命名空间下的配置数变为了1.如下图:
Ⅲ、项目工程配置文件bootstrap.properties添加查找Nacos配置文件的配置项:
# 以下配置项按照查找Nacos配置中心文件逻辑顺序进行配置
# 1、Nacos服务地址
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
# 2、配置文件所处的命名空间id
spring.cloud.nacos.config.namespace=0851e92e-6687-471d-a4af-460a00868b5d
# 3、配置文件所在的组
spring.cloud.nacos.config.group=DEV_GROUP
# 4、配置文件的名字。
# ① 上面新建配置文件prefix 部分 默认使用的名字为该应用的名字。此处配置应用名称即可。
# ② 如果Nacos配置文件不使用该应用的名字,自定义配置文件名称,这里可使用配置项:spring.cloud.nacos.config.prefix进行指定
spring.application.name=nacos-config-client
#spring.cloud.nacos.config.prefix=aaa (aaa为新建Nacos配置文件时的prefix部分的值)
# 5、该配置为Nacos配置文件名字中 ${spring.profiles.active} 部分的值
spring.profiles.active=dev
# 6、该配置为Nacos配置文件名字中 file-exetension 部分的值。
# 如果Nacos配置文件使用的是properties文件格式,则这个配置项可不用配置。Nacos默认使用的是properties文件格式。
# 如果Nacos配置文件使用的YAML格式的,则这个配置项需显式指定文件格式为 yaml
spring.cloud.nacos.config.file-extension=yaml
3、启动工程,获取Nacos配置中心该服务配置
业务组件:
@RestController
//通过 Spring Cloud 原生注解 @RefreshScope 实现配置自动更新.此处的实时更新是指 在程序运行过程中,Nacos配置文件中的信息有更新,这里会自动获取到。(项目启动时读取到的配置 比如 server.port、MySQL配置信息等 这些启动时的配置信息不会更新。也许其他方式可实现,目前未研究)
@RefreshScope
public class ConfigClientController {
@Value("${config.info}")
private String configInfo;
@GetMapping(value = "config/info")
public String getConfigInfo(){
return configInfo;
}
}
至此,配置中心的基本使用已完毕。更多详细配置信息请参见 nacos-config.doc。
四、数据持久化到MySQL
说明:以Windows 版为例,Nacos版本差异性简单对比
Nacos-server 版本 | 默认启动方式 | 持久化默认支持Mysql版本 | 低版本(例如 Nacos1.1.4) | 单机版standalone | 低版本MySQL5.x | 高版本(例如Nacos2.0.0 ALPHA.2) | 集群版cluster | 高版本MySQL8.x |
① 启动方式更改:
低版本:启动时默认是单机版;高版本启动时默认集群版。可通过配置文件进行更改。文件目录为:
...\nacos-server-2.0.0-ALPHA.2\nacos\bin\startup.cmd
单机版:set MODE="standalone"
集群版:set MODE="cluster" 或者使用cmd命令行的方式启动服务时指定:进入到nacos的bin目录下→ 文件目录输入cmd→ 启动命令+参数配置
② 数据持久化(单机版配置)
Nacos 默认使用嵌入式数据库来实现数据的存储,如果启动多个默认配置下的Nacos节点,数据存储一致性是存在问题的。
为了解决这个问题,Nacos采用了集中式存储的方式支持集群化部署,目前只支持MySQL存储。
Nacos默认嵌入式数据库是Derby。
Derby切换到MySQL的配置步骤:
# 1、在 nacos/conf/ 目录下找到sql脚本 nacos-mysql.sql。
# 2、创建数据库,数据库名字为 nacos_config。
# 3、在 nacos_config 数据库中执行sql脚本到数据库创建表。
# 4、修改conf/application.properties文件,增加支持mysql数据源配置(目前只支持mysql),添加mysql数据源的url、用户名和密码。
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://39.97.3.60(MySQL服务器IP或域名):3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root(MySQL数据源用户名)
db.password=333(MySQL数据源密码)
# 5、再以单机模式启动nacos,nacos所有写嵌入式数据库的数据都写到了mysql
数据持久化:
低版本:支持低版本的MySQL(5.7),如果想让低版本nacos可兼容高版本MySQL(8.0.x),需要自己下载nacos源码,在源码中进行MySQL配置的更改;然后进行构建、打包,使用新更改的jar包。
高版本:支持高版本的MySQL(8.0.x)
其他版本差异问题:可能会有登陆不上、账号密码错误等问题。某些版本的服务不稳定等等,具体版本问题具体分析。
|