Vert.x的Verticle(s)JSON / YAML配置(每个环境最好)

有没有一种“合理”的方式来配置Vert.x的deployment optionsinstancesworker等?

我希望能够在DeploymentOptions时候“摆脱” DeploymentOptions ,并将其放在一个JSON / YAML配置文件中,这些文件就像Vert.x所理解的 – 最好是通过“环境”来拆分,就像Spring Boot一样。

这是我目前使用的:

 class MainVerticle : AbstractVerticle() { private val logger: Logger = LoggerFactory.getLogger(this.javaClass.name) override fun start(future: Future<Void>) { val config = config().getJsonObject("verticle_instances") deploy(AuthVerticle::class.java, DeploymentOptions().setInstances(config.getInteger("auth_instances"))) deploy(HttpServerVerticle::class.java, DeploymentOptions().setConfig(config().getJsonObject("http_server_verticle")) .setInstances(config.getInteger("http_server_instances"))) deploy(DialPadVerticle::class.java, DeploymentOptions().setConfig(config().getJsonObject("phone_verticle")) .setWorker(true)) logger.info("Module(s) and/or verticle(s) deployment...DONE") future.complete() } override fun stop(future: Future<Void>) { logger.debug("Undeploying verticle(s)...DONE") logger.info("Application stopped successfully. Enjoy the elevator music while we're offline...") future.complete() } private fun deploy(clazz: Class<out AbstractVerticle>, options: DeploymentOptions) { vertx.deployVerticle(clazz.name, options) { handler -> if (handler.succeeded()) { logger.debug("${clazz.simpleName} started successfully (deployment identifier: ${handler.result()})") } else { logger.error("${clazz.simpleName} deployment failed due to: ${handler.cause()}") //stop(); } } } } 

…和config.json

 { "verticle_instances": { "auth_instances": 3, "http_server_instances": 6 }, "http_server_verticle": { "hostname": "0.0.0.0", "port": 9080, "cert_path": "server-cert.pem", "key_path": "server-key.pem", "use_alpn": true, "use_ssl": true } } 

据我所知,不。 但是,您可以对config.jsondeploy(Class, DeploymentOptions)方法进行一些调整,以获得类似的结果。

对于config.json ,如果将每个Verticle的名称更改为限定类名,并为每个Verticle都有一个deployment_options对象,则可以修改deploy()以加载选项,而不必在start方法中指定它们。 在Vert.x中,您可以提供默认配置选项,因此您可以执行如下操作:

 override fun start(future: Future<Void>) { deploy(AuthVerticle::class.java) deploy(HttpServerVerticle::class.java) deploy(DialPadVerticle::class.java) ... } private fun deploy(clazz: Class<out AbstractVerticle>) { val options = getDeploymentOptionsFromConfig(clazz) vertx.deployVerticle(clazz.name, options) { handler -> ... } } private fun getDeploymentOptionsFromConfig(clazz: Class<out AbstractVerticle>): DeploymentOptions { val config = config() .getJsonObject(clazz.name) .getJsonObject("deployment_options") return DeploymentOptions() .setInstances(config.getInteger("instances", 1)) .setWorker(config.getBoolean("worker", false)) } 

我发现Vert.x配置启动 ,但仍然,我认为这应该是一个“核心”功能。

在任何情况下, DeploymentOptions接受一个JsonObject …而且很整洁。 唯一需要注意的是确保JSON配置文件中的键(当然不包括配置文件中的那些键)与fromJsonDeploymentOptionsConverter )的方法所fromJson的值相同。

“部分”解决方案将是一个config.json像:

 { "io.shido.core.verticle.AuthVerticle": { }, "io.shido.core.verticle.DialPadVerticle": { }, "io.shido.core.verticle.HttpServerVerticle": { "config": { "hostname": "0.0.0.0", "port": 9081, "certPath": "server-cert.pem", "keyPath": "server-key.pem", "useAlpn": true, "useSsl": true }, "instances": 5 } } 

…与foreksorg/vertx-config-launcher的子集非常相似 – 因为我只对配置注入部分感兴趣。

最终,(最初发布的) deploy方法如下所示:

 private fun deploy(clazz: Class<out AbstractVerticle>) { vertx.deployVerticle(clazz.name, DeploymentOptions(config().getJsonObject(clazz.name) ?: JsonObject())) { handler -> if (handler.succeeded()) { logger.debug("${clazz.simpleName} started successfully (deployment identifier: ${handler.result()})") } else { logger.error("${clazz.simpleName} deployment failed due to: ${handler.cause()}") //stop(); } } }