在一個廣大領域需求的市場,無論你身處哪種開發情境下,勢必都會遇到需要開發API進行介接的情況,目的在於將資訊呈現於前端介面上,或整合介接於各套系統上,故勢必會切割出各類各式的API,此種架構統稱為服務導向架構(SOA,Service-Oriented Architecture),本文章採用領域驅動設計(DDD,Domain Driven Design)設計方法進行實作,相關運用的元件在前面幾天已有進行詳細敘述,如何使開發者快速尋找到對應的服務、快速建立相關的服務及運用控制器(@RestController)達到基礎的新增、讀取、更新及刪除(CRUD,Create Read Update Delete)四項基本操作,有沒有一種開始想躍躍欲試感覺,現在讓我們開始跟你做介紹與說明吧!Let's Go~!!!
SOA架構至今依舊是相當盛行的架構,適用於各種場域上的系統設計,主要由三種基本元素組成,分別為元件、服務及流程三個部份,在這十幾天,我們已將達到這三種元素相關模式註解進行詳細介紹,亦介紹過相當多種模式註解來設計出不同的Bean元件、設計不同服務元件及修改流程註解模式,所有的應用程式接口(API)接來至於控制器(Controller),Spring框架亦有提供應用程式接口開發註解模式,分別為@RestController與@Controller兩種控制器模式註解,@Controller屬於一種元註解控制器模式註解,可適用於Socket與WebService服務開發,@RestController屬於WebService的模式註解,可以見得@RestController等於@ResponseBody及@Controller兩項註解搭配而成,@RestController因有@ResponseBody此項註解輔助,可以將模型實體自動返回格式轉成JSON(JavaScript Object Notation)格式,而@Controller需再多配置@ResponseBody此項註解才可達到效用,各位開發者可參考以下範例程式及測試結果,相關開發設計方法再由下面結構章節進行闡述。
範例一、@RestController範例程式碼,以內部配置@ResponseBody預設回覆內文格式註解。
@RestController
public class ProductController extends ControllerBase{
@Resource(name="seaFoodRetailService",type = SeaFoodRetailService.class)
SeaFoodRetailService seaFoodRetailService;
@GetMapping(
value="/taiwan/list"
)
List<SeaFood> listSeaFood() {
return seaFoodRetailService.listSeaFoodProducts();
}
.....
.....
.....
}
範例一、測試結果未配置任何回應格式註解自動轉為JSON格式
範例二、@Controller範例程式碼,並未配置上@ResponseBody回覆內文格式註解。
@Controller
public class ChinaProductController extends ControllerBase {
@Resource(name="chinaSeaFoodRetailService",type = SeaFoodRetailService.class)
SeaFoodRetailService seaFoodRetailService;
@GetMapping(
value="/china/list"
)
List<SeaFood> listSeaFood() {
return seaFoodRetailService.listSeaFoodProducts();
}
.....
.....
.....
}
範例二、因沒有預設的回覆格式會導致回覆內容錯誤
補上@ResponseBody後即可回傳接取JSON預設格式,或在每個方法置放上{consumes = MediaType.APPLICATION_JSON_VALUE},這樣就會要求每個請求API在header中置放Content-type為application/json才可進行請求。
透過以上@Controller註解模式程式碼範例與規範給各位開發者作參考,亦可釐清個註解之間的差異處,範例檔中的postman.json提供給各位開發者做操作測試使用,各位開發者可以無聊玩玩看喔!
依據下圖(圖一),我們可看出Spring所有註解服務皆擴展於@Component元註解,並僅能運用在類別元件上,不可引用於方法上,是一個專為Restful API設計的註解模式,並配置上了預設的JSON回覆格式之註解模式(@ResponseBody)方法,而為何要將@Controller獨立切出呢,是因為這個控制器元註解(@Controller)亦有其他服務共用,如:RSocket Service,啊~可是這個時間不夠,小編沒規劃排在這三十天內,下方架構圖提供給各位開發者作參考。
圖一 RestController 繼承架構圖
依據下圖(圖二),我們可看出任何前端框架發送請求數據給後端服務時,皆採用HTTP方法居多,故我們提供了一個簡單範例用Cache來暫時取代ORM套件,由上至下的架構為@Controller、@Service、@Reporitory及@DataModel此四項,可由架構圖可看出亦可配置周遭相關服務去更新各領域的DataModel,如:@Scheduler,如此一來,各控制器可很快速地透過各式各樣的注入服務進行觸發執行任務,並取得介接元件或服務所需要的數據資料,即可讓前端介面進行界皆呈現。
圖二 Domain Driven Design架構圖
服務導向架構(Service-Oriented Architecture,SOA) 簡介
[Domain Driven Design] 簡介和為什麼你需要DDD