Micronaut FAQ

2023-03-15 11:10 更新

以下部分涵蓋了您在考慮使用或使用 Micronaut 時(shí)可能會(huì)問(wèn)到的常見(jiàn)問(wèn)題。

Micronaut 會(huì)修改我的字節(jié)碼嗎?

不,你的類(lèi)就是你的類(lèi)。Micronaut不會(huì)轉(zhuǎn)換類(lèi),也不會(huì)修改從你寫(xiě)的代碼中生成的字節(jié)碼。Micronaut在編譯時(shí)產(chǎn)生額外的類(lèi),與你原來(lái)未修改的類(lèi)在同一個(gè)包中。

為什么 Micronaut 不使用 Spring?

當(dāng)問(wèn)到為什么 Micronaut 不使用 Spring 時(shí),通常是指 Spring 依賴注入容器。

Spring 生態(tài)系統(tǒng)非常廣泛,您可以在 Micronaut 中直接使用許多 Spring 庫(kù),而無(wú)需 Spring 容器。

Micronaut 具有自己的原生 JSR-330 兼容依賴注入的原因是 Spring(以及任何基于反射的 DI/AOP 容器)中這些功能的成本在內(nèi)存消耗和對(duì)啟動(dòng)時(shí)間的影響方面太大了。為了在運(yùn)行時(shí)支持依賴注入,Spring:

  • 讀取它在運(yùn)行時(shí)找到的每個(gè) bean 的字節(jié)碼。

  • 為每個(gè) bean 方法、構(gòu)造函數(shù)、字段等上的每個(gè)注釋合成新注釋以支持注釋元數(shù)據(jù)。

  • 為每個(gè)方法、構(gòu)造函數(shù)、字段等的每個(gè) bean 構(gòu)建反射元數(shù)據(jù)。

結(jié)果是隨著您的應(yīng)用程序包含更多功能,啟動(dòng)時(shí)間和內(nèi)存消耗逐漸減少。

對(duì)于啟動(dòng)時(shí)間和內(nèi)存消耗保持低水平至關(guān)重要的微服務(wù)和無(wú)服務(wù)器功能,上述行為是使用 Spring 容器的不良現(xiàn)實(shí),因此 Micronaut 的設(shè)計(jì)者選擇不使用 Spring。

Micronaut 支持 Scala 嗎?

Micronaut 支持任何支持注釋處理器 API 的 JVM 語(yǔ)言。 Scala 目前不支持這個(gè) API。但是,Groovy 也不支持此 API,并且已經(jīng)構(gòu)建了處理 Groovy AST 的特殊支持。如果構(gòu)建類(lèi)似于 inject-groovy 的模塊,將來(lái)在技術(shù)上可能會(huì)支持 Scala,但在撰寫(xiě)本文時(shí),Scala 尚不支持。

Micronaut 可以用于微服務(wù)以外的目的嗎?

是的。 Micronaut 是非常模塊化的,您可以通過(guò)在應(yīng)用程序中包含 micronaut-inject-java(或 micronaut-inject-groovy for Groovy)依賴項(xiàng)來(lái)選擇僅使用依賴注入和 AOP 實(shí)現(xiàn)。

事實(shí)上,Micronaut 對(duì)無(wú)服務(wù)器計(jì)算的支持正是使用了這種方法。

Micronaut 的 Dependency Injection 和 AOP 實(shí)現(xiàn)有什么優(yōu)勢(shì)?

Micronaut 在編譯時(shí)處理您的類(lèi)并生成所有元數(shù)據(jù)。這消除了對(duì)反射、緩存反射元數(shù)據(jù)的需要,以及在運(yùn)行時(shí)分析類(lèi)的要求,所有這些都會(huì)導(dǎo)致啟動(dòng)性能變慢和內(nèi)存消耗增加。

此外,Micronaut 在編譯時(shí)構(gòu)建無(wú)反射 AOP 代理,從而提高性能、減少堆棧跟蹤大小并減少內(nèi)存消耗。

為什么 Micronaut 有自己的 Consul 和 Eureka 客戶端實(shí)現(xiàn)?

現(xiàn)有的大多數(shù) Consul 和 Eureka 客戶端都是阻塞的,并且包含許多使 JAR 文件膨脹的外部依賴項(xiàng)。

Micronaut 的 DiscoveryClient 使用 Micronaut 的原生 HTTP 客戶端,大大減少了對(duì)外部依賴的需求,并在兩個(gè)發(fā)現(xiàn)服務(wù)器上提供了一個(gè)反應(yīng)式 API。

為什么我在加載 bean (Groovy) 時(shí)遇到 NoSuchMethodError?

Groovy 默認(rèn)導(dǎo)入 groovy.lang 包中的類(lèi),包括一個(gè)名為 @Singleton 的類(lèi),這是一個(gè) AST 轉(zhuǎn)換類(lèi),它通過(guò)添加私有構(gòu)造函數(shù)和靜態(tài)檢索方法使您的類(lèi)成為單例。這個(gè)注釋很容易與用于在 Micronaut 中定義單例 bean 的 javax.inject.Singleton 注釋混淆。確保在 Groovy 類(lèi)中使??用正確的注解。

為什么啟動(dòng)應(yīng)用程序花費(fèi)的時(shí)間比應(yīng)有的時(shí)間長(zhǎng)得多

Micronaut 的啟動(dòng)時(shí)間通常非???。但是,在應(yīng)用程序級(jí)別,可能會(huì)影響啟動(dòng)時(shí)間。如果您看到啟動(dòng)緩慢,請(qǐng)查看任何啟動(dòng)緩慢的應(yīng)用程序啟動(dòng)偵聽(tīng)器或 @Context 范圍 bean。

一些網(wǎng)絡(luò)問(wèn)題也可能導(dǎo)致啟動(dòng)緩慢。例如,在 Mac 上,錯(cuò)誤配置 /etc/hosts 文件可能會(huì)導(dǎo)致問(wèn)題。請(qǐng)參閱以下 stackoverflow 答案。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)