Nacos1.1.3小试牛刀
什么是 Nacos(摘自https://nacos.io/zh-cn/docs/quick-start.html)
Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。
Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。
服务(Service)是 Nacos 世界的一等公民。Nacos 支持几乎所有主流类型的“服务”的发现、配置和管理:
Nacos 的关键特性包括:
- 服务发现和服务健康监测:
- Nacos 支持基于 DNS 和基于 RPC 的服务发现。服务提供者使用 原生SDK、OpenAPI、或一个独立的Agent TODO注册 Service 后,服务消费者可以使用DNS TODO 或HTTP&API查找和发现服务。Nacos 提供对服务的实时的健康检查,阻止向不健康的主机或服务实例发送请求。Nacos 支持传输层 (PING 或 TCP)和应用层 (如 HTTP、MySQL、用户自定义)的健康检查。 对于复杂的云环境和网络拓扑环境中(如 VPC、边缘网络等)服务的健康检查,Nacos 提供了 agent 上报模式和服务端主动检测2种健康检查模式。Nacos 还提供了统一的健康检查仪表盘,帮助您根据健康状态管理服务的可用性及流量。
- 动态配置服务:
- 动态配置服务可以让您以中心化、外部化和动态化的方式管理所有环境的应用配置和服务配置。动态配置消除了配置变更时重新部署应用和服务的需要,让配置管理变得更加高效和敏捷。配置中心化管理让实现无状态服务变得更简单,让服务按需弹性扩展变得更容易。Nacos 提供了一个简洁易用的UI (控制台样例 Demo) 帮助您管理所有的服务和应用的配置。Nacos 还提供包括配置版本跟踪、金丝雀发布、一键回滚配置以及客户端配置更新状态跟踪在内的一系列开箱即用的配置管理特性,帮助您更安全地在生产环境中管理配置变更和降低配置变更带来的风险。
- 动态 DNS 服务:
- 动态 DNS 服务支持权重路由,让您更容易地实现中间层负载均衡、更灵活的路由策略、流量控制以及数据中心内网的简单DNS解析服务。动态DNS服务还能让您更容易地实现以 DNS 协议为基础的服务发现,以帮助您消除耦合到厂商私有服务发现 API 上的风险。Nacos 提供了一些简单的 DNS APIs TODO 帮助您管理服务的关联域名和可用的 IP:PORT 列表.
- 服务及其元数据管理:
Nacos 能让您从微服务平台建设的视角管理数据中心的所有服务及元数据,包括管理服务的描述、生命周期、服务的静态依赖分析、服务的健康状态、服务的流量管理、路由及安全策略、服务的 SLA 以及最首要的 metrics 统计数据。
Nacos 快速开始:
1.预备环境准备
Nacos 依赖 Java 环境来运行。如果您是从代码开始构建并运行Nacos,还需要为此配置 Maven环境,请确保是在以下版本环境中安装使用:
- 64 bit OS,支持 Linux/Unix/Mac/Windows,推荐选用 Linux/Unix/Mac。
- 64 bit JDK 1.8+;下载 & 配置。
- Maven 3.2.x+;下载 & 配置。
也可以通过 https://github.com/alibaba/nacos/releases 下载最新稳定版本 下载 nacos-server-$version.zip
包。从 Github 上下载源码方式:
git clone https://github.com/alibaba/nacos.git cd nacos/ mvn -Prelease-nacos clean install -U ls -al distribution/target/ cd distribution/target/nacos-server-$version/nacos/bin
由于我编译的时候跑Test报错,我这里选择跳过Test.
编译完进入 nacos\distribution\target\nacos-server-1.1.3\nacos\bin 目录,我这边windows 双击 startup.cmd 启动服务:
等服务启动完毕根据其控制台打印的地址去访问http://192.168.216.1:8848/nacos/index.html,登录进去(默认账号密码都是 nacos),会看到以下界面:
可以很清晰的看到nacos为我们提供了基于配置管理,服务管理,集群管理三大主功能下的管理。作为服务注册中心的话,如果小伙伴们熟悉Zookeeper的话,其实原理是大同小异的,我们这里主要基于配置中心去操作一下,我们去添加一条配置:
其中ID与Group 官方给出的定义如下:
配置集 ID:Nacos 中的某个配置集的 ID。配置集 ID 是组织划分配置的维度之一。Data ID 通常用于组织划分系统的配置集。一个系统或者应用可以包含多个配置集,每个配置集都可以被一个有意义的名称标识。Data ID 通常采用类 Java 包(如 com.taobao.tc.refund.log.level)的命名规则保证全局唯一性。此命名规则非强制。
配置分组:Nacos 中的一组配置集,是组织配置的维度之一。通过一个有意义的字符串(如 Buy 或 Trade )对配置集进行分组,从而区分 Data ID 相同的配置集。当您在 Nacos 上创建一个配置时,如果未填写配置分组的名称,则配置分组的名称默认采用 DEFAULT_GROUP 。配置分组的常见场景:不同的应用或组件使用了相同的配置类型,如 database_url 配置和 MQ_topic 配置。
Java案例实践:
1.首先基于Nacos 的原生SDK,导入依赖:
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>1.1.1</version>
</dependency>
2.主类操作如下:
public static void main(String[] args) {
//连接到目标服务的地址
//指定dataid、 groupid
String serverAddr="localhost:8848";
String dataId="example";
String groupId="DEFAULT_GROUP";
Properties properties=new Properties();
properties.put("serverAddr",serverAddr);
try {
//ConfigService-> NacosConfigService
ConfigService configService=NacosFactory.createConfigService(properties);
String content=configService.getConfig(dataId,groupId,3000);
System.out.println(content);
//监听
configService.addListener(dataId, groupId, new Listener() {
@Override
public Executor getExecutor() {
return null;
}
@Override
public void receiveConfigInfo(String configInfo) {
System.out.println("configInfo:"+configInfo);
}
});
} catch (NacosException e) {
e.printStackTrace();
}
}
3.在控制台新增如下配置:
4.运行即可获得对应的配置结果。
基于SpringBoot 集成 Nacos配置中心:
1.导入依赖:
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>nacos-config-spring-boot-starter</artifactId>
<version>0.2.2</version>
</dependency>
2.编写一个Controller:
@NacosPropertySource(type = ConfigType.YAML,dataId = "example",groupId = "DEFAULT_GROUP",autoRefreshed = true)
@RestController
public class NacosConfigController {
/**
* 当前的info这个属性,回去nacos-server找到对应的info这个属性
* 高可用性
* hello Nacos表示本地属性(降级属性)
* autoRefreshed :是否自动刷新配置变更
*/
@NacosValue(value = "${name:hello Nacos}",autoRefreshed = true)
private String name;
@GetMapping("/get")
public String get(){
return name;
}
}
3.新增配置文件 application.properties
spring.application.name=springboot-nacos # nacos配置地址 nacos.config.server-addr=127.0.0.1:8848 server.port=8083
启动项目访问接口就可以获取结果。
基于SpringBoot 集成 Nacos注册中心:
1.新增依赖:
<dependency> <groupId>com.alibaba.boot</groupId> <artifactId>nacos-discovery-spring-boot-starter</artifactId> <version>0.2.3</version> </dependency>
2.新增配置类:
@Configuration public class NacosRegisterConfiguration { @Value("${server.port}") private int serverPort; @Value("${spring.application.name}") private String applicationName; @NacosInjected private NamingService namingService; @PostConstruct public void registerInstance() throws NacosException { namingService.registerInstance(applicationName, "127.0.0.1", serverPort, "DEFAULT"); } }
3.新增配置:
# nacos注册地址 nacos.discovery.server-addr=127.0.0.1:8848
4.启动后可以在控制台看到:
调用方则通过RestTemplate 进行调用和即可(restTemplate.getForObject("http://nacos-provider/get", String.class))。当然需要调用方也注册到Nacos中.
官方文档有很详细的解释,包括对于 Dubbo,springCloud的集成等。接下去我们深入来学习一下Nacos的源码,来体会设计思路。
spring-cloud-alibaba + dubbo 集成 Nacos注册中心:
基于 spring-cloud-alibaba ,集成dubbo 跟Nacos显得特别的简单。首先县来看一下我的项目结构:
首先在最外层添加 spring-boot 与 apring-cloud-alibaba 的依赖(相关版本规范惨开Nacos官网介绍):
<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> <spring-cloud-alibaba.version>2.2.1.RELEASE</spring-cloud-alibaba.version> <spring-boot.version>2.3.0.RELEASE</spring-boot.version> </properties> <dependencyManagement> <dependencies> <dependency> <!-- Import dependency management from Spring Boot --> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>${spring-boot.version}</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>${spring-cloud-alibaba.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
构建服务提供方:
1.在 service 模块添加 pom 依赖:
<dependencies>
<dependency>
<artifactId>api</artifactId>
<groupId>com.wuzz.demo</groupId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-dubbo</artifactId>
</dependency>
</dependencies>
2. 在 api 模块创建一个接口,作为对外暴露的服务,同时在 service 模块实现该接口:
//注意这个Service注解的全路径
//org.apache.dubbo.config.annotation.Service
@Service(protocol = "dubbo")
class EchoServiceImpl implements EchoService {
@Override
public String echo(String message) {
return "[echo] Hello, " + message;
}
}
3.添加相关 application.properties 配置:
server.port=7098
spring.application.name=wuzz-nacos-dubbo-provider
#端点暴露配置
management.endpoints.jmx.exposure.include=*
management.endpoints.web.exposure.include=*
management.endpoint.health.show-details=always
# spring cloud access&secret config
# 可以访问如下地址查看: https://usercenter.console.aliyun.com/#/manage/ak
alibaba.cloud.access-key=****
alibaba.cloud.secret-key=****
# dubbo 服务扫描基础包路径,指定 Dubbo 服务实现类的扫描基准包
dubbo.scan.base-packages=com.wuzz.demo.provider
dubbo.protocol.id=dubbo
# Dubbo 服务暴露的协议配置,其中子属性 name 为协议名称,port 为协议端口( -1 表示自增端口,从 20880 开始)
dubbo.protocol.name=dubbo
dubbo.protocol.port=-1
# 这里默认使用了当前应用名,请根据需要增加对应的应用名
dubbo.cloud.subscribed-services=wuzz-nacos-dubbo-provider
#Nacos 服务发现与注册配置,其中子属性 server-addr指定 Nacos 服务器主机和端口
spring.cloud.nacos.discovery.server-addr=192.168.200.1:8848
然后运行启动类则会将服务注册到Nacos上,可以通过Nacos面板看到。
构建服务消费方:
1.在consumer 模块添加相关pom 依赖:
<dependencies> <dependency> <artifactId>api</artifactId> <groupId>com.wuzz.demo</groupId> <version>1.0-SNAPSHOT</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-dubbo</artifactId> </dependency> </dependencies>
2.添加测试类:
@RestController public class TestController { @Reference EchoService echoService; @GetMapping("/call") public String call() { return echoService.echo("Wuzz"); } }
3.添加 application 配置文件
spring.application.name=wuzz-nacos-dubbo-consumer dubbo.application.name=wuzz-nacos-dubbo-consumer management.endpoints.jmx.exposure.include=* management.endpoints.web.exposure.include=* management.endpoint.health.show-details=always # dubbo 服务扫描基础包路径 dubbo.scan.base-packages=com.wuzz.demo dubbo.protocol.name=dubbo dubbo.protocol.port=20881 server.port=8086 # 用于服务消费方订阅服务提供方的应用名称的列表,若需订阅多应用,使用 "," 分割。 不推荐使用默认值为 "*",它将订阅所有应用。 # 这里默认使用了当前应用名,请根据需要增加对应的应用名 dubbo.cloud.subscribed-services=wuzz-nacos-dubbo-provider spring.cloud.nacos.discovery.server-addr=192.168.200.1:8848
然后启动消费者,可以在Nacos面板看到如下内容,说明服务提供者与消费者均构建完成。则可以通过测试接口测试接口的调用:
Nacos配置中心:
1.在 consumer 模块添加服务配置的依赖:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
2.需要注意,配置中心的ip,需要放在bootstrap.properties文件中,因为需要保证优先级。
spring.cloud.nacos.config.server-addr=192.168.200.1:8848
#指定配置的组,默认是DEFAULT_GROUP
spring.cloud.nacos.config.group=myGroup
3.修改测试接口类:
@RefreshScope
@RestController
public class TestController {
@Reference
EchoService echoService;
@GetMapping("/call")
public String call() {
return echoService.echo("Wuzz");
}
@Value("${info:hello Nacos}")
private String info;
@GetMapping("/get")
public String get() {
return info;
}
}
4.进入控制台,增加配置,dataid=wuzz-nacos-dubbo-consumer,groupid=myGroup, 并且增加 info = xx的value属性,然后请求测试接口地址。修改一下配置,再次刷新url,就可以读取到值的变化。
关于Nacos Config配置解释:
在 Nacos Spring Cloud 中, dataId 的完整格式如下:
${prefix}-${spring.profiles.active}.${file-extension}
-
prefix 默认为 spring.application.name 的值,也可以通过配置项 spring.cloud.nacos.config.prefix 来配置。
-
spring.profiles.active 即为当前环境对应的 profile,详情可以参考 。 注意:当 spring.profiles.active 为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成 ${prefix}.${file-extension}
-
file-exetension 为配置内容的数据格式,可以通过配置项spring.cloud.nacos.config.file-extension 来配置。目前只支持 properties 和 yaml 类型。
Nacos的整体架构:
Nacos的整体架构还是比较清晰的,我们可以从下面这个官方提供的架构图进行简单分析。
Nacos的集群搭建:
Nacos 的集群搭建也是非常便捷的
1.准备三台服务器,分别安装好Nacos。
2.配置数据源:需要注意的是,Nacos默认采用的是一个derby的内置数据库,在实际过程中,不建议使用这种数据源。建议采用高可用数据库,比如我们使用mysql构建主从。那我们可以使用mysql作为数据源来进行服务的配置。
在 conf 文件夹下有个 nacos-mysql.sql 脚本、导入mysql数据库脚本、修改nacos中application.properties文件内容
#*************** Config Module Related Configurations ***************# ### If use MySQL as datasource: spring.datasource.platform=mysql ### Count of DB: db.num=1 ### Connect URL of DB: db.url.0=jdbc:mysql://127.0.0.1:3306/nacos? characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect= true&useUnicode=true&useSSL=false&serverTimezone=UTC db.user=nacos db.password=nacos
3.在nacos/conf目录下,有一个cluster.conf配置文件,在这个配置文件中配置这三个节点的ip和端口
192.168.216.128:8848
192.168.216.129:8848
192.168.216.130:8848
分别启动就完成了集群的搭建。更多的特性请参考官网。
Nacos Server的监控:
Prometheus:
Prometheus是一个开源的监控系统,起源于SoundCloud。它由以下几个核心组件构成:数据爬虫:根据配置的时间定期的通过HTTP抓去metrics数据。time-series 数据库:存储所有的metrics数据。简单的用户交互接口:可视化、查询和监控所有的metrics。
Grafana:
Grafana使你能够把来自不同数据源比如Elasticsearch, Prometheus, Graphite, influxDB等多样的数据以绚丽的图标展示出来。它也能基于你的metrics数据发出告警。当一个告警状态改变时,它能通知你通过email,slack或者其他途径。值得注意的是,Prometheus仪表盘也有简单的图标。但是Grafana的图表表现的更好。这也是为什么,我们需要整合Grafana和Pormetheus来可视化metrics数据。
Nacos server接入到监控:
1.修改${NACOS_HOME}/conf/application.properties ,打开 management.endpoints.web.exposure.include=*
3.访问这个地址: http://192.168.216.128:8848/nacos/actuator/prometheus 可以看到服务监控信息
4.修改prometheus.yml,添加Nacos的采集任务
- job_name: 'nacos'
metrics_path: '/nacos/actuator/prometheus'
static_configs:
- targets:
["192.168.216.128:8848","192.168.216.129:8848","192.168.216.130:8848"]
- job_name:任务名称
- metrics_path: 指标路径
- targets:实例地址/项目地址,可配置多个
- scrape_interval: 多久采集一次
- scrape_timeout: 采集超时时间
启动prometheus服务,访问:http://192.168.216.128:9090/ ,在搜索栏中搜索 nacos_monitor,如果可以看到nacos的数据,说明采集成功在status菜单的service discovery中,可以看到nacos这个job
采用grafana图形化展示metrics数据:
1.下载Grafana:https://grafana.com/grafana/download
2.启动Grafana, service grafana-server start / $GRAFANA_HOME/bin/grafana-server
3.访问Grafana , http://localhost:3000 , 默认的帐号密码 admin/admin
4.菜单选择 Configuration -> Data Source -> Add Data Source -> 名字:prometheus
导入nacos的面板数据 .nacos-granfa.json ,这个json可以百度获取,获取不到就自己配置,该json只是使用别人做好的面板配置而已。