Vertx实现和spring的application.yml自动配置加载

前言

        在用vertx写项目的时候,由于需要不同的环境加载不同的配置文件,这里就需要和spring架构的application.yml配置文件一样,可以根据环境变量加载不同的配置。

代码

引入vertx相关依赖

<dependency><groupId>io.vertx</groupId><artifactId>vertx-config-yaml</artifactId><version>4.4.6</version>
</dependency>

编写配置文件

server:port: 8080redis:endpoint: redis://127.0.0.1:6379/2password: 123456

这里可以编写多个配置文件,在设置不同的环境变量决定需要加载哪个配置文件

实现vertical

加载配置文件中的配置,这里环境变量的参数覆盖配置文件中的变量,这样改变量的时候无需更改代码。

import com.client.config.Constants;
import io.vertx.config.ConfigRetriever;
import io.vertx.config.ConfigRetrieverOptions;
import io.vertx.config.ConfigStoreOptions;
import io.vertx.core.*;
import io.vertx.core.json.JsonObject;
import io.vertx.redis.client.Redis;
import io.vertx.redis.client.RedisAPI;
import io.vertx.redis.client.RedisOptions;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;import java.net.InetAddress;
import java.util.Arrays;/*** @author yan* @since 2024-01-22*/
@Slf4j
public class MainVerticle extends AbstractVerticle {@Overridepublic void start(Promise<Void> startPromise) throws Exception {ConfigRetrieverOptions options = new ConfigRetrieverOptions();options.setScanPeriod(0);options.addStore(new ConfigStoreOptions().setType("sys"));options.addStore(new ConfigStoreOptions().setType("env"));ConfigRetriever retriever = ConfigRetriever.create(vertx, options);retriever.getConfig().flatMap(config -> {// 加载配置文件ConfigRetrieverOptions appOptions = new ConfigRetrieverOptions();appOptions.setScanPeriod(0);ConfigStoreOptions storeOptions = new ConfigStoreOptions();storeOptions.setType("file").setFormat("yaml").setConfig(new JsonObject().put("path", "application.yml"));appOptions.addStore(storeOptions);String profile = config.getString("profiles_active");log.info("profiles active:" + profile);if (StringUtils.isNotEmpty(profile)) {ConfigStoreOptions profileStoreOptions = new ConfigStoreOptions();profileStoreOptions.setType("file").setFormat("yaml").setConfig(new JsonObject().put("path", "application-" + profile + ".yml"));appOptions.addStore(profileStoreOptions);}return ConfigRetriever.create(vertx, appOptions).getConfig().map(appConfig -> appConfig.mergeIn(config));}).flatMap(config -> {try {// 加载环境变量redisJsonObject redis = config.getJsonObject("redis");String redisEndpoint = config.getString(Constants.Redis.ENDPOINT);if(StringUtils.isNotEmpty(redisEndpoint)){redis.put("endpoint", redisEndpoint);}String password = config.getString(Constants.Redis.PASSWORD);if(StringUtils.isNotEmpty(password)){redis.put("password", password);}config.put("redis", redis);} catch (Exception e) {log.error("get config error:", e);}return Future.succeededFuture(config);}).map(config -> {DeploymentOptions deploymentOptions = new DeploymentOptions();deploymentOptions.setConfig(config);deploymentOptions.setInstances(VertxOptions.DEFAULT_EVENT_LOOP_POOL_SIZE);return vertx.deployVerticle(ClientStater.class, deploymentOptions).<Void>mapEmpty().onComplete(startPromise);});}
}

随后初始化redisApi,方便下面的业务直接调用

/*** @author yan* @since 2023-12-25*/
@Slf4j
public class ClientStater extends AbstractVerticle {@Overridepublic void start(Promise<Void> startPromise) throws Exception {JsonObject config = vertx.getOrCreateContext().config();// 加载redis配置RedisOptions redisOptions = new RedisOptions(config.getJsonObject("redis"));Redis client = Redis.createClient(vertx, redisOptions);RedisAPI redisAPI = RedisAPI.api(client);// 这里存储redisAPI,方便其他服务调用RedisConfig.saveRedisApi(vertx, redisAPI);// 启动http服务WebServer webServer = new WebServer(vertx, config.getJsonObject("server").getInteger("port"));webServer.start().onComplete(startPromise);}
}

通过以上步骤在下面的服务就能正常使用配置文件中的变量了,可以接着往下封装配置了。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/883428.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ECharts饼图-饼图自定义样式,附视频讲解与代码下载

引言&#xff1a; 在数据可视化的世界里&#xff0c;ECharts凭借其丰富的图表类型和强大的配置能力&#xff0c;成为了众多开发者的首选。今天&#xff0c;我将带大家一起实现一个饼图图表&#xff0c;通过该图表我们可以直观地展示和分析数据。此外&#xff0c;我还将提供详…

猫头虎 分享:前端工具 NVM 的简介、安装、用法详解入门教程

&#x1f42f; 猫头虎 分享&#xff1a;前端工具 NVM 的简介、安装、用法详解入门教程 今天猫头虎带您深入了解 NVM&#xff01;最近&#xff0c;猫哥在项目中遇到一个前端小伙伴&#xff0c;询问如何在开发过程中高效地切换不同的 Node.js 版本。前端项目往往需要特定版本的 …

二分查找_在排序数组中查找元素的第一个和最后一个位置

1.朴素二分查找 .二分查找 二分查找思路&#xff1a; 1.left0,rightnums.size()-1&#xff08;最后一个元素下标&#xff09;&#xff0c;取中间元素下标 midleft(right-left)/2 &#xff08;防溢出&#xff09; 2.nums[mid]>target &#xff0c;说明mid右边的元素都大于ta…

Discuz 论坛开发一套传奇发布站与传奇开服表

Discuz 论坛开发一套传奇发布站与传奇开服表 随着互联网技术的飞速发展&#xff0c;网络游戏已成为人们休闲娱乐的重要方式之一。在众多网络游戏中&#xff0c;传奇系列以其独特的魅力吸引了大量忠实玩家。为了满足这些玩家的需求&#xff0c;并促进游戏信息的交流与分享&…

QtCreator通过CMake多文件编译.cpp、.qss、.h、.ui文件,达到MVC三层架构的效果

博主在构建C项目的时候&#xff0c;一般都喜欢将头文件和源文件分开为不同的文件夹&#xff0c;比如include目录下只存放.h文件和.ui文件&#xff0c;src目录下只存放.cpp和.qss文件&#xff0c;res目录下只存放图片、音频等文件&#xff0c;这时候使用CMake对项目进行分文件管…

qml圆形图片,qml圆形头像制作

代码比较简单&#xff0c;就不细讲了&#xff0c;大家直接看下面源码吧&#xff01;如果对你有所帮助&#xff0c;可以帮角角点个关注嘛&#xff1f; import QtQuick import QtQuick.Effects import Qt5Compat.GraphicalEffectsWindow {width: 640height: 480visible: truetit…

使用代理服务器后sse数据合并问题

如果是使用本地代理服务器devServer compress:false,如果是发布到生产环境下的代理服务器nginx 增加如下配置&#xff0c;该配置同时支持websocket和sse proxy_http_version 1.1; #设置代理请求使用 HTTP/1.1 版本。WebSocket 需要 HTTP/1.1&#xff0c;因为它支持持久连接和更…

【每日一题】LeetCode - 盛最多水的容器

给定一个长度为 n 的整数数组 height。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i])。要求找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 输入示例&#xff1a; height [1,8,6,2,5,4,8,3,7]输出&#xff1a; 4…

Python快速入门教程

目录 1. Python 简介 2. 环境准备 3. 第一个 Python 程序 4. 变量与数据类型 5. 基本操作与控制结构 6. 函数与模块 7. 实践项目 结语 Python 是一种非常友好的编程语言&#xff0c;特别适合初学者。它的语法简洁&#xff0c;容易上手&#xff0c;并且广泛应用于各种领…

C++结合图形编程与物联网:你更偏向哪种方式来学习信息学奥赛?

随着信息学奥赛在全国范围内的热度逐年攀升&#xff0c;学生和家长们越来越重视如何有效备赛。传统的编程学习方式侧重于算法和数据结构&#xff0c;但随着科技的发展&#xff0c;图形化编程与物联网&#xff08;IoT&#xff09;项目逐渐成为新兴的学习路径。通过C结合图形化编…

Rust 力扣 - 1. 两数相加

文章目录 题目描述题解思路题解代码题目链接 题目描述 题解思路 我们使用一个全局的备忘录&#xff0c;然后我们遍历数组&#xff0c;如果当前元素在备忘录里面找到了&#xff0c;就返回备忘录里面记录的下标和当前下标记录&#xff0c;没找到就把当前元素匹配的元素和当前元素…

人工智能_神经网络103_感知机_感知机工作原理_感知机具备学习能力_在学习过程中自我调整权重_优化效果_多元线性回归_逻辑回归---人工智能工作笔记0228

由于之前一直对神经网络不是特别清楚,尤其是对神经网络中的一些具体的概念,包括循环,神经网络卷积神经网络以及他们具体的作用,都是应用于什么方向不是特别清楚,所以现在我们来做教程来具体明确一下。 当然在机器学习之后还有深度学习,然后在深度学习中对各种神经网络的…

Java对称加密:AES 高级加密标准

1、对称加密简述 对称加密&#xff0c;又称对称密钥加密或私钥加密&#xff0c;是一种在加密和解密过程中使用相同一个密钥的加密算法。这种加密方式的核心在于&#xff0c;发送方使用某个密钥对数据进行加密&#xff0c;接收方则使用完全相同的密钥对数据进行解密。由于加密和…

基于物联网的智慧考场系统设计(论文+源码)

1. 功能设计 &#xff08;1&#xff09;温度监测与控制功能&#xff1a; 系统需要能够实时采集考场内的温度信息&#xff0c;通过DS18B20传感器获取准确的数据&#xff0c;并在OLED屏幕和APP上显示。当温度异常过高时&#xff0c;系统应自动启动继电器&#xff0c;模拟空调开启…

数字IC后端实现 | Innovus各个阶段常用命令汇总

应各位读者要求&#xff0c;小编最近按照Innovus流程顺序整理出数字IC后端项目中常用的命令汇总。限于篇幅&#xff0c;这次只更新到powerplan阶段。有了这份Innovus常用命令汇总&#xff0c;学习数字IC后端从此不再迷路&#xff01;如果大家觉得这个专题还不错&#xff0c;想继…

C语言_动态内存管理

本章重点 为什么存在动态内存分配 动态内存函数的介绍 malloc free calloc realloc 常见的动态内存错误 几个经典的笔试题 柔性数组 1. 为什么存在动态内存分配 我们已经掌握的内存开辟方式有&#xff1a; int val 20;//在栈空间上开辟四个字节 char arr[10] {0}…

Maven进阶——坐标、依赖、仓库

目录 1.pomxml文件 2. 坐标 2.1 坐标的概念 2.2 坐标的意义 2.3 坐标的含义 2.4 自己项目的坐标 2.5 第三方项目坐标 3. 依赖 3.1 依赖的意义 3.2 依赖的使用 3.3 第三方依赖的查找方法 3.4 依赖范围 3.5 依赖传递和可选依赖 3.5.1 依赖传递 3.5.2 依赖范围对传…

算法的学习笔记—数组中的逆序对(牛客JZ51)

&#x1f600;前言 在算法和数据结构领域&#xff0c;"逆序对"是一个经典问题。它在数组中两个数字之间定义&#xff0c;若前面的数字大于后面的数字&#xff0c;则这两个数字组成一个逆序对。我们要做的就是&#xff0c;给定一个数组&#xff0c;找出数组中所有的逆…

Docker 镜像下载问题及解决办法

Docker 镜像下载问题及解决办法 我在杂乱的、破旧的村庄寂寞地走过漫长的雨季&#xff0c;将我年少的眼光从晦暗的日子里打捞出来的是一棵棵开花的树&#xff0c;它们以一串串卓然不俗的花擦明了我的眼睛&#xff0c;也洗净了我的灵魂。 引言 在使用 Docker 时&#xff0c;用户…

【AI绘画】Midjourney进阶:对角线构图详解

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AI绘画 | Midjourney 文章目录 &#x1f4af;前言&#x1f4af;什么是构图为什么Midjourney要使用构图 &#x1f4af;对角线构图特点应用场景提示词书写技巧测试 &#x1f4af;小结 &#x1f4af;前言 【AI绘画】Midjourney进阶&a…