Quarkus中RESTEasy?Reactive集成合并master分支
前言
Quarkus和RESTEasy團隊非常高興地宣布了Quarkus中的RESTEasy Reactive集成已進入master分支,并將成為下一個Quarkus 1.11發(fā)行版的一部分。我們期待每個人對其進行測試。并為我們提供盡可能多的反饋。以典型的Quarkus方式,該項目可作為一組新的擴展使用。這是一個非常令人興奮的消息,所以博主用自己蹩腳的英語+google翻譯翻譯了官方的公告,迫不及待的想要和大家分享。
它是什么?
正如您可能從名稱中猜到的那樣,該工作是從頭開始編寫的新JAX-RS實現(xiàn),可在我們的通用Vert.x層上工作,因此具有完全的反應性,同時還與Quarkus緊密集成,因此移動了很多特定于框架的工作(例如注釋掃描和元模型生成)以建立時間。
為什么非常重要?
最簡單的答案是,您可以繼續(xù)利用廣泛使用且功能強大的JAX-RS API為應用程序公開REST層,同時顯著提高應用程序可以實現(xiàn)的最大吞吐量。該應用程序還應該稍微加快啟動速度,并占用更少的內(nèi)存。
我們的基準測試表明,此新擴展的可測量性能幾乎與我們使用Quarkus的Reactive Routes API(它本身是一個非常有趣的API,但通常級別較低)所達到的性能相同,更不用說這是開發(fā)人員需要學習的新API)。
此外,將我們的結(jié)果與提供基于注釋的REST層的其他競爭企業(yè)Java框架進行比較時,根據(jù)基準,Quarkus提供的吞吐量是原來的兩倍。
還有什么其他好處?
好像熟悉的API和新擴展的改進的運行時特性還不夠,我們添加了一些真正令人興奮且方便的新功能(這些功能不是JAX-RS規(guī)范的一部分),這些功能是社區(qū)所要求的,或者我們覺得可以改善開發(fā)人員的體驗,并減輕某些規(guī)范的毛病。這些新功能是:
- 默認不阻塞:現(xiàn)在,默認情況下,所有端點都在IO線程上運行。您可以@Blocking用來更改它。
- 計分系統(tǒng):在開發(fā)人員模式啟動時,該應用程序?qū)槟@示端點列表,以及性能得分,告訴您為什么端點比最佳版本慢。這有助于弄清楚如何提高REST性能。
新的請求/響應過濾器設計
JAX-RS過濾器需要實現(xiàn)一個接口并將上下文對象作為字段注入,這既昂貴又不靈活?;谖覀冊赒uarkus構(gòu)建系統(tǒng)中的成功,現(xiàn)在過濾器只是帶有注釋的方法,并且會自動注入任何參數(shù):
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); } }
此外,如果過濾器需要執(zhí)行阻止操作,則它們可以返回Uni并且RESTEasy Reactive在執(zhí)行過濾器時不會阻止事件循環(huán)線程。
最后,盡管我們還沒有完成,但是可以很容易地將此方法擴展到其他類型的JAX-RS Provider,從而完全不需要@Context在其代碼中使用。
新*Param注解
這些注釋意味著要用來代替JAX-RS @PathParam,@QueryParam等注釋,而不必需要指定一個名稱。我們選擇不重用相同的批注名稱的原因是為了避免與JAX-RS或其他EE規(guī)范沖突:
@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; }
更簡單的參數(shù)和上下文注入
使用RESTEasy Reactive,您甚至不需要使用,@PathParam或者@RestPath您的參數(shù)與path參數(shù)具有相同的名稱,并且類似地,您可以跳過@Context所有已知的上下文類型,這使它更加簡單:
@POST @Path("params/{p}") public String params(String p, UriInfo info) { return "params: p: " + p + ", info: " + info; }
新的最佳消息正文閱讀器/編寫器
如果在為端點提供服務時未調(diào)用任何篩選器和攔截器,則可以使用更高效的消息正文編寫器,這些編寫器直接寫入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()); } }
默認內(nèi)容類型
返回String的端點默認為產(chǎn)生文本/純文本。我們計劃對JSON和其他類型執(zhí)行相同的操作。
CDI整合
通過JAX-RS的@Context進行的所有注入都委托給Arc。這為用戶提供了Arc帶給Quarkus所有其他部分的構(gòu)建時間注入的好處。
每類異常映射器
在JAX-RS規(guī)范中,無法對特定的JAX-RS資源類以不同的方式處理異常-所有異常映射都是以全局方式完成的。但是在RESTEasy Reactive中,您可以簡單地執(zhí)行以下操作:
@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。
其他擴展程序也可以使用嗎?
絕對!與現(xiàn)有quarkus-resteasy擴展集成的擴展也與quarkus-resteasy-active擴展集成。因此,您可以繼續(xù)使用CDI,Security,Metrics,JSON,Qute,Bean Validation,OpenAPI, 并享受開箱即用和完善的開發(fā)經(jīng)驗。
該如何嘗試?
該項目已降落在Quarkus主分支,所以,如果你渴望嘗試一下,你就必須按照從源代碼編譯Quarkus這和使用遵循正確BOM和版本此??捎玫腞ESTEasy Reactive擴展為:
quarkus-resteasy-reactive
quarkus-resteasy-reactive-jackson
quarkus-resteasy-reactive-jsonb
quarkus-resteasy-reactive-qute
些擴展等效于現(xiàn)有的quarkus-resteasy *擴展,因此只需在應用程序中從quarkus-resteasy-jackson切換到quarkus-resteasy-reactive-jackson,即可讓您嘗試通過Jackson集成進行RESTEasy Reactive。
此外,如果需要使用JAX-RS客戶端,則可以使用quarkus-jaxrs-client擴展(這不是聲明性的MicroProfile REST客戶端,而是JAX-RS規(guī)范指定的程序化客戶端)。
應該注意什么?
首先要注意的是,目前暫時將這組擴展視為實驗性的。盡管該項目幾乎通過了JAX-RS TCK的全部,但它只是第一個發(fā)行版,因此請記住,它可能比典型的經(jīng)過戰(zhàn)斗的庫具有更多的錯誤,而某些新的API和SPI可能會損壞。盡管這是第一個發(fā)行版,但我們確實預想這項工作將在不久的將來成為Quarkus的默認REST層。
如新功能部分所述,默認情況下,請求是在事件循環(huán)線程上處理的。這樣可以確保最大的吞吐量,但是也意味著不應在這些線程上執(zhí)行任何阻塞工作。如果您使用Blocking IO(例如,通過使用Hibernate Panache訪問數(shù)據(jù)庫),請確保@Blocking在方法或類上使用注釋。這將確保該請求將在工作線程上得到服務。不用說,我們也非常有興趣聽到您對此默認設置的反饋。
尚無文檔。文檔將在1.11正式版之前添加,并將逐步增強。該電子郵件應包含您入門所需的所有信息,但是如果您遇到任何麻煩,我們可以在任何常用渠道(Zulip聊天,郵件列表,GitHub問題,StackOverflow)上為您提供幫助。
缺少哪些JAX-RS功能?
我們決定專注于現(xiàn)代REST層上大多數(shù)用戶的需求,而不是實現(xiàn)JAX-RS TCK所需的每個功能。因此,就這一點而言,RESTEasy Reactive中不提供XML支持,同時也不支持該規(guī)范的各種奧秘功能
例如:
javax.activation.DataSource
javax.annotation.ManagedBean
javax.ws.rs.core.StreamingOutput
此外,值得注意的是,第一個發(fā)行版將不包含基于新的JAX-RS客戶端(具有專用擴展)的MicroProfile REST客戶端的實現(xiàn)。這很可能在不久的將來改變。
下一步計劃是什么?
盡管新的擴展將隨常規(guī)的1.11版本一起提供,但我們正在考慮1.11.0.Alpha1發(fā)布一個版本,以使您盡可能容易地嘗試新的擴展并提供早期反饋。我們非常期待聽到您在Quarkus中使用RESTEasy Reactive的想法和經(jīng)驗,并計劃充分利用它來進一步改進該項目。
以上就是Quarkus中RESTEasy Reactive集成合并master分支的詳細內(nèi)容,更多關(guān)于RESTEasy Reactive集成合并master的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
淺談Java list.remove( )方法需要注意的兩個坑
這篇文章主要介紹了淺談Java list.remove( )方法需要注意的兩個坑,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-12-12Java ScheduledExecutorService定時任務案例講解
這篇文章主要介紹了Java ScheduledExecutorService定時任務案例講解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下2021-08-08Springboot使用thymeleaf動態(tài)模板實現(xiàn)刷新
這篇文章主要介紹了Springboot使用thymeleaf動態(tài)模板實現(xiàn)刷新,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-08-08如何使用SpringBootCondition更自由地定義條件化配置
這篇文章主要介紹了如何使用SpringBootCondition更自由地定義條件化配置,幫助大家更好的理解和學習使用springboot框架,感興趣的朋友可以了解下2021-04-04