【SpringCloud】8.Spring Cloud Alibaba Nacos——服务注册和配置中心

之前,我已经学习过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-provider
cloud:
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。
image

服务消费者

作为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-consumer
cloud:
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
{
@Resource
private 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-client
cloud:
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: 3377
spring:
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
image

完整格式

${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来配置。目前只支持propertiesyaml类型。

如何创建配置呢?首先打开nacos浏览器端,点击【配置管理】→【配置列表】,点【创建配置】。
image

根据dataId规则,我们创建的文件名称为nacos-config-client-dev.yaml,配置要测试的属性config.info
image

测试

启动Nacos且按照前文配置成功配置管理,运行cloud-config-nacos-client3377,查看接口调用的配置信息: http://localhsot3377/config/info。
测试返回值
image

修改配置信息,查看是否动态刷新是否使用成功。

nacos会记录配置文件的历史版本,默认保留30天,此外还有一键回滚的功能:happy:。会触发配置更新。位置:【配置管理】→【历史版本】。

Nacos数据模型之Namespace-Group-DataId(命名空间-分组-DataId)

实际开发中,通常一个系统会准备:dev开发环境、test测试环境、prod生产环境,如果保证指定环境,启动时,能够读取到Nacos上环境的配置文件呢?

一个大型分布式微服务系统会有很多微服务子项目,每个微服务项目又都会有相应的开发环境、测试环境、预发环境、正式环境……那么,这些微服务配置如何分组和命名空间管理呢?
nacos命名空间

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

image

持久化的数据库如何初始化?打开{nacos.home}/conf文件下的mysql-schema.sql,初始化到自己的mysql数据库即可。

posted @   陆陆无为而治者  阅读(184)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
历史上的今天:
2024-01-03 【Redis】SQL 和NoSQL区别
2024-01-03 【Redis】不知彼阶段Redis认知
点击右上角即可分享
微信分享提示