Quarkus中RESTEasy Reactive集成合并master分支

目录
  • 前言
  • 它是什么?
  • 为什么非常重要?
  • 还有什么其他好处?
    • 新的请求/响应过滤器设计
    • 新*Param注解
    • 更简单的参数和上下文注入
    • 新的最佳消息正文阅读器/编写器
      • 默认内容类型
      • CDI整合
      • 每类异常映射器
  • 其他扩展程序也可以使用吗?
  • 该如何尝试?
  • 应该注意什么?
  • 缺少哪些JAX-RS功能?
  • 下一步计划是什么?

前言

Quarkus和RESTEasy团队非常高兴地宣布了Quarkus中的RESTEasy Reactive集成已进入master分支,并将成为下一个Quarkus 1.11发行版的一部分。我们期待每个人对其进行测试。并为我们提供尽可能多的反馈。以典型的Quarkus方式,该项目可作为一组新的扩展使用。这是一个非常令人兴奋的消息,所以博主用自己蹩脚的英语+google翻译翻译了官方的公告,迫不及待的想要和大家分享。

它是什么?

正如您可能从名称中猜到的那样,该工作是从头开始编写的新JAX-RS实现,可在我们的通用Vert.x层上工作,因此具有完全的反应性,同时还与Quarkus紧密集成,因此移动了很多特定于框架的工作(例如注释扫描和元模型生成)以建立时间。

为什么非常重要?

最简单的答案是,您可以继续利用广泛使用且功能强大的JAX-RS API为应用程序公开REST层,同时显着提高应用程序可以实现的最大吞吐量。该应用程序还应该稍微加快启动速度,并占用更少的内存。

我们的基准测试表明,此新扩展的可测量性能几乎与我们使用Quarkus的Reactive Routes API(它本身是一个非常有趣的API,但通常级别较低)所达到的性能相同,更不用说这是开发人员需要学习的新API)。

此外,将我们的结果与提供基于注释的REST层的其他竞争企业Java框架进行比较时,根据基准,Quarkus提供的吞吐量是原来的两倍。

还有什么其他好处?

好像熟悉的API和新扩展的改进的运行时特性还不够,我们添加了一些真正令人兴奋且方便的新功能(这些功能不是JAX-RS规范的一部分),这些功能是社区所要求的,或者我们觉得可以改善开发人员的体验,并减轻某些规范的毛病。这些新功能是:

  • 默认不阻塞:现在,默认情况下,所有端点都在IO线程上运行。您可以@Blocking用来更改它。
  • 计分系统:在开发人员模式启动时,该应用程序将为您显示端点列表,以及性能得分,告诉您为什么端点比最佳版本慢。这有助于弄清楚如何提高REST性能。

新的请求/响应过滤器设计

JAX-RS过滤器需要实现一个接口并将上下文对象作为字段注入,这既昂贵又不灵活。基于我们在Quarkus构建系统中的成功,现在过滤器只是带有注释的方法,并且会自动注入任何参数:

public class CustomContainerRequestFilter {
   @ServerRequestFilter
   public void whatever(UriInfo uriInfo, HttpHeaders httpHeaders, ContainerRequestContext requestContext) {
       String customHeaderValue = uriInfo.getPath() + "-" + httpHeaders.getHeaderString("some-input");
       requestContext.getHeaders().putSingle("custom-header", customHeaderValue);
   }
}

此外,如果过滤器需要执行阻止操作,则它们可以返回Uni并且RESTEasy Reactive在执行过滤器时不会阻止事件循环线程。
最后,尽管我们还没有完成,但是可以很容易地将此方法扩展到其他类型的JAX-RS Provider,从而完全不需要@Context在其代码中使用。

新*Param注解

这些注释意味着要用来代替JAX-RS @PathParam,@QueryParam等注释,而不必需要指定一个名称。我们选择不重用相同的批注名称的原因是为了避免与JAX-RS或其他EE规范冲突:

@POST
@Path("params/{p}")
public String params(@RestPath String p,
                    @RestQuery String q,
                    @RestHeader int h,
                    @RestForm String f,
                    @RestMatrix String m,
                    @RestCookie String c) {
   return "params: p: " + p + ", q: " + q + ", h: " + h + ", f: " + f + ", m: " + m + ", c: " + c;
}

更简单的参数和上下文注入

使用RESTEasy Reactive,您甚至不需要使用,@PathParam或者@RestPath您的参数与path参数具有相同的名称,并且类似地,您可以跳过@Context所有已知的上下文类型,这使它更加简单:

@POST
@Path("params/{p}")
public String params(String p, UriInfo info) {
   return "params: p: " + p + ", info: " + info;
}

新的最佳消息正文阅读器/编写器

如果在为端点提供服务时未调用任何筛选器和拦截器,则可以使用更高效的消息正文编写器,这些编写器直接写入vert.x,并且不需要反射和注释:

@Provider
public class ServerVertxBufferMessageBodyWriter extends VertxBufferMessageBodyWriter
       implements ServerMessageBodyWriter{
   @Override
   public boolean isWriteable(Class type, ResteasyReactiveResourceInfo target, MediaType mediaType) {
       return true;
   }
   @Override
   public void writeResponse(Buffer buffer, ServerRequestContext context) {
       context.serverResponse().end(buffer.getBytes());
   }
}

默认内容类型

返回String的端点默认为产生文本/纯文本。我们计划对JSON和其他类型执行相同的操作。

CDI整合

通过JAX-RS的@Context进行的所有注入都委托给Arc。这为用户提供了Arc带给Quarkus所有其他部分的构建时间注入的好处。

每类异常映射器

在JAX-RS规范中,无法对特定的JAX-RS资源类以不同的方式处理异常-所有异常映射都是以全局方式完成的。但是在RESTEasy Reactive中,您可以简单地执行以下操作:

@Path("first")
public class FirstResource {
   @GET
   @Produces("text/plain")
   public String throwsVariousExceptions(@RestQuery String name) {
       if (name.startsWith("IllegalArgument")) {
           throw new IllegalArgumentException();
       } else if (name.startsWith("IllegalState")) {
           throw new IllegalStateException("IllegalState");
       } else if (name.startsWith("My")) {
           throw new MyException();
       }
       throw new RuntimeException();
   }
   @ServerExceptionMapper({ IllegalStateException.class, IllegalArgumentException.class })
   public Response handleIllegal() {
       return Response.status(409).build();
   }
   @ServerExceptionMapper(MyException.class)
   public Response handleMy(SimpleResourceInfo simplifiedResourceInfo, MyException myException,
           ContainerRequestContext containerRequestContext, UriInfo uriInfo, HttpHeaders httpHeaders, Request request) {
       return Response.status(410).entity(uriInfo.getPath() + "->" + simplifiedResourceInfo.getMethodName()).build();
   }
}

为了自定义某些资源类的异常处理。还要注意,@ServerExceptionMapper可以像JAX-RS使用那样以全局方式处理异常ExceptionMapper。为此,只需使用注释不属于Resource类的方法@ServerExceptionMapper。

其他扩展程序也可以使用吗?

绝对!与现有quarkus-resteasy扩展集成的扩展也与quarkus-resteasy-active扩展集成。因此,您可以继续使用CDI,Security,Metrics,JSON,Qute,Bean Validation,OpenAPI, 并享受开箱即用和完善的开发经验。

该如何尝试?

该项目已降落在Quarkus主分支,所以,如果你渴望尝试一下,你就必须按照从源代码编译Quarkus这和使用遵循正确BOM和版本此。可用的RESTEasy Reactive扩展为:

quarkus-resteasy-reactive

quarkus-resteasy-reactive-jackson

quarkus-resteasy-reactive-jsonb

quarkus-resteasy-reactive-qute

些扩展等效于现有的quarkus-resteasy *扩展,因此只需在应用程序中从quarkus-resteasy-jackson切换到quarkus-resteasy-reactive-jackson,即可让您尝试通过Jackson集成进行RESTEasy Reactive。
此外,如果需要使用JAX-RS客户端,则可以使用quarkus-jaxrs-client扩展(这不是声明性的MicroProfile REST客户端,而是JAX-RS规范指定的程序化客户端)。

应该注意什么?

首先要注意的是,目前暂时将这组扩展视为实验性的。尽管该项目几乎通过了JAX-RS TCK的全部,但它只是第一个发行版,因此请记住,它可能比典型的经过战斗的库具有更多的错误,而某些新的API和SPI可能会损坏。尽管这是第一个发行版,但我们确实预想这项工作将在不久的将来成为Quarkus的默认REST层。

如新功能部分所述,默认情况下,请求是在事件循环线程上处理的。这样可以确保最大的吞吐量,但是也意味着不应在这些线程上执行任何阻塞工作。如果您使用Blocking IO(例如,通过使用Hibernate Panache访问数据库),请确保@Blocking在方法或类上使用注释。这将确保该请求将在工作线程上得到服务。不用说,我们也非常有兴趣听到您对此默认设置的反馈。

尚无文档。文档将在1.11正式版之前添加,并将逐步增强。该电子邮件应包含您入门所需的所有信息,但是如果您遇到任何麻烦,我们可以在任何常用渠道(Zulip聊天,邮件列表,GitHub问题,StackOverflow)上为您提供帮助。

缺少哪些JAX-RS功能?

我们决定专注于现代REST层上大多数用户的需求,而不是实现JAX-RS TCK所需的每个功能。因此,就这一点而言,RESTEasy Reactive中不提供XML支持,同时也不支持该规范的各种奥秘功能

例如:

javax.activation.DataSource

javax.annotation.ManagedBean

javax.ws.rs.core.StreamingOutput

此外,值得注意的是,第一个发行版将不包含基于新的JAX-RS客户端(具有专用扩展)的MicroProfile REST客户端的实现。这很可能在不久的将来改变。

下一步计划是什么?

尽管新的扩展将随常规的1.11版本一起提供,但我们正在考虑1.11.0.Alpha1发布一个版本,以使您尽可能容易地尝试新的扩展并提供早期反馈。我们非常期待听到您在Quarkus中使用RESTEasy Reactive的想法和经验,并计划充分利用它来进一步改进该项目。

以上就是Quarkus中RESTEasy Reactive集成合并master分支的详细内容,更多关于RESTEasy Reactive集成合并master的资料请关注我们其它相关文章!

(0)

相关推荐

  • mysql(master/slave)主从复制原理及配置图文详解

    1 复制概述 Mysql内建的复制功能是构建大型,高性能应用程序的基础.将Mysql的数据分布到多个系统上去,这种分布的机制,是通过将Mysql的某一台主机的数据复制到其它主机(slaves)上,并重新执行一遍来实现的.复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器.主服务器将更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环.这些日志可以记录发送到从服务器的更新.当一个从服务器连接主服务器时,它通知主服务器从服务器在日志中读取的最后一次成功更新的位置.从服务器接收

  • setup+ref+reactive实现vue3响应式功能

    setup 是用来写组合式 api ,内部的数据和方法需要通过 return 之后,模板才能使用.在之前 vue2 中,data 返回的数据,可以直接进行双向绑定使用,如果我们把 setup 中数据类型直接双向绑定,发现变量并不能实时响应.接下来就看看setup如何实现data的响应式功能? 一.ref setup 内的自定义属性不具备响应式能力,所以引入了 ref ,ref 底层通过代理,把属性包装值包装成一个 proxy ,proxy 内部是一个对象,使得基础类型的数据具备响应式能力,使用之

  • 深入浅析Restful接口的两种使用方式

    为什么用restful接口? 怎么用呢? restful接口常用的两种方式是get和post.下面简单介绍一下这两种方式的使用. 由于调用restful接口是通过url的方式来访问后端的代码.新建CustRegisterApi类以后,除了基本的注入外,还需要配置url的地址.以后的demo就在这个类里面写了. <strong><span style="font-size:18px;">@RestController @RequestMapping(value =

  • 详解如何使用ReactiveObjC

    概述 RAC架构框架图 信号流程 基本使用 1.基本控件 UITextField //监听文本输入 [[_textField rac_textSignal] subscribeNext:^(NSString * _Nullable x) { NSLog(@"%@",x); }]; //可根据自己想要监听的事件选择 [[_textField rac_signalForControlEvents:UIControlEventEditingChanged] subscribeNext:^(_

  • Quarkus中RESTEasy Reactive集成合并master分支

    目录 前言 它是什么? 为什么非常重要? 还有什么其他好处? 新的请求/响应过滤器设计 新*Param注解 更简单的参数和上下文注入 新的最佳消息正文阅读器/编写器 默认内容类型 CDI整合 每类异常映射器 其他扩展程序也可以使用吗? 该如何尝试? 应该注意什么? 缺少哪些JAX-RS功能? 下一步计划是什么? 前言 Quarkus和RESTEasy团队非常高兴地宣布了Quarkus中的RESTEasy Reactive集成已进入master分支,并将成为下一个Quarkus 1.11发行版的一

  • Quarkus中实现Resteasy的文件上传下载操作

    目录 前言 文件上传 文件下载 前言 做java web开发,文件的上传和下载是一个非常常见的需求场景.在spring生态下的文件上传下载非常简单,记得五年前,我刚写博的时候也写过spring的上传和下载<SpringMvc实现文件上传与下载>,以及Struts2的文件上传和下载<java Struts2实现文件上传下载>.今天来看看Quarkus框架中是如何实现的,因为Quarkus的JAX-RS采用Resteasy的实现,故Quarkus中的文件上传和下载,也就是Resteas

  • Quarkus中filter过滤器跨域cors问题解决方案

    目录 前言 web依赖 过滤器filter开发 resteasy的filter vertx的filter Quarkus中的跨域 前言 Quarkus中的web模块是基于java标准web规范jax-rs构建的,实现则选用了jboss的resteasy.这部分只是请求路由转发部分实现.真正的请求接收则使用了eclipse开源的vert.x框架,底层也是基于netty的一个响应式开发框架.Quarkus将vert.x和resteasy集成在了一起,所以支持响应式和非响应式应用混合开发,这也是Qua

  • Android中使用ShareSDK集成分享功能的实例代码

    引言 现在APP开发集成分享功能已经是非常普遍的需求了.其他集成分享技术我没有使用过,今天我就来介绍下使用ShareSDK来进行分享功能开发的一些基本步骤和注意点,帮助朋友们避免一些坑.好了,下面切入正题正式开始介绍. 1.ShareSDK开发包及配置 这个不用多说,去他们官网看找SDK开发包和集成文档即可. Android版本地址:http://www.mob.com/downloadDetail/ShareSDK/android. 注意:记得要注册ShareSDK账号获取AppKey哦.这些

  • Quarkus中的依赖注入DI和面向切面aop编程

    目录 前言 JSR365:Java2.0的上下文和依赖注规范 Bean声明和依赖注入 Bean的生命周期 条件化初始Bean 面向切面编程aop Bean列表接口 结语 前言 做java开发的肯定清楚spring中的核心思想ioc和aop,ioc即控制反转的意思,di的核心思想和ioc一样,描述的也是同一个事情同一个思想,只是di的依赖注入更容易被理解了,aop即面向切面,如注解事务功能,就是基于aop的思想来实现的.Quarkus中也实现了一套非标准的cdi规范,下面就来看看Quarkus中的

  • Quarkus中ConfigSourceInterceptor的加密配置实现

    目录 前言 配置拦截器ConfigSourceInterceptor 内置的实现 加密配置实现 结语 前言 加密配置是一个很常见的需求,在spring boot生态中,已经有非常多的第三方starter实现了,博主所在公司也有这种强制要求,一些敏感配置信息必须加密,比如第三方账号,数据库密码等等.所以研究了下怎么在Quarkus中实现类似的配置加密功能.在前文 Quarkus集成apollo配置中心 中,已经有介绍过Quarkus中的配置架构了,配置加密功能也是基于smallrye-config

  • 详谈Numpy中数组重塑、合并与拆分方法

    1.数组重塑 1.1一维数组转变成二维数组 通过reshape( )函数即可实现,假设data是numpy.array类型的一维数组array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]),现将其转变为2行5列的二维数组,代码如下: data.reshape((2,5)) 作为参数的形状的其中一维可以是-1,它表示该维度的大小由数据本身推断而来,因此上面代码等价于: data.reshape((2,-1)) 1.2二维数组转换成一维数组 将多维数组转换成一维数组的运算通常称为扁

  • 基于Python中numpy数组的合并实例讲解

    Python中numpy数组的合并有很多方法,如 - np.append() - np.concatenate() - np.stack() - np.hstack() - np.vstack() - np.dstack() 其中最泛用的是第一个和第二个.第一个可读性好,比较灵活,但是占内存大.第二个则没有内存占用大的问题. 方法一--append parameters introduction arr 待合并的数组的复制(特别主页是复制,所以要多耗费很多内存) values 用来合并到上述数组

  • element-ui中Table表格省市区合并单元格的方法实现

    本文介绍了element-ui中Table表格省市区合并单元格的方法实现,分享给大家,具体如下: 效果如图 代码如下: <template> <div> <el-form :inline="true" :model="formInline" class="demo-form-inline"> <el-form-item label="搜索"> <el-input v-mod

  • 在python中pandas的series合并方法

    如下所示: In [3]: import pandas as pd In [4]: a = pd.Series([1,2,3]) In [5]: b = pd.Series([2,3,4]) In [6]: c = pd.DataFrame([a,b]) In [7]: c Out[7]: 0 1 2 0 1 2 3 1 2 3 4 不过pandas直接用列表生成dataframe只能按行生成,如果是字典可以按列生成,比如: In [8]: c = pd.DataFrame({'a':a,'b'

随机推荐