育碧開發者證實:《孤島驚魂2》傑克就是一代主角
Spring Boot概述
微服務概述
微服務
微服務(英語:Microservices)是一種軟體架構風格,它是以專注於單一責任與功能的小型功能區塊 (Small Building Blocks) 為基礎,利用模組化的方式組合出複雜的大型應用程式,各功能區塊使用與語言無關 (Language-Independent/Language agnostic)的API集相互通訊;2014年,Martin Fowler 與 James Lewis 共同提出了微服務的概念,定義了微服務是以開發一組小型服務的方式來開發一個獨立的應用系統的。其中每個小型服務都執行在自己的程序中,並經常採用HTTP資源API這樣輕量的機制來相互通訊。這些服務圍繞業務功能進行構建,並能通過全自動的部署機制來進行獨立部署。這些微服務可以使用不同的語言來編寫,並且可以使用不同的資料儲存技術。對這些微服務我們僅做最低限度的集中管理。
單體應用
- 單體應用:一個單塊應用系統是以一個單個單元的方式來構建的。企業應用系統經常包含三個主要部分:客戶端使用者介面、資料庫和服務端應用系統,這裡的服務端應用系統就是一個單體的應用,系統中任意邏輯發生變化都會導致重新構建部署一個新版本的服務端應用系統。針對單體應用,當訪問量變大時,通常採用負載均衡,橫向擴充套件的方式將多個單體應用部署到多個伺服器上訪問。
- 單位應用缺點:軟體變更受到了很大的限制,應用系統的一個很小的部分的一處變更,也需要將整個單塊應用系統進行重新構建和部署。不能根據使用者需求部署應用系統中的功能模組,只能擴充套件部署整個應用系統。
微服務應用搭建
要搭建一個微服務,運維和部署都變得非常複雜,spring提供一套解決方案
-
SpringBoot:快速構建單個服務(簡化開發)
-
SpringCloud:是一系列有序框架的集合,其主要的設施有,服務發現與註冊,配置中心,訊息匯流排,負載均衡,斷路器,資料監控等,通過Spring Boot的方式,可以實現一鍵啟動,和部署。
-
Spring cloud data flow: 為基於微服務的分散式流處理和批處理資料通道提供了一系列模型和最佳實踐.
Spring Boot簡介
Spring-Boot是由Pivotal團隊提供的全新框架,其設計目的是用來簡化新Spring應用的初始搭建以及開發過程。個人理解來說Spring-Boot其實不是什麼新的框架,它預設配置了很多框架的使用方式,就像maven整合了所有的jar包,Spring-Boot整合了其他相關聯框架。
SpringBoot是整合了其他技術的框架:spring整合其他技術的時候自己手動完成整合的過程。
SpringBoot 是對spring技術棧的一次整合。
Spring Boot優勢
- 快速構建專案
- 對主流開發框架的無配置整合
- 專案可獨立執行,無須外部依賴Servlet容器
- 提供執行時的應用監控
- 極大的提高了開發、部署效率
- 與雲端計算的天然整合
Spring Boot的核心功能
獨立執行Spring專案
Spring Boot 可以以jar包形式獨立執行,執行一個Spring Boot專案只需要通過java -jar xx.jar來執行。
內嵌servlet容器
Spring Boot可以選擇內嵌Tomcat、jetty或者Undertow,這樣我們無須以war包形式部署專案。
提供starter(啟動器)簡化Maven配置
spring提供了一系列的start pom來簡化Maven的依賴載入,例如,當你使用了spring-boot-starter-web會自動加入
自動裝配Spring
Spring Boot會根據在類路徑中的jar包,類、為jar包裡面的類自動配置Bean,這樣會極大地減少我們要使用的配置。當然,Spring Boot只考慮大多數的開發場景,並不是所有的場景,若在實際開發中我們需要配置Bean,而Spring Boot也有提供支援,則可以自定義自動配置。
準生產的應用監控
Spring Boot提供基於http ssh telnet對執行時的專案進行監控
無程式碼生成和xml配置
Spring Boot不是藉助與程式碼生成來實現的,而是通過條件註解來實現的,這是Spring4.x提供的新特性。
Spring Boot入門程式
建立maven工程匯入springboot依賴
<!--繼承指定的父模組pom.xml檔案:對專案進行整體的管理維護,如統一版本管理-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.3</version>
</parent>
<!--spring提供的web專案啟動器模組-->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
Spring Boot將所有的功能場景都抽取出來,做成一個個的starters(啟動器),只需要在專案裡面引入這些starter 相關場景的所有依賴都會匯入進來。要用什麼功能就匯入什麼場景的啟動器 。
編寫spring Boot的主程式
主程式程式碼
@SpringBootApplication
public class Example {
public static void main(String[] args) {
/**
* 啟動springboot
*/
SpringApplication.run(Example.class,args);
}
}
@SpringBootApplication: 註解說明這個類是SpringBoot的主配置類,SpringBoot 就應該執行這個類的main方法來啟動SpringBoot應用;並將主配置類(@SpringBootApplication標註的類)的所在包及下面所有子包裡面的所有元件掃描到Spring容器;
編寫Controller程式碼
@Controller
public class TestController {
@RequestMapping("/hello")
@ResponseBody
public String helloWorld(){
return "Hello world!";
}
}
Spring Boot配置檔案
配置檔案的作用及規範
Spring Boot使用一個全域性的配置檔案,配置檔名是固定的;預設使用以下兩種格式:
application.properties
application.yml
配置檔案的作用:修改SpringBoot自動配置的預設值;
Spring Boot啟動時會根據配置檔案自動註冊相關的應用元件
yaml配置檔案
yaml的語法
YAML:以資料為中心配置語言,比json、xml等更適合做配置檔案(以格式為中心的語言,強調標籤結構);
- (1)基本語法
– 使用縮排表示層級關係
– 縮排時不允許使用Tab鍵,只允許使用空格。
– 縮排的空格數目不重要,只要相同層級的元素左側對齊即可 – 大小寫敏感(嚴格區分大小寫內容)
- 鍵值對中間必須要有空格k:(空格)v
- (2)值的寫法
YAML 支援的三種資料結構:
字面量:普通的值(數字,字串,布林)
server:
port: 8081 admin true...
注意:字串預設不用加上單引號或者雙引號;
雙引號:特殊符號表示轉義符本身;
name: "zhangsan \n lisi":輸出;zhangsan 換行 lisi
單引號;特殊字元就表示字元本身;
name: ‘zhangsan \n lisi’:輸出;zhangsan \n lisi
物件、Map(屬性和值)(鍵值對)
person:
name: zhangsan
age: 12
另一種行內寫法:
person: {name: zhangsan,age: 12}
陣列(List,Set)
hobbies:
- singing
- dancing
- running
用-(空格)值表示陣列中的一個元素
另一種行內寫法:
hobbies: [singing,dancing,running]
配置檔案值的注入
(1)構建bean物件
//只有spring容器中的物件才能自動進行資料繫結
@Component
//將本類中的所有屬性和配置檔案中相關的配置進行繫結;
// prefix指定要繫結的配置檔案中的屬性字首;
@ConfigurationProperties(prefix = "person")
public class Person {
private String pname;
private int age;
private boolean success;
private Date birth;
private Car car;
private Map<String,Object> maps;
private List<Object> lists;
}
(2)構建配置檔案
person:
pname: zhangsan
age: 12
birth: 2020/12/12
success: true
car:
cname: 賓士
cprice: 200.0
lists: [唱歌,跳舞]
lists:
- 唱歌
- 跳舞
maps: {key1: v1,key2: v2}
maps:
key1: v1
key2: v2
(3)執行單元測試檢視person物件的值
@SpringBootTest
class SpringbootApplicationTests {
@Autowired
private Person person;
@Test
void contextLoads() {
System.out.println(person);
}
}
properties配置檔案
properties語法
以KEY=VALue鍵值對的方式設定值
字面量:普通的值(數字,字串,布林)
name=張三
物件、Map(屬性和值)(鍵值對)
person.name=張三
person.age=12
maps.key1=value1
maps.key2=value2
陣列(List,Set)
hobbies=singing,dancing,running
配置檔案值的注入
(1)構建bean物件
//只有spring容器中的物件才能自動進行資料繫結
@Component
//將本類中的所有屬性和配置檔案中相關的配置進行繫結;
// prefix指定要繫結的配置檔案中的屬性字首;
@ConfigurationProperties(prefix = "person")
public class Person {
private String pname;
private int age;
private boolean success;
private Date birth;
private Car car;
private Map<String,Object> maps;
private List<Object> lists;
}
(2)構建配置檔案
person.pname=張三
person.age=12
person.birth=2019/12/12
person.success=true
person.car.cname=寶馬
person.car.cprice=100.0
person.lists=唱歌,跳舞,跑步
person.maps.k1=value1
person.maps.k2=value2
(3)執行單元測試檢視person物件的值
@SpringBootTest
class SpringbootApplicationTests {
@Autowired
private Person person;
@Test
void contextLoads() {
System.out.println(person);
}
}
@ConfigurationProperties註解和@Value註解的區別
- @ConfigurationProperties註解用於根據配置檔案批量注入值,springboot預設配置檔案application.yml/application.properties;
- @Value註解用於根據配置檔案單個注入值;
區別 | @ConfigurationProperties | @Value |
---|---|---|
SpEL | 不支援 | 支援 |
複雜型別封裝 | 支援 | 不支援 |
案例:
@Component
//@ConfigurationProperties(prefix = "person")
public class Person {
@Value("${person.pname}")
private String pname;
@Value("#{12*2}")
private int age;
private boolean success;
private Date birth;
private Car car;
private Map<String,Object> map;
private List<Object> hobbies;
}
配置檔案中的佔位符
- springboot全域性配置檔案中可以使用隨機數
${random.value}、${random.int}、${random.long}
${random.int(10)}、${random.int[1024,65536]} - springboot全域性配置檔案中可以使用佔位符
通過${屬性名}獲取已經在配置檔案中載入過的屬性值;
通過${屬性名:預設值}來指定找不到屬性時的預設值;
案例:
person.pname=張三
person.age=${random.int}
person.success=true
person.birth=2012/12/12
person.car.cname=${car.cname:賓士}
person.car.cprice=200.0
person.map.key1=value1
person.map.key2=value2
person.hobbies=唱歌,跳舞,跑步
多環節支援
Profile是Spring對不同環境提供不同配置功能的支援,可以通過啟用、指定引數等方式快速切換環境;
多檔案多環節形式
格式:application-{profile}.properties/yml
例如:可以在專案中建立如下主配置檔案:application-dev.properties、application-test.properties、application-prod.properties、application.properties,預設使用application.properties,可以通過配置spring.profiles.active=profile指定使用某個環境的配置檔案。
yaml支援單檔案多環境形式
server:
port: 8080
person:
pid: 123
pname: admin
bir: 2021/10/09
dog:
dogName: 小黑
maps: {key1: value1,key2: value2}
nums:
- 123
- 45
- 789
stringList: [str1,str2,str3]
spring:
profiles:
active: dev1
---
server:
port: 8086
spring:
config:
activate:
on-profile: test1
---
spring:
config:
activate:
on-profile: dev1
server:
port: 8087
---
spring:
config:
activate:
on-profile: pro1
server:
port: 8088
Spring Boot的Web開發
springboot關於靜態資源的處理
springboot啟動時會根據配置檔案自動配置相應場景的元件xxxAutoConfiguration,web專案啟動時會初始化WebMvcAutoConfiguration元件處理請求相關的操作,其中有預設處理靜態資源的方法:
傳統應用的做法:
給專案新增 jquery vue css.....,直接將資源賦值貼上到專案中。
springboot: jquery vue .... 做成了jar檔案,在pom檔案中新增相關靜態資源的jar,然後在專案中使用。
@Override
protected void addResourceHandlers(ResourceHandlerRegistry registry) {
super.addResourceHandlers(registry);
if (!this.resourceProperties.isAddMappings()) {
logger.debug("Default resource handling disabled");
return;
}
ServletContext servletContext = getServletContext();
addResourceHandler(registry, "/webjars/**", "classpath:/META-INF/resources/webjars/");
addResourceHandler(registry, this.mvcProperties.getStaticPathPattern(), (registration) -> {
registration.addResourceLocations(this.resourceProperties.getStaticLocations());
if (servletContext != null) {
registration.addResourceLocations(new ServletContextResource(servletContext, SERVLET_LOCATION));
}
});
}
從該方法中可以發現:
1、預設情況下:
(1)匹配/webjars/** 的請求,都去 classpath:/META-INF/resources/webjars/ 找資源;
(2)匹配 "/**" 的請求,都去(靜態資源的資料夾)找對映,靜態資原始檔夾路徑如下ResourceProperties.java中:
"classpath:/META‐INF/resources/"
"classpath:/resources/"
"classpath:/static/"
"classpath:/public/"
"/":當前專案的根路徑
2、自定義配置靜態資源路徑:
spring.web.resources.static-locations=自定義路徑
- 1、webjars的使用
- 可以通過webjars以jar包的方式引入靜態資源。
(1)引入依賴
<!--jquery的jar包引入-->
<dependency>
<groupId>org.webjars</groupId>
<artifactId>jquery</artifactId>
<version>3.6.0</version>
</dependency>
(2)啟動服務訪問資源
瀏覽器訪問路徑:http://localhost:8080/webjars/jquery/3.6.0/jquery.min.js獲取相應的靜態資源。
2、靜態資源的存放位置
(1)預設存放位置檢視
ResourceProperties.java----->Resources
private static final String[] CLASSPATH_RESOURCE_LOCATIONS = {
"classpath:/META-INF/resources/",
"classpath:/resources/",
"classpath:/static/",
"classpath:/public/"
};
預設靜態資源路徑:
"classpath:/META‐INF/resources/"
"classpath:/resources/"
"classpath:/static/"
"classpath:/public/"
"/":當前專案的根路徑
案例:在上述任意路徑下建立靜態資源hello.html,瀏覽器訪問路徑:http://localhost:8080/hello.html獲取相應的靜態資源。
(2)自定義位置存放
在配置檔案中通過屬性spring.web.resources.static-locations=自定義路徑,設定自定義靜態資源存放路徑;
案例:
a、配置檔案中設定:spring.web.resources.static-locations= classpath:/hello/, classpath:/hello/
b、在自定義路徑下新增靜態資源hello.html,瀏覽器訪問路徑:http://localhost:8080/hello.html獲取相應的靜態資源。
注意:自定義靜態資源路徑後,預設靜態資源路徑失效(2.4.3版本中/META‐INF/resources/,自定義後式不會失效的)!