Quarkus实战:专为Kubernetes而优化的Java解决方案
上QQ阅读APP看书,第一时间看更新

3.6 使用响应式路由

问题

如何使用响应式路由实现HTTP端点?

解决方案

使用Vert.x的io.vertx.ext.web.Router路由器实例或io.quarkus.vertx.web.Route注解。

有两种方法可以在Quarkus中使用响应式路由。第一种方法是直接使用io.vertx.ext.web.Router类注册路由。

为了在启动时检索Router实例,你需要使用Contexts and Dependency Injection(CDI)观察对象的创建。

创建一个名为org.acme.quickstart.ApplicationRoutes.java的新类:

❶将对象实例化到CDI容器中,其作用域为application

❷提供Router对象来注册路由

❸将GET HTTP方法绑定到/ok

❹处理逻辑

❺例子中稍后使用的import的对象

打开一个新的终端窗口,启动Quarkus应用程序,并向新方法发送一个请求:

使用响应式路由的第二种方式是使用io.quarkus.vertx.web.Route注解的声明式方法。要访问这个注解,你需要添加quarkus-vertx-web扩展:

然后你可以用@Route来注解方法。这些方法必须在CDI bean中定义。

打开org.acme.quickstart.ApplicationRoutes.java类并定义一个路由:

❶设置HTTP路径和方法

❷RoutingContext获取请求信息

❸获取查询参数

❹处理逻辑

打开一个新的终端窗口,启动Quarkus应用程序,并向新方法发送一个请求:

讨论

Quarkus HTTP基于一个非阻塞的响应式引擎。其内部使用的是Vert.x和Netty。当接收到一个请求时,它由event loop(事件循环)管理,在servlet或JAX-RS的情况下,它可以依靠一个worker线程;在响应式路由的情况下,它可以使用I/O线程来处理调用的逻辑。

需要注意的是,响应式路由必须是非阻塞式的,或者显式声明为阻塞式的。如果不是,由于响应式事件循环的特性,你将阻塞循环,从而阻止进一步的循环处理,直到线程解锁。

在同一个项目中,你可以将JAX-RS端点与响应式路由混合使用,不会发生任何问题。

另见

你可以在下面的网页上了解关于Vert.x中的响应式路由的更多信息:

·基本Vert.x-Web概念(https://oreil.ly/kznp9