文章目录
1.简介
为什么叫Nacos
前四个字母分别为Naming和Configuration的前两个字母,最后的s为Service.
是什么
Nacos= Eureka +Config + Bus
功能
替代Eureka做服务注册中心
替代Config做服务配置中心
官网
https://nacos.io/zh-cn/docs/what-is-nacos.html
下载地址:https://github.com/alibaba/nacos/releases
注册中心对比
据说Nacolp在阿里巴巴内部有超过10万的实例运行,已经过了类似双十一等各种大型流量的考验
安装及运行
2.nacos作为服务注册中心
和eureka和zookeeper类似如果要使用nacos注册中心只需要在yml配置文件中进行配置即可。
1.nacos作为服务提供者
建立9001项目
- 建项目
项目名称:cloudalibaba-provider-payment9001 - 写pom
- 写yml
server:
port: 9001
spring:
application:
name: nacos-payment-provider
cloud:
nacos:
discovery:
server-addr: localhost:8848
# 暴露端口,方便监控服务
management:
endpoints:
web:
exposure:
include: "*"
- 主启动
- 业务类
controller
@RestController
public class PaymentController {
@Value("${server.port}")
private String serverPort;
@GetMapping(value = "/payment/nacos/{id}")
public String getPayment(@PathVariable("id") Integer id) {
return "nacos registry, serverPort: " + serverPort + " id" + id;
}
}
简单的程序只输出其端口
测试
启动nacos和83项目,访问http://localhost:8848/nacos
已经注册入nacos
访问http://localhost:9001/payment/nacos/3
可以正常访问服务提供者搭建成功。
为了演示nacos的负载均衡功能参照9001,新建9002
2.nacos作为服务消费者替代Eureka
下面开始nacos作为服务中心项目的建立
建项目
若部分代码没有给出,请在远程仓库https://gitee.com/gyhdx/cloud2020查找
-
新建项目
项目名称:cloudalibaba-consumer-nacos-Order83 -
写pom
-
写yml
server:
port: 83
spring:
application:
name: nacos-order-consumer
cloud:
nacos:
discovery:
server-addr: localhost:8848
# 不在项目启动中起作用,仅作为一个公有配置,方便项目中使用
service-url:
nacos-user-service: http://nacos-payment-provider
- 主启动
NacosConsumerMain83.class类 - 业务类
config
package wf.springcloudalibaba.config;
/**
* @Description TODO
* @Author gyhdx
* @Date 2020/4/25 21:46
*/
@Configuration
public class ApplicationContextConfig {
@Bean
@LoadBalanced
public RestTemplate getRestTemple(){
return new RestTemplate();
}
}
controller
package wf.springcloudalibaba.controller;
/**
* @Description TODO
* @Author gyhdx
* @Date 2020/4/25 21:48
*/
@RestController
@Slf4j
public class NacosController {
@Resource
private RestTemplate restTemplate;
//获取yml中的相关配置值
@Value("${service-url.nacos-user-service}")
private String path;
@GetMapping(value = "/consumer/payment/nacos/{id}")
public String paymentInfo(@PathVariable("id") Long id){
return restTemplate.getForObject(path+"/payment/nacos/"+id,String.class);
}
}
测试
启动nacos和83项目,访问http://localhost:8848/nacos
访问http://localhost:83/consumer/payment/nacos/3
第一次访问
刷新页面
实现了轮询访问服务提供者,证明Nacos负载均衡起作用
nacos中的负载均衡
可以看到nacos依赖中已经自带了负载均衡Ribbon。
3.nacos作为配置中心替代Config
nacos的cap
Nacos支持AP和CP模式的切换
C是所有节点在同一时间看到的数据是一致的; 而A的定义是所有的请求都会收到响应。
何时选择使用何种模式?
一般来说,
如果不需要存储服务级别的信息且服务实例是通过nacos- client注册,并能够保持心跳上报,那么就可以选择AP模式。当前主流的服务如Spring cloud和Dubbo服务,都适用于AP模式,AP模式为了服务的可能性而减弱了一致性, 因此AP模式下只支持注册临时实例。
如果需要在服务级别编辑或者存储配置信息,那么CP是必须,K8S服务和DNS服务则适用于CP模式。
CP模式下则支持注册持久化实例,此时则是以Raft协议为集群运行模式,该模式下注册实例之前必须先注册服务,如果服务不存在,则会返回错误。
可以通过cmd执行
curl -XPUT ‘$NACOS_ SERVER:8848/nacos/v1/ns/operator/switches?ntry=serverMode&value=CP’
来实现nacos的CP模式切换
1.代码演示nacos配置中心功能
新建项目
- 建项目
项目名称:cloudalibaba-config-nacos-client3377 - 写pom
- 写yml
因为Nacos同springcloud-config一样,在项目初始化时,要保证先丛配置中心进行配置拉取,
拉取配置之后,才能保证项目的正常启动。springboot中配置文件的加载是存在优先级顺序的,bootstrap优先级高于application
bootstrap.yml
此次先使用这的配置,不然直接使用仓库中的会出问题
server:
port: 3377
spring:
application:
name: nacos-config-client
cloud:
nacos:
discovery:
server-addr: localhost:8848
config:
server-addr: localhost:8848
file-extension: yaml
application.yml
该yml是为了支持DataId方案的开发
spring:
profiles:
# active: test
active: dev
- 主启动
- 业务类
controller
@RestController
@RefreshScope
public class NacosController {
@Value("${config.info}")
String value;
@GetMapping(value = "/config/nacos/info")
public String info(){
return value;
}
}
注意在controller中@RefreshScope注解必须配置,为了实现动态刷新功能(Nacos的配置中心,配置发生改变,服务能感知到这种变化)
在nacos中添加配置信息
nacos中的匹配规则理论
Nacos中的dataid的组成格式及与SpringBoot配置文件中的匹配规则
简单来说就是
故按照我们在项目中yml的配置,改目标Data Id为nacos-config-client-dev.yaml
在nacos中添加配置
配置完成下拉,点击发布即可
配置成功后:
测试
启动3377项目,访问http://localhost:3377/config/nacos/info
配置成功。
点击编辑修改配置
刷新http://localhost:3377/config/nacos/info
可以看到改变了,这就是上面yml的端口开放实现监控和@RefreshScope共同起作用。
2.Nacos的分类配置
多环境多项目的问题
- 问题1:
实际开发中,通常一个系统会准备
dev开发环境
test测试环境
prod生产环境。
如何保证指定环境启动时服务能正确读取到Nacos.上相应环境的配置文件呢? - 问题2:
一个大型分布式微服务系统会有很多微服务子项目,
每个微服务项目又都会有相应的开发环境、测试环境、预发环境、正式环境…
那怎么对这些微服务配置进行管理呢?
nacos的图形化管理界面
- 配置管理
- 命名空间
Namespace+ Group+Data ID3者关系?为什么这么设计?
- 是什么
类似Java里面的package名和类名
最外层的namespace是可以用于区分部署环境的,Group和DatalD逻辑 上区分两个目标对象。 - 三者关系
默认情况:
Namespace=public, Group=DEFAULT GROUP,默认Cluster是DEFAULT
Nacos默认的命名空间是public, Namespace主要用来实现隔离。
比方说我们现在有三个环境:开发、测试、生产环境,我们就可以创建三三个Namespace,不同的Namespace之间是隔离的。
Group默认是DEFAULT_ GROUP, Group可以把不同的微服务划分到同一个分组里面去
Service就是微服务;一个Service可以包含多个Cluster (集群),Nacos默认Cluster是DEFAULT, Cluster是对指定微服务的一个虚拟划分。
比方说为了容灾,将Service微服务分别部署在了杭州机房和广州机房,
这时就可以给杭州机房的Service微服务起一个集群名称(HZ),
给广州机房的Service微服务起一个集群名称 (GZ) ,还可以尽量让同一个机房的微服务互相调用,以提升性能。
最后是Instance,就是微服务的实例。
3.三种方案加载配置
DataId方案
指定spring.profile.active和配置文件的DatalD来使不同环境下读取不同的配置
默认空间+默认分组+新建dev和test两个DatalD
- 新建dev配置DatalD
nacos-config-client-dev.yaml - 新建test配置DatalD
nacos-config-client-test.yaml
我们开始配置的application.yml中为dev,此时修改为test
访问http://localhost:3377/config/nacos/info
可以看到,该方案起作用了。
Group方案
通过group实现环境区分
在新建时直接修改Group即可
想让项目成功访问,需要在bootstrap.yml中修改一下配置
重启项目,成功访问http://localhost:3377/config/nacos/info
注意此处浏览器显示的内容为nacos中配置的
是通过controller获取
具体规则
namespace方案
可以自定义命名空间的名称、描述和ID,新建dev(开发)、test(测试)两个命名空间。
回到配置列表查看
在dev命名空间新建配置
然后,对项目的bootstrap.yml文件进行修改
此处我的命名空间为dev,group为DEV_GROUP,active环境为dev,说明访问的是
重启项目,成功访问http://localhost:3377/config/nacos/info
namespace方案使用成功。
3.nacos集群架构说明
1.集群模式部署
这个快速开始手册是帮忙您快速在你的电脑上,下载安装并使用Nacos,部署生产使用的集群模式。
集群部署架构图
因此开源的时候推荐用户把所有服务列表放到一个vip下面,然后挂到一个域名下面
http://ip1:port/openAPI 直连ip模式,机器挂则需要修改ip才可以使用。
http://VIP:port/openAPI 挂载VIP模式,直连vip即可,下面挂server真实ip,可读性不好。
http://nacos.com:port/openAPI 域名 + VIP模式,可读性好,而且换ip方便,推荐模式
注意:VIP=virtue ip(虚拟ip,用来在集群环境映射Nacos的真实ip)
实现上述架构的一种方案
Nacos支持三种部署模式
单机模式 - 用于测试和单机试用。
集群模式 - 用于生产环境,确保高可用。
多集群模式 - 用于多数据中心场景。
2.nacos持久化
因为nacos具备注册中心的功能,以及支持cp故nacos需要数据的持久化。
默认Nacos使用嵌入式数据库实现数据的存储。所以,如果启动多个默认配置下的Nacos节点,数据存储是存在一致性问题的。
为了解决这个问题,Nacos采用了集中式存储的方式来支持集群化部署,目前只支持MySQL的存储。
Nacos默认自带的是嵌入式数据库derby