Nacos是Naming和Configuration和Service的简称
一个更易于构建云原生应用的动态服务发现,配置管理和服务管理平台
Nacos简单来说就是一个注册中心+配置中心的组合
可以近似看作等价于Eureka+Config+Bus
<dependencies>
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-alibaba-dependenciesartifactId>
<version>2.1.0.RELEASEversion>
<type>pomtype>
<scope>importscope>
dependency>
dependencies>
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-actuatorartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-devtoolsartifactId>
<scope>runtimescope>
<optional>trueoptional>
dependency>
<dependency>
<groupId>com.xwb.springcloudgroupId>
<artifactId>cloud-api-commonsartifactId>
<version>1.0-SNAPSHOTversion>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-testartifactId>
<scope>testscope>
dependency>
server:
port: 9001
spring:
application:
name: nacos-payment-provider
cloud:
nacos:
discovery:
server-addr: localhost:8848 #配置Nacos地址
management:
endpoints:
web:
exposure:
include: '*'
@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;
}
}
只启动9001端口,无需启动其他端口
启动nacos服务器
完成后访问http://localhost:9001/payment/nacos/1
再访问http://localhost:8848/nacos可以看到下图
进入事例代码,我们可以选择复制代码与其他业务进行联动
设置虚拟端口,但是最终引用的还是我们9001端口
运行9011虚拟端口
查看http://localhost:8848/nacos ,可以看到9011的虚拟端口也进入了nacos中
nacos集合了ribbon
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;
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’
请使用groupId为com.alibaba.cloud
且artifacId为的启动器spring-cloud-starter-alibaba-nacos-config
。
<dependency>
<groupId> com.alibaba.cloud
<artifactId> spring-cloud-starter-alibaba-nacos-config
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
类型。这是因为
按正常来说,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的内容
是什么
类似 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 , 就是微服务实例。
指定spring.profile.active和配置文件的Data ID来使不同环境下读取不同的配置
默认空间+默认分组+新建dev和test两个Data ID
先在nacos控制台创建一个Data ID是test的文件
在aplication.yml中做一个修改,可修改工作环境
spring:
profiles:
# active: dev # 表示开发环境
active: test # 表示开发环境
修改bootstrap.yml添加group属性
config:
file-extension: yaml # 声明DataId的格式为yaml
server-addr: localhost:8848
#group: TEST_GROUP
group: INFO_GROUP
命名空间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