当前位置: 首页 > article >正文

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: 8080

redis:
  endpoint: redis://127.0.0.1:6379/2
  password: 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 {
    @Override
    public 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 {
                // 加载环境变量redis
                JsonObject 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 {

    @Override
    public 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.kler.cn/news/362601.html

相关文章:

  • [项目][boost搜索引擎#4] cpp-httplib使用 | log.hpp | 前端 | 测试及总结
  • Unity3D学习FPS游戏(1)获取素材、快速了解三维模型素材(骨骼、网格、动画、Avatar、材质贴图)
  • 信息安全工程师(64)其他恶意代码分析与防护
  • 客户端工具xshell/finalshell连接Vagrant创建的虚拟机并上传本地文件
  • Golang使用viper读取配置到结构体,但是获取的数据为空
  • kafka自定义配置信息踩坑
  • 基于Spring Boot的论坛网站:从零到部署
  • Pr 视频效果:自动重构
  • 【C++篇】探索STL之美:熟悉使用String类
  • 传感器驱动系列之PAW3212DB鼠标光电传感器
  • 网安加·百家讲坛 | 徐一丁:金融机构网络安全合规浅析
  • 云原生环境下的等保测评:构建新型安全防线的探索
  • ChatGPT实现旅游推荐微信小程序
  • XPM_CDC_PULSE
  • 安全见闻(7)——开阔眼界,不做井底之蛙
  • create-vite my-vite-uniapp-project
  • YOLO V3 网络构架解析
  • 群控系统服务端开发模式-程序草图设计
  • idea 开发插件
  • Maven入门到实践:从安装到项目构建与IDEA集成
  • gin入门教程(5):请求参数处理
  • stm32F103 实现呼吸灯效果
  • ubuntu 22.04网线连接无ip、网络设置无有线网界面(netplan修复)
  • 求最大公约数(c语言)
  • LINUX设备OTA时无法从HTTP服务器(TOMCAT)下载文件
  • GRU神经网络理解