netty java_Netty Java快速指南
netty java
使用Okta的身份管理平臺(tái)輕松部署您的應(yīng)用程序 使用Okta的API在幾分鐘之內(nèi)即可對(duì)任何應(yīng)用程序中的用戶進(jìn)行身份驗(yàn)證,管理和保護(hù)。 今天嘗試Okta。
Netty是一個(gè)無阻塞輸入/輸出(NIO)框架,它使開發(fā)低級(jí)網(wǎng)絡(luò)服務(wù)器和客戶端變得相對(duì)簡單。 Netty為需要在套接字級(jí)別上工作的開發(fā)人員提供了令人難以置信的強(qiáng)大功能,例如在開發(fā)客戶端和服務(wù)器之間的自定義通信協(xié)議時(shí)。 它支持SSL / TLS,具有阻塞和非阻塞統(tǒng)一API,以及靈活的線程模型。 它又快又高效。
Netty的異步,非阻塞I / O模型是為高度可擴(kuò)展的體系結(jié)構(gòu)設(shè)計(jì)的,與類似的阻塞模型相比,它可能允許更高的吞吐量。 基本上,非阻塞服務(wù)器在單個(gè)線程上異步運(yùn)行所有請(qǐng)求(沒有函數(shù)應(yīng)“阻塞”事件循環(huán))。 這與阻塞服務(wù)器模型形成對(duì)比,后者通常在單獨(dú)的線程上運(yùn)行每個(gè)請(qǐng)求。 通過不必在負(fù)載增加時(shí)切換線程或創(chuàng)建新線程,非阻塞模型可以減少開銷,并隨著流量增加而更快地進(jìn)行擴(kuò)展。
但是,所有這些功能都是以復(fù)雜性為代價(jià)的。 非阻塞代碼通常更難閱讀,測試和維護(hù),盡管隨著異步范例的成熟,非阻塞代碼已大大改善。 由于Netty在套接字級(jí)別工作,因此還需要更深入地了解諸如線程循環(huán),字節(jié)緩沖區(qū)和內(nèi)存管理之類的細(xì)節(jié)。
Netty.io團(tuán)隊(duì)做了出色的工作,使Netty的所有功能易于使用,但是它仍然比高級(jí)庫(例如Spring Boot WebFlux)更加復(fù)雜。 那么為什么要使用它呢?
Netty旨在使自定義網(wǎng)絡(luò)協(xié)議的實(shí)現(xiàn)相對(duì)容易。 HTTP很不錯(cuò),但是它是一種通用協(xié)議,基本上適合大多數(shù)情況。 但是,如果您始終在服務(wù)器和客戶端之間來回傳遞自定義的結(jié)構(gòu)化數(shù)據(jù)(大型文件,流媒體,實(shí)時(shí)游戲數(shù)據(jù)等),則可以做得更好。 Netty允許您編寫適合自己特定需求的自己的網(wǎng)絡(luò)協(xié)議,針對(duì)特定情況優(yōu)化流量,而沒有HTTP或FTP之類的不必要開銷。
但是,即使您不打算編寫自己的自定義TCP協(xié)議,也可以使用Netty的功能。 Spring WebFlux是Spring對(duì)非阻塞和React式編程的解答。 它是傳統(tǒng)(阻塞)Spring MVC體系結(jié)構(gòu)的替代方案。 默認(rèn)情況下,Spring Boot WebFlux Starter在嵌入式Netty服務(wù)器上運(yùn)行。 在此配置中,您可以將WebFlux視為基于Netty的NIO套接字優(yōu)勢(shì)構(gòu)建的React性,非阻塞HTTP應(yīng)用程序?qū)印?
在本教程中,您將在Netty中創(chuàng)建一個(gè)基本的“ Hello world”應(yīng)用程序。 接下來,您將在Spring Boot WebFlux中創(chuàng)建相同的“ Hello world”應(yīng)用程序。 最后,您將使用Okta作為OAuth 2.0提供程序?qū)Auth 2.0登錄名添加到應(yīng)用程序中。
安裝項(xiàng)目依賴項(xiàng)
在開始之前,該項(xiàng)目需要安裝一些必需的工具。
Java 11 :該項(xiàng)目使用Java11 。您可以按照OpenJDK網(wǎng)站上的說明或使用SDKMAN來安裝OpenJDK。
HTTPie :這是一個(gè)簡單的命令行實(shí)用程序,用于發(fā)出將用于測試REST應(yīng)用程序的HTTP請(qǐng)求。 Okta開發(fā)人員也喜歡它。 按照其網(wǎng)站上的說明進(jìn)行安裝 。
Okta開發(fā)人員帳戶 :您將Okta用作OAuth / OIDC提供程序,以向應(yīng)用程序添加OAuth2登錄身份驗(yàn)證。 如果尚未注冊(cè)免費(fèi)的Okta開發(fā)者帳戶 ,請(qǐng)注冊(cè)。
您還應(yīng)該繼續(xù)克隆該博客的GitHub存儲(chǔ)庫 。
<
git clone https://github.com/oktadeveloper/okta-netty-webflux-example.git該項(xiàng)目包含三個(gè)子目錄,分別對(duì)應(yīng)于本教程的三個(gè)部分:
使用Netty構(gòu)建HTTP服務(wù)器
HTTP服務(wù)器是HTTP協(xié)議(OSI第7層)的應(yīng)用層實(shí)現(xiàn),因此在Internet堆棧中相對(duì)較高。 如果您正在開發(fā)REST API, 那么您將在為您提供此實(shí)現(xiàn)的API的基礎(chǔ)上進(jìn)行開發(fā) 。 相比之下,Netty并不一定要構(gòu)建通信,提供會(huì)話管理甚至提供像TLS這樣的安全性。 如果您要構(gòu)建超低級(jí)網(wǎng)絡(luò)應(yīng)用程序,那就太好了; 但是,如果您正在構(gòu)建REST服務(wù),則可能不是最佳選擇。
幸運(yùn)的是,Netty API還提供了一些幫助程序類和函數(shù),這些類和函數(shù)使我們能夠輕松集成更高級(jí)別的協(xié)議(例如HTTP)。 在本部分的教程中,您將使用它們來構(gòu)建一個(gè)簡單的HTTP服務(wù)器。
在您喜歡的IDE或文本編輯器中打開netty-hello-world項(xiàng)目。
首先,查看src/main/java/com/okta/netty/AppServer.java文件。 此類是應(yīng)用程序的入口點(diǎn),用于設(shè)置Netty服務(wù)器。
package com.okta.netty; ...public class AppServer { private static final int HTTP_PORT = 8080; public void run() throws Exception { // Create the multithreaded event loops for the serverEventLoopGroup bossGroup = new NioEventLoopGroup(); EventLoopGroup workerGroup = new NioEventLoopGroup(); try { // A helper class that simplifies server configuration ServerBootstrap httpBootstrap = new ServerBootstrap(); // Configure the serverhttpBootstrap.group(bossGroup, workerGroup) .channel(NioServerSocketChannel.class) .childHandler(new ServerInitializer()) // <-- Our handler created here .option(ChannelOption.SO_BACKLOG, 128) .childOption(ChannelOption.SO_KEEPALIVE, true); // Bind and start to accept incoming connections. ChannelFuture httpChannel = httpBootstrap.bind(HTTP_PORT).sync(); // Wait until server socket is closedhttpChannel.channel().closeFuture().sync(); } finally { workerGroup.shutdownGracefully(); bossGroup.shutdownGracefully(); } } public static void main(String[] args) throws Exception { new AppServer().run(); } }最重要的一行是.childHandler(new ServerInitializer()) ,它創(chuàng)建ServerInitializer和ServerHandler并掛接到Netty服務(wù)器。
接下來查看src/main/java/com/okta/netty/ServerInitializer.java 。 此類配置Netty通道,該通道將處理我們的請(qǐng)求并將其連接到ServerHandler 。
package com.okta.netty; ...public class ServerInitializer extends ChannelInitializer<Channel> { @Override protected void initChannel(Channel ch) { ChannelPipeline pipeline = ch.pipeline(); pipeline.addLast(new HttpServerCodec()); pipeline.addLast(new HttpObjectAggregator(Integer.MAX_VALUE)); pipeline.addLast(new ServerHandler()); } }最后,有src/main/java/com/okta/netty/ServerHandler.java 。 這是映射實(shí)際請(qǐng)求并生成響應(yīng)的地方。
package com.okta.netty; ...public class ServerHandler extends SimpleChannelInboundHandler{ @Override protected void channelRead0(ChannelHandlerContext ctx, FullHttpRequest msg) { ByteBuf content = Unpooled.copiedBuffer("Hello World!", CharsetUtil.UTF_8); FullHttpResponse response = new DefaultFullHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK, content); response.headers().set(HttpHeaderNames.CONTENT_TYPE, "text/html"); response.headers().set(HttpHeaderNames.CONTENT_LENGTH, content.readableBytes()); ctx.write(response); ctx.flush(); } }在此類中,請(qǐng)注意,您必須將響應(yīng)字符串轉(zhuǎn)換為字節(jié)緩沖區(qū)。 實(shí)際上,您會(huì)生成一個(gè)HTTP響應(yīng)并直接設(shè)置一些標(biāo)頭。 這是Internet的應(yīng)用層(OSI第7層)。 調(diào)用ctx.write(response) ,它將響應(yīng)作為字節(jié)流通過TCP發(fā)送。 Netty團(tuán)隊(duì)在保持低水平的傳輸協(xié)議的同時(shí),為隱藏大量的復(fù)雜性做了出色的工作。
測試您的Netty應(yīng)用
要測試此Netty應(yīng)用程序,請(qǐng)從項(xiàng)目根目錄netty-hello-world運(yùn)行:
./gradlew run一旦應(yīng)用程序完成了加載,就從另一個(gè)外殼程序中,使用HTTPie執(zhí)行GET請(qǐng)求:
$ http :8080HTTP/1.1 200 OK content-length: 12 content-type: text/htmlHello World!那是Netty內(nèi)置的簡單HTTP服務(wù)器。 接下來,您將爬上梯級(jí)的抽象階梯,并使用Spring Boot和WebFlux簡化操作。
在Netty上向WebFlux打個(gè)招呼
如前所述,WebFlux是Spring MVC的無阻塞替代方案。 它通過事件驅(qū)動(dòng),異步和非阻塞方法來處理請(qǐng)求,從而支持React式編程。 它還提供了許多功能性API。 Reactor是與Spring緊密合作開發(fā)的React性服務(wù)器端Java庫,提供了WebFlux的React流方面。 但是,您也可以使用其他React式流庫。
回想一下,默認(rèn)情況下,Spring Boot WebFlux啟動(dòng)程序在Netty服務(wù)器上運(yùn)行。 在下一個(gè)示例中,您會(huì)注意到Spring Boot隱藏了多少復(fù)雜性。
Spring Boot WebFlux項(xiàng)目位于GitHub存儲(chǔ)庫的webflux-hello-world子目錄中。 非常簡單。
看一看ReactiveApplication類。 這是準(zhǔn)系統(tǒng)的標(biāo)準(zhǔn)Spring Boot應(yīng)用程序類。 它只是利用public static void main()方法和@SpringBootApplication來啟動(dòng)整個(gè)Spring Boot應(yīng)用程序框架。
src/main/java/com/okta/webflux/app/ReactiveApplication.java
package com.okta.webflux.app; ... @SpringBootApplication public class ReactiveApplication { public static void main(String[] args) { SpringApplication.run(ReactiveApplication.class, args); } }ReactiveRouter是一個(gè)簡單的路由器類,它將HTML端點(diǎn)與處理程序方法鏈接在一起。 您可以看到它使用依賴注入將ReactiveHandler傳遞給路由器bean,該bean為/路由定義了一個(gè)端點(diǎn)。
src/main/java/com/okta/webflux/app/ReactiveRouter.java
package com.okta.webflux.app; ...@Configuration public class ReactiveRouter { @Bean public RouterFunctionroute(ReactiveHandler handler) { return RouterFunctions .route(RequestPredicates .GET("/") .and(RequestPredicates.accept(MediaType.TEXT_PLAIN)), handler::hello); } }ReactiveHandler同樣簡單。 它定義了一個(gè)返回純文本的處理函數(shù)。 Mono<ServerResponse>返回類型是一種特殊類型,用于返回一個(gè)元素的流。 查看有關(guān)了解React類型的Spring文檔,以了解有關(guān)返回類型的更多信息。 如果您習(xí)慣使用Spring MVC,則這可能是WebFlux更不熟悉的方面之一。
package com.okta.webflux.app; ...@Component public class ReactiveHandler { public Mono<ServerResponse> hello() { return ServerResponse .ok() .contentType(MediaType.TEXT_PLAIN) .body(BodyInserters.fromObject("Hello world!")); } }打開一個(gè)外殼,然后導(dǎo)航到項(xiàng)目的webflux-hello-world子目錄。
使用以下項(xiàng)目運(yùn)行項(xiàng)目: ./gradlew bootRun 。
打開另一個(gè)外殼以使用http :8080測試端點(diǎn)。
HTTP/1.1 200 OK Content-Length: 12 Content-Type: text/plainHello world!看到使用Spring Boot比Netty簡單多少?
創(chuàng)建一個(gè)OpenID Connect(OIDC)應(yīng)用程序
接下來,您將使用OAuth 2.0登錄名來保護(hù)應(yīng)用程序。 這聽起來可能很復(fù)雜,但是不用擔(dān)心。 Spring和Okta密謀使其變得非常簡單!
Okta是SaaS(軟件即服務(wù))身份驗(yàn)證和授權(quán)提供者。 我們?yōu)殚_發(fā)人員提供免費(fèi)帳戶,因此您可以輕松開發(fā)OIDC應(yīng)用程序。 前往developer.okta.com并注冊(cè)一個(gè)帳戶。
驗(yàn)證電子郵件后,登錄并執(zhí)行以下步驟(如果這是您第一次登錄,則可能需要單擊黃色的“ 管理”按鈕才能進(jìn)入開發(fā)人員儀表板):
- 轉(zhuǎn)到應(yīng)用程序 > 添加應(yīng)用程序 。
- 選擇應(yīng)用程序類型Web ,然后單擊下一步 。
- 為應(yīng)用命名。 我將其命名為“ WebFlux OAuth”。
- 在登錄重定向URI下, 將值更改為http://localhost:8080/login/oauth2/code/okta 。 其余的默認(rèn)值將起作用。
- 單擊完成 。
請(qǐng)注意底部的客戶端ID和客戶端密鑰 。 稍后您將需要它們。
使用OAuth 2.0保護(hù)您的應(yīng)用安全
在Okta上創(chuàng)建OIDC應(yīng)用程序后,需要在項(xiàng)目中進(jìn)行一些更新。 如果您想跳過本部分教程的完成項(xiàng)目,可以在webflux-oauth2login子目錄中找到,但是我將向您展示如何修改webflux-hello-world以添加login 。
首先,將Okta Spring Boot Starter添加到Gradle構(gòu)建文件中。 我們一直在努力使這一過程盡可能容易,并且Okta Spring Boot Starter簡化了OAuth配置。 看看入門的GitHub項(xiàng)目,了解更多信息。
將以下依賴項(xiàng)添加到build.gradle文件的依賴項(xiàng)塊中:
dependencies { ...implementation 'com.okta.spring:okta-spring-boot-starter:1.3.0' }接下來,將以下屬性添加到src/main/resources/application.properties文件。 您需要將括號(hào)中的值替換為您自己的Okta域和客戶端ID。
您可以通過打開Okta開發(fā)人員儀表板并轉(zhuǎn)到API > 授權(quán)服務(wù)器并在默認(rèn)服務(wù)器的表中查找來找到您的Issuer URI。 客戶端ID和機(jī)密來自您剛才創(chuàng)建的OIDC應(yīng)用程序。
okta.oauth2.issuer={yourIssuerUri} okta.oauth2.client-id={yourClientId} okta.oauth2.client-secret={yourClientSecret}現(xiàn)在運(yùn)行應(yīng)用程序: ./gradlew bootRun 。
注銷您的Okta開發(fā)人員帳戶或使用隱身窗口并瀏覽至(在瀏覽器中): http:// localhost:8080 。
系統(tǒng)將指導(dǎo)您使用Okta帳戶登錄。
登錄后,您將被重定向回該應(yīng)用程序。 是的-成功!
了解有關(guān)Netty,Spring Boot和OAuth 2.0的更多信息
在本教程中,您使用Netty創(chuàng)建了一個(gè)基本的“ Hello world”應(yīng)用程序。 您已經(jīng)看到Netty是一個(gè)用于創(chuàng)建TCP和UDP網(wǎng)絡(luò)協(xié)議的超強(qiáng)大框架。 您已經(jīng)了解了它如何支持非阻塞IO,以及Spring WebFlux如何在Netty之上構(gòu)建以提供React性,非阻塞HTTP應(yīng)用程序框架。 然后,您在WebFlux中構(gòu)建了一個(gè)“ Hello world”應(yīng)用程序,此后,您使用Okta作為OAuth 2.0 / OIDC提供程序來向該應(yīng)用程序添加OAuth 2.0登錄名。
您可以在oktadeveloper / okta-netty-webflux-example上在GitHub上查看本教程的完整代碼。
除了WebFlux,在Netty之上還構(gòu)建了一些強(qiáng)大的網(wǎng)絡(luò)框架。 Apple最近開放了ServiceTalk的源代碼, ServiceTalk是一個(gè)支持HTTP,HTTP / 2和gRPC的React性微服務(wù)客戶端/服務(wù)器庫。 還有一個(gè)Armeria ,一個(gè)基于Java 8,Netty,Thrift和gRPC構(gòu)建的開源異步HTTP / 2 RPC / REST客戶端/服務(wù)器庫。 它的主要目標(biāo)是幫助工程師構(gòu)建高性能的異步微服務(wù)。
如果您想了解有關(guān)Spring Boot,Spring WebFlux和OAuth 2.0的更多信息,請(qǐng)查看以下有用的教程:
- Spring Boot,OAuth 2.0和Okta入門
- 使用Spring WebFlux構(gòu)建React性API
- OAuth到底是什么?
- Spring Security 5.0和OIDC入門
- 身份,聲明和令牌– OpenID Connect入門,第1部分,共3部分
- 使用Spring Boot和GraphQL構(gòu)建安全的API
如果您對(duì)此帖子有任何疑問,請(qǐng)?jiān)谙旅嫣砑釉u(píng)論。 有關(guān)更多精彩內(nèi)容, 請(qǐng)?jiān)赥witter上關(guān)注@oktadev或訂閱我們的YouTube頻道 !
使用Okta的身份管理平臺(tái)輕松部署您的應(yīng)用程序 使用Okta的API在幾分鐘之內(nèi)即可對(duì)任何應(yīng)用程序中的用戶進(jìn)行身份驗(yàn)證,管理和保護(hù)。 今天嘗試Okta。
翻譯自: https://www.javacodegeeks.com/2020/01/a-quick-guide-to-java-on-netty.html
netty java
總結(jié)
以上是生活随笔為你收集整理的netty java_Netty Java快速指南的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 也组词 也组词有哪些
- 下一篇: 多的近义词 多的近义词有哪些