spring boot 屬性配置與監控
spring boot
- 自動配置:針對很多Spring應用程式常見的應用功能,Spring Boot能自動提供相關配置
- 起步依賴:告訴Spring Boot需要什麼功能,它就能引入需要的庫。
- Actuator:讓你能夠深入執行中的Spring Boot應用程式,一探究竟。
屬性檔案
屬性檔案是最常見的管理配置屬性的方式。Spring Boot 提供的 SpringApplication 類會搜尋並載入 application.properties 檔案來獲取配置屬性值。SpringApplication 類會在下面位置搜尋該檔案。
- 外接:在相對於應用程式執行目錄的/congfig子目錄裡。
- 外接,在應用程式執行的目錄裡
- 內建,在config包內
- 內建,在classpath根目錄
src/main/resources/config下application.properties會覆蓋src/main/resources下application.properties中相同的屬性,此外,如果你在相同優先順序位置同時有application.properties和application.yml,那麼application.properties裡的屬性裡面的屬性就會覆蓋application.yml
Spring Boot的配置檔案還支援YAML檔案,YAML 可以在一個單個檔案中通過使用 spring.profiles 屬性來定義多個不同的環境配置。
配置詳解
Spring Boot 所提供的配置優先順序順序比較複雜。按照優先順序從高到低的順序,具體的列表如下所示。
- 命令列引數。
- 通過 System.getProperties() 獲取的 Java 系統引數。
- 作業系統環境變數。
- 從 java:comp/env 得到的 JNDI 屬性。
- 通過 RandomValuePropertySource 生成的“random.*”屬性。
- 應用 Jar 檔案之外的屬性檔案。
- 應用 Jar 檔案內部的屬性檔案。
- 在應用配置 Java 類(包含“@Configuration”註解的 Java 類)中通過“@PropertySource”註解宣告的屬性件。
- 通過“SpringApplication.setDefaultProperties”宣告的預設屬性。
Spring Boot 的這個配置優先順序看似複雜,其實是很合理的。比如命令列引數的優先順序被設定為最高。這樣的好處是可以在測試或生產環境中快速地修改配置引數值,而不需要重新打包和部署應用。
application.properties配置自定義屬性
application.properties提供自定義屬性的支援,這樣我們就可以把一些常量配置在這裡:
com.dudu.name="嘟嘟MD"
com.dudu.want="祝大家雞年大吉吧"
com.dudu.yearhope=${com.dudu.name}在此${com.dudu.want}
然後直接在要使用的地方通過註解@Value(value=”${config.name}”)就可以繫結到你想要的屬性上面
@RestController
public class UserController {
@Value("${com.dudu.name}")
private String name;
@Value("${com.dudu.want}")
private String want;
@RequestMapping("/")
public String hexo(){
return name+","+want;
}
}
將屬性繫結到一個java Bean上
有時候屬性太多了,一個個繫結到屬性欄位上太麻煩,官方提倡繫結一個物件的bean,這裡我們建一個ConfigBean.java類,頂部需要使用註解@ConfigurationProperties(prefix = “com.dudu”)來指明使用哪個
@ConfigurationProperties(prefix = "com.dudu")
public class ConfigBean {
private String name;
private String want;
// 省略getter和setter
}
這裡配置完還需要在spring Boot入口類加上@EnableConfigurationProperties並指明要載入哪個bean,如果不寫ConfigBean.class,在bean類那邊新增
@SpringBootApplication
@EnableConfigurationProperties({ConfigBean.class})
public class Chapter2Application {
public static void main(String[] args) {
SpringApplication.run(Chapter2Application.class, args);
}
}
最後在Controller中引入ConfigBean使用即可,如下:
@RestController
public class UserController {
@Autowired
ConfigBean configBean;
@RequestMapping("/")
public String hexo(){
return configBean.getName()+configBean.getWant();
}
}
使用自定義配置檔案
有時候我們不希望把所有配置都放在application.properties裡面,這時候我們可以另外定義一個,這裡我明取名為test.properties,路徑跟也放在src/main/resources下面
@Configuration
@ConfigurationProperties(prefix = "com.md")
@PropertySource("classpath:test.properties")
public class ConfigTestBean {
private String name;
private String want;
// 省略getter和setter
}
這裡要注意哦,有一個問題,如果你使用的是1.5以前的版本,那麼可以通過locations指定properties檔案的位置
@ConfigurationProperties(prefix = "config2",locations="classpath:test.properties")
隨機值配置
配置檔案中${random} 可以用來生成各種不同型別的隨機值,從而簡化了程式碼生成的麻煩,例如 生成 int 值、long 值或者 string 字串。
dudu.secret=${random.value}
dudu.number=${random.int}
dudu.bignumber=${random.long}
dudu.uuid=${random.uuid}
dudu.number.less.than.ten=${random.int(10)}
dudu.number.in.range=${random.int[1024,65536]}
外部配置-命令列引數配置
Spring Boot是基於jar包執行的,打成jar包的程式可以直接通過下面命令執行:
java -jar xx.jar
可以以下命令修改tomcat埠號:
java -jar xx.jar --server.port=9090
命令列中連續的兩個減號--
就是對application.properties
中的屬性值進行賦值的標識。
java -jar xx.jar --server.port=9090
等價於在application.properties
中新增屬性server.port=9090
如果你怕命令列有風險,可以使用SpringApplication.setAddCommandLineProperties(false)禁用它
Profile-多環境配置
在 Spring Boot 中, 多環境配置的檔名需要滿足 application-{profile}.properties的格式, 其中{profile}對應你的環境標識。
至於具體哪個配置檔案會被載入, 需要在 application.properties檔案中通過spring.profiles.active 屬性來設定。
多環境的配置思路
• 在application.properties中配置通用內容,並設定spring.profiles.active=dev, 以開發環境為預設配置。
• 在application-{profile}.properties中配置各個環境不同的內容。
• 通過命令列方式去啟用不同環境的配置。
- application-dev.properties:開發環境
- application-prod.properties:生產環境
java -jar xxx.jar –spring.profiles.active=dev
spring.profiles.active=dev
Spring boot測試
@SpringApplicationConfiguration(classes = HelloController.class)
//引入Spring對JUnit4的支援
@RunWith(SpringJUnit4ClassRunner.class)
//@WebAppConfigura巨on: 開啟Web應用的配置, 用千模擬ServletContext
@WebAppConfiguration
public class HelloControllerTest {
@Autowired
private Book book;
//MockMvc物件: 用於模擬呼叫 Controller的介面發起請求,
private MockMvc mockMvc;
@Before
public void before(){
mockMvc = MockMvcBuilders.standaloneSetup(new HelloController()).build();
}
@Test
public void testHello() throws Exception {
System.out.println(book.getName()+" "+book.getAuthor()+" "+book.getDesc());
//perform函式執行一次請求呼叫
mockMvc.perform(MockMvcRequestBuilders.get("/hello")
//accept用於執行接收的資料型別
.accept(MediaType.APPLICATION_JSON))
//andExpect用於判斷介面返回的期望值
.andExpect(MockMvcResultMatchers.status().isOk())
.andExpect(MockMvcResultMatchers.content().string("hello world"));
}
}
監控與管理
在微服務架構中,我們將原本龐大的單體系統拆分成多個提供不同服務的應用。 雖然各個應用的內部邏輯因分解而得以簡化,但是由於部署應用的數量成倍增長,使得系統的維護複雜度大大提升。 雖然在高可用機制的保護下,個別故障不會影響系統的對外服務,但是這些頻繁出現的故障需要被及時發現和處理才能長期保證系統處於健康可用狀態。 為了能對這些成倍增長的應用做到高效運維,所以我們需要實現一套自動化的監控 運維機制,而這套機制的執行基礎就是不間斷地收集各個微服務應用的各項 指標情況,並根據這些基礎指標資訊來制定監控和預警規則,更進一步甚至做到一些自動化的運維操作等。為了讓運維繫統能夠獲取各個微服務應用的相關指標以及實現一些常規操作控制,我們需要開發一套專門用於植入各個微服務應用的介面供監控 系統採集資訊。 而這些介面往往有很大一部分指標都是類似的,比如環境變數、 垃圾收集資訊、 記憶體資訊、 執行緒池資訊等。
spring-boot-starter-actuator 。引入該模組能夠自動為 Spring Boot 構建的應用提供一系列用於監控的端點。 同時, SpringCloud 在實現各個微服務元件的時候,進一步為該模組做了不少擴充套件, 比如,為原生端點
增加了更多的指標和度量資訊(比如在整合 Eureka 的時候會為/health 端點增加相關的資訊),並且根據不同的元件還提供了更多有空的端點(比如,為 API 閘道器元件Zuul 提供了 /routes 端點來返回路由資訊)。
初識actuator
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
增加該依賴之後,重新啟動應用。spring-boot-starter-actuator模組根據應用依賴和配置自動創建出來的監控和管理端點。通過這些端點,我們可以實時獲取應用的各項監控指標。
原生端點
• 應用配置類:獲取應用程式中載入的應用配置、 環境變數、 自動化配置報告等與Spring Boot應用密切相關的配置類資訊。
• 度最指標類:獲取應用程式執行過程中用於監控的度量指標, 比如記憶體資訊、 執行緒池資訊、 HTTP請求統計等。
• 操作控制類:提供了對應用的關閉等操作類功能。
應用配置類
由於整個應用的例項建立和依賴關係等資訊都被離散到了各個配置類的註解上,這使得我們分析整個應用中資源和例項的各種關係變得非常的困難。而這類端點就可以幫助我們輕鬆的獲取一系列關於Spring 應用配置內容的詳細報告
/autoconfig:該端點用來獲取應用的自動化配置報告,其中包括所有自動化配置的候選項。同時還列出了每個候選項自動化配置的各個先決條件是否滿足。
positiveMatches
中返回的是條件匹配成功的自動化配置negativeMatches
中返回的是條件匹配不成功的自動化配置
/beans:該端點用來獲取應用上下文中建立的所有Bean
/configprops:該端點用來獲取應用中配置的屬性資訊報告
/env:該端點用來獲取應用所有可用的環境屬性報告。包括:環境變數、JVM屬性、應用的配置配置、命令列中的引數。
/mappings:該端點用來返回所有Spring MVC的控制器對映關係報告
/info:該端點用來返回一些應用自定義的資訊。預設情況下,該端點只會返回一個空的json內容。我們可以在application.properties
配置檔案中通過info
字首來設定一些屬性
info.app.name=spring-boot-hello
info.app.version=v1.0.0
度量指標類
度量指標類端點提供的報告內容則是動態變化的。這些端點提供了應用程式在執行過程中的一些快照資訊,比如:記憶體使用情況、HTTP請求統計、外部資源指標等。這些端點對於我們構建微服務架構中的監控系統非常有幫助
/metrics:該端點用來返回當前應用的各類重要度量指標,比如:記憶體資訊、執行緒資訊、垃圾回收資訊等
{
"mem": 362833,
"mem.free": 269020,
"processors": 4,
"instance.uptime": 1473938,
"uptime": 1479930,
"systemload.average": -1,
"heap.committed": 312832,
"heap.init": 131072,
"heap.used": 43811,
"heap": 1840640,
"nonheap.committed": 51096,
"nonheap.init": 2496,
"nonheap.used": 50002,
"nonheap": 0,
"threads.peak": 30,
"threads.daemon": 24,
"threads.totalStarted": 56,
"threads": 26,
"classes": 7166,
"classes.loaded": 7166,
"classes.unloaded": 0,
"gc.ps_scavenge.count": 9,
"gc.ps_scavenge.time": 112,
"gc.ps_marksweep.count": 2,
"gc.ps_marksweep.time": 134,
"httpsessions.max": -1,
"httpsessions.active": 0,
"gauge.response.beans": 37,
"gauge.response.mappings": 7,
"gauge.response.env": 8,
"gauge.response.autoconfig": 16,
"gauge.response.hello": 133,
"gauge.response.configprops": 88,
"gauge.response.star-star": 7,
"gauge.response.star-star.favicon.ico": 17,
"counter.status.200.mappings": 1,
"counter.status.200.star-star.favicon.ico": 1,
"counter.status.200.beans": 1,
"counter.status.200.configprops": 1,
"counter.status.404.star-star": 1,
"counter.status.200.autoconfig": 2,
"counter.status.200.hello": 1,
"counter.status.200.env": 1
}
/health:該端點用來獲取應用的各類健康指標資訊
/dump:該端點用來暴露程式執行中的執行緒資訊
/trace:該端點用來返回基本的HTTP跟蹤資訊
操作控制類
在原生端點中,只提供了一個用來關閉應用的端點:/shutdown
endpoints.shutdown.enabled=true