NACOS 认识和学习
Posted 认真的菜鸡
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NACOS 认识和学习相关的知识,希望对你有一定的参考价值。
NACOS 认识和学习
简介
1. nacos是什么?
Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。
Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。
2. 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 统计数据。
等等...
3.nacos架构
架构:https://nacos.io/zh-cn/docs/architecture.html
安装
1.版本选择
github地址:https://github.com/alibaba/nacos/releases
当前推荐的稳定版本为1.4.2或2.0.1。
2.环境依赖
Nacos 依赖 Java 环境来运行。如果您是从代码开始构建并运行Nacos,还需要为此配置 Maven环境,请确保是在以下版本环境中安装使用:
- 64 bit OS,支持 Linux/Unix/Mac/Windows,推荐选用 Linux/Unix/Mac。
- 64 bit JDK 1.8+;下载 & 配置。
- Maven 3.2.x+;下载 & 配置。
3.下载
你可以通过源码和发行包两种方式获取nacos.
4.启动和停止
- 启动
Linux/Unix/Mac
启动命令(standalone代表着单机模式运行,非集群模式):
sh startup.sh -m standalone
如果您使用的是ubuntu系统,或者运行脚本报错提示[[符号找不到,可尝试如下运行:
bash startup.sh -m standalone
Windows
启动命令(standalone代表着单机模式运行,非集群模式):
startup.cmd -m standalone
懒得用命令的话
可以在编辑startup.cmd在启动将
set MODE="cluster" ##这是集群模式
set MODE="standalone" ##这是单机模式
- 关闭
Linux/Unix/Mac
sh shutdown.sh
Windows
shutdown.cmd
或者双击shutdown.cmd运行文件。
-
配置数据库(默认使用的是自己的内置数据库),更改成本地的数据库很简单
-
找到conf/nacos-mysql.sql 提供了数据库文件,创建数据库
-
配置conf/application.properties 配置文件,修改如下地方(因为我这里是单机模式,所以就是一个,如果是多个的话,就是数组形式去填加)
#*************** Config Module Related Configurations ***************# ### If use MySQL as datasource: # 指定数据源为 MySQL spring.datasource.platform=mysql ### Count of DB: # 数据库实例数量 db.num=1 ### Connect URL of DB: # 数据库连接 db.url.0=jdbc:mysql://127.0.0.1:3306/db_nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC db.user.0= db.password.0=
-
使用
-
新建父级目录maven项目(依赖约定如下)
<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> <springboot-cloud.version>Hoxton.SR8</springboot-cloud.version> <springboot.version>2.3.2.RELEASE</springboot.version> <springcloudalibaba.version>2.2.5.RELEASE</springcloudalibaba.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${springboot-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>${springboot.version}</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>${springcloudalibaba.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
1.配置中心demo
-
新建子项目(依赖如下) nacos-config-demo
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--配置中心--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency> </dependencies>
bootstrap配置如下:(单配置文件如下)
spring.application.name=nacos-config-demo # 项目名字 spring.cloud.nacos.config.server-addr=127.0.0.1:8848 # nacos服务地址 spring.cloud.nacos.config.namespace=1f9392361eb5a36f37b # 命名空间id而不是名字 spring.cloud.nacos.config.group=DEFAULT_GROUP # 分组名称 spring.cloud.nacos.config.name=nacos_config.properties #data id spring.cloud.nacos.config.file-extension=yml # 看源码可知 默认是private String fileExtension = "properties";
如果你也使用的.yml格式,一定要在bootstrap.yml中指明
file-extension: yml
。如果你也使用的.yml格式,一定要在bootstrap.yml中指明
file-extension: yml
。如果你也使用的.yml格式,一定要在bootstrap.yml中指明
file-extension: yml
。bootstrap配置如下:(多配置文件如下,properties形式)
spring.application.name=nacos-config-demo spring.cloud.nacos.config.server-addr=127.0.0.1:8848 spring.cloud.nacos.config.namespace=6f6ed112-546d-41ae-9629-72c63f107c90 spring.cloud.nacos.config.extension-configs[0].data-id=mysql_config.properties spring.cloud.nacos.config.extension-configs[0].group=MYSQL_GROUP spring.cloud.nacos.config.extension-configs[0].refresh=true spring.cloud.nacos.config.extension-configs[1].data-id=redis_config.properties spring.cloud.nacos.config.extension-configs[1].group=REDIS_GROUP spring.cloud.nacos.config.extension-configs[1].refresh=true spring.cloud.nacos.config.extension-configs[2].data-id=oa_config.properties spring.cloud.nacos.config.extension-configs[2].group=OA_GROUP spring.cloud.nacos.config.extension-configs[2].refresh=true
注意1:
通过
spring.cloud.nacos.config.ext-config[n].data-id
的配置来配置多个DataId 的配置。
通过spring.cloud.nacos.config.ext-config[n].group
的配置来指定dataId所在的组,不明确指定的话使用默认的DEFAULT_GROUP
通过spring.cloud.nacos.config.ext-config[n].refresh
的配置来控制该dataId属性变更时,是否动态刷新加载,默认如果不在DEFAULT_GROUP,自动刷新是关闭的,可以通过置为true来手动开启.注意2:
spring.cloud.nacos.config.ext-config[n].data-id=
必须带上扩展名,即文件格式,支持properties,也支持yaml/yml.此时
spring.cloud.nacos.config.file-extension
的配置对自定义扩展的配置的data-id是无效的。
bootstrap配置如下:(多配置文件如下,yml形式)spring: application: name: nacos-config-demo cloud: nacos: config: namespace: 973c8477-47e9-4d1e-b1fa-dc709234be4d extension-configs: # 多配置文件 yml - data-id: mysql_config.yml group: MYSQL_GROUP refresh: true - data-id: redis_config.yml group: REDIS_GROUP refresh: true - data-id: oa_config.yml group: OA_GROUP refresh: true # 多配置文件 properties # - # data-id: mysql_config.properties # group: MYSQL_GROUP # refresh: true # - # data-id: redis_config.properties # group: REDIS_GROUP # refresh: true # - # data-id: oa_config.properties # group: OA_GROUP # refresh: true # 单配置 # config: # server-addr: 127.0.0.1:8848 # group: DEFAULT_GROUP # name: nacos-config.yml # file-extension: yaml
这几个名词的关系,官方有给出图(数据模型)
Nacos 数据模型 Key 由三元组唯一确定, Namespace默认是空串,公共命名空间(public),分组默认是 DEFAULT_GROUP。
使用@Value 和@RefreshScope配合测试
@RestController @RefreshScope public class NacosCopnfigController { @Value("${zhonglao.name}") private String name; @Value("${zhonglao.age}") private String age; @RequestMapping("/info") public String getConfigInfo(){ return name + ":" + age; } }
@RefreshScope注解实时刷新配置信息
我们在ConfigController
控制器上添加了注解@RefreshScope
主要目的是来实时同步通过Nacos Console
修改的配置内容。@RefreshScope
注解是SpringCloud
内部提供,用于配置热加载
。
2.服务注册发现和调用demo
简单实现 订单调用库存
-
创建stock(依赖如下)
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--服务注册与发现--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> </dependencies>
-
配置如下
server: port: 8084 spring: application: name: nacos-stock cloud: nacos: discovery: server-addr: 127.0.0.1:8848 namespace: 1f939233-3f3f-4e97-82a6-61eb5a36f37b cluster-name: stock
-
操作如下
@RestController @RequestMapping("/stock") public class StockController { @RequestMapping("/test") public String test(String info){ return "库存模块收到的信息:" + info; } }
启动类加上
@EnableDiscoveryClient
使其他服务能发现 -
创建order(依赖如下)
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--服务注册与发现--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <!--openfeign--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> </dependencies>
-
配置如下
server: port: 8083 spring: application: name: nacos-order cloud: nacos: discovery: server-addr: 127.0.0.1:8848
-
创建service 使用openfeign
@FeignClient("nacos-stock") public interface StockFeignService { @RequestMapping("/stock/test") public String test(@RequestParam("info") String info); }
-
创建controller来调用
@RestController @RequestMapping("/order") public class TestConrtoller { @Autowired StockFeignService stockFeignService; @RequestMapping("/info") public String test(){ return stockFeignService.test("牛啊牛啊"); } }
启动类需加上
@EnableDiscoveryClient @EnableFeignClients(basePackages = "com.zhonglao.feign")
3.nacos高可用集群配置
使用windows禁止中文目录!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
为了防止一个nacos崩掉,我们可以搞3个或者更多的nacos服务来搭建集群,实现高可用:
-
1.启动的时候,使用集群模式
startup.cmd -m cluster
-
2.将nacos服务复制三份或更多,分别修改端口(不要被占用),端口在
conf/application
中修改 -
3.设置ip
nacos.inetutils.ip-address=127.0.0.1
-
4.将
conf/cluster.conf.example
修改为cluster.conf
,并修改启动的iplist#it is ip #example 127.0.0.1:8848 127.0.0.1:8849 127.0.0.1:8850
以上是关于NACOS 认识和学习的主要内容,如果未能解决你的问题,请参考以下文章
Nacos一篇学会:认识-安装-注册-配置,服务分级存储模型等