2017-01-12 54 views
1

我們有兩個微服務:提供者和消費者,兩者都是獨立建立的。消費者微服務在其如何使用提供商服務(無論出於何種原因)方面出現錯誤,因此將不正確的協議發佈給Pact Broker。 消費者服務構建成功(並且可以一路發佈!),但下一個提供者服務構建將因錯誤原因失敗。所以我們最終得到了破碎的Provider服務構建和Consumer的破解版本。PACT:如何防範消費者產生不正確的合同

防止類似情況的最佳做法是什麼?

我希望Pact Broker可以在合同發佈時自動觸發提供者測試,並在消費者失敗時通知消費者,但似乎並非如此。

謝謝!

回答

0

你現在就在眼前,這是目前缺乏Pact工作流程的事情之一,而且這是我一直努力工作的意思,一旦其他事情一致。

這就是說,與此同時,這不是解決你目前的問題,所以我會建議你的過程中潛在的解決方法。與其爲消費者運行測試,他們通過,然後立即釋放測試,您可以讓測試運行在消費者身上,然後等待供應商測試恢復綠色,然後再將消費者/提供者放在一起。另一種方法是對提供者/消費者交互進行版本化(api版本控制),以便您可以事先發布消費者,但在提供者的正確版本發佈之前不會「打開」。

這些解決方案都不是很好,我完全同意。這是我非常熱衷的事情,並且很快就會着手解決開發人員與協作代理的經驗問題,並以更好的方式發佈消費者/提供商。

歡迎任何和所有意見。乾杯。

+1

非常感謝!很高興知道你有這個計劃! –

+0

@YuriSokolovski當然,想知道更多關於您當前的工作流程。如果您有5分鐘的空餘時間,請通過我的個人資料向我發送消息/電子郵件。乾杯。 –

0

我認爲這個問題可能是由於合同是在消費者方面產生的。這意味着消費者可以根據需要修改這些合同。但最終,由於消費者產生不正確的合同,生產者的構建將受到影響。 合同是否有任何生產者定義的方式?我認爲製片人有責任維持自己的合約。例如,對於Spring Cloud Contracts,建議在生產者源中定義聯繫人(例如,在具有生產者源代碼的同一git回購中)或在可由生產者和消費者一起管理的單獨scm回購中。

+0

你是對的。在我們與基金會成員的最後一次會議上,我們討論瞭如何從「消費者驅動型合同」改變爲「協作驅動型合同」,以便消費者和提供者的投入可以雙向進行。更多信息請見: –

+0

您可以隨時將合同存儲在供應商團隊管理的單獨回購/位置中。我將添加到我的回答 –

+0

感謝@MatthewFellows的評論。其實我已經做到了。它好多了。因此,現在我有一個單獨的git倉庫中有幾個Junit測試,其中包含狀態註釋,描述瞭如何將提供者切換到特定狀態(FYI提供者使用docker-compose-rule作爲碼頭容器運行)。我運行這些測試來驗證生產者違反合同。 但合同本身仍然在使用Pact註釋的消費者集成測試中定義。我希望能夠將這些合同與我的合同git存儲庫中的集成測試分開。 – Dmitry

0

這是消費者的性質驅動契約 - 消費者在API中有重要的發言權!

作爲一般規則,如果合同沒有改變,則不需要運行Provider構建,儘管目前在Broker中沒有簡單的方法來了解它(請參閱功能請求https://github.com/bethesque/pact_broker/issues/48)。

至於解決方案,您可以使用一個或多個以下策略。

有效使用的代碼分支

這當然是非常重要的,在合同上新的假設由提供者來驗證消費者可以安全地釋放之前的。在合併到主服務器之前,已針對提供者測試了分支。

但最重要的是 - 您必須與供應商團隊密切合作!

使用源代碼控制檢測合同變更:

如果您還檢查主協議文件到源代碼控制,你的CI構建可以有條件地採取行動 - 如果合同發生了變化,你必須等待一個綠色提供者構建,如果沒有,你可以安全部署!

存放在獨立的倉庫

如果你真的想提供商保持控制,你可以存儲合同由提供者管理的中間存儲庫或文件的位置。我建議這是最後的手段,因爲它否定了大多數協作協議打算促成的。

使用契約經紀人網絡掛接:

我希望條約Broker可以自動觸發提供測試時,合同公佈,如果他們失敗通知消費者,但它似乎並沒有這樣的情況。

是的,這可以在Pact Broker上使用web hooks。一旦將新合同提交給服務器,您就可以在Provider上觸發生成。

你可以設想這個步驟與選項1和2

工作見Using Pact where the Consumer team is different from the Provider team在我們的常見問題在這種使用情況。

+0

感謝您提供詳細的建議和一些新的想法。我喜歡將提供程序測試作爲消費者管道的一部分運行。爲了實現這一點,我們可能需要將提供者測試包含到提供者Docker鏡像中,並且有辦法觸發測試。 –

+0

不用擔心!只需要小心,在每次構建消費者之後,您都希望避免始終運行Provider構建 - 獨立可釋放的構件畢竟是我們想要的。理想情況下,只關注合同變更的情況。 –