Tag: vert.x

在Vertx中,我需要将所有HTTP请求重定向到相同的URL,但HTTPS

我已经在Koltin中编写了一个Vertx-web处理程序,它将任何接收到的HTTP请求重定向到HTTPS,并且使用context.request().isSSL来确定请求是否不是SSL,并且直到我把我的代码在负载平衡器后面。 如果负载均衡器使用HTTPS与我的Vertx-web服务器通信,则认为所有用户请求都是HTTPS,即使它们不是。 如果我更改负载平衡器以与HTTP上的Vertx-web进行通信,那么即使用户已经使用HTTPS,每个请求也会被无限重定向。 然后,我也看到另一个问题,即使用context.request().absoluteURI()的重定向转到私有地址,而不是用户实际与之通信的公用地址。 在Vertx-web中是否有一个处理程序,我错过了这个,或者一些惯用的方法来解决这个问题? 我应该从JavaScript做到这一点,因为它看到的是真正的用户地址,而不是尝试服务器端重定向? 我在Kotlin编码,所以这个语言的例子都很棒! 注意: 这个问题是由作者故意编写和回答的( 自我回答问题 ),所以在SO中共享有趣问题的解决方案。

来自Kotlin的vert.x服务代理与vertx-codegen

我在Kotlin写了一个vertx服务接口,为此我试图生成服务代理。 但是,除了在src/main generated目录之外,它什么也不做。 src/main/java/amb85/portfolio/package-info.java : @ModuleGen(name = “portfolio”, groupPackage = “amb85.portfolio”) package amb85.portfolio; import io.vertx.codegen.annotations.ModuleGen; 然后我有以下服务接口src/main/kotlin/amb85/portfolio/PortfolioService.kt : @VertxGen @ProxyGen interface PortfolioService { companion object { val ADDRESS = “service.portfolio” val EVENT_ADDRESS = “portfolio” } fun getPortfolio(resultHandler: (AsyncResult) -> Unit) fun buy(amount: Int, quote: JsonObject, resultHandler: (AsyncResult) -> Unit) fun sell(amount: Int, quote:JsonObject, resultHandler: (AsyncResult) -> […]

Vertx同步代码运行多次

我正在使用Kotlin语言编写一个使用Vertx Web和Verticle的Web服务项目。 当我尝试切换到Vertx同步停止进入回调地狱,我的代码的一些部分运行不止一次没有理由。 当使用旧的回调结构时,不存在这样的问题。 这是一些示例代码: router.post(“/layers”).handler(fiberHandler { routingContext -> val request = routingContext.request() val response = request.response() response.putHeader(“content-type”, “application/json”) val layer = gson.fromJson(routingContext.bodyAsString, Layer::class.java) val layerResult = awaitResult<Message> { vert.eventBus().send(“PersistLayer”, layer, it) } val viewResult = awaitResult<Message> { vert.eventBus().send(“CreateView”, layerResult.body(), it) } response.isChunked = true response.write(gson.toJson(viewResult.body())) response.statusCode = 201 }) 只要我把“PersisLayer”行,下一行运行多次。 当省略这一行时,下一行将运行一次。 这是PersistLayer代码: vert.eventBus().consumer(“PersistLayer”).handler { […]

Kotlin&Vertx&Mongo:如何管理异步CRUDfunction?

朋友们! 我是Vertx和Mongo的绿手,现在我面临一个棘手的问题。 以下是代码段。 这里是Mongo客户端的包装类。 // MongoDatabase.kt import io.vertx.core.json.JsonObject import io.vertx.core.logging.LoggerFactory import io.vertx.kotlin.core.json.JsonObject import io.vertx.rxjava.core.Vertx import io.vertx.rxjava.ext.mongo.MongoClient import kotlin.reflect.KClass import kotlin.reflect.full.declaredFunctions class MongoDatabase (val tClass: KClass, vertx: Vertx, config: JsonObject, databaseName: String) : Database { private val mongo = MongoClient.createShared(vertx, config, databaseName) private val logger = LoggerFactory.getLogger(MongoDatabase::class.java) // I use a self-made annotation to record the […]

Kotlin Vertxtypes不匹配发现未来预期处理程序<AsyncResult >

我以为在Kotlin, Unit就相当于Void 。 使用Vert.x服务发现,不可能传递Future来unpublish(String id, Handler<AsyncResult> resultHandler) (给出types不匹配),但它将接受Future没有任何问题。 为什么是这样的,有没有一个解决方案,或者我只需要生活在使用Void ?

不能使vert.x + kotlin + gradle热重新部署工程

我刚开始研究vert.x并从https://github.com/vert-x3/vertx-examples/tree/master/kotlin-examples/web下载了一个示例restful项目。 根据自述,它应该能够自动重新部署时,有任何文件更改,但似乎没有工作。 不管我多少次更改主类文件,都不能反映出来。 我所做的是: 运行“gradlew run” C:\vertx-examples-master\kotlin-examples\web>gradlew run :compileKotlin UP-TO-DATE :compileJava UP-TO-DATE :copyMainKotlinClasses UP-TO-DATE :processResources UP-TO-DATE :classes UP-TO-DATE :run Jan 08, 2018 7:16:04 PM io.vertx.core.impl.launcher.commands.Watcher INFO: Watched paths: [C:\vertx-examples-master\kotlin-examples\web\.\out] Jan 08, 2018 7:16:04 PM io.vertx.core.impl.launcher.commands.Watcher INFO: Starting the vert.x application in redeploy mode Starting vert.x application… 58d1ec56-6d4c-4209-9fba-71cd6f54101c-redeploy Jan 08, 2018 7:16:05 PM io.vertx.core.impl.launcher.commands.VertxIsolatedDeployer INFO: Succeeded […]

如何在VertX中从工厂创建Verticle?

我正在开发一个Web服务使用vertx网络,我正在使用垂直任何数据库操作。 我有几个verticle,每个对应一个域。 我怎样才能使用VerticleFactory而不是手动实例化Verticle类? 什么是正确的方法? 我研究了一些文档,发现有一些Verticle服务工厂使用配置和构建系统来创建主要的verticile。 我有一个WebVerticle为主要服务。 但是,我的存储库模式垂直访问数据库呢? 我应该如何实例化它们?

VertX Web不删除Cookie

我在VertX中创建了cookie,并且希望在用户注销后再次删除它们。 AccountController.handleLogin(vertx, router.post("/login")) … fun handleLogin(vertx: Vertx, route: Route) { route.handler { rtx -> rtx.request().bodyHandler { btx -> vertx.executeBlocking<Login>({ it.complete(AccountController.login(Json.decodeValue(String(btx.bytes), Login::class.java))) }, { if (it.succeeded()) { // set some cookies rtx.addCookie(Cookie.cookie("atom-session", it.result().session).setHttpOnly(true).setSecure(secure)) Chrome现在可以看到这个cookie: 当我想再次删除该cookie时: AccountController.handleLogout(vertx, router.post("/logout")) … fun handleLogout(vertx: Vertx, route: Route) { route.handler { rtx -> rtx.request().bodyHandler { btx -> vertx.executeBlocking<Logout>({ val logout = […]

在VertX中匹配响应处理程序与请求

假设我在1..n个VertX(V)实例前有一个负载均衡器(LB),每个VertX实例都连接到一个队列(Q),并且我有1..m后端(BE)。 用户点击一个按钮发出一个请求,甚至打开一个Web套接字,负载平衡器将请求转发给一个VertX实例,这个实例向队列发出一个请求,其中一个后端消费这个消息并发送一个响应背部; 如果正确的VertX实例使用它,它可以查找响应处理程序并向用户写入响应,如果VertX实例使用错误,则不会有响应处理程序来写入响应,用户将无限期地等待一个回应。 看这个草图: 或者,V2死亡,负载平衡器将用户重新连接到V1,这意味着即使我可以将它发送回与请求完全相同的用户,也不能保证在响应返回时仍然在那里,但用户可能仍然等待通过另一个VertX实例的响应。 我现在正在做的是为每个新的连接生成一个GUID,然后只要websocket连接,将websocket处理程序存储在对照GUID的hashmap中,然后当BE想要响应时,它将扇出所有1 .. VertX实例,当前在其hashmap中具有正确GUID的实例可以向用户写入响应。 这样处理POST / GET也一样。 伪代码: queue.handler { q -> q.handler { val handler = someMap.get(q.guid) // only respond if handler exists if (handler != null){ handler.writeResponse(someresponsemessagehere) } } } vertx.createHttpServer().websocketHandler { ws -> val guid = generateGUID() someMap.put(guid, ws) ws.writeFinalTextFrame("guid=${guid}") ws.handler { val guid = extractGuid(it) // send […]

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

有没有一种“合理”的方式来配置Vert.x的deployment options , instances , worker等? 我希望能够在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 […]