目录
- 概述
- 下载安装
- Nacos服务注册中心
- 原理
- 配置服务提供者
- 配置服务消费者
- 负载均衡
- Nacos服务配置中心
- 新建一个配置中心服务
- Nacos控制台配置
- 历史配置回滚
- Nacos数据模型三元组
- 是什么
- 默认值
- Service就是微服务
- Nacos图形界面
- 三种方案加载配置
- DataId方案
- Group方案
- Namespace方案
- 文献参考
概述
Nacos(官方网站:nacos.io)是一个易于使用的平台,专为动态服务发现、配置和服务管理而设计。帮助您轻松构建云原生应用和微服务平台。
Nacos是 Dynamic Naming and Configuration Service 的首字母简称。
Spring Cloud Alibaba 是 Spring Cloud 的第二代实现,因此与其他注册中心关系如下:
Nacos = Eurake+Config+Bus
Nacos = Spring Cloud Consul
Nacos与其他注册中心就比较
技术选型的话,根据实际情况来定。
下载安装
Nacos 依赖 Java 环境来运行。如果您是从代码开始构建并运行Nacos,还需要配置 Maven环境,请确保是在以下版本环境中安装使用:
64 bit OS,支持 Linux/Unix/Mac/Windows,推荐选用 Linux/Unix/Mac。
64 bit JDK 1.8+;
Maven 3.2.x+;
具体启动方式参考 Nacos 官网。
Nacos Server 启动成功之后,浏览器地址栏输入 http://ip:8848/nacos 查看 Nacos 控制台(默认账号名和密码为 nacos/nacos):
关于更多的 Nacos Server 版本,可以从 Nacos 官方 release 页面查看。
Nacos服务注册中心
通过 Nacos Server 和 spring-cloud-starter-alibaba-nacos-discovery 实现服务的注册与发现。
原理
spring-cloud-starter-alibaba-nacos-discovery 遵循了 Spring Cloud Common 标准,实现了 AutoServiceRegistration、ServiceRegistry、Registration 这三个接口。
在 Spring Cloud 应用的启动阶段,监听了 WebServerInitializedEvent 事件,当 Web 容器初始化完成后,即收到 WebServerInitializedEvent 事件后,会触发注册的动作,调用 ServiceRegistry 的 register 方法,将服务注册到 Nacos Server。
配置服务提供者
从而服务提供者可以通过 Nacos 的服务注册发现功能将其服务注册到 Nacos server 上
1、添加依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
注意:版本 2.1.x.RELEASE 对应的是 Spring Boot 2.1.x 版本。版本 2.0.x.RELEASE 对应的是 Spring Boot 2.0.x 版本,版本 1.5.x.RELEASE 对应的是 Spring Boot 1.5.x 版本。
2、在 application.yml 中配置 Nacos server 的地址
server:
port: 9001
spring:
application:
name: nacos-payment-provider
cloud:
nacos:
discovery:
server-addr: localhost:8848 #配置Nacos地址
3、 通过 Spring Cloud 原生注解 @EnableDiscoveryClient 开启服务注册发现功能
@SpringBootApplication
@EnableDiscoveryClient
public class Main9001
{
public static void main(String[] args)
{
SpringApplication.run(Main9001.class,args);
}
}
业务类
@RestController
public class PayAlibabaController
{
@Value("${server.port}")
private String serverPort;
@GetMapping(value = "/pay/nacos/{id}")
public String getPayInfo(@PathVariable("id") Integer id)
{
return "nacos registry, serverPort: "+ serverPort+"\t id"+id;
}
}
配置服务消费者
从而服务消费者可以通过 Nacos 的服务注册发现功能从 Nacos server 上获取到它要调用的服务。
1、添加依赖
<!--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>
2、配置yml
server:
port: 83
spring:
application:
name: nacos-order-consumer
cloud:
nacos:
discovery:
server-addr: localhost:8848
#消费者将要去访问的微服务名称(nacos微服务提供者叫什么你写什么)
service-url:
nacos-user-service: http://nacos-payment-provider
3、 通过 Spring Cloud 原生注解 @EnableDiscoveryClient 开启服务注册发现功能
@EnableDiscoveryClient
@SpringBootApplication
public class Main83
{
public static void main(String[] args)
{
SpringApplication.run(Main83.class,args);
}
}
配置类
@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调用者。。。。。。";
}
}
负载均衡
在之前LoadBalanced讲到过,是具备负载均衡能力的,因此,服务提供者+1,可以来试试Nacos+LoadBalanced的威力
在IDEA拷贝虚拟端口映射,偷个懒,不CV了
-DServer.port=9002
测试,输入http://localhost:83/consumer/pay/nacos/14,看到9001/9002交替出现,负载均衡成功
Nacos服务配置中心
通过 Nacos Server 和 spring-cloud-starter-alibaba-nacos-config 实现配置的动态变更
新建一个配置中心服务
1、添加依赖
<!--bootstrap-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
<!--nacos-config-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
注意:版本 2.1.x.RELEASE 对应的是 Spring Boot 2.1.x 版本。版本 2.0.x.RELEASE 对应的是 Spring Boot 2.0.x 版本,版本 1.5.x.RELEASE 对应的是 Spring Boot 1.5.x 版本。
2、添加bootstrap.yml
# 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
3、添加application.yml
server:
port: 3377
spring:
profiles:
active: dev # 表示开发环境
#active: prod # 表示生产环境
#active: test # 表示测试环境
4、主启动类
@EnableDiscoveryClient
@SpringBootApplication
public class NacosConfigClient3377
{
public static void main(String[] args)
{
SpringApplication.run(NacosConfigClient3377.class,args);
}
}
5、业务类
通过 Spring Cloud 原生注解 @RefreshScope 实现配置自动更新
@RestController
@RefreshScope //在控制器类加入@RefreshScope注解使当前类下的配置支持Nacos的动态刷新功能。
public class NacosConfigClientController
{
@Value("${config.info}")
private String configInfo;
@GetMapping("/config/info")
public String getConfigInfo() {
return configInfo;
}
}
Nacos控制台配置
在 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 的拼接格式变成 p r e f i x . {prefix}. prefix.{file-extension}
- file-exetension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。目前只支持 properties 和 yaml 类型。
按照上面案例来说,dataId就是【nacos-config-client-dev.yaml】
测试
1、启动配置中心服务,调用接口http://localhost:3377/config/info查看当先配置信息。
2、改动Nacos刚创建的yaml配置,重新调用接口,会发现接口返回的配置信息与控制台修改的配置一致,成功
历史配置回滚
上一步修改了Nacos控制台的yaml配置,在这里可以看到历史记录,也可以选择右侧的按钮进行回滚
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是对指定微服务的一个虚拟划分。见下一节:服务领域模型-补充说明
Nacos图形界面
三种方案加载配置
制定颗粒度,按照隔离的颗粒度优先级从Nacos拉取配置更新项目配置
spring-cloud-starter-alibaba-nacos-config 在加载服务配置时:
不仅仅加载了以 dataId 为 s p r i n g . a p p l i c a t i o n . n a m e . {spring.application.name}. spring.application.name.{file-extension:properties } 为前缀的基础配置,
还加载了 dataId 为 s p r i n g . a p p l i c a t i o n . n a m e − {spring.application.name}- spring.application.name−{profile}.${file-extension:properties } 的基础配置。
在日常开发中如果遇到多套环境下的不同配置,可以通过 Spring 提供的 ${spring.profiles.active} 这个配置项选择不同情况下的配置。
DataId方案
这种方案在上面将配置中心的时候已经举例过,关键字搜索【dataId就是【nacos-config-client-dev.yaml】】
在Nacos控制台再新建一个配置文件叫做 nacos-config-client-test.yaml(里面内容可自行修改),可以在端口3377项目,修改application.yml配置文件,切换test环境
spring:
profiles:
#active: dev # 表示开发环境
#active: prod # 表示生产环境
active: test # 表示测试环境
重启3377项目,再调用接口http://localhost:3377/config/info,可查看最新配置信息是从Nacos拉取的test配置文件
Group方案
Nacos控制台新建Group分组,新建nacos-config-client-prod.yaml配置文件
利用Group实现环境区分
修改bootstrap.yml文件
修改application.yml文件
重启3377项目,访问http://localhost:3377/config/info,可查看最新配置信息是从Nacos拉取的prod配置文件
Namespace方案
创建多个Namespace
不填的话会自动生成命名空间id
选中Prod_Namespace新建配置
修改bootstrap.yml文件
修改application.yml文件
重启3377项目,访问http://localhost:3377/config/info,可查看最新配置信息是从Nacos拉取的prod配置文件
文献参考
Nacos中文文档:https://sca.aliyun.com/docs/2023/user-guide/nacos/overview/?spm=5176.29160081.0.0.74801a152Cfdp0
Nacos官网:https://nacos.io/docs/latest/quickstart/quick-start/
Nacos Github:https://github.com/alibaba/Nacos
Spring Cloud Alibaba Github:https://github.com/alibaba/spring-cloud-alibaba
就先说到这
\color{#008B8B}{ 就先说到这}
就先说到这
在下
A
p
o
l
l
o
\color{#008B8B}{在下Apollo}
在下Apollo
一个爱分享
J
a
v
a
、生活的小人物,
\color{#008B8B}{一个爱分享Java、生活的小人物,}
一个爱分享Java、生活的小人物,
咱们来日方长,有缘江湖再见,告辞!
\color{#008B8B}{咱们来日方长,有缘江湖再见,告辞!}
咱们来日方长,有缘江湖再见,告辞!