
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)