REST 已迅速成為在 Web 上構(gòu)建 Web 服務(wù)的事實(shí)標(biāo)準(zhǔn),因?yàn)樗鼈円子跇?gòu)建且易于使用。
關(guān)于 REST 如何適應(yīng)微服務(wù)世界還有一個(gè)更大的討論,但是——對(duì)于本教程——讓我們看看構(gòu)建 RESTful 服務(wù)。
為什么是 REST?REST 包含 Web 的規(guī)則,包括其架構(gòu)、優(yōu)勢(shì)和其他一切。這并不奇怪,因?yàn)樗淖髡?Roy Fielding 參與了十幾個(gè)管理網(wǎng)絡(luò)運(yùn)行方式的規(guī)范。
有什么好處?Web 及其核心協(xié)議 HTTP 提供了一系列功能:
- 合適的行動(dòng) ( GET, POST, PUT, DELETE, ...)
- 緩存
- 重定向和轉(zhuǎn)發(fā)
- 安全性(加密和身份驗(yàn)證)
這些都是構(gòu)建彈性服務(wù)的關(guān)鍵因素。但這還不是全部。網(wǎng)絡(luò)是由許多微小的規(guī)范構(gòu)成的,因此它能夠輕松發(fā)展,而不會(huì)陷入“標(biāo)準(zhǔn)戰(zhàn)爭(zhēng)”的泥潭。
開(kāi)發(fā)人員能夠利用 3rd 方工具包來(lái)實(shí)現(xiàn)這些不同的規(guī)范,并立即讓客戶端和服務(wù)器技術(shù)觸手可及。
通過(guò)在 HTTP 之上構(gòu)建,REST API 提供了構(gòu)建方法:
- 向后兼容的 API
- 可演進(jìn)的 API
- 可擴(kuò)展的服務(wù)
- 安全的服務(wù)
- 一系列無(wú)狀態(tài)服務(wù)到有狀態(tài)服務(wù)
重要的是要意識(shí)到,無(wú)論多么普遍,REST本身并不是一種標(biāo)準(zhǔn),而是一種方法、一種風(fēng)格、一組對(duì)您的架構(gòu)的約束,可以幫助您構(gòu)建 Web 規(guī)模的系統(tǒng)。在本教程中,我們將使用 Spring 產(chǎn)品組合來(lái)構(gòu)建 RESTful 服務(wù),同時(shí)利用 REST 的無(wú)堆棧特性。
入門(mén)
在完成本教程時(shí),我們將使用Spring Boot。轉(zhuǎn)到Spring Initializr并將以下依賴(lài)項(xiàng)添加到項(xiàng)目中:
- 網(wǎng)絡(luò)
- JPA
- H2
將名稱(chēng)更改為“工資單”,然后選擇“生成項(xiàng)目”。A.zip會(huì)下載。解壓它。在里面你會(huì)發(fā)現(xiàn)一個(gè)簡(jiǎn)單的、基于 Maven 的項(xiàng)目,包括一個(gè)pom.xml構(gòu)建文件(注意:你可以使用 Gradle。本教程中的示例將基于 Maven。)
Spring Boot 可以與任何 IDE 一起使用。您可以使用 Eclipse、IntelliJ IDEA、Netbeans 等。Spring Tool Suite是一個(gè)開(kāi)源的、基于 Eclipse 的 IDE 發(fā)行版,它提供了 Eclipse 的 Java EE 發(fā)行版的超集。它包括使使用 Spring 應(yīng)用程序更加容易的功能。這絕不是必需的。但是,如果您想要為您的擊鍵帶來(lái)額外的魅力,請(qǐng)考慮一下。
到目前為止的故事……?
讓我們從我們能構(gòu)建的最簡(jiǎn)單的東西開(kāi)始。事實(shí)上,為了盡可能簡(jiǎn)單,我們甚至可以省略 REST 的概念。(稍后,我們將添加 REST 以了解差異。)
大圖:我們將創(chuàng)建一個(gè)簡(jiǎn)單的工資單服務(wù)來(lái)管理公司的員工。我們將員工對(duì)象存儲(chǔ)在(H2 內(nèi)存中)數(shù)據(jù)庫(kù)中,并訪問(wèn)它們(通過(guò)稱(chēng)為JPA的東西)。然后我們將使用允許通過(guò) Internet 訪問(wèn)的東西(稱(chēng)為 Spring MVC層)包裝它。
以下代碼在我們的系統(tǒng)中定義了一個(gè) Employee。
nonrest/src/main/java/payroll/Employee.java
package payroll;
import java.util.Objects;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
@Entity
class Employee {
private @Id @GeneratedValue Long id;
private String name;
private String role;
Employee() {}
Employee(String name, String role) {
this.name = name;
this.role = role;
}
public Long getId() {
return this.id;
}
public String getName() {
return this.name;
}
public String getRole() {
return this.role;
}
public void setId(Long id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
public void setRole(String role) {
this.role = role;
}
@Override
public boolean equals(Object o) {
if (this == o)
return true;
if (!(o instanceof Employee))
return false;
Employee employee = (Employee) o;
return Objects.equals(this.id, employee.id) && Objects.equals(this.name, employee.name)
&& Objects.equals(this.role, employee.role);
}
@Override
public int hashCode() {
return Objects.hash(this.id, this.name, this.role);
}
@Override
public String toString() {
return "Employee{" + "id=" + this.id + ", name='" + this.name + '\'' + ", role='" + this.role + '\'' + '}';
}
}
盡管很小,但這個(gè) Java 類(lèi)包含很多:
- @Entity是一個(gè) JPA 注釋?zhuān)糜谑乖搶?duì)象準(zhǔn)備好存儲(chǔ)在基于 JPA 的數(shù)據(jù)存儲(chǔ)中。
- id, name, 和role是我們的 Employee域?qū)ο蟮膶傩浴?span style="color:rgb(0,0,153);">id用更多的 JPA 注釋標(biāo)記以指示它是主鍵并由 JPA 提供程序自動(dòng)填充。
- 當(dāng)我們需要?jiǎng)?chuàng)建一個(gè)新實(shí)例但還沒(méi)有 id 時(shí),會(huì)創(chuàng)建一個(gè)自定義構(gòu)造函數(shù)。
有了這個(gè)域?qū)ο蠖x,我們現(xiàn)在可以轉(zhuǎn)向Spring Data JPA來(lái)處理繁瑣的數(shù)據(jù)庫(kù)交互。
Spring Data JPA 存儲(chǔ)庫(kù)是與支持針對(duì)后端數(shù)據(jù)存儲(chǔ)創(chuàng)建、讀取、更新和刪除記錄的方法的接口。在適當(dāng)?shù)那闆r下,一些存儲(chǔ)庫(kù)還支持?jǐn)?shù)據(jù)分頁(yè)和排序。Spring Data 根據(jù)接口中方法命名中的約定來(lái)綜合實(shí)現(xiàn)。
除了 JPA 之外,還有多個(gè)存儲(chǔ)庫(kù)實(shí)現(xiàn)。您可以使用 Spring Data MongoDB、Spring Data GemFire、Spring Data Cassandra 等。對(duì)于本教程,我們將堅(jiān)持使用 JPA。
Spring 使訪問(wèn)數(shù)據(jù)變得容易。通過(guò)簡(jiǎn)單地聲明以下EmployeeRepository接口,我們將能夠自動(dòng)
- 創(chuàng)建新員工
- 更新現(xiàn)有的
- 刪除員工
- 查找員工(一個(gè)、全部或按簡(jiǎn)單或復(fù)雜屬性搜索)
nonrest/src/main/java/payroll/EmployeeRepository.java
package payroll;
import org.springframework.data.jpa.repository.JpaRepository;
interface EmployeeRepository extends JpaRepository {,>
}
為了獲得所有這些免費(fèi)功能,我們所要做的就是聲明一個(gè)擴(kuò)展 Spring Data JPA 的接口,JpaRepository將域類(lèi)型指定為Employeeid 類(lèi)型Long。
Spring Data 的存儲(chǔ)庫(kù)解決方案可以回避數(shù)據(jù)存儲(chǔ)細(xì)節(jié),而是使用特定于域的術(shù)語(yǔ)解決大多數(shù)問(wèn)題。
信不信由你,這足以啟動(dòng)應(yīng)用程序!Spring Boot 應(yīng)用程序至少是一個(gè)public static void main入口點(diǎn)和@SpringBootApplication注解。這告訴 Spring Boot 盡可能提供幫助。
nonrest/src/main/java/payroll/PayrollApplication.java
package payroll;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class PayrollApplication {
public static void main(String... args) {
SpringApplication.run(PayrollApplication.class, args);
}
}
@SpringBootApplication是一個(gè)引入組件掃描、自動(dòng)配置和屬性支持的元注釋。在本教程中,我們不會(huì)深入探討 Spring Boot 的細(xì)節(jié),但本質(zhì)上,它將啟動(dòng)一個(gè) servlet 容器并提供我們的服務(wù)。
然而,沒(méi)有數(shù)據(jù)的應(yīng)用程序不是很有趣,所以讓我們預(yù)加載它。Spring 將自動(dòng)加載以下類(lèi):
nonrest/src/main/java/payroll/LoadDatabase.java
package payroll;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.CommandLineRunner;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
class LoadDatabase {
private static final Logger log = LoggerFactory.getLogger(LoadDatabase.class);
@Bean
CommandLineRunner initDatabase(EmployeeRepository repository) {
return args -> {
log.info("Preloading " + repository.save(new Employee("Bilbo Baggins", "burglar")));
log.info("Preloading " + repository.save(new Employee("Frodo Baggins", "thief")));
};
}
}
加載時(shí)會(huì)發(fā)生什么?
- CommandLineRunner加載應(yīng)用程序上下文后,Spring Boot 將運(yùn)行所有bean。
- 此運(yùn)行程序?qū)⒄?qǐng)求EmployeeRepository您剛剛創(chuàng)建的副本。
- 使用它,它將創(chuàng)建兩個(gè)實(shí)體并存儲(chǔ)它們。
右鍵單擊并運(yùn)行 PayRollApplication,這就是你得到的:
顯示數(shù)據(jù)預(yù)加載的控制臺(tái)輸出片段
...2018-08-09 11:36:26.169 INFO 74611 --- [main] payroll.LoadDatabase:預(yù)加載員工(id=1,name=Bilbo Baggins,角色=竊賊)2018-08-09 11:36:26.174 INFO 74611 --- [main] payroll.LoadDatabase:預(yù)加載員工(id=2,name=Frodo Baggins,role=thief)...
這不是整個(gè)日志,而只是預(yù)加載數(shù)據(jù)的關(guān)鍵部分。(確實(shí),檢查整個(gè)控制臺(tái)。這太棒了。)
.......未完待續(xù)......
以上就是今天關(guān)于Spring的一些討論,對(duì)你有幫助嗎?如果你有興趣深入了解,歡迎到Spring中國(guó)教育管理中心留言交流!
審核編輯:湯梓紅
-
spring
+關(guān)注
關(guān)注
0文章
340瀏覽量
14392 -
REST
+關(guān)注
關(guān)注
0文章
33瀏覽量
9448
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論