Dynamic Naming and Configuration Service
一个更易于构建云原生应用的动态服务发现,配置管理和服务管理平台。就是注册中心+配置中心得组合,等价于Eureka+Config+Bus。
win版直接解压后,到安装目录下,双击startup.cmd之后。访问http://localhost:8848/nacos/即可。登录密码和账户都是nacos
cloudalibaba-provider-payment9001
Nacos自带负载均衡。
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-discovery
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-actuator
org.springframework.boot
spring-boot-devtools
runtime
true
org.projectlombok
lombok
true
org.springframework.boot
spring-boot-starter-test
test
server:
port: 9001
spring:
application:
name: nacos-payment-provider
cloud:
nacos:
discovery:
server-addr: localhost:8848 #配置Nacos地址
management:
endpoints:
web:
exposure:
include: '*'
@EnableDiscoveryClient
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
public class PaymentMain9001 {
public static void main(String[] args) {
SpringApplication.run(PaymentMain9001.class, args);
}
}
cloudalibaba-consumer-nacos-order83
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-discovery
cn.nwnu.springcloud
cloud-api-commons
${project.version}
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-actuator
org.springframework.boot
spring-boot-devtools
runtime
true
org.projectlombok
lombok
true
org.springframework.boot
spring-boot-starter-test
test
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
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
@EnableDiscoveryClient
public class OrderConsumerMain83 {
public static void main(String args[]){
SpringApplication.run(OrderConsumerMain83.class, args);
}
}
@Configuration
public class ApplicationContextConfig
{
@Bean
@LoadBalanced
public RestTemplate getRestTemplate()
{
return new RestTemplate();
}
}
@RestController
@Slf4j
public class OrderNacosController
{
@Resource
private RestTemplate restTemplate;
@Value("${service-url.nacos-user-service}")
private String serverURL;
@GetMapping(value = "/consumer/payment/nacos/{id}")
public String paymentInfo(@PathVariable("id") Long id)
{
return restTemplate.getForObject(serverURL+"/payment/nacos/"+id,String.class);
}
}
CP+AP:Nacos支持CP和AP的切换
C是指所有节点在同一时间看到的数据是一致的,而A的定义是所有的请求都会收到响应。
何时选择何种模式:
如果不需要存储服务级别的信息且服务实例是通过nacos-client注册,并能够保持心跳上报,name就可以选择AP模式。当前主流的服务如SPring Cloud和Dubbo服务,都适用于AP模式,AP模式为了服务可能性而减弱了一致性,因此,AP模式下只支持注册临时实例。
如果需要在服务级别编辑或者存储配置信息,那么CP是必须,K8S服务和DNS服务都适用于CP模式,CP模式下支持持久化实例,此时则是以Raft协议为集群运行模式,该模式下注册实例之前必须先注册服务,如果服务不存在,就会返回错误。
cloudalibaba-config-nacos-client3377
Nacos支持自动刷新配置,当配置中心配置更改之后,Nacos会自动刷新,不想SpringCloud Config一样,需要发送广播通知。
Nacos同Springcloud-config一样,在项目初始化时,要先保证从配置中心拉取,拉取配置后,才能保证项目的正常启动。
Springboot中配置文件的加载存在优先级顺序,bootstrap优先级高于application。
spring:
profiles:
active: dev # 表示开发环境
#active: test # 表示测试环境
#active: info
# nacos配置
server:
port: 3377
spring:
application:
name: nacos-config-client
cloud:
nacos:
discovery:
server-addr: localhost:8848 #Nacos服务注册中心地址
config:
server-addr: localhost:8848 #Nacos作为配置中心地址
file-extension: yaml #指定yaml格式的配置
# ${spring.application.name}-${spring.profile.active}.${spring.cloud.nacos.config.file-extension}
# nacos-config-client-dev.yaml
# nacos-config-client-test.yaml ----> config.info
通过SpringCloud的原生注解@RefreshScope
实现配置的自动更新。
@RestController
@RefreshScope //支持Nacos的动态刷新功能。
public class ConfigClientController
{
@Value("${config.info}")
private String configInfo;
@GetMapping("/config/info")
public String getConfigInfo() {
return configInfo;
}
}
服务名-环境.后缀
官方文档
注意是yaml(不是yml)
公式:${spring.application.name}-${spring.profile.active}.${spring.cloud.nacos.config.file-extension}
实例:nacos-config-client-dev.yaml
在实际开发中,通常一个系统会准备:
如何保证指定环境启动时服务能够正确读取到Nacos上相应的配置文件
一个大型分布式微服务系统会有很多微服务子项目,每个微服务子项目有都会有对应的开发环境,测试环境,预发环境,正式环境…那怎么能对这些微服务进行管理呢?
类似java中package和class
最外层的namespace是可以用于区分环境部署的,Group和Data ID逻辑上是分两个目标对象。
默认情况
Namespace=public,Group=DEFAULR_GROUP,Service=Cluster
Nacos默认的命名空间是public,NameSpace主要用来实现隔离。比如说现在有三个开发环境:开发、测试、生产环境,我们就可以创建三个Namespace,不同的Namespace之间是隔离的。
Group可以吧不同的微服务划分到同一个组里面去。
Service就是微服务;一个service可以包含多个Cluster(集群),Nacos默认的Cluster是DEFAULT,Cluster
是对指定微服务的一个划分。比方说为了容灾,将service微服务分别部署在杭州机房和广州机房,这样就可以给杭州机房起名HZ。广州机房的service集群名称GZ,尽量让同一个机房的微服务互相调用,以提升性能。
最后是Instance,就是微服务实例
指定spring.profile.active
和配置文件的Data ID来使不同环境下读取不同的配置。
在Nacos中创建配置文件时指定分组。在bootstrap.yml中添加
spring:
cloud:
nacos:
config:
group: 分组名
在Nacos创建命名空间,然后在bootstrap.yml中添加
spring:
cloud:
nacos:
config:
namespace: 命名空间对应的id
官网
默认Nacos使用嵌入式数据库实现数据的存储。所以,如果启动多个默认配置下的Nacos结点,数据存储是存在一致性的问题。为了解决这个问题,Nacos采用了集中式存储的方式来支持集群化部署,目前只支持MySQL的存储。