日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

nacos 公共_Springboot,Nacos并向使用研究

發布時間:2025/3/20 javascript 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 nacos 公共_Springboot,Nacos并向使用研究 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

nacos 測試樣例 :

1.nacos 管理的配置文件中,配置了一個key,再到項目中bootstrap.yml中配置相同的key,不起作用!

nacos 配置:

info:

? redis:

host: localhost

port: 6379

本地bootstrap.yml配置:

info:

? redis:

host: 192.168.100.100

port: 6379

輸出:{"host":"localhost","port":6379}

2.nacos 管理的配置文件中,配置了一個以某個key開始的信息,再到項目中bootstrap.yml中配置相同的key開始的信息,以nacos管理的配置信息為主,bootstrap.yml中為輔助!

nacos 配置:

info:

? redis:

host: localhost

port: 6379

本地bootstrap.yml配置:

info:

? redis:

host: 192.168.100.100

port: 6379

index: 1

輸出:{"host":"localhost","index":1,"port":6379}

3.nacos 管理的配置文件中,配置了一個以某個key開始的信息,再到項目中 application.yml中配置相同的key開始的信息,以nacos管理的配置信息為主,application.yml中為輔助!

nacos 配置:

info:

? redis:

host: localhost

port: 6379

本地 application.yml配置:

info:

? redis:

host: 192.168.100.100

port: 6379

index: 1

輸出:{"host":"localhost","index":1,"port":6379}

4.nacos 管理的配置文件中,配置了一個以某個key開始的信息,再到項目中 application-xxx.yml中配置相同的key開始的信息,以nacos管理的配置信息為主,application-xxx.yml中為輔助!

nacos 配置:

info:

? redis:

host: localhost

port: 6379

本地 application.yml配置:

info:

? redis:

host: 192.168.100.100

port: 6379

index: 1

輸出:{"host":"localhost","index":1,"port":6379}

5.springboot 工程中,相同名稱的文件名: application.yml 和 application.yml ,會讀取application.yml中的內容.

結論:文件配置,優先級由高到底,高優先級的配置會覆蓋低優先級的配置.

1.一切以 nacos 配置中心的配置信息為主,本地bootstrap.yml 或 application.yml中有相同信息,不會被覆蓋, 獲取時候,可以將公共的信息抽取出來放入到 nacos 配置中去,私有的信息放置到本地的yml中.

2.Springboot 中,加載完bootstrap.yml中的信息,還會加載本地的,其他yml文件,加載順序是:bootstrap.yml>application.yml>application-xxx.yml,沒有application.yml,會默認加載application-dev.yml.

3.bootstrap.yml 由父Spring ApplicationContext加載,它的級別是最高的.bootstrap.yml 是放入的是系統級別的配置,配置是最高的;application.yml 可以用來定義應用級別的,級別要低些.

4.在不指定要被加載文件時,默認的加載順序:由里向外加載,所以最外層的最后被加載,會覆蓋里層的屬性(參考官網介紹)

SpringApplication will load properties from application.properties files in the following locations and add them to the Spring Environment:

5.Springboot 默認的web容器主要有:Tomcat > Jetty > Undertow , 默認的web容器是:Tomcat 這個在spring-boot-starter-web中引入的配置可以證明.

@Import({ ServletWebServerFactoryAutoConfiguration.BeanPostProcessorsRegistrar.class,

? ? ? ServletWebServerFactoryConfiguration.EmbeddedTomcat.class,

? ? ? ServletWebServerFactoryConfiguration.EmbeddedJetty.class,

? ? ? ServletWebServerFactoryConfiguration.EmbeddedUndertow.class })

public class ServletWebServerFactoryAutoConfiguration {} 從這個順序上來說,也是: Tomcat > Jetty > Undertow ,一般情況下,在SpringBoot依賴中默認就已經引入tomcat的依賴,

因此這里對于tomcat來說一般情況下會恒成立,那么Tomcat就會一直作為恒成立條件被SpringBoot首選為默認服務器。可以手動通過@Bean 標簽來配置SpringBoot的web容器.

6.如何剔除Tomcat作為springboot的默認web容器,使用 jetty 作為 SpringBoot 的web容器,那就是如下所示:

org.springframework.boot

spring-boot-starter-web

spring-boot-starter-tomcat

org.springframework.boot

org.springframework.boot

spring-boot-starter-jetty

web容器的自動配置,實際上是SpringBoot通過創建原生Tomcat對象,對這個對象進行端口,協議,組件等初始化,并且將Web應用信息Context對象封裝到這個tomcat對象中,

然后Web應用信息配置生命周期監聽生效后啟動tomcat,最后將這個過程封裝到一個WebServer對象中供SpringBoot啟動時調用。

以下是收集的關于springboot內置 web容器的文章,還不錯!

本文介紹SpringBoot內置web服務器。知識點有SpringBoot默認web服務器;如何配置當前web容器;內嵌Web服務器如何切換(從tomcat到jetty);Web容器怎么自動配置;web容器啟動源碼解析;SpringBoot內置服務器不使用SPI機制特別說明。

(一)SpringBoot默認web服務器?

在SpringBoot中采用的默認web服務器是Tomcat,要了解為什么是Tomcat可從源碼入手。對于web服務器的配置,也是在自動配置中找,前面學習了SpringBoot自動配置WebMVC的知識,可以推測對于Web服務器的配置應該也是在一個自動配置類當中進行的,那么可以去/META-INF/spring.factories文件找一下WebMVC的自動配置,在這個自動配置內可以間接找到關于Web服務器的配置。

org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration,\

在上面SpringBoot包的目錄找到這個路徑下的Web服務器自動配置類。

這個Web服務器的自動配置類,我們可以看到這個配置類支持3種web服務器(Tomcat,Jetty,Undertow),具體要配置哪種服務器由ServletWebServerFactoryConfiguration來決定,同時這里還定義了一個順序,依次是Tomcat->Jetty->Undertow。

那要選擇哪種服務器呢?看ServletWebServerFactoryConfiguration。

在這個web服務器工廠配置類中,分別對上述三種服務器進行了定義:

對Tomcat定義:判斷環境中是否引入了Tomcat所需的依賴Servlet.class, Tomcat.class, UpgradeProtocol.class,同時用戶沒有自己進行Web服務器配置(比如自己通過實現ServletWebServerFactory接口進行手動配置web服務器),那么這個Tomcat服務器就會生效。

對Jetty定義:所需要的依賴有Servlet.class, Server.class, Loader.class, WebAppContext.class

對Undertow定義:所需要的依賴有Servlet.class, Undertow.class, SslClientAuthMode.class

那么問題來了,SpringBoot如果這幾種都有,那是怎么選擇呢?從ServletWebServerFactoryAutoConfiguration配置類

@Import({ ServletWebServerFactoryAutoConfiguration.BeanPostProcessorsRegistrar.class,

ServletWebServerFactoryConfiguration.EmbeddedTomcat.class,

ServletWebServerFactoryConfiguration.EmbeddedJetty.class,

ServletWebServerFactoryConfiguration.EmbeddedUndertow.class })

public class ServletWebServerFactoryAutoConfiguration

通過@Import就可以看出這里定義了一個順序,依次是Tomcat->Jetty->Undertow,意思就是當環境中有Tomcat滿足的依賴時就會優先使用Tomcat,依次往后推。

而一般情況下,在SpringBoot依賴中默認就已經引入tomcat的依賴,因此這里對于tomcat來說一般情況下會恒成立,那么Tomcat就會一直作為恒成立條件被SpringBoot首選為默認服務器。

(二)如何配置當前web容器?

想要配置當前Web容器,可以通過yml配置讓SpringBoot自動加載解析修改配置,也可以通過提供自定義的@Bean方法忽略SpringBoot自動配置采用手動配置方式。

為什么是通過@Bean提供ServletWebServerFactory和WebServerFactoryCustomizer的Bean交給Spring就可以跳過SpringBoot的自動web服務器配置呢?可從源碼分析如下:

對于WebServerFactoryCustomizer在上面ServletWebServerFactoryConfiguration配置類Factory配置Tomcat,Jetty時在注解上會判斷存過存在自己手動添加的ServletWebServerFactory則不再進行自動配置:

對于WebServerFactoryCustomizer則在ServletWebServerFactoryAutoConfiguration服務器自動配置類加載時,如果存在自己定義的WebServerFactoryCustomizer,那么就會觸發一個WebServerFactoryCustomizerBeanPostProcessor后置處理器,在這個后置處理器中會遍歷這些WebServerFactoryCustomizer并且執行內部customize方法,從而跳過自動配置,轉為進行自定義配置:

(三)內嵌Web服務器如何切換(從tomcat到jetty)?

上面通過源碼可以知道一般情況下,Tomcat會一直作為恒成立條件被SpringBoot首選為默認服務器。但是我們如果不想用Tomcat作為默認服務器,例如想切換為Jetty,那么我們應該怎么辦呢?我們可以把Tomcat的相關依賴在pom.xml中的spring-boot-starter-web中剔除掉,使環境不再擁有Tomcat依賴,同時加入Jetty的依賴那么就能使Jetty作為滿足條件被SpringBoot選擇了。

<dependency>

<groupId>org.springframework.bootgroupId>

<artifactId>spring-boot-starter-webartifactId>

<exclusions>

<exclusion>

<artifactId>spring-boot-starter-tomcatartifactId>

<groupId>org.springframework.bootgroupId>

exclusion>

exclusions>

dependency>

<dependency>

<groupId>org.springframework.bootgroupId>

<artifactId>spring-boot-starter-jettyartifactId>

dependency>

這樣,SpringBoot重新啟動后就會切換為Jetty服務器了。

(四)Web容器怎么自動配置?

對于Web容器的自動配置,以Tomcat未來可以看上面提到的TomcatServletWebServerFactory,這是通過@Bean自動注入一個Tomcat的工廠類:

這個工廠類內部會對Tomcat進行一些初始化操作,最重要的操作在getWebServer方法內:

首先這個類是SpringBoot包提供的,用的是最底層的tomcat實例進行配置(通過new Tomcat的方式,而這個Tomcat是tomcat源碼包的一個實例類 package org.apache.catalina.startup),具體的配置細節不做描述,主要對端口,協議,tomcat組件對象等進行初始化并封裝:

將要發布的Web應用信息Context初始化到tomcat中:

對初始化好的tomcat進行封裝并啟動:

最后將這個tomcat對象封裝為一個TomcatWebServer對象供SpringBoot啟動時調用。

綜上,web容器的自動配置,實際上是SpringBoot通過創建原生Tomcat對象,對這個對象進行端口,協議,組件等初始化,并且將Web應用信息Context對象封裝到這個tomcat對象中,然后Web應用信息配置生命周期監聽生效后啟動tomcat,最后將這個過程

封裝到一個WebServer對象中供SpringBoot啟動時調用。

(五)web容器啟動源碼解析?

SpringBoot是什么時候運行了一個web服務器呢?這個要從SpringBootApplication.run()方法進行分析。以tomcat為例按照上面提到的,這個啟動過程應該會調用到TomcatServletWebServerFactory.getWebServer方法獲取這么一個tomcat實例。

調用鏈可看下面圖示:

SpringBootApplication.run():

context = createApplicationContext():創建Context環境,這個方法內會根據當前環境初始化不同的Context,如果是Web環境則會初始化出AnnotationConfigServletWebApplicationContext:

?

初始化AnnotationConfigServletWebApplicationContext之后,在構造函數調用這個context的refresh方法-->onRefresh方法:

調用onRefresh方法,就會調用到ServletWebServerApplicationContext的onRefresh方法,在這個方法內,就對web服務器進行了創建操作createWebServer():

在createWebServer()方法中,會判斷是外置還是內置方式發布應用,分別進行不同的邏輯操作。我們這里以內置來學習:

這樣,SpringBoot啟動時在創建Web服務器時,就執行到了getWebServer的操作,然后再對Web服務器進行創建,初始化和啟動操作。

綜上:在SpringBoot的run啟動時,會判斷當前所處環境。如果是Web環境則通過創建一個ServletWebServerApplicationContext,執行構造函數的refresh方法,在refresh方法內重寫onRefresh方法,執行創建createWebServer()方法,這個方法會根據當前應用是內置還是外置發布方式來決定以何種方式獲取web服務器。如果是內置方式則通過TomcatServletWebServerFactory工廠類來獲取一個首選的web服務器,然后進行服務器的初始化配置,應用加載生效以及服務器啟動的操作。

(六)SpringBoot內置服務器不使用SPI機制特別說明?

最后還有一個結論要記住:對于SpringBoot內置服務器不會通過SPI的機制(官網也有特別說明),因為SpringBoot內置服務器是SpringBoot自己幫我們創建了web服務器來發布應用,不使用SPI機制的目的就是盡可能減少內置和外置web服務器可能存在的沖突,讓web應用由SpringBoot自己來管理。詳細原因和原理這里不做研究。

至此,關于SpringBoot內置服務器的相關知識解析就到此了。

總結

以上是生活随笔為你收集整理的nacos 公共_Springboot,Nacos并向使用研究的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。