<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          替代 Spring Boot 的其它5種微服務(wù)框架,你了解了嗎?

          共 15922字,需瀏覽 32分鐘

           ·

          2021-08-11 01:12

          前言

          在 Java 和 Kotlin 中, 除了使用Spring Boot創(chuàng)建微服務(wù)外,還有很多其他的替代方案。

          名稱版本發(fā)布時(shí)間開(kāi)發(fā)商GitHub
          Helidon SE1.4.12019年甲骨文鏈接
          Ktor1.3.02018年JetBrains鏈接
          Micronaut1.2.92018年Object Computing鏈接
          Quarkus1.2.02019年Red Hat鏈接
          Spring Boot2.2.42014年Pivotal鏈接

          本文,基于這些微服務(wù)框架,創(chuàng)建了五個(gè)服務(wù),并使用Consul的服務(wù)發(fā)現(xiàn)模式實(shí)現(xiàn)服務(wù)間的 相互通信。因此,它們形成了異構(gòu)微服務(wù)架構(gòu)(Heterogeneous Microservice Architecture, 以下簡(jiǎn)稱 MSA):

          本文簡(jiǎn)要考慮了微服務(wù)在各個(gè)框架上的實(shí)現(xiàn)(更多細(xì)節(jié)請(qǐng)查看源代碼:https : //github.com/rkudryashov/heterogeneous-microservices)

          技術(shù)棧:

          • JDK 13

          • Kotlin

          • Gradle (Kotlin DSL)

          • JUnit 5


            功能接口(HTTP API):

            • — 返回logo信息

            • — 返回微服務(wù)的一些基本信息(名稱、框架、發(fā)布年份)

            • GET /application-info{?request-to=some-service-name}

            • GET /application-info/logo

          • 實(shí)現(xiàn)方式:

            • 使用文本文件的配置方式

            • 使用依賴注入

            • HTTP API


          • MSA:

            • 使用服務(wù)發(fā)現(xiàn)模式(在Consul中注冊(cè),通過(guò)客戶端負(fù)載均衡的名稱請(qǐng)求另一個(gè)微服務(wù)的HTTP API)

            • 構(gòu)建一個(gè) uber-JAR

          先決條件

          • JDK 13

          • Consul

          從頭開(kāi)始創(chuàng)建應(yīng)用程序

          要基于其中一個(gè)框架上生成新項(xiàng)目,你可以使用web starter 或其他選項(xiàng)(例如,構(gòu)建工具或 IDE):

          名稱Web starter指南支持的開(kāi)發(fā)語(yǔ)言
          Helidon鏈接(MP)鏈接(SE) 鏈接(MP)Java,Kotlin
          Ktor鏈接鏈接Kotlin
          Micronaut鏈接鏈接Groovy、Java、Kotlin
          Quarkus鏈接鏈接Java、Kotlin、Scala
          Spring Boot鏈接鏈接Groovy、Java、Kotlin

          Helidon服務(wù)

          該框架是在 Oracle 中創(chuàng)建以供內(nèi)部使用,隨后成為開(kāi)源。Helidon 非常簡(jiǎn)單和快捷,它提供了兩個(gè)版本:標(biāo)準(zhǔn)版(SE)和MicroProfile(MP)。在這兩種情況下,服務(wù)都是一個(gè)常規(guī)的 Java SE 程序。(在Helidon上了解更多信息)

          Helidon MP 是 Eclipse MicroProfile的實(shí)現(xiàn)之一,這使得使用許多 API 成為可能,包括 Java EE 開(kāi)發(fā)人員已知的(例如 JAX-RS、CDI等)和新的 API(健康檢查、指標(biāo)、容錯(cuò)等)。在 Helidon SE 模型中,開(kāi)發(fā)人員遵循“沒(méi)有魔法”的原則,例如,創(chuàng)建應(yīng)用程序所需的注解數(shù)量較少或完全沒(méi)有。

          Helidon SE 被選中用于微服務(wù)的開(kāi)發(fā)。因?yàn)镠elidon SE 缺乏依賴注入的手段,因此為此使用了Koin。

          以下代碼示例,是包含 main 方法的類。為了實(shí)現(xiàn)依賴注入,該類繼承自KoinComponent。

          首先,Koin 啟動(dòng),然后初始化所需的依賴并調(diào)用startServer()方法—-其中創(chuàng)建了一個(gè)WebServer類型的對(duì)象,應(yīng)用程序配置和路由設(shè)置傳遞到該對(duì)象;

          啟動(dòng)應(yīng)用程序后在Consul注冊(cè):

          object HelidonServiceApplication : KoinComponent {
          @JvmStatic fun main(args: Array<String>) { val startTime = System.currentTimeMillis() startKoin { modules(koinModule) }
          val applicationInfoService: ApplicationInfoService by inject() val consulClient: Consul by inject() val applicationInfoProperties: ApplicationInfoProperties by inject() val serviceName = applicationInfoProperties.name
          startServer(applicationInfoService, consulClient, serviceName, startTime) }}
          fun startServer( applicationInfoService: ApplicationInfoService, consulClient: Consul, serviceName: String, startTime: Long): WebServer { val serverConfig = ServerConfiguration.create(Config.create().get("webserver"))
          val server: WebServer = WebServer .builder(createRouting(applicationInfoService)) .config(serverConfig) .build()
          server.start().thenAccept { ws -> val durationInMillis = System.currentTimeMillis() - startTime log.info("Startup completed in $durationInMillis ms. Service running at: http://localhost:" + ws.port()) // register in Consul consulClient.agentClient().register(createConsulRegistration(serviceName, ws.port())) }
          return server

          路由配置如下:

          private fun createRouting(applicationInfoService: ApplicationInfoService) = Routing.builder()    .register(JacksonSupport.create())    .get("/application-info", Handler { req, res ->        val requestTo: String? = req.queryParams()            .first("request-to")            .orElse(null)
          res .status(Http.ResponseStatus.create(200)) .send(applicationInfoService.get(requestTo)) }) .get("/application-info/logo", Handler { req, res -> res.headers().contentType(MediaType.create("image", "png")) res .status(Http.ResponseStatus.create(200)) .send(applicationInfoService.getLogo()) }) .error(Exception::class.java) { req, res, ex -> log.error("Exception:", ex) res.status(Http.Status.INTERNAL_SERVER_ERROR_500).send() } .build()

          該應(yīng)用程序使用HOCON格式的配置文件:

          webserver {  port: 8081}
          application-info { name: "helidon-service" framework { name: "Helidon SE" release-year: 2019 }}

          還可以使用 JSON、YAML 和properties 格式的文件進(jìn)行配置(在Helidon 配置文檔中了解更多信息)。

          Ktor服務(wù)

          該框架是為 Kotlin 編寫(xiě)和設(shè)計(jì)的。和 Helidon SE 一樣,Ktor 沒(méi)有開(kāi)箱即用的 DI,所以在啟動(dòng)服務(wù)器依賴項(xiàng)之前應(yīng)該使用 Koin 注入:

          val koinModule = module {    single { ApplicationInfoService(get(), get()) }    single { ApplicationInfoProperties() }    single { ServiceClient(get()) }    single { Consul.builder().withUrl("https://localhost:8500").build() }}
          fun main(args: Array<String>) { startKoin { modules(koinModule) } val server = embeddedServer(Netty, commandLineEnvironment(args)) server.start(wait = true)}

          應(yīng)用程序需要的模塊在配置文件中指定(HOCON格式;更多配置信息參考Ktor配置文檔 ),其內(nèi)容如下:

          ktor {  deployment {    host = localhost    port = 8082    environment = prod    // for dev purpose    autoreload = true    watch = [io.heterogeneousmicroservices.ktorservice]  }  application {    modules = [io.heterogeneousmicroservices.ktorservice.module.KtorServiceApplicationModuleKt.module]  }}
          application-info { name: "ktor-service" framework { name: "Ktor" release-year: 2018 }}

          在 Ktor 和 Koin 中,術(shù)語(yǔ)“模塊”具有不同的含義。

          在 Koin 中,模塊類似于 Spring 框架中的應(yīng)用程序上下文。Ktor的模塊是一個(gè)用戶定義的函數(shù),它接受一個(gè) Application類型的對(duì)象,可以配置流水線、注冊(cè)路由、處理請(qǐng)求等:

          fun Application.module() {    val applicationInfoService: ApplicationInfoService by inject()
          if (!isTest()) { val consulClient: Consul by inject() registerInConsul(applicationInfoService.get(null).name, consulClient) }
          install(DefaultHeaders) install(Compression) install(CallLogging) install(ContentNegotiation) { jackson {} }
          routing { route("application-info") { get { val requestTo: String? = call.parameters["request-to"] call.respond(applicationInfoService.get(requestTo)) } static { resource("/logo", "logo.png") } } }}

          此代碼是配置請(qǐng)求的路由,特別是靜態(tài)資源logo.png。

          下面是基于Round-robin算法結(jié)合客戶端負(fù)載均衡實(shí)現(xiàn)服務(wù)發(fā)現(xiàn)模式的代碼:

          class ConsulFeature(private val consulClient: Consul) {
          class Config { lateinit var consulClient: Consul }
          companion object Feature : HttpClientFeature<Config, ConsulFeature> { var serviceInstanceIndex: Int = 0
          override val key = AttributeKey<ConsulFeature>("ConsulFeature")
          override fun prepare(block: Config.() -> Unit) = ConsulFeature(Config().apply(block).consulClient)
          override fun install(feature: ConsulFeature, scope: HttpClient) { scope.requestPipeline.intercept(HttpRequestPipeline.Render) { val serviceName = context.url.host val serviceInstances = feature.consulClient.healthClient().getHealthyServiceInstances(serviceName).response val selectedInstance = serviceInstances[serviceInstanceIndex] context.url.apply { host = selectedInstance.service.address port = selectedInstance.service.port } serviceInstanceIndex = (serviceInstanceIndex + 1) % serviceInstances.size } } }}

          主要邏輯在install方法中:在Render請(qǐng)求階段(在Send階段之前執(zhí)行)首先確定被調(diào)用服務(wù)的名稱,然后consulClient請(qǐng)求服務(wù)的實(shí)例列表,然后通過(guò)循環(huán)算法定義一個(gè)實(shí)例正在調(diào)用。因此,以下調(diào)用成為可能:

          fun getApplicationInfo(serviceName: String): ApplicationInfo = runBlocking {    httpClient.get<ApplicationInfo>("http://$serviceName/application-info")}

          Micronaut 服務(wù)

          Micronaut 由Grails框架的創(chuàng)建者開(kāi)發(fā),靈感來(lái)自使用 Spring、Spring Boot 和 Grails 構(gòu)建服務(wù)的經(jīng)驗(yàn)。該框架目前支持 Java、Kotlin 和 Groovy 語(yǔ)言。依賴是在編譯時(shí)注入的,與 Spring Boot 相比,這會(huì)導(dǎo)致更少的內(nèi)存消耗和更快的應(yīng)用程序啟動(dòng)。

          主類如下所示:

          object MicronautServiceApplication {
          @JvmStatic fun main(args: Array<String>) { Micronaut.build() .packages("io.heterogeneousmicroservices.micronautservice") .mainClass(MicronautServiceApplication.javaClass) .start() }}

          基于 Micronaut 的應(yīng)用程序的某些組件與它們?cè)?Spring Boot 應(yīng)用程序中的對(duì)應(yīng)組件類似,例如,以下是控制器代碼:

          @Controller(    value = "/application-info",    consumes = [MediaType.APPLICATION_JSON],    produces = [MediaType.APPLICATION_JSON])class ApplicationInfoController(    private val applicationInfoService: ApplicationInfoService) {
          @Get fun get(requestTo: String?): ApplicationInfo = applicationInfoService.get(requestTo)
          @Get("/logo", produces = [MediaType.IMAGE_PNG]) fun getLogo(): ByteArray = applicationInfoService.getLogo()}

          Micronaut 中對(duì) Kotlin 的支持建立在kapt編譯器插件的基礎(chǔ)上(參考Micronaut Kotlin 指南了解更多詳細(xì)信息)。

          構(gòu)建腳本配置如下:

          plugins {    ...    kotlin("kapt")    ...}
          dependencies { kapt("io.micronaut:micronaut-inject-java:$micronautVersion") ... kaptTest("io.micronaut:micronaut-inject-java:$micronautVersion") ...}

          以下是配置文件的內(nèi)容:

          micronaut:  application:    name: micronaut-service  server:    port: 8083
          consul: client: registration: enabled: true
          application-info: name: ${micronaut.application.name} framework: name: Micronaut release-year: 2018

          JSON、properties和 Groovy 文件格式也可用于配置(參考Micronaut 配置指南查看更多詳細(xì)信息)。

          Quarkus服務(wù)

          Quarkus是作為一種應(yīng)對(duì)新部署環(huán)境和應(yīng)用程序架構(gòu)等挑戰(zhàn)的工具而引入的,在框架上編寫(xiě)的應(yīng)用程序?qū)⒕哂械蛢?nèi)存消耗和更快的啟動(dòng)時(shí)間。此外,對(duì)開(kāi)發(fā)人員也很友好,例如,開(kāi)箱即用的實(shí)時(shí)重新加載。

          Quarkus 應(yīng)用程序目前沒(méi)有 main 方法,但也許未來(lái)會(huì)出現(xiàn)(GitHub 上的問(wèn)題)。

          對(duì)于熟悉 Spring 或 Java EE 的人來(lái)說(shuō),Controller 看起來(lái)非常熟悉:

          @Path("/application-info")@Produces(MediaType.APPLICATION_JSON)@Consumes(MediaType.APPLICATION_JSON)class ApplicationInfoResource(    @Inject private val applicationInfoService: ApplicationInfoService) {
          @GET fun get(@QueryParam("request-to") requestTo: String?): Response = Response.ok(applicationInfoService.get(requestTo)).build()
          @GET @Path("/logo") @Produces("image/png") fun logo(): Response = Response.ok(applicationInfoService.getLogo()).build()}

          如你所見(jiàn),bean 是通過(guò)@Inject注解注入的,對(duì)于注入的 bean,你可以指定一個(gè)范圍,例如:

          @ApplicationScopedclass ApplicationInfoService(    ...) {...}

          為其他服務(wù)創(chuàng)建 REST 接口,就像使用 JAX-RS 和 MicroProfile 創(chuàng)建接口一樣簡(jiǎn)單:

          @ApplicationScoped@Path("/")interface ExternalServiceClient {    @GET    @Path("/application-info")    @Produces("application/json")    fun getApplicationInfo(): ApplicationInfo}
          @RegisterRestClient(baseUri = "http://helidon-service")interface HelidonServiceClient : ExternalServiceClient
          @RegisterRestClient(baseUri = "http://ktor-service")interface KtorServiceClient : ExternalServiceClient
          @RegisterRestClient(baseUri = "http://micronaut-service")interface MicronautServiceClient : ExternalServiceClient
          @RegisterRestClient(baseUri = "http://quarkus-service")interface QuarkusServiceClient : ExternalServiceClient
          @RegisterRestClient(baseUri = "http://spring-boot-service")interface SpringBootServiceClient : ExternalServiceClient

          但是它現(xiàn)在缺乏對(duì)服務(wù)發(fā)現(xiàn) ( Eureka和Consul ) 的內(nèi)置支持,因?yàn)樵摽蚣苤饕槍?duì)云環(huán)境。因此,在 Helidon 和 Ktor 服務(wù)中, 我使用了Java類庫(kù)方式的Consul 客戶端。

          首先,需要注冊(cè)應(yīng)用程序:

          @ApplicationScopedclass ConsulRegistrationBean(    @Inject private val consulClient: ConsulClient) {
          fun onStart(@Observes event: StartupEvent) { consulClient.register() }}

          然后需要將服務(wù)的名稱解析到其特定位置;

          解析是通過(guò)從 Consul 客戶端獲得的服務(wù)的位置替換 requestContext的URI 來(lái)實(shí)現(xiàn)的:

          @Provider@ApplicationScopedclass ConsulFilter(    @Inject private val consulClient: ConsulClient) : ClientRequestFilter {
          override fun filter(requestContext: ClientRequestContext) { val serviceName = requestContext.uri.host val serviceInstance = consulClient.getServiceInstance(serviceName) val newUri: URI = URIBuilder(URI.create(requestContext.uri.toString())) .setHost(serviceInstance.address) .setPort(serviceInstance.port) .build()
          requestContext.uri = newUri }}

          Quarkus也支持通過(guò)properties 或 YAML 文件進(jìn)行配置(參考Quarkus 配置指南了解更多詳細(xì)信息)。

          Spring Boot服務(wù)

          創(chuàng)建該框架是為了使用 Spring Framework 生態(tài)系統(tǒng),同時(shí)有利于簡(jiǎn)化應(yīng)用程序的開(kāi)發(fā)。這是通過(guò)auto-configuration實(shí)現(xiàn)的。

          以下是控制器代碼:

          @RestController@RequestMapping(path = ["application-info"], produces = [MediaType.APPLICATION_JSON_VALUE])class ApplicationInfoController(    private val applicationInfoService: ApplicationInfoService) {
          @GetMapping fun get(@RequestParam("request-to") requestTo: String?): ApplicationInfo = applicationInfoService.get(requestTo)
          @GetMapping(path = ["/logo"], produces = [MediaType.IMAGE_PNG_VALUE]) fun getLogo(): ByteArray = applicationInfoService.getLogo()}

          微服務(wù)由 YAML 文件配置:

          spring:  application:    name: spring-boot-service
          server: port: 8085
          application-info: name: ${spring.application.name} framework: name: Spring Boot release-year: 2014

          也可以使用properties文件進(jìn)行配置(更多信息參考Spring Boot 配置文檔)。

          啟動(dòng)微服務(wù)

          在啟動(dòng)微服務(wù)之前,你需要安裝Consul和 啟動(dòng)代理-例如,像這樣:consul agent -dev。

          你可以從以下位置啟動(dòng)微服務(wù):

          • IDE中啟動(dòng)微服務(wù)IntelliJ IDEA 的用戶可能會(huì)看到如下內(nèi)容:要啟動(dòng) Quarkus 服務(wù),你需要啟動(dòng)quarkusDev的Gradle 任務(wù)。

          • console中啟動(dòng)微服務(wù)在項(xiàng)目的根文件夾中執(zhí)行:

          java -jar helidon-service/build/libs/helidon-service-all.jar

          java -jar ktor-service/build/libs/ktor-service-all.jar

          java -jar micronaut-service/build/libs/micronaut-service-all.jar

          java -jar quarkus-service/build/quarkus-service-1.0.0-runner.jar

          java -jar spring-boot-service/build/libs/spring-boot-service.jar

          啟動(dòng)所有微服務(wù)后,訪問(wèn)http://localhost:8500/ui/dc1/services,你將看到:

          API測(cè)試

          以Helidon服務(wù)的API測(cè)試結(jié)果為例:

          GET http://localhost:8081/application-info

          {  "name":"helidon-service",  "framework":{    "name":"Helidon SE",    "releaseYear":2019},  "requestedService":null}

          GET http://localhost:8081/application-info?request-to=ktor-service

          {  "name": "helidon-service",  "framework": {    "name": "Helidon SE",    "releaseYear": 2019  },  "requestedService": {    "name": "ktor-service",    "framework": {          "name": "Ktor",          "releaseYear": 2018    },    "requestedService": null  }}

          GET http://localhost:8081/application-info/logo返回logo信息


          你可以使用Postman 、IntelliJ IDEA HTTP 客戶端 、瀏覽器或其他工具測(cè)試微服務(wù)的 API接口 。

          不同微服務(wù)框架對(duì)比

          不同微服務(wù)框架的新版本發(fā)布后,下面的結(jié)果可能會(huì)有變化;你可以使用此GitHub項(xiàng)目自行檢查最新的對(duì)比結(jié)果 。

          程序大小

          為了保證設(shè)置應(yīng)用程序的簡(jiǎn)單性,構(gòu)建腳本中沒(méi)有排除傳遞依賴項(xiàng),因此 Spring Boot 服務(wù) uber-JAR 的大小大大超過(guò)了其他框架上的類似物的大?。ㄒ?yàn)槭褂?starters 不僅導(dǎo)入了必要的依賴項(xiàng);如果需要,可以通過(guò)排除指定依賴來(lái)減小大?。?/span>

          備注:什么是 maven的uber-jar

          在maven的一些文檔中我們會(huì)發(fā)現(xiàn) “uber-jar”這個(gè)術(shù)語(yǔ),許多人看到后感到困惑。其實(shí)在很多編程語(yǔ)言中會(huì)把super叫做uber (因?yàn)閟uper可能是關(guān)鍵字), 這是上世紀(jì)80年代開(kāi)始流行的,比如管superman叫uberman。所以u(píng)ber-jar從字面上理解就是super-jar,這樣的jar不但包含自己代碼中的class ,也會(huì)包含一些第三方依賴的jar,也就是把自身的代碼和其依賴的jar全打包在一個(gè)jar里面了,所以就很形象的稱其為super-jar ,uber-jar來(lái)歷就是這樣的。

          微服務(wù)程序大小(MB)
          Helidon服務(wù)17,3
          Ktor服務(wù)22,4
          Micronaut 服務(wù)17,1
          Quarkus服務(wù)24,4
          Spring Boot服務(wù)45,2

          啟動(dòng)時(shí)長(zhǎng)

          每個(gè)應(yīng)用程序的啟動(dòng)時(shí)長(zhǎng)都是不固定的:

          微服務(wù)開(kāi)始時(shí)間(秒)
          Helidon服務(wù)2,0
          Ktor服務(wù)1,5
          Micronaut 服務(wù)2,8
          Quarkus服務(wù)1,9
          Spring Boot服務(wù)10,7

          值得注意的是,如果你將 Spring Boot 中不必要的依賴排除,并注意設(shè)置應(yīng)用的啟動(dòng)參數(shù)(例如,只掃描必要的包并使用 bean 的延遲初始化),那么你可以顯著地減少啟動(dòng)時(shí)間。

          內(nèi)存使用情況

          對(duì)于每個(gè)微服務(wù),確定了以下內(nèi)容:

          • 通過(guò)-Xmx參數(shù),指定微服務(wù)所需的堆內(nèi)存大小

          • 通過(guò)負(fù)載測(cè)試服務(wù)健康的請(qǐng)求(能夠響應(yīng)不同的請(qǐng)求)

          • 通過(guò)負(fù)載測(cè)試50 個(gè)用戶 * 1000 個(gè)的請(qǐng)求

          • 通過(guò)負(fù)載測(cè)試500 個(gè)用戶 * 1000 個(gè)的請(qǐng)求

          堆內(nèi)存只是為應(yīng)用程序分配的總內(nèi)存的一部分。例如,如果要測(cè)量總體內(nèi)存使用情況,可以參考本指南。

          對(duì)于負(fù)載測(cè)試,使用了Gatling和Scala腳本 。

          1、負(fù)載生成器和被測(cè)試的服務(wù)在同一臺(tái)機(jī)器上運(yùn)行(Windows 10、3.2 GHz 四核處理器、24 GB RAM、SSD)。

          2、服務(wù)的端口在 Scala 腳本中指定。

          3、通過(guò)負(fù)載測(cè)試意味著微服務(wù)已經(jīng)響應(yīng)了所有時(shí)間的所有請(qǐng)求。

          微服務(wù)堆內(nèi)存大小(MB)堆內(nèi)存大?。∕B)堆內(nèi)存大?。∕B)

          對(duì)于健康服務(wù)對(duì)于 50 * 1000 的負(fù)載對(duì)于 500 * 1000 的負(fù)載
          Helidon服務(wù)11911
          Ktor服務(wù)131115
          Micronaut 服務(wù)171519
          Quarkus服務(wù)131721
          Spring Boot服務(wù)181923

          需要注意的是,所有微服務(wù)都使用 Netty HTTP 服務(wù)器。

          結(jié)論

          通過(guò)上文,我們所需的功能——一個(gè)帶有 HTTP API 的簡(jiǎn)單服務(wù)和在 MSA 中運(yùn)行的能力——在所有考慮的框架中都取得了成功。

          是時(shí)候開(kāi)始盤(pán)點(diǎn)并考慮他們的利弊了。

          Helidon標(biāo)準(zhǔn)版

          優(yōu)點(diǎn)

          創(chuàng)建的應(yīng)用程序,只需要一個(gè)注釋(@JvmStatic)

          缺點(diǎn)

          開(kāi)發(fā)所需的一些組件缺少開(kāi)箱即用(例如,依賴注入和與服務(wù)發(fā)現(xiàn)服務(wù)器的交互)

          Helidon MicroProfile

          微服務(wù)還沒(méi)有在這個(gè)框架上實(shí)現(xiàn),所以這里簡(jiǎn)單說(shuō)明一下。

          優(yōu)點(diǎn)

          1、Eclipse MicroProfile 實(shí)現(xiàn)

          2、本質(zhì)上,MicroProfile 是針對(duì) MSA 優(yōu)化的 Java EE。因此,首先你可以訪問(wèn)各種 Java EE API,包括專門(mén)為 MSA 開(kāi)發(fā)的 API,其次,你可以將 MicroProfile 的實(shí)現(xiàn)更改為任何其他實(shí)現(xiàn)(例如:Open Liberty、WildFly Swarm 等)

          Ktor

          優(yōu)點(diǎn)

          1、輕量級(jí)的允許你僅添加執(zhí)行任務(wù)直接需要的那些功能

          2、應(yīng)用參數(shù)所有參數(shù)的良好結(jié)果

          缺點(diǎn)

          1、依賴于Kotlin,即用其他語(yǔ)言開(kāi)發(fā)可能是不可能的或不值得的

          2、微框架:參考Helidon SE

          3、目前最流行的兩種 Java 開(kāi)發(fā)模型(Spring Boot/Micronaut)和 Java EE/MicroProfile)

          4、中沒(méi)有包含該框架,這會(huì)導(dǎo)致:

            難以尋找專家

            由于需要顯式配置所需的功能,因此與 Spring Boot 相比,執(zhí)行任務(wù)的時(shí)間有所增加

          Micronaut

          優(yōu)點(diǎn)

          1、AOT如前所述,與 Spring Boot 上的模擬相比,AOT 可以減少應(yīng)用程序的啟動(dòng)時(shí)間和內(nèi)存消耗

          2、類Spring開(kāi)發(fā)模式有 Spring 框架經(jīng)驗(yàn)的程序員不會(huì)花太多時(shí)間來(lái)掌握這個(gè)框架

          3、Micronaut for Spring可以改變現(xiàn)有的Spring Boot應(yīng)用程序的執(zhí)行環(huán)境到Micronaut中(有限制)

          Quarkus

          優(yōu)點(diǎn)

          1、Eclipse MicroProfile 的實(shí)現(xiàn)

          2、該框架為多種 Spring 技術(shù)提供了兼容層:DI、 Web、Security、Data JPA

          Spring Boot

          優(yōu)點(diǎn)

          1、平臺(tái)成熟度和生態(tài)系統(tǒng)對(duì)于大多數(shù)日常任務(wù),Spring的編程范式已經(jīng)有了解決方案,也是很多程序員習(xí)慣的方式。此外,starter和auto-configuration的概念簡(jiǎn)化了開(kāi)發(fā)

          2、專家多,文檔詳細(xì)

          我想很多人都會(huì)同意 Spring 在不久的將來(lái)仍將是 Java/Kotlin開(kāi)發(fā)領(lǐng)域領(lǐng)先的框架。

          缺點(diǎn)

          • 應(yīng)用參數(shù)多且復(fù)雜但是,有些參數(shù),如前所述,你可以自己優(yōu)化。還有一個(gè)Spring Fu項(xiàng)目的存在,該項(xiàng)目正在積極開(kāi)發(fā)中,使用它可以減少參數(shù)。

          Helidon SE 和 Ktor 是 微框架,Spring Boot 和 Micronaut 是全棧框架,Quarkus 和 Helidon MP 是 MicroProfile 框架。微框架的功能有限,這會(huì)減慢開(kāi)發(fā)速度。

          我不敢判斷這個(gè)或那個(gè)框架會(huì)不會(huì)在近期“大更新”,所以在我看來(lái),目前最好繼續(xù)觀察,使用熟悉的框架解決工作問(wèn)題。

          同時(shí),如本文所示,新框架在應(yīng)用程序參數(shù)設(shè)置方面贏得了 Spring Boot。如果這些參數(shù)中的任何一個(gè)對(duì)你的某個(gè)微服務(wù)至關(guān)重要,那么也許值得關(guān)注。但是,我們不要忘記,Spring Boot 一是在不斷改進(jìn),二是它擁有龐大的生態(tài)系統(tǒng),并且有相當(dāng)多的 Java 程序員熟悉它。此外,還有未涉及的其他框架:Vert.x、Javalin 等,也值得關(guān)注。


          來(lái)源 | https://www.kubernetes.org.cn/9526.html


          ——————END——————


          歡迎關(guān)注“Java引導(dǎo)者”,我們分享最有價(jià)值的Java的干貨文章,助力您成為有思想的Java開(kāi)發(fā)工程師!

          瀏覽 74
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  五月丁香逼 | 色一情一区二 | 高清一区二区三区 | 97成人毛片 | 日本亚洲黄色 |