Java 垂直x';垂直的JSON/YAML配置(每个环境最好)
是否有一种“合理”的方法来配置Vert.x中的Java 垂直x';垂直的JSON/YAML配置(每个环境最好),java,kotlin,vert.x,Java,Kotlin,Vert.x,是否有一种“合理”的方法来配置Vert.x中的部署选项、实例、工作者等 我希望能够在部署时“摆脱”部署选项,并将其保存在Vert.x能够理解的JSON/YAML配置文件中,最好是按“环境”分割,就像Spring Boot那样 这是我目前正在使用的: class MainVerticle : AbstractVerticle() { private val logger: Logger = LoggerFactory.getLogger(this.javaClass.name) over
部署选项
、实例
、工作者
等
我希望能够在部署时“摆脱”部署选项,并将其保存在Vert.x能够理解的JSON/YAML配置文件中,最好是按“环境”分割,就像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
和deploy(Class,DeploymentOptions)
方法进行一些调整,以获得类似的结果
对于config.json
,如果您将每个垂直链接的名称更改为限定类名,并且每个垂直链接都有一个deployment\u 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))
}
覆盖乐趣开始(未来:未来){
部署(AuthVerticle::class.java)
部署(HttpServerVerticle::class.java)
部署(DialPadVerticle::class.java)
...
}
私人娱乐部署(课堂:课堂){
val options=getDeploymentOptionsFromConfig(clazz)
deployVerticle(clazz.name,选项){handler->
...
}
}
private fun GetDeploymentOptions fromConfig(clazz:Class):DeploymentOptions{
val config=config()
.getJsonObject(clazz.name)
.getJsonObject(“部署选项”)
return-DeploymentOptions()
.setInstances(config.getInteger(“实例”,1))
.setWorker(config.getBoolean(“worker”,false))
}
我发现了,但我仍然认为这应该是一个“核心”功能
在任何情况下,DeploymentOptions
都接受一个JsonObject
…这很好。唯一需要注意的是,确保JSON配置文件中的键(当然不包括config
中的键)与JSON(DeploymentOptionConverter
)中的方法的值相同
“部分”解决方案是使用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();
}
}
}
private-fun部署(clazz:Class){
deployVerticle(clazz.name,DeploymentOptions(config().getJsonObject(clazz.name)?:JsonObject()){handler->
if(handler.successed()){
logger.debug(${clazz.simpleName}已成功启动(部署标识符:${handler.result()})”
}否则{
logger.error(${clazz.simpleName}部署失败,原因是:${handler.cause()}”)
//停止();
}
}
}
是啊!这很酷,但我不想准确地编写getDeploymentOptions fromconfig
,因为您必须为要包含的键编写代码,这已经在DeploymentOptions Converter.fromJson
中完成了。几分钟后我将发布另一个解决方案。您在哪里找到解释DeploymentOptions Converter
工作原理的文档?Java文档也没有提到密钥是如何映射的;我阅读了源代码-Vert.x是开源的。我认为“映射”无论如何都不会被记录下来,所以这更像是一个你必须遵守的惯例,直到“核心”中内置了某种东西或者Vert.x中的官方工件。
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();
}
}
}