Nacos的初步学习
Nacos是Naming和Configuration和Service的简称
一个更易于构建云原生应用的动态服务发现,配置管理和服务管理平台
Nacos简单来说就是一个注册中心+配置中心的组合
可以近似看作等价于Eureka+Config+Bus
可以替代eureka做服务注册中心,替代config做服务配置中心
官网地址https://nacos.io/zh-cn/
下载地址https://github.com/alibaba/nacos/releases/tag/1.2.1
解压后,进入到bin中打开cmd运行startup.cmd
下载安装成功后访问http://localhost:8848/nacos 账号密码默认nacos
构建项目
1.我们为了避免多次引入,需要在父pom中引入我们的Alibaba依赖
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.1.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
2.我们在子POM引入Nacos Discovery进行服务注册/发现
<!-- SpringCloud alibaba nacos -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- web组件 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.xwb.springcloud</groupId>
<artifactId>cloud-api-commons</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
3.yml配置搭建(以下内容必须配置)
server:
port: 9001
spring:
application:
name: nacos-payment-provider
cloud:
nacos:
discovery:
server-addr: localhost:8848 #配置Nacos地址
management:
endpoints:
web:
exposure:
include: '*'
4.主启动类和业务类
@SpringBootApplication
@EnableDiscoveryClient
public class Payment9001 {
public static void main(String[] args) {
SpringApplication.run(Payment9001.class,args);
}
}
@RestController
public class PaymentController {
@Value("${server.port}")
private String serverPort;
@GetMapping("/payment/nacos/{id}")
public String getPayment(@PathVariable("id") Integer id){
return "welcome to my nacos,this my serverPort"+serverPort+"\t your id:"+id;
}
}
5.测试
只启动9001端口,无需启动其他端口
启动nacos服务器
完成后访问http://localhost:9001/payment/nacos/1
再访问http://localhost:8848/nacos可以看到下图
进入事例代码,我们可以选择复制代码与其他业务进行联动
6.若项目内容重复繁琐,可直接拷贝虚拟端口映射
设置虚拟端口,但是最终引用的还是我们9001端口
运行9011虚拟端口
查看http://localhost:8848/nacos ,可以看到9011的虚拟端口也进入了nacos中
7.nacos默认支持负载均衡
nacos集合了ribbon
8.通过子服务调用实现负载轮询
1.构建83端口号项目
pom文件保持不变
在yml文件多添加一个属性
# 消费者将要去访问的微服务名称(注册成功进nacos的为服务提供者)
server-url:
nacos-user-service: http://nacos-payment-provider
这样可实现在controller当中路径指向的配置和代码杂糅
/*
* 以前的写法,配置和代码杂糅
* public static final String SERVER_URL="http://nacos-payment-provider";
* */
//集成了feign
@Value("${server-url.nacos-user-service}")
private String serverURL;
9.Nacos支持ap和cp模式的切换
C 是所有节点在同一时间看到的数据是一致的,而A的定义是所有的请求都会受到相应。
何时选择使用何种模式?
一般来说,
如果不需要存储级别的信息且服务实例是通过 nacos-client 注册的,并且能够保持心跳上报,那么久可以选择AP 模式,当前主流的服务如: spring cloud 和 dubbo 服务,都适用于AP 模式,AP为了方服务的可能性而减弱了一致性,因此AP模式先只支持注册临时实例。
如果需要在服务级别编辑或者存储配置信息,那么CP是必须的, K8S 服务和 DNS 服务则不适用于 CP 模式。
CP 模式下则支持注册持久化实例,此时则是 Raft 协议为集群模式运行, 该模式下注册实实例之前必须先注册服务。如果服务不存在,则会返回错误
如何进行模式切换
curl -X PUT
‘$NACOS_SERVER:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP’
10.Nacos Config
pom修改
请使用groupId为com.alibaba.cloud
且artifacId为的启动器spring-cloud-starter-alibaba-nacos-config
。
<dependency>
<groupId> com.alibaba.cloud </ groupId>
<artifactId> spring-cloud-starter-alibaba-nacos-config </ artifactId>
</ dependency>
yml配置,有一个application和bootstrap
bootstrap
server:
port: 3377
spring:
application:
name: nacos-config-client
cloud:
nacos:
discovery:
server-addr: localhost:8848
config:
file-extension: yaml # 声明DataId的格式为yaml
server-addr: localhost:8848
# ${prefix}-${spring.profile.active}.${file-extension}等同于下面语句
#${spring.application.name}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
# 一一对应下来就是 nacos-config-client-dev.yaml
application
spring:
profiles:
active: dev # 表示开发环境
prefix
默认为spring.application.name
的值,也可以通过配置项spring.cloud.nacos.config.prefix
来配置。spring.profile.active
即为当前环境对应的 profile,详情可以参考 Spring Boot文档。 注意:当 spring.profile.active 为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成 p r e f i x . {prefix}. prefix.{file-extension}file-exetension
为配置内容的数据格式,可以通过配置项spring.cloud.nacos.config.file-extension
来配置。目前只支持properties
和yaml
类型。
官网配置
当我们配置完成好整个3377端口后出现这个错误
这是因为
我们这个yaml和yml
按正常来说,nacos应该同时支持yml和yaml
但是nacos只默认支持yaml,由于我们平时习惯的yml
所以我们要更改这个错误的,应该将
这个Data Id改成yaml文件
修改完成后,重启一下nacos和3377端口即可
启动成功后,访问http://localhost:3377/config/info即可获得我们在nacos中配置的 nacos-config-client-dev.yaml的内容
动态刷新
我们去nacos中修改我们的config内容
当我们去刷新http://localhost:3377/config/info,随即更新config的内容
11.命名空间NameSpace+Group+Data ID三者间的关系,为什么这样设计
是什么
类似 Java 里面的 package 和 类名。
最外层的 namespace 是可以用于区分部署环境的, group 和 dataid 罗裳区分两个目标对象。
三者情况
默认情况下:
Namespace=public , Group = DEFAULT_GROUP , 默认 Cluster 是DEAULT
Nacos 默认的命名空间是 public , Namespace 主要用来实现隔离。
比如说我们现在有三个环境:开发、测试、生产环境,我们可以创建三个Namespace , 不同的 Namespace 之间是隔离的。
Group 默认是 DEFAULT_GROUP , Group 可以把不同的微服务划分到同一个分组里面去。(类似于Stream)
Service 就是微服务;一个 service 可以包含多个 Cluster (集群), Nacos默认 Cluster 是 DEFAULT , Cluster 是对指定微服务的一个虚拟划分。
比方说容灾,将 Service 微服务分别部署在杭州机房和广州机房,
这时就可以给杭州机房的一个 Service 微服务一个集群名字 HZ
给广州机房的一个集群名称 (GZ),还可以精良让同一个机房的微服务相互调用,以提升性能。
最后是 Instance , 就是微服务实例。
1.Data ID配置方案
指定spring.profile.active和配置文件的Data ID来使不同环境下读取不同的配置
方案:
默认空间+默认分组+新建dev和test两个Data ID
先在nacos控制台创建一个Data ID是test的文件
在aplication.yml中做一个修改,可修改工作环境
spring:
profiles:
# active: dev # 表示开发环境
active: test # 表示开发环境
2.Group ID配置方案
在nacos控制台发布不同的group
修改bootstrap.yml添加group属性
config:
file-extension: yaml # 声明DataId的格式为yaml
server-addr: localhost:8848
#group: TEST_GROUP
group: INFO_GROUP
3.NameSpace的配置方案
命名空间id》》》》要在bootstrap中配置
public默认空间,无法删除
在nacos控制台中配置完成后,可以在左上角看到我们的自定义Namespace
在,我们新建的命名空间中新建文件
修改我们的bootstrap.yml
添加namespace属性,namespace要对应上命名空间ID而不是我们的自定义名称
config:
file-extension: yaml # 声明DataId的格式为yaml
server-addr: localhost:8848
#group: TEST_GROUP
group: INFO_GROUP
namespace: a50a13e7-31c5-49b1-8da6-e6a244599564