[Day - 18] - Spring SOA架构之领域驱动设计之旅

Abstract

在一个广大领域需求的市场,无论你身处哪种开发情境下,势必都会遇到需要开发API进行介接的情况,目的在於将资讯呈现於前端介面上,或整合介接於各套系统上,故势必会切割出各类各式的API,此种架构统称为服务导向架构(SOA,Service-Oriented Architecture),本文章采用领域驱动设计(DDD,Domain Driven Design)设计方法进行实作,相关运用的元件在前面几天已有进行详细叙述,如何使开发者快速寻找到对应的服务、快速建立相关的服务及运用控制器(@RestController)达到基础的新增、读取、更新及删除(CRUD,Create Read Update Delete)四项基本操作,有没有一种开始想跃跃欲试感觉,现在让我们开始跟你做介绍与说明吧!Let's Go~!!!

Principle Introduction

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格式

image

范例二、@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();
    }
    
    .....
    .....
    .....
    
}

范例二、因没有预设的回覆格式会导致回覆内容错误

image

补上@ResponseBody後即可回传接取JSON预设格式,或在每个方法置放上{consumes = MediaType.APPLICATION_JSON_VALUE},这样就会要求每个请求API在header中置放Content-type为application/json才可进行请求。
image

透过以上@Controller注解模式程序码范例与规范给各位开发者作参考,亦可厘清个注解之间的差异处,范例档中的postman.json提供给各位开发者做操作测试使用,各位开发者可以无聊玩玩看喔!

Structure

依据下图(图一),我们可看出Spring所有注解服务皆扩展於@Component元注解,并仅能运用在类别元件上,不可引用於方法上,是一个专为Restful API设计的注解模式,并配置上了预设的JSON回覆格式之注解模式(@ResponseBody)方法,而为何要将@Controller独立切出呢,是因为这个控制器元注解(@Controller)亦有其他服务共用,如:RSocket Service,啊~可是这个时间不够,小编没规划排在这三十天内,下方架构图提供给各位开发者作参考。

图一 RestController 继承架构图
image

依据下图(图二),我们可看出任何前端框架发送请求数据给後端服务时,皆采用HTTP方法居多,故我们提供了一个简单范例用Cache来暂时取代ORM套件,由上至下的架构为@Controller、@Service、@Reporitory及@DataModel此四项,可由架构图可看出亦可配置周遭相关服务去更新各领域的DataModel,如:@Scheduler,如此一来,各控制器可很快速地透过各式各样的注入服务进行触发执行任务,并取得介接元件或服务所需要的数据资料,即可让前端介面进行界皆呈现。

图二 Domain Driven Design架构图
image

Sample Source

Spring-sample-controller

Reference Url

服务导向架构(Service-Oriented Architecture,SOA) 简介

[Domain Driven Design] 简介和为什麽你需要DDD


<<:  Day 18 - UML x Component — Button

>>:  android studio 30天学习笔记-day 18-viewPager

[Day 7] -『 GO语言学习笔记』- 指标函式设计 & 常数(constants)

以下笔记摘录自『 The Go Workshop 』。 采用指标的函式设计 如果变数是指标,或者传递...

[Q&A] 06 风险评监报告生出来前的修修改改

资讯安全管理制度运行过程中,会对即有的企业或机构文化带来一定的冲击。 顾问有教过、学员有学过都是真的...

【这些年我似是非懂的 Javascript】Day 30 - 完赛心得

今天是最後一天铁人赛, 好像没有完赛心得就不完美了一样, 原本想说不应该在三十天时写心得, 毕竟这...

DAY26 - [React] 登入登出 router

今日文章目录 需求说明 过程纪录 参考文章 今天来练习Router切换页面。 需求说明 两个页面:...

[Q&A] 03 资安健诊/弱点检测报告不被重视

资安健诊/弱点检测报告对於企业或机构来说,是一份全面性的安全检查结果揭露。 如果发生了下图模拟情境,...