接上文,第一步需要設(shè)計(jì)我們的表結(jié)構(gòu),我初步的構(gòu)想是兩張表來裝下它,后續(xù)肯定會(huì)有一些變動(dòng),因?yàn)槲乙彩且贿厡懝ぞ咭贿呌涗浀摹?/p>
設(shè)計(jì)說明
工具應(yīng)該有兩塊內(nèi)容,第一塊是契約的信息,這部分記錄的契約的結(jié)構(gòu)體。第二快是子契約,所有具體的值必須由子契約來承載,子契約的內(nèi)容一旦定義后是不可變更的。而契約工具對(duì)消費(fèi)端和生產(chǎn)端的具體報(bào)文內(nèi)容都由子契約來承載。
環(huán)境說明
我使用的是sqlalchemy這個(gè)ORM框架來處理數(shù)據(jù)庫(kù)交互的。表結(jié)構(gòu)的代碼如下
from sqlalchemy import Column, String, Integer
from sqlalchemy.ext.declarative import declarative_base
BaseModel = declarative_base()
class ContractStructure(BaseModel):
__tablename__ = 'contract_structure'
id = Column(Integer, primary_key=True)
contract_name = Column(String(500), nullable=False)
contract_consumer_body = Column(String(10000), nullable=False)
contract_consumer_keys = Column(String(500), nullable=False)
contract_provider_body = Column(String(5000), nullable=False)
contract_stakeholders = Column(String(500), nullable=False)
contract_child_ids = Column(String(500), nullable=True)
contract_version = Column(Integer, default=1)
contract_last_version = Column(String(1), nullable=False, default='Y')
provider_url = Column(String(100), nullable=True)
class ContractChild(BaseModel):
__tablename__ = 'contract_child'
id = Column(Integer, primary_key=True)
child_id = Column(String(40), nullable=False)
child_name = Column(String(100), nullable=False)
contract_id = Column(Integer)
child_consumer_body = Column(String(10000), nullable=False)
child_provider_body = Column(String(5000), nullable=False)
下面我們一個(gè)一個(gè)來說明我這樣設(shè)計(jì)的想法
ContractStructure
這個(gè)表是用來存放契約結(jié)構(gòu)以及契約的一些相關(guān)信息。
- contract_name
契約名稱,一般來說方便認(rèn)識(shí)的名字比較好,比如Consumer-Provider這種。
- contract_consumer_body
契約消費(fèi)者的結(jié)構(gòu)體,也就是consumer端發(fā)起的報(bào)文。
- contract_consumer_keys
契約消費(fèi)者的結(jié)構(gòu)體的key,由于契約測(cè)試中結(jié)構(gòu)體是不可變的,因此必須要校驗(yàn)consumer端傳過來結(jié)構(gòu)的key值,用來確保報(bào)文結(jié)構(gòu)的一致性
- contract_provider_body
契約生產(chǎn)者的結(jié)構(gòu)體,也就是返回給consumer端的報(bào)文結(jié)構(gòu)
- contract_stakeholders
契約的干系人,一旦契約發(fā)生變動(dòng),程序需要通知的對(duì)象
- contract_child_ids
契約子內(nèi)容的id
- contract_version
契約的版本信息,一旦契約發(fā)生變更,那么版本也要對(duì)應(yīng)的變更
- contract_last_version
標(biāo)記改版本的契約是否為最新的契約
- provider_url
生產(chǎn)中的url地址,工具要能夠給provider端發(fā)送契約內(nèi)容,因此需要一個(gè)字段來記錄url
contract_child
這個(gè)表用來存放子契約的內(nèi)容
- child_name
子契約對(duì)應(yīng)的名字
- contract_id
所屬契約的id
- child_consumer_body
消費(fèi)端的報(bào)文內(nèi)容
- child_provider_body
生產(chǎn)端的報(bào)文內(nèi)容
最后
以上,我們定義了工具的表,下面應(yīng)該做的就是開始寫具體的契約類。