首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Nacos配置中心落地与实践

Nacos配置中心落地与实践

作者头像
杨同学technotes
发布于 2022-12-01 07:55:31
发布于 2022-12-01 07:55:31
94400
代码可运行
举报
文章被收录于专栏:杨同学technotes杨同学technotes
运行总次数:0
代码可运行

一、背景

目前,我们公司各团队配置中心使用各异,电商使用的是 Spring Cloud Config,支付使用的是 Apollo,APP 团队使用的是 Apollo+Nacos。为了更好地应对公司业务的发展,统一基础设施技术栈必不可少。

图片来源:直播《如何做好微服务基础设施选型》--李运华

此外,电商团队使用的 Spring Cloud Config 面临以下技术痛点:

  • • 修改配置需要重启服务
  • • 配置管理不友好(通过gitlab修改)
  • • 缺少权限管控、格式检验、安全配置等特性

二、配置中心选型

开源产品分析

  • • Spring Cloud Config

2014年9月开源,Spring Cloud 生态组件,可以和 Spring Cloud 体系无缝整合。

  • • Apollo

2016年5月,携程开源的一款可靠的分布式配置管理中心。能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性,适用于微服务配置管理场景。

  • • Nacos

2018年6月,阿里开源的一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。它孵化于阿里巴巴,成长于十年双十一的洪峰考验,沉淀了简单易用、稳定可靠、性能卓越的核心竞争力。

比较项

Nacos

Apollo

Spring Cloud Config

社区活跃度

开源时间

2018.6

2016.5

2014.9

github关注

20.5k

26K

1.7K

文档

完善

完善

完善

性能

单机读(QPS)

15000

9000

7(限流所致)

单机写(QPS)

1800

1100

5(限流所致)

可用性

停服影响(配置服务)

已启动的客户端不影响

已启动的客户端不影响

已启动的客户端不影响

部署模式

集群

集群

集群

易用性

配置生效时间

实时

实时

重启生效,或手动refresh生效

数据一致性

HTTP异步通知

数据库模拟消息队列,Apollo定时读消息 一分钟实时生效

Git保证数据一致性,Config-server从Git读数据

配置界面

支持

支持

不支持

配置格式校验

支持

支持

不支持

配置回滚

支持

支持

支持(基于git的回滚)

版本管理

支持

支持

支持(基于git的版本管理)

客户端支持语言

官方java 非官方 Go、Python、NodeJS、C++

官方java .net 非官方 Go、Python、NodeJS、PHP、C++

客户端使用

nacos client

apollo client

cloud config client

安全性

权限管理

支持

完善 数据权限都比较完善

支持(git)

授权/审计/审核

支持

界面上直接操作且支持修改和发布权限分离

依赖git权限管理

数据加密

不支持

不支持

加密和解密属性值

架构复杂度

运维成本

Nacos+MySQL(部署简单)

Config+Admin+Portal+MySQL(部署复杂)

Config-server+Git+MQ(部署复杂)

服务依赖

自身就是注册发现中心 阿里云两个功能隔开了

分布式 需要注册中心 内置了eureka

需要注册中心

灰度发布

支持 客户端配置 且路由规则客户端计算 耦合高 繁琐

支持 服务端配置 且路由规则服务端计算 客户端透明 简单

支持

邮件服务

不支持

支持

不支持

查询配置监听

支持

支持

支持

  1. 1. 从性能方面看:读写性能 Nacos > Apollo > Spring Cloud Config。
  2. 2. 从功能方面看:功能完善度 Apollo > Nacos > Spring Cloud Config。
  3. 3. 从社区活跃性看:原来Spring Cloud 那一套生态Netflix基本上不怎么维护了,因为不赚钱;但是 Spring Alibaba 这套微服务生态会一直开源且有维护,因为阿里将这一块 SaaS 化后赚钱。
  4. 4. Nacos的优势:简单。它整合了注册中心、配置中心功能,部署和操作相比Apollo都要直观简单,因此它简化了架构复杂度,并减轻运维及部署工作。

性能对比

  • • 压力机信息

处理器:Intel(R) Core(TM) i5-9500 CPU @ 3.00GHz 3.00 GHz

系统:window 10

内测:16G

  • • 压测工具:JMeter
  • • 压测策略:100用户请求线程 10内递增开启,持续时间100s

场景一:调用服务端

image-20220222142033442

测试结果如下:

image-20220222142102625

通过压测发现,Nacos读配置的TPS大约是11000左右 ,写配置TPS大约是1800左右,而Apollo读配置TPS大约是1100,写配置TPS大约310,Nacos读写性能优势非常明显。

场景二:调用客户端

image-20220222142123826

测试结果如下:

image-20220222142232508

可见,读性能相差不大。

结论

选择的原因

不选择的原因

Nacos

统一技术栈能解决现有技术痛点运维成本低

Apollo

依赖 Eureka

Spring Cloud Config

参考文档:

  • • 深度对比三种主流微服务配置中心
  • • Nacos服务配置性能测试报告
  • • Apollo性能测试报告
  • • 凉凉了,Eureka 宣布闭源,Spring Cloud 何去何从?

三、快速使用

参考文档:https://nacos.io/en-us/docs/quick-start-spring-boot.html

升级依赖

去除 spring-cloud-config 依赖:

代码语言:javascript
代码运行次数:0
运行
复制
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-config</artifactId>
</dependency>

添加 Nacos 依赖:

代码语言:javascript
代码运行次数:0
运行
复制
<dependency>
    <groupId>com.alibaba.boot</groupId>
    <artifactId>nacos-config-spring-boot-starter</artifactId>
    <version>0.1.8</version>
</dependency>

替换 Nacos 配置

将原 bootstrap.yml 文件中的 config 配置替换成 nacos 的配置。

代码语言:javascript
代码运行次数:0
运行
复制
spring:
  application:
    name: {应用名}
  cloud:                                                      # 移除
    config:                                                   # 移除
      uri: http://config-center.alpha-intra.dbses.com/conf    # 移除
      label: alpha                                            # 移除

替换结果如下:

代码语言:javascript
代码运行次数:0
运行
复制
spring:
  application:
    name: {应用名}
nacos:
  config:
    server-addr: http://ec-nacos.dbses.com
    namespace: alpha
    group: {组名}

启动类添加注解

代码语言:javascript
代码运行次数:0
运行
复制
// dataId 对应服务的配置
@NacosPropertySource(groupId = "${nacos.config.group}", dataId = "${spring.application.name}.yml", first = true)
public class WebApplication {
 
    public static void main(String[] args) {
        SpringApplication.run(WebApplication.class, args);
    }
 
}

四、实践

配置动态刷新

方式一:使用@NacosValue

使用此种方法需要在@NacosPropertySource 需加上 autoRefreshed=true。示例代码如下:

代码语言:javascript
代码运行次数:0
运行
复制
@NacosPropertySource(groupId = "infra", dataId = "zebra-service.yml", first = true, autoRefreshed = true)
public class WebApplication {
 
    public static void main(String[] args) {
        SpringApplication.run(WebApplication.class, args);
    }
 
}

nacos 配置如下:

代码语言:javascript
代码运行次数:0
运行
复制
test1:
  config: 2

接口代码如下:

代码语言:javascript
代码运行次数:0
运行
复制
@RestController
public class TestController {
 
    @NacosValue(value = "${test1.config}", autoRefreshed = true)
    private String config;
 
    @GetMapping("/config")
    public String getConfig() {
        return config;
    }
 
}

方式二:使用@NacosConfigurationProperties

示例代码如下:

代码语言:javascript
代码运行次数:0
运行
复制
@Configuration
@Data
@NacosConfigurationProperties(prefix = "test2", dataId = "zebra-service.yml", groupId = "infra", autoRefreshed = true)
public class TestConfig {
 
    private List<String> config;
 
    private Map<String, String> map;
 
    @Override
    public String toString() {
        return "TestConfig{" + "config=" + config + ", map=" + map + '}';
    }
 
}

nacos 配置如下:

代码语言:javascript
代码运行次数:0
运行
复制
test2:
  config:
    - yang
    - wang
  map:
    courier: yang
    zebra: wang

接口代码如下:

代码语言:javascript
代码运行次数:0
运行
复制
@RestController
public class TestController {
 
    @Autowired
    private TestConfig testConfig;
 
    @GetMapping("/config2")
    public String getConfig2() {
        return testConfig.toString();
    }
 
}

注意 动态刷新map,修改了key会累加,不会删除原来的key。例如将 zebra-service.yml 配置中的 test2.map.zebra 改为 test2.map.zebr 后,获取的结果如下: TestConfig{config=[yang, wang], map={courier=yang, zebra=wang, zebr=wang}}

方式三:使用@NacosConfigListener

nacos 配置如下:

代码语言:javascript
代码运行次数:0
运行
复制
test1:
  config: 2

示例代码如下:

代码语言:javascript
代码运行次数:0
运行
复制
@RestController
public class TestController {
 
    @Value(value = "${test1.config}")
    private String config;
 
    @GetMapping("/config")
    public String getConfig() {
        return config;
    }
 
    @NacosConfigListener(dataId = "zebra-service.yml", groupId = "infra")
    public void testConfigChange(String newContent) {
        YamlPropertiesFactoryBean yamlFactory = new YamlPropertiesFactoryBean();
        yamlFactory.setResources(new ByteArrayResource(newContent.getBytes()));
        Properties commonsProperties = yamlFactory.getObject();
        this.config = commonsProperties.getProperty("test1.config"));
    }
 
}

多配置引入

问题描述

我们的项目之前读取了许多公共配置,现想要读取公共配置,该怎么办?

问题解决

使用 @NacosPropertySources 注解即可加入多个配置文件。

样例代码:

代码语言:javascript
代码运行次数:0
运行
复制
@NacosPropertySources({
        @NacosPropertySource(groupId = "infra", dataId = "captcha-service.yml", first = true),
        @NacosPropertySource(groupId = "commons", dataId = "__common_eureka_.yml")
})
public class WebApplication {
 
    public static void main(String[] args) {
        SpringApplication.run(WebApplication.class, args);
    }
 
}

这里的 first = true 表示这个文件的配置优先级是最高的。

本地配置覆盖

问题描述

作为开发人员,我们可能需要本地启动程序来进行调试,但此时本地启动的程序连接的是 alpha 环境的配置。如果修改 alpha 环境的配置,又可能影响 alpha 及其他人的程序运行。

面对这种情况,我们怎么管理配置的优先级?

下面以 test1.config 配置为例。nacos 配置文件如下:

image-20220222143101832

启动配置如下:

image-20220222143133401

测试代码如下:

代码语言:javascript
代码运行次数:0
运行
复制
@RestController
public class TestController {
 
    @NacosValue(value = "${test1.config}", autoRefreshed = true)
    private String config1;
 
    @GetMapping("/config1")
    public String getConfig1() {
        return config1;
    }
}

执行结果为:

image-20220222143208909

本地的配置并没有达到覆盖的效果。

问题分析

我们不妨先改造一下程序启动类。

image-20220222143652521

通过断点可以看到,应用配置(这里指 nacos 中的 zebra-service.yml,下同)的优先级是在公共配置之前的,这点是必要的。

应用配置必须在公共配置之前。

但是应用配置也在系统变量(systemProperties)、系统环境(systemEnvironment)之前。所以我们配置的 test1.config 并没有生效为 local。

稍作修改一下:

image-20220222143612121

问题解决

再测试一下本地配置是否覆盖。

image-20220222143742655

本地的配置已达到覆盖的效果。最终的启动类代码为:

代码语言:javascript
代码运行次数:0
运行
复制
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
@PrepareConfigurations({"__common_database_", "__common_eureka_"})
@NacosPropertySource(groupId = "infra", dataId = "zebra-service.yml", autoRefreshed = true
        ,after = StandardEnvironment.SYSTEM_PROPERTIES_PROPERTY_SOURCE_NAME
)
public class WebApplication {
 
    public static void main(String[] args) {
        SpringApplication.run(WebApplication.class, args);
    }
 
}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-10-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 杨同学technotes 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
「influxDB 原理与实践(四)」保留策略
一台InfluxDB服务器每秒可以处理近百万条时序数据。如果所有数据都持久保存,数据量非常大,造成存储成本高昂。 常见的解决方法就是降低数据精度,即详细的、高时间精度的数据只能保留一段时间,同时对这些数据进行聚合计算得到低精度的、符合我们需求的数据,再根据实际情况存储一段时间然后删除高精度的数据,只保留低精度的数据。
源码之路
2020/09/04
1.5K0
「influxDB 原理与实践(四)」保留策略
Influx Sql系列教程四:series/point/tag/field
influxdb中的一条记录point,主要可以分为三类,必须存在的time(时间),string类型的tag,以及其他成员field;而series则是一个measurement中保存策略和tag集构成;本篇教程将介绍一些这几个概念
一灰灰blog
2019/08/21
1.4K0
时序数据库 InfluxDB(一)
数据库种类有很多,比如传统的关系型数据库 RDBMS( 如 MySQL ),NoSQL 数据库( 如 MongoDB ),Key-Value 类型( 如 redis ),Wide column 类型( 如 HBase )等等等等,当然还有本系列文章将会介绍的时序数据库 TSDB( 如 InfluxDB )。
凌虚
2020/07/17
3.8K0
时序数据库技术体系(二)–初识InfluxDB
在上篇文章《时序数据库体系技术 – 时序数据存储模型设计》中笔者分别介绍了多种时序数据库在存储模型设计上的一些考虑,其中OpenTSDB基于HBase对维度值进行了全局字典编码优化,Druid采用列式存储并实现了Bitmap索引以及局部字典编码优化,InfluxDB和Beringei都将时间线挑了出来,大大降低了Tag的冗余。在这几种时序数据库中,InfluxDB无疑显的更加专业。接下来笔者将会针对InfluxDB的基本概念、内核实现等进行深入的分析。本篇文章先行介绍一些相关的基本概念。 InfluxDB
企鹅号小编
2018/02/01
1.9K0
时序数据库技术体系(二)–初识InfluxDB
饿了么Influxdb实践之路
作者 | 刘平 文章来源GitChat,CSDN独家合作发布,查看交流实录:http://gitbook.cn/books/59428f6f7e850f039399fd02/index.html Influxdb是一个基于golang编写,没有额外依赖的开源时序数据库,用于记录metrics、events,进行数据分析。这篇文章谈论的influxdb版本在1.2.0以上。这篇文章只谈论influxdb在监控中的数据存储应用,不会谈论influxdb提供的整套监控方案。本文主要谈论五个方面:时序数据库选
CSDN技术头条
2018/02/08
5.1K0
饿了么Influxdb实践之路
java使用influxDB时序数据库
InfluxDB的字段类型,由第一条插入的值得类型决定;tags的类型只能是String型,可以作为索引,提高检索速度。
半条命专刊
2020/09/14
3K0
Influx Sql系列教程三:measurement 表
在influxdb中measurement相当于mysql中的表,可以理解为一条一条记录都是存与measurent中的,一个数据库中可以有多个measurement,一个measurement中可以存很多的数据。虽然可将measurement类比为mysql中的表,但是他们之间的差别也挺明显的
一灰灰blog
2019/08/21
1.7K0
InfluxDB
另外,InfluxDB也提供了多个可能需要自定义端口的插件,所以的端口映射都可以通过配置文件修改,对于默认安装的InfluxDB,这个配置文件位于/influxdb/influxdb.conf。
框架师
2021/03/05
1.6K0
influxdb 简介与实现(一)
InfluxDB是一个开源的没有外部依赖的时间序列数据库。适用于记录度量,事件及执行分析。
Timu
2018/07/17
1.5K0
influxdb 简介与实现(一)
influxdb的命令们
influxdb的单机版是开源的,而集群版是商业版,influxdb被设计运行在SSD上,如果使用机器或者网络磁盘作为存储介质,会导致性能下降至少一个数量级。influxdb支持restful api,同时也支持https,为了保证安全性,非局域网建议使用https与Influxdb进行通信。
luoxn28
2020/02/17
1.9K0
influxdb的命令们
时序数据库 InfluxDB(二)
先回顾一下 RP 策略( retention policy ),它由三个部分构成:
凌虚
2020/07/17
1.8K0
influxdb安装和学习
https://docs.docker.com/samples/library/influxdb/
Ryan-Miao
2019/06/21
1.7K0
大数据ClickHouse(二):多种安装方式
在官网中可以看到ClickHouse可以基于多种方式安装,rpm安装、tgz安装包安装、docker镜像安装、源码编译安装等。这里我们使用rpm安装包安装。目前Clickhouse仅支持Linux系统且cpu必须支持SSE4.2指令集,可以通过以下命令查询Linux是否支持:
Lansonli
2022/08/09
3.6K0
大数据ClickHouse(二):多种安装方式
influxdb基本操作_一个数据库只有一个内模式
转载于:https://juejin.im/post/5c4f07b7e51d454b0d75d883
全栈程序员站长
2022/11/16
3470
时序数据库influxdb简介
influxdb是一款开源的时序数据库,可以用作监控系统的数据存储或用来存储基于时序进行分析的业务系统的数据存储。
俊才
2020/05/04
2.9K0
influxdb 时间序列数据库
1、InfluxDB 是用Go语言编写的一个开源分布式时序、事件和指标数据库,无需外部依赖。 基于时间序列,支持与时间有关的相关函数(如最大,最小,求和等) 可度量性:你可以实时对大量数据进行计算 基于事件:它支持任意的事件数据 1)无结构(无模式):可以是任意数量的列 2)可拓展的 3)支持min, max, sum, count, mean, median 等一系列函数,方便统计 4)原生的HTTP支持,内置HTTP API 5)强大的类SQL语法 6)自带管理界面,方便使用 2、安装: rpm -ivh https://dl.influxdata.com/influxdb/releases/influxdb-0.13.0.x86_64.rpm 3、启动: sudo service influxdb start 4、客户端: 在usr/bin里使用influx即可登入Influx服务器。也可以将路径加入环境变量中,这样既可在任意地方使用influx。 InfluxDB自带web管理界面,在浏览器中输入 http://服务器IP:8083 即可进入web管理页面。 5、基本概念: database 数据库 measurement 表 point 表中的一行数据 point由time(自动生成的时间戳),field数据,tags由索引的数据 series所有在数据库中的数据,都需要通过图表来展示,而这个series表示这个表里面的数据,可以在图表上画成几条线:通过tags排列组合算出来。 6、基本操作: 客户端命令行、HTTP API、各语言API库 show databases; create database test drop database test use test
用户5760343
2022/05/14
1.3K0
influxdb 时间序列数据库
2.InfluxDB2.x数据库实践使用
描述: 在 V2.x 版本中 influx 客户端命令已独立处理, 其与V1.x版本的 influx cli 参数与使用大不相同, 此处主要讲解V2.x相关语法参数,但也会简单提及一下V1.x版本语法及其使用。
全栈工程师修炼指南
2022/09/29
6K1
2.InfluxDB2.x数据库实践使用
Oracle RMAN 基础配置和常用命令
1、备份保留策略rman连接到 RMAN 管理工具, rman 默认配置[oracle@orcl:/home/oracle]$ rman target /Recovery Manager: Release 11.2.0.4.0 - Production on Wed Jun 15 13:11:22 2022Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.connected to target datab
用户8006012
2022/06/17
1.3K0
InfluxDB 设置数据保留策略,验证保留的数据存储大小
在使用Telegraf+InfluxDB+Grafana监控服务器资源的时候,如果influxdb中的数据不设置超时过期的机制的话,那么数据就会默认一直保存。这样一直保存的话,数据量就会导致偏大。 这时候就要适当调整influxdb的数据存储时长,保留最近一段时间的数据即可。
Devops海洋的渔夫
2019/12/02
12.4K0
Influx Sql系列教程五:insert 添加数据
接下来开始进入influxdb的curd篇,首先我们看一下如何添加数据,也就是insert的使用姿势
一灰灰blog
2019/08/21
1.5K0
相关推荐
「influxDB 原理与实践(四)」保留策略
更多 >
目录
  • 一、背景
  • 二、配置中心选型
    • 开源产品分析
    • 性能对比
      • 场景一:调用服务端
      • 场景二:调用客户端
    • 结论
  • 三、快速使用
    • 升级依赖
    • 替换 Nacos 配置
    • 启动类添加注解
  • 四、实践
    • 配置动态刷新
    • 多配置引入
    • 本地配置覆盖
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档