当前位置:首页 > 生活常识 > 正文

nacos简介以及作为注册 配置中心与Eureka、apollo的选型比较

摘要: nacos简介以及作为注册配置中心与Eureka、apollo的选型比较最佳答案53678位专家为你答疑解惑nacos简介以及作...

nacos简介以及作为注册 配置中心与Eureka、apollo的选型比较

最佳答案 53678位专家为你答疑解惑

nacos简介以及作为注册/配置中心与Eureka、apollo的选型比较

一、Nacos简介

Nacos是以服务为主要服务对象的中间件,Nacos支持所有主流的服务发现、配置和管理。

Nacos主要提供以下四大功能:

服务发现与服务健康检查

Nacos使服务更容易注册自己并通过DNS或HTTP接口发现其他服务。Nacos还提供服务的实时健康检查,以防止向不健康的主机或服务实例发送请求。

动态配置管理

动态配置服务允许您在所有环境中以集中和动态的方式管理所有服务的配置。Nacos消除了在更新配置时重新部署应用程序和服务的需要,这使配置更改更加高效和灵活。

动态DNS服务

Nacos支持加权路由,使您可以更轻松地在数据中心的生产环境中实施中间层负载平衡,灵活的路由策略,流量控制和简单的DNS解析服务。它可以帮助您轻松实现基于DNS的服务发现,并防止应用程序耦合到特定于供应商的服务发现API。

服务和元数据管理

Nacos提供易于使用的服务仪表板,可帮助您管理服务元数据,配置,kubernetes DNS,服务运行状况和指标统计。

1.1 Nacos总体概况image.png1.2 Nacos架构image.png二、注册中心与配置中心横向对比2.1 Nacos与eureka注册中心对比对比项目\注册中心Spring Cloud NacosSpring Cloud EurekaCAP模型支持AP和CP模型AP模型客户端更新服务信息使用注册+DNS-f+健康检查模式。 DNS-F客户端使用监听模式push/pull拉取更新信息客户端定时轮询服务端获取其他服务ip信息并对比,相比之下服务端压力较大、延迟较大伸缩性使用Raft选举算法性能、可用性、容错性均比较好,新加入节点无需与所有节点互相广播同步信息由于使用广播同步信息,集群超过1000台机器后对eureka集群压力很大健康检查模式/方式支持服务端/客户端/关闭检查模式,检查方式有tcp、http、sql。支持自己构建健康检查器客户端向服务端发送http心跳负载均衡支持支持手动上下线服务方式通过控制台页面和API通过调用API跨中心同步支持不支持k8s集成支持不支持分组Nacos可用根据业务和环境进行分组管理不支持权重Nacos默认提供权重设置功能,调整承载流量压力不支持厂商阿里巴巴Netflix2.2服务配置中心对比对比项目/配置中心apollonacos开源时间2016.52018.6配置实时推送支持(HTTP长轮询1s内)支持(HTTP长轮询1s内)版本管理自动管理自动管理配置回滚支持支持权限管理支持待支持多集群多环境支持支持监听查询支持支持多语言Go,C++,Python,Java,.net,OpenAPIPython,Java,Nodejs,OpenAPI分布式高可用最小集群数量Config2+Admin3+Portal*2+Mysql=8Nacos*3+MySql=4配置格式校验支持支持通信协议HTTPHTTP数据一致性数据库模拟消息队列,Apollo定时读消息HTTP异步通知单机读(tps)900015000单机写(tps)11001800

nacos具有Apollo大部分功能,最重要的是配置中心与注册中心打通,可以省去我们在微服务治理方面 的一些投入(比如通过动态配置来启停线程池等操作)。

2.3 初步选型结论

初步结论为:使用Nacos代替Eureka和apollo,主要理由为:相比与Eureka:(1)Nacos具备服务优雅上下线和流量管理(API+后台管理页面),而Eureka的后台页面仅供展示,需要使用api操作上下线且不具备流量管理功能。(2)从部署来看,Nacos整合了注册中心、配置中心功能,把原来两套集群整合成一套,简化了部署维护(3)从长远来看,Eureka开源工作已停止,后续不再有更新和维护,而Nacos在以后的版本会支持SpringCLoud+Kubernetes的组合,填补 2 者的鸿沟,在两套体系下可以采用同一套服务发现和配置管理的解决方案,这将大大的简化使用和维护的成本。同时来说,Nacos 计划实现 Service Mesh,是未来微服务的趋势(4)从伸缩性和扩展性来看Nacos支持跨注册中心同步,而Eureka不支持,且在伸缩扩容方面,Nacos比Eureka更优(nacos支持大数量级的集群)。(5)Nacos具有分组隔离功能,一套Nacos集群可以支撑多项目、多环境。

相比于apollo(1) Nacos部署简化,Nacos整合了注册中心、配置中心功能,且部署相比apollo简单,方便管理和监控。(2) apollo容器化较困难,Nacos有官网的镜像可以直接部署,总体来说,Nacos比apollo更符合KISS原则(3)性能方面,Nacos读写tps比apollo稍强一些

结论:使用Nacos代替Eureka和apollo

三、Nacos其他特性3.1 Nacos Sync的价值NacosSync是一个支持多种注册中心的同步组件,基于Spring boot开发框架,数据层采用Spring Data JPA,遵循了标准的JPA访问规范,支持多种数据源存储,默认使用Hibernate实现,更加方便的支持表的自动创建更新使用了高效的事件异步驱动模型, 支持多种自定义事件,使得同步任务处理的延时控制在3s,8C16G的单机能够支持6K的同步任务NacosSync除了单机部署,也提供了高可用的集群部署模式,NacosSync是无状态设计,将任务等状态数据迁移到了数据库,使得集群扩展非常方便抽象出了Sync组件核心接口,通过注解对同步类型进行区分,使得开发者可以很容易的根据自己需求,去扩展不同注册中心,目前已支持的同步类型:Nacos数据同步到NacosZookeeper数据同步到NacosNacos数据同步到ZookeeperEureka数据同步到NacosConsul数据同步到Nacos

系统模块架构

image.png使用场景多个网络互通的Region之间服务共享,打破Region之间的服务调用限制image.png3.2 DNS - F 的技术价值

Nacos提供DNS-F功能DNS-F落地的技术价值

填补了内部微服务业务没有全局动态调度能力的空白解决了服务端棉铃挑战:时延大、解析不准、故障牵引慢支持服务端多种调度需要加速外部域名解析服务故障牵引秒级生效

提供专线流量牵引能力

image.png3.3 目前使用Nacos的公司

阿里巴巴、虎牙直播、中国工商银行、爱奇艺、中国平安、平安科技、浙江农信、贝壳、丰巢、百世快递、汽车之家等

完整列表:https://github.com/alibaba/nacos/issues/273

用了3年Apollo,这次我选择了Nacos,原因不多说了

老板都开口了,我能说不么?

本文探讨一下如何实现不同环境(开发、测试、灰度、正式)的配置管理问题。

就像Maven用groupId、artifactId、version三者来定位jar包在仓库中的位置一样,Nacos也提供了 Namespace (命名空间) 、Data ID (配置集ID)、 Group (组) 来确定一个配置文件(或者叫配置集)。

由此,实现多环境配置的方案也有三种:

1、用命名空间(namespace)来区分不同的环境,一个命名空间对应一个环境;

2、用配置组(group)来区分不同的环境,命名空间用默认的public即可,一个组对应一种环境;

3、用配置集ID(Data ID)名称来区分不同的环境,命名空间和组用默认的即可,通过文件命名来区分;

接下来,逐个来看

http://{host}:{port}/nacos

http://{host}:{port}/nacos/index.html

默认用户名密码都是nacos

为了方便演示,这里建了一个名为example的Spring Boot项目

pom.xml

1<?xmlversion="1.0"encoding="UTF-8"?>2<projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"3xsi:schemaLocation="http://maven.apache.org/POM/4.0.0https://maven.apache.org/xsd/maven-4.0.0.xsd">4<modelVersion>4.0.0</modelVersion>5<parent>6<groupId>org.springframework.boot</groupId>7<artifactId>spring-boot-starter-parent</artifactId>8<version>2.3.6.RELEASE</version>9<relativePath/><!--lookupparentfromrepository-->10</parent>11<groupId>com.example</groupId>12<artifactId>example</artifactId>13<version>0.0.1-SNAPSHOT</version>14<name>example</name>1516<properties>17<java.version>1.8</java.version>18<spring-cloud-alibaba.version>2.2.3.RELEASE</spring-cloud-alibaba.version>19</properties>2021<dependencies>22<dependency>23<groupId>org.springframework.boot</groupId>24<artifactId>spring-boot-starter-web</artifactId>25</dependency>26<dependency>27<groupId>com.alibaba.cloud</groupId>28<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>29</dependency>30</dependencies>3132<dependencyManagement>33<dependencies>34<dependency>35<groupId>com.alibaba.cloud</groupId>36<artifactId>spring-cloud-alibaba-dependencies</artifactId>37<version>${spring-cloud-alibaba.version}</version>38<type>pom</type>39<scope>import</scope>40</dependency>41</dependencies>42</dependencyManagement>4344<build>45<plugins>46<plugin>47<groupId>org.springframework.boot</groupId>48<artifactId>spring-boot-maven-plugin</artifactId>49</plugin>50</plugins>51</build>5253</project>

bootstrap.yml

HelloController.java

1. 利用 Data ID 命名 来区分环境

利用Data ID命名来区分环境,命名空间和组默认即可

在 Nacos Spring Cloud 中,dataId 的完整格式如下:

prefix 默认为 spring.application.name 的值,也可以通过配置项 spring.cloud.nacos.config.prefix来配置spring.profiles.active 即为当前环境对应的 profile,详情可以参考 Spring Boot文档。 注意:当 spring.profiles.active 为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成 ${prefix}.${file-extension}file-exetension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。目前只支持 properties 和 yaml 类型。

用命令行启动也是一样的

例如:

java-Dspring.profiles.active=test-jarexample-0.0.1-SNAPSHOT.jar

2. 利用 Group 来区分环境

项目不变,我们把spring.application.name改成example2

命名空间用默认的public

java-Dspring.cloud.nacos.config.group=DEV_GROUP-jarexample-0.0.1-SNAPSHOT.jar

java-Dspring.cloud.nacos.config.group=TEST_GROUP-jarexample-0.0.1-SNAPSHOT.jar

java-Dspring.profiles.active=test-Dspring.cloud.nacos.config.group=TEST_GROUP-jarexample-0.0.1-SNAPSHOT.jar

如果是这样的话,这个时候,Data ID 命名就应该是 example2-test.yaml

3. 利用 Namespace 区分环境

创建命名空间的时候,如果不指定ID,则自动生成的id就是这样的uuid字符串,我们还是自己指定一个有意义的ID吧

java-Dspring.cloud.nacos.config.namespace=ns_dev-jarexample-0.0.1-SNAPSHOT.jar

java-Dspring.profiles.active=dev-Dspring.cloud.nacos.config.namespace=ns_dev-jarexample-0.0.1-SNAPSHOT.jar

java-Dspring.cloud.nacos.config.namespace=ns_test-jarexample-0.0.1-SNAPSHOT.jar

java-Dspring.profiles.active=test\-Dspring.cloud.nacos.config.namespace=ns_test\-Dspring.cloud.nacos.config.group=TEST_GROUP\-jarexample-0.0.1-SNAPSHOT.jar

4. 小结

第一种,用 Data ID 区分环境,虽然简单,但是每个项目要创建4个配置文件,随着项目的增多,都在一个命名空间下会显得很混乱,查找起来也不是很方便,而且不利于做权限控制

第二种,用Group区分,问题也是一样的

综上,最好的是用Namespace区分环境,清晰明了,而且有利于做权限控制

来源 | https://urlify.cn/jmY3Ez

发表评论