轉載:https://blog.csdn.net/xuewenyong/article/details/89287097
1、項目搭建
訪問https://start.spring.io/生成標准的SpringBoot項目
選擇maven項目,語言選擇Java,SpringBoot版本選擇最新版本2.2,定義好Group和Artifact之后,在Dependencies選擇其他的依賴包,在這里我們只選擇了Web,然后點擊Generate Project下載項目導入IDE目錄結構如下:
src/main/java: 主程序入口 , Java 代碼位置。
src/main/resources: 配置目錄, 用來存放應用的一些配置信息
Web資源:static 目錄與templates目錄用於存放靜態資源和頁面文件
src/test/: 單元測試目錄
2、Maven配置分析
打開當前Pom.xml文件,大致內容如下:
-
<?xml version="1.0" encoding="UTF-8"?>
-
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-
xsi:schemaLocation=
"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-
<modelVersion>4.0.0
</modelVersion>
-
<parent>
-
<groupId>org.springframework.boot
</groupId>
-
<artifactId>spring-boot-starter-parent
</artifactId>
-
<version>2.2.0.M1
</version>
-
<relativePath/>
<!-- lookup parent from repository -->
-
</parent>
-
<groupId>com.example
</groupId>
-
<artifactId>demo
</artifactId>
-
<version>0.0.1-SNAPSHOT
</version>
-
<name>demo
</name>
-
<description>Demo project for Spring Boot
</description>
-
-
<properties>
-
<java.version>1.8
</java.version>
-
</properties>
-
-
<dependencies>
-
<dependency>
-
<groupId>org.springframework.boot
</groupId>
-
<artifactId>spring-boot-starter-web
</artifactId>
-
</dependency>
-
-
<dependency>
-
<groupId>org.springframework.boot
</groupId>
-
<artifactId>spring-boot-starter-test
</artifactId>
-
<scope>test
</scope>
-
</dependency>
-
<dependency>
-
<groupId>org.springframework.boot
</groupId>
-
<artifactId>spring-boot-autoconfigure
</artifactId>
-
<version>2.1.1.RELEASE
</version>
-
</dependency>
-
</dependencies>
-
-
<build>
-
<plugins>
-
<plugin>
-
<groupId>org.springframework.boot
</groupId>
-
<artifactId>spring-boot-maven-plugin
</artifactId>
-
</plugin>
-
</plugins>
-
</build>
-
-
<repositories>
-
<repository>
-
<id>spring-snapshots
</id>
-
<name>Spring Snapshots
</name>
-
<url>https://repo.spring.io/snapshot
</url>
-
<snapshots>
-
<enabled>true
</enabled>
-
</snapshots>
-
</repository>
-
<repository>
-
<id>spring-milestones
</id>
-
<name>Spring Milestones
</name>
-
<url>https://repo.spring.io/milestone
</url>
-
</repository>
-
</repositories>
-
<pluginRepositories>
-
<pluginRepository>
-
<id>spring-snapshots
</id>
-
<name>Spring Snapshots
</name>
-
<url>https://repo.spring.io/snapshot
</url>
-
<snapshots>
-
<enabled>true
</enabled>
-
</snapshots>
-
</pluginRepository>
-
<pluginRepository>
-
<id>spring-milestones
</id>
-
<name>Spring Milestones
</name>
-
<url>https://repo.spring.io/milestone
</url>
-
</pluginRepository>
-
</pluginRepositories>
-
-
</project>
-
groupId和artifactId:是項目生成時頁面填寫的內容
-
packaging:指打包方式,可以是jar或者war
-
spring-boot-starter-parent:定義了Spring Boot版本的基礎依賴以及一些默認配置,如配置文件位置
-
spring-boot-starter-web: Web開發模塊, 包含嵌入式Tomcat、 Spring MVC等
-
spring-boot-startertest: 測試模塊, 包含Junit等
3、實現RestfulAPI
新建HelloController類,定義一個接口,代碼實現如下:
-
@RestController
-
public
class HelloController {
-
@RequestMapping("/hello")
-
public String index() {
-
return
"Hello World";
-
}
-
}
配置訪問端口
現在啟動項目,訪問http://localhost:8888/hello輸出Hello World,
4、單元測試
在test目錄下創建和代碼一樣的包路徑,創建DemoTest測試類,代碼如下:
-
@RunWith(SpringJUnit4ClassRunner.class)
-
@WebAppConfiguration
-
public
class DemoTest {
-
private MockMvc mvc;
-
-
@Before
-
public void setUp(){
-
mvc = MockMvcBuilders.standaloneSetup(
new HelloController()).build();
-
}
-
-
@Test
-
public void hello() throws Exception {
-
mvc.perform(MockMvcRequestBuilders.get(
"/hello").accept(MediaType.
-
APPLICATION_JSON))
-
.andExpect(status().isOk())
-
.andExpect(content().string(equalTo(
"Hello World")));
-
}
-
-
}
啟動測試類,執行結果如下
代碼解析如下。
@RunWith(SpringJUnit4ClassRunner.class): 引入Spring對JUnit4的支 持
@SpringApplicationConfiguration (classes = DemoApplication. class): 指定Spring Boot的啟動類
@WebAppConfigura巨on: 開啟Web應用的配置, 模擬ServletContext。
MockMvc對象: 用於模擬調用 Controller的接口發起請求, 在@Test定義的hello 測試用例中, perform函數執行 一次請求調用, accept用於執行接收的數據類型, andExpect用於判斷接口返回的期望值。
@Before: JUnit中定義在測試用例@Test內容執行前預加載的內容, 這里用來初 始化對HelloController的模擬 。
5、配置文件
SpringBoot的配置文件支持兩種格式,properties和YAML,兩種配置方式對比如下:
properties:
-
environments.dev.url=http:localhost:
8888
-
environments.dev.
name=demo
-
environments.prod.url=http:localhost:
8080
-
environments.prod.
name=app
YAML
-
environments
-
dev
-
url
:http
:localhost
:8888
-
name
:demo
-
prod
-
url
:http
:localhost
:8080
-
name
:app
6、自定義參數
比如在application.properties文件定義
-
user.
name=張三
-
user.age=
25
在Java代碼中可以通過@value獲取配置文件的內容
-
@Component
-
public
class User {
-
-
@Value("${user.name}")
-
private String name;
-
-
@Value("${user.age}")
-
private String age;
-
}
也可以直接通過使用 PlaceHolder 的方式參數進行應用
-
user.
name=張三
-
user.age=
25
-
user.desc=
name
is $
{user.name}
and age
is $
{user.age}
7、隨機數
通過 使用${random}配置來產 生隨機的int值、long值或者string字符串
-
${random}的配置方式主要有以下幾種
-
#隨機字符串
-
com.demo.
string=${random.
value}
-
#隨機
int
-
com.demo.
int=${random.
int}
-
#隨機
long
-
com.demo.
long=${random.
long}
-
# 10以內的隨機數
-
com.demo.test=${random.
int(l0)}
-
# 10-20的隨機數
-
com.demo.range=${random.
int[l0,
20]}
8、多環境的配置
在 Spring Boot 中, 多環境配置的文件名需要滿足 application-{profile}. properties的格式, 其中{profile}對應你的環境標識,application-dev.properties: 開發環境。
application-test.properties: 測試環境。
application-prod.properties: 生產環境。
至於具體哪個配置文件會被加載, 需要在application.properties 文件中通過 spring.profiles.active 屬性來設置,,下面
通過不同的端口號區分不同環境進行測試:
application-dev.properties配置
application-test.properties配置
application-prod.properties配置
application.properties配置spring.profiles.active=test
application.properties配置spring.profiles.active=dev
application.properties配置spring.profiles.active=prod
對比控制台打印信息可以發現,我們通過調整spring.profiles.active屬性值,達到了多環境的配置的目的,這樣在實際應用中就可以配置根據環境的不同,配置不同的application-{profile}. properties文件支持多環境,避免了由於環境問題導致的數據庫配置等不同要經常修改配置文件的現象。
9、加載順序
SpringBoot對數據文件的加載機制
1 在命令行中傳入的參數。
2. SPRING APPLICATION JSON中的屬性。 SPRING_APPLICATION—JSON是以 JSON格式配置在系統環境變量中的內容。 3. java:comp/env中的JNDI 屬性。
4. Java的系統屬性, 可以通過System.getProperties()獲得的內容。
5 操作系統的環境變量 。
6 通過random.*配置的隨機屬性。
7 當前應用 jar 包之外,針對不同{profile}環境的配置文件內容,例如 application-{profile}.properties或是YAML定義的配置文件。
8 當前應用 jar 包內 ,針對不同{profile}環境的配置文件內容,例如 application-{profile}.properties或是YAML定義的配置文件。
9 位於當前應用jar包之外的application.proper巨es和YAML配置內容。
10位於當前應用jar包之內的app口ca巨on.proper巨es和YAML配置內容。
11在@Configura巨on注解修改的類中,通過@PropertySource注解定義的屬性。
12應用默認屬性,使用SpringApplication.setDefaultProperties 定義的 內容。
優先級按上面的順序由高到低,數字越小優先級越高
10、監控與管理
spring-boo七-starter-actuator模塊能夠自動為 Spring Boot 構建的應用提供 一系列用於監控的端點,也可以通過簡單的擴展來幫助我們實現系統個性化的監控需求
在pom.xml文件中加入spring-boot-starter-actuator依賴
-
<dependency>
-
<groupId> org.springframework.boot
</groupId>
-
<artifactId>spring-boot-starter-actuator
</artifactId>
-
</dependency>
增加該依賴之后,重新啟動應用可以在控制台中看到如下圖所示的輸出:
原生端點分為以下三大類。
(1)、應用配置類:獲取應用程序中加載的應用配置、 環境變量、 自動化配置報告等與 Spring Boot應用密切相關的配置類信息。
(2)、度最指標類:獲取應用程序運行過程中用於監控的度量指標, 比如內存信息、 線程 池信息、 HTTP請求統計等。
(3)、操作控制類:提供了對應用的關閉等操作類功能。
應用配置類(/configprops /autoconfig /beans /env /info /mappings)
[1]、/autoconfig: 該端點用來獲取應用的自動化配置報告, 其中包括所有自動化配置的 候選項。 同時還列出了每個候選項是否滿足自動化配置的各個先決條件
positiveMatches中返回的是條件匹配成功的自動化配置
negativeMatches中返回的是條件匹配不成功的自動化配置
[2]、/beans: 該端點用來獲取應用上下文中創建的所有Bean,每個bean都會包括以下信息
bean: Bean 的名稱。
scope: Bean 的作用域。
type: Bean 的 Java 類型。
resource: class 文件的具體路徑。
dependencies: 依賴的 Bean 名稱。
[3]、/configprops: 該端點用來獲取應用中配置的屬性信息報告
prefix :屬性的配 置前綴,
properties :屬性的名稱和值
[4]、/env: 用來獲取應用所有可用的環境屬性報告
[5]、 /mappings: 該端點用來返回所有Spring MVC的控制器映射關系報告
[6]、/info: 該端點用來返回一些應用自定義的信息。 默認清況下,可以在application.properties配置文件中通過info 前綴來設置一些屬性
度量指標類(/metrics ) 該端點用來返回當前應用的各類重要度量指標
有如下重要的度量值
系統信息:包括處理器數量processors、運行時間uptime和instance.uptime、 系統平均負載 systemload.average。
mem. *: 內存概要信息,包括分配給應用的總內存數量以及當前空閑的內存數量。 這些信息來自java.lang.Runtime。
heap.* : 堆內存使用情況。 這些信息來自 java.lang.management. MemoryMXBean 接口中 getHeapMemoryUsage 方法獲取的 java.lang. management.MemoryUsage。
nonheap. *: 非堆內存使用情況。 這些信息來自 java. lang.management. MemoryMXBean接口中getNonHeapMemoryUsage方法獲取的java.lang. management.MemoryUsage。
hreads.*: 線程使用情況,包括線程數、守護線程數(daemon),線程峰值(peak) 等, 這些數據均來自java.lang.management.ThreadMXBean。
classes.*: 應用加載和卸載的類統計。這些數據均來自java.lang.management.ClassLoadingMXBean。
gc. *: 垃圾收集器的詳細信息,包括垃圾回收次數gc.ps—scavenge.count、 垃圾回收消耗時間 gc.ps_scavenge.time、 標記-清除算法的次數 gc.ps marksweep.count、 標記-清除算法的消耗時間gc.ps_marksweep.time。 這些數據均來自java.lang.management.GarbageCollectorMXBean。
httpsessions. * : Tomcat容 器 的會話使用情況。 包 括最大會話 數 httpsessions.max和活躍會話數httpsessions.active。 該度量指標信 息僅在引入嵌入式Tomcat作為應用容器的時候才會提供。
gauge.*: HTTP請求的性能指標之一,它主要用來反映一個絕對數值。 比如gauge.response.hello: 5, 它表示上 一 次hello請求的延遲 時間為5毫秒。
counter.*: HTTP 請求的性能指標之一,它主要作為計 數器來使用,記錄了 增加量和減少量。 上述示例中的counter.status.200.hello: 11, 它代表 了 hello請求返回200狀態的次數為11
對於gauge.*和counter.*的統計,這里有 一個特殊的內容請求 star-star, 它代表了對靜態資源的訪問,還可以通過 /metrics/{name}接口來更細粒度地獲取度量信息 , 比 如可 以通 過訪 問 /metrics/mem.free來獲取當前可用 內存數量
/health: 用來獲取應用的各類 健康 指標信息
自定義監控管理信息:
比如RocketMQ作為消息代理時,由於沒有自動化配置的檢測器, 所以需要自己來實現一個用來采集健康信息的檢測器。 我們可以在SpringBoot的應用 中,為org.springframework.boot.actuate.health.Healthindicator接 口實現一個對RocketMQ的檢測器類,
代碼如下
-
-
@Component
-
public
class RocketMQHealthindicator implements HealthIndicator {
-
-
@Override
-
public Health health() {
-
int errorCode = check();
-
if (errorCode !=
0) {
-
return Health.down().withDetail(
"Error Code", errorCode).build();
-
}
-
return Health.up().build();
-
}
-
-
private int check() {
-
//對監控對象的檢測操作
-
return
0;
-
}
-
}
/dump: 該端點用來暴露程序運行中的線程信息。它使用 java.lang.rnanagernent.ThreadMXBean 的 durnpAllThreads方法來返回所有含有同步信息的活動線程詳 情。
• /trace: 該端點用來返回基本的 HTTP 跟蹤信息。 默認情況下, 跟蹤信息的存儲采用 org.springfrarnework.boot.actuate.trace.InMernoryTraceRepository 實現的內存方式, 始終保留最近的100條請求記錄。
轉載:https://blog.csdn.net/xuewenyong/article/details/89287097操作控制類
操作 控制類端點擁有更強大的控制能力,使用它們需要通過屬性來配置開啟操作
/shutdown :關閉應用的端點,通過以下配置開啟
endpoints.shutdown.enabled=true
關於微服務搭建的一些內容到這里就結束了,監控管理這一塊只是對一些默認的端點進行了介紹,具體的還需要在實際應用過程中多學習和觀察。
文檔資料:
翟永超主編 Spring Cloud微服務實戰 出版社:電子工業出版社 出版時間:2017.5
另外安利一個學習教程:Spring Cloud微服務實戰
分享一個it資源平台:點擊進入