微服务灵魂摆渡者——Nacos实践

目录

一、前置条件

二、基本概念

二、启动服务注册与发现

三、启动配置管理

四、数据持久化到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)

其他版本差异问题:可能会有登陆不上、账号密码错误等问题。某些版本的服务不稳定等等,具体版本问题具体分析。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

技术蜗牛-阿春

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值