接上文巷挥,第一步需要設(shè)計(jì)我們的表結(jié)構(gòu),我初步的構(gòu)想是兩張表來(lái)裝下它棘催,后續(xù)肯定會(huì)有一些變動(dòng)劲弦,因?yàn)槲乙彩且贿厡?xiě)工具一邊記錄的。
設(shè)計(jì)說(shuō)明
工具應(yīng)該有兩塊內(nèi)容醇坝,第一塊是契約的信息邑跪,這部分記錄的契約的結(jié)構(gòu)體。第二快是子契約呼猪,所有具體的值必須由子契約來(lái)承載画畅,子契約的內(nèi)容一旦定義后是不可變更的。而契約工具對(duì)消費(fèi)端和生產(chǎn)端的具體報(bào)文內(nèi)容都由子契約來(lái)承載宋距。
環(huán)境說(shuō)明
我使用的是sqlalchemy
這個(gè)ORM框架來(lái)處理數(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è)來(lái)說(shuō)明我這樣設(shè)計(jì)的想法
ContractStructure
這個(gè)表是用來(lái)存放契約結(jié)構(gòu)以及契約的一些相關(guān)信息。
- contract_name
契約名稱(chēng)谚赎,一般來(lái)說(shuō)方便認(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
端傳過(guò)來(lái)結(jié)構(gòu)的key
值悯辙,用來(lái)確保報(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è)字段來(lái)記錄url
contract_child
這個(gè)表用來(lái)存放子契約的內(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)該做的就是開(kāi)始寫(xiě)具體的契約類(lèi)。