日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
云原生Java框架-Micronaut

云原生Java框架-Micronaut

譯文 精選
作者: 陳峻 2022-07-26 06:50:02

云計(jì)算

云原生 本文先介紹Micronaut的基本特點(diǎn),然后從一個(gè)簡(jiǎn)單的基于RESTful API的應(yīng)用開(kāi)始,將其重構(gòu)為反應(yīng)式非阻塞IO(reactive non-blocking IO,NIO),并介紹Micronaut如何支持基于微服務(wù)和無(wú)服務(wù)器架構(gòu)的云原生開(kāi)發(fā)。

譯者 | 陳峻

審校 | 孫淑娟

長(zhǎng)期以來(lái),Spring框架一直主導(dǎo)著后端Java的開(kāi)發(fā),但是以Micronaut、Quarkus、以及Dropwizard為代表的新型云原生Java框架正在不斷流行。其中,Micronaut是一種令人耳目一新的替代方案。它是由構(gòu)建Grails(譯者注:Grails是一套用于快速Web應(yīng)用開(kāi)發(fā)的開(kāi)源框架)的團(tuán)隊(duì),專為現(xiàn)代化架構(gòu)而設(shè)計(jì)開(kāi)發(fā)的。

本文先介紹Micronaut的基本特點(diǎn),然后從一個(gè)簡(jiǎn)單的基于RESTful API的應(yīng)用開(kāi)始,將其重構(gòu)為反應(yīng)式非阻塞IO(reactive non-blocking IO,NIO),并介紹Micronaut如何支持基于微服務(wù)和無(wú)服務(wù)器架構(gòu)的云原生開(kāi)發(fā)。

Micronaut的特征

Micronaut提供了從Spring和Grails等傳統(tǒng)框架處繼承來(lái)的大量?jī)?yōu)勢(shì),其中的一項(xiàng)被稱為“原生云原生(natively cloud native)”,即:為云環(huán)境從頭開(kāi)始構(gòu)建。它的云原生能力包括:環(huán)境檢測(cè)、服務(wù)發(fā)現(xiàn)、以及分布式跟蹤等。

同時(shí),Micronaut提供了一個(gè)全新的控制反轉(zhuǎn)(inversion-of-control,IoC)容器。該容器能夠使用提前(ahead-of-time,AoT)編譯,來(lái)加快啟動(dòng)速度。此處的AoT是指,啟動(dòng)時(shí)間不會(huì)隨著代碼庫(kù)的增多而增加。這對(duì)于無(wú)服務(wù)器和基于容器的部署來(lái)說(shuō),是尤其重要的。畢竟,在這些部署中,節(jié)點(diǎn)通常會(huì)按需進(jìn)行關(guān)閉和啟動(dòng)。

作為一個(gè)多語(yǔ)言JVM框架,Micronaut目前支持Java、Groovy和Kotlin,并且即將支持Scala。

此外,Micronaut也支持響應(yīng)式編程。開(kāi)發(fā)人員可以在該框架內(nèi),使用ReactiveX或Reactor。其實(shí),從 2021年7月發(fā)布的Micronaut 3開(kāi)始,Reactor已被推薦使用了。值得注意的是,其新版本并沒(méi)有將響應(yīng)式庫(kù)作為傳遞式依賴項(xiàng)。

1.開(kāi)始使用Micronaut  

我們可以通過(guò)SDKMan,將Micronaut輕松地安裝在包括Linux和macOS在內(nèi)的任何基于Unix的系統(tǒng)上。如果您使用的是Windows,那么請(qǐng)下載Micronaut的二進(jìn)制文件,并將其添加到合適的路徑中。

在安裝完成后,您可以在命令行中看到mn工具的提示符。也就是說(shuō),通過(guò)打開(kāi)一個(gè)Shell,并定位到合適的位置,您便可以鍵入:mn create-app micronaut-idg --build maven。

Micronaut通過(guò)包裝器(wrapper)來(lái)支持Gradle和Maven。這免去了自行安裝和構(gòu)建工具的繁瑣。注意,如果您喜歡使用Gradle的話,請(qǐng)不要在上述命令中使用--build maven。  

如果您使用mvnw mn:run命令來(lái)運(yùn)行服務(wù)器,并在瀏覽器中輸入http://localhost:8080/,那么您可能會(huì)看到一個(gè)默認(rèn)為“未找到(not found)”的JSON響應(yīng)。對(duì)此,讓我們來(lái)研究一下該示例項(xiàng)目的布局。它是一個(gè)標(biāo)準(zhǔn)的Maven項(xiàng)目。其main類位于src/main/java/micronaut/idg/Application.java中。請(qǐng)注意,該main類是以一個(gè)嵌入式服務(wù)器運(yùn)行的。當(dāng)您更改代碼時(shí),Micronaut開(kāi)發(fā)服務(wù)器會(huì)自動(dòng)更新正在運(yùn)行的應(yīng)用程序。

2.添加一個(gè)Micronaut控制器  

就像在Spring的MVC 中一樣,您可以添加各種控制器類(controller class),將URL映射到代碼處理器(handler)上。例如,您可以在src/main/java/micronaut/idg/controller/SimpleController上添加一個(gè)類。如下面的清單1所示,我們使用該控制器來(lái)創(chuàng)建一個(gè)文本響應(yīng)。

清單1. 使用Micronaut控制器

package micronaut.idg.controller; 

import io.micronaut.http.MediaType;
import io.micronaut.http.annotation.Controller;
import io.micronaut.http.annotation.Get;

@Controller("/simple")
public class SimpleController {

@Get(produces = MediaType.TEXT_PLAIN)
public String index() {
return "A Simple Endpoint";
}
}

如下面的清單2所示,它能夠容易地返回一個(gè)JSON格式的響應(yīng)。

清單2. JSON格式的響應(yīng)

package micronaut.idg.controller; 

import io.micronaut.http.MediaType;
import io.micronaut.http.annotation.Controller;
import io.micronaut.http.annotation.Get;

import java.util.Map;
import java.util.HashMap;

@Controller("/simple")
public class SimpleController {

@Get(produces = MediaType.APPLICATION_JSON)
public Map index() {
Map msg = new HashMap();
msg.put("message", "A simple message");
return msg;

}
}

清單2演示了Micronaut針對(duì)@Get注解的produces參數(shù)所進(jìn)行的智能處理。在這種情況下,它會(huì)發(fā)送我們已設(shè)置好的JSON格式的響應(yīng)。

3.添加Micronaut服務(wù)層  

由于能夠預(yù)運(yùn)行,因此Micronaut的IoC實(shí)現(xiàn)在底層是唯一的。當(dāng)然,它仍然屬于CDI(Contexts and Dependency Injection,上下文和依賴注入)規(guī)范的完整實(shí)現(xiàn)。這就意味著您可以使用從Spring中(如@Inject)獲悉的所有類似DI的注釋。

在下面的清單3中,我們將連接一個(gè)服務(wù)層的bean,以提供消息。在實(shí)際的應(yīng)用程序中,這個(gè)類可以通過(guò)一個(gè)數(shù)據(jù)訪問(wèn)bean,來(lái)調(diào)用數(shù)據(jù)存儲(chǔ)或其他遠(yuǎn)程的API。例如,我們可以創(chuàng)建一個(gè)src/main/java/micronaut/idg/service文件夾,并添加如清單3所示的兩個(gè)文件——一個(gè)接口(Simple)、及其實(shí)現(xiàn)(SimpleService)。

清單3. 創(chuàng)建一個(gè)簡(jiǎn)單的服務(wù)層bean

// Simple.java 
package micronaut.idg.service;

public interface Simple {
public String getMessage();

}

// SimpleService.java
package micronaut.idg.service;

import jakarta.inject.Singleton;

@Singleton
public class SimpleService implements Simple {
public String getMessage(){
return "A simple service message";

}
}

現(xiàn)在,您可以通過(guò)將服務(wù)注入在清單1中創(chuàng)建的SimpleController服務(wù),來(lái)使用新的服務(wù)層。下面的清單4展示了Constructor的注入。

清單4. 將服務(wù)bean注入控制器

@Controller("/simple") 
public class SimpleController {

@Inject
private final Simple simpleService;

public SimpleController(@Named("simpleService") Simple simple) { //(1)
thi.simpleService = simple;

}

@Get(produces = MediaType.APPLICATION_JSON)
public Map index() {
Map msg = new HashMap();
msg.put("message", simpleService.getMessage());
return msg;
}
}

關(guān)鍵性任務(wù)是在注釋1處完成的,其中服務(wù)bean是按照名稱完成了連接。至此,如果您去訪問(wèn)http://localhost:8080/simple,就能夠看到來(lái)自服務(wù)層的響應(yīng):{"message":"A simple service message"}。  

4.使用Micronaut的反應(yīng)式NIO  

接下來(lái),讓我們來(lái)討論Micronaut與Reactor的結(jié)合使用。在這種情況下,我們將重構(gòu)當(dāng)前的應(yīng)用程序,以使用Reactor和非阻塞IO。該應(yīng)用程序雖然仍執(zhí)行相同的任務(wù),但是在后臺(tái)會(huì)使用非阻塞?!猂eactor和Netty。

如前文所述,Micronaut 3默認(rèn)是不包含響應(yīng)式庫(kù)的,因此,正如下面的清單5所示,我們首先需要將Reactor核心添加到Maven的POM處。

清單5. 將Reactor添加到pom.xml

 
io.projectreactor
reactor-core
3.4.11

如下面的清單6所示,您可以對(duì)返回的SimpleController進(jìn)行修改。

清單6. 使控制器非阻塞

import reactor.core.publisher.Mono; 

//...

@Get
public Mono index() {
Map msg = new HashMap();
msg.put("message", simpleService.getMessage());
return Mono.just(msg);
}
}

如您所見(jiàn),我們只是使用Reactor的Mono類,包裝了相同的返回類型(即,string/strin的映射)。

在反應(yīng)方式中,由于使用遠(yuǎn)程服務(wù)也能夠得到類似的支持,因此您完全可以在非阻塞IO上運(yùn)行應(yīng)用程序。

5.使用Micronaut的CLI創(chuàng)建新的組件  

您也可以使用Micronaut的命令行工具(CLI),來(lái)stub out各種組件。例如,如果你想添加一個(gè)新的控制器,那么可以使用命令:mn add-controller MyController。如下面的清單7所示,它將輸出一個(gè)新的控制器、及其對(duì)應(yīng)的測(cè)試。  

清單7. 使用Micronaut命令行創(chuàng)建一個(gè)新的控制器

mn create-controller MyController 
| Rendered controller to src/main/java/micronaut/idg/MyControllerController.java
| Rendered test to src/test/java/micronaut/idg/MyControllerControllerTest.java

6.使用Micronaut進(jìn)行云原生開(kāi)發(fā)  

如前文所述,Micronaut是為云原生微服務(wù)和無(wú)服務(wù)器的開(kāi)發(fā)而構(gòu)建的。Micronaut支持一種所謂聯(lián)合(federation)的云原生概念。此處的聯(lián)合是指,幾個(gè)較小的應(yīng)用程序共享相同的設(shè)置,并且可以實(shí)現(xiàn)串聯(lián)部署。這聽(tīng)起來(lái)像極了微服務(wù)架構(gòu),其目的就是為了使得微服務(wù)的開(kāi)發(fā)更簡(jiǎn)單,并能夠保持可管理性。有關(guān)聯(lián)合服務(wù)的更多信息,請(qǐng)參閱Micronaut的相關(guān)文檔。

此外,Micronaut還可以輕松地針對(duì)云環(huán)境實(shí)現(xiàn)部署。如下面的清單8 所示,您可以部署Google Cloud Platform(GCP)的Docker存儲(chǔ)庫(kù)。  

清單8. 使用GCP的Docker存儲(chǔ)庫(kù)部署Micronaut應(yīng)用

./mvnw deploy \ 
-Dpackaging=docker \
-Djib.to.image=gcr.io/my-org/my-project:latest

在這種情況下,該項(xiàng)目會(huì)被作為Docker鏡像,推送到GCP的Docker存儲(chǔ)庫(kù)處。請(qǐng)注意,我們?cè)诖擞玫搅薐ib Maven插件。它能夠?qū)ava項(xiàng)目轉(zhuǎn)換為Docker鏡像,而無(wú)需您創(chuàng)建實(shí)際的Docker文件。  

此外,我們已經(jīng)將Docker標(biāo)識(shí)為帶有-Dpackaging=docker的打包工具,一旦打包完成,您便可以像下面的清單9那樣,使用GCP命令行工具,去部署自己的項(xiàng)目。  

清單9. 從命令行處運(yùn)行Docker鏡像

gcloud run deploy \ 
--image=gcr.io/my-org/my-project:latest \
--platform managed \
--allow-unauthenticated

Micronaut支持的另一種云原生功能是:跟蹤。例如,Micronaut通過(guò)各種注釋,使得啟用Jaeger的分布式跟蹤,變得相當(dāng)簡(jiǎn)單。  

如下面的清單10所示,我們可以將Jaeger配置為跟蹤微服務(wù)應(yīng)用程序application.xml文件中的所有請(qǐng)求。

清單10. application.xml中的Jaeger配置

tracing: 
jaeger:
enabled: true
sampler:
probability: 1

7.小結(jié)  

Micronaut提供了一系列非常適合云原生和微服務(wù)開(kāi)發(fā)的功能。同時(shí),該框架更適合讓傳統(tǒng)的、基于API的開(kāi)發(fā),變得簡(jiǎn)單明了。此外,它還可以與反應(yīng)式NIO的Reactor和Netty進(jìn)行很好的集成。

原文鏈接:https://www.infoworld.com/article/3658968/intro-to-micronaut-a-cloud-native-java-framework.html

譯者介紹

陳峻 (Julian Chen),51CTO社區(qū)編輯,具有十多年的IT項(xiàng)目實(shí)施經(jīng)驗(yàn),善于對(duì)內(nèi)外部資源與風(fēng)險(xiǎn)實(shí)施管控,專注傳播網(wǎng)絡(luò)與信息安全知識(shí)與經(jīng)驗(yàn);持續(xù)以博文、專題和譯文等形式,分享前沿技術(shù)與新知;經(jīng)常以線上、線下等方式,開(kāi)展信息安全類培訓(xùn)與授課。


新聞標(biāo)題:云原生Java框架-Micronaut
本文來(lái)源:http://www.5511xx.com/article/dhgpoij.html