通过容器编排和服务网格来改进Java微服务的可测性
關鍵要點
\\- 在企業測試中,測試軟件的方式應該與軟件在生產環境中運行的方式相同,以便確保軟件能夠按預期的方式運行。\\t
- 常見的挑戰是微服務應用程序直接或間接依賴需要在測試場景中編排的其他服務。\\t
- 本文展示了容器編排如何在服務實例之上提供抽象,并使用模擬實例來替代真實實例。\\t
- 此外,服務網格讓我們能夠重新路由流量,并通過注入錯誤響應或延遲來驗證服務的彈性。\\t
- 本文包含了一個示例代碼,代碼來自一個基于Java的咖啡店應用程序,該應用程序將被部署到Kubernetes和Istio上,并對其進行測試。\
在企業測試中,測試軟件的方式應該與軟件在生產環境中運行的方式相同,以便確保軟件能夠按預期的方式運行。常見的挑戰是微服務應用程序直接或間接依賴需要在測試場景中編排的其他服務。
\\本文展示了容器編排如何在服務實例之上提供抽象,并使用樁實例來替代真實實例。此外,服務網格讓我們能夠重新路由流量,并通過注入錯誤響應或延遲來驗證服務的彈性。
\\我們將使用一個咖啡店示例應用程序,這個應用程序被部署在一個容器和服務網格集群中。我們選擇Kubernetes和Istio作為實例運行環境。
\\測試場景
\\假設我們想要在不考慮其他外部服務的情況下測試應用程序的行為。應用程序的運行方式和配置方式應該與生產環境相同,以便確保以后它在生產環境中的行為是一致的。在測試中,我們將使用定義好的通信接口連接應用程序。
\\但是,外部服務不應成為測試場景的一部分。通常,在測試時我們應該關注被測試的對象,并忽略掉其他對象。因此,我們使用模擬服務器來替代外部服務。
\\
\\容器編排
\\使用模擬服務器而不是真實實例與以與生產環境相同的方式運行微服務的想法相矛盾,因為到了生產環境配置會發生改變。但是,如果我們的應用程序部署到容器編排集群(例如Kubernetes),就可以將抽象的服務名稱用作配置,并讓集群自己去解析后端服務實例。
\\以下示例是一個網關類,它是咖啡店應用程序的一部分,連接到端口8080上的coffee-processor。
\\\public class OrderProcessor {\\????// definitions omitted ...\\????@PostConstruct\????private void initClient() {\????????final Client client = ClientBuilder.newClient();\????????target = client.target(\"http://coffee-processor:8080/processes\");\????}\\???@Transactional(Transactional.TxType.REQUIRES_NEW)\????public void processOrder(Order order) {\????????OrderStatus status = retrieveOrderStatus(order);\????????order.setStatus(status);\????????entityManager.merge(order);\????}\\????// ...\\????private JsonObject sendRequest(final JsonObject requestBody) {\????????Response response = target.request()\???????????????.buildPost(Entity.json(requestBody))\????????????????.invoke();\\????????// ...\\????????return response.readEntity(JsonObject.class);\????}\\????// definitions omitted ...\}\\\主機名通過Kubernetes群集DNS解析,將流量引導到其中一個正在運行的處理器實例。然而,coffee-processor的實例將成為一個模擬服務器,在我們的示例中使用了WireMock。這種替換對我們的應用來說是透明的。
\\在測試場景中,不僅會連接到應用程序來調用業務邏輯,還會與模擬服務器發生通信,在單獨的管理界面上控制響應行為,并驗證應用程序是否以正確的方式調用模擬服務器。這與類級別的單元測試類似,通常使用JUnit和Mockito實現。
\\
\\外部服務
\\上述的設置可以讓我們模擬和控制在容器編排集群內運行的服務。那么那些在集群之外的外部服務該怎么辦呢?
\\通常,我們可以創建一個不帶有選擇器的Kubernetes服務,讓它指向一個外部IP,并重寫我們的應用程序,讓它始終使用由群集解析的服務名。這樣一來,我們定義了一個單一的點,服務將被路由到這個點上。
\\以下的代碼片段顯示了一個外部Kubernetes服務和端點定義,它將coffee-shop-db路由到外部IP地址1.2.3.4:
\\\kind: Service\apiVersion: v1\metadata:\??name: coffee-shop-db\spec:\??ports:\??- protocol: TCP\????port: 5432\---\\kind: Endpoints\apiVersion: v1\metadata:\??name: coffee-shop-db\subsets:\??- addresses:\??????- ip: 1.2.3.4\????ports:\??????- port: 5432\\\在不同的環境中,服務可能會被路由到不同的數據庫實例。
\\服務網格
\\服務網格能夠幫助我們處理微服務間的通信問題。目前,Istio是最常用的服務網格技術之一。它增加了與應用程序容器共存的邊車代理容器,可以解決微服務間的通信問題,并且還可以用來操縱或減慢連接,以便進行彈性測試。
\\在端到端測試中,我們可以引入錯誤或緩慢的響應來驗證應用程序是否能夠正確處理這些問題場景。
\\以下的代碼片段顯示了一個Istio虛擬服務的定義,其中到coffee-processor的路由有50%的延遲為3秒,10%的響應是失敗的。
\\\apiVersion: networking.istio.io/v1alpha3\kind: VirtualService\metadata:\??name: coffee-processor\spec:\??hosts:\??- coffee-processor\??http:\??- route:\????- destination:\????????host: coffee-processor\????????subset: v1\????fault:\??????delay:\????????fixedDelay: 3s\????????percent: 50\??????abort:\????????httpStatus: 500\????????percent: 10\---\\apiVersion: networking.istio.io/v1alpha3\kind: DestinationRule\metadata:\??name: coffee-processor\spec:\??host: coffee-processor\??subsets:\??- name: v1\????labels:\??????version: v1\\現在,我們可以運行其他測試,并驗證應用程序將如何處理這些增加的響應時間和故障狀況。
\\除了可以注入錯誤響應之外,服務網格技術還可以用來從環境中添加彈性。代理容器可以處理超時,實現斷路器和隔板,而應用程序無需關心這些問題。
\\結論
\\容器編排和服務網格通過將應用程序的關注點轉移到環境中來提高微服務應用程序的可測試性。有了服務抽象,我們就可以透明地替換服務或進行重新路由。服務網格不僅支持更復雜的路由,還允許我們注入故障或減慢響應,讓應用程序處于壓力之下,以此來驗證其相應的行為。
\\更多資源
\\- Coffee shop example application\\t
- Kubernetes service documentation\\t
- Istio traffic management documentation\
關于作者
\\?Sebastian Daschner 是一名自由Java顧問、作家和培訓師,對編程和Java充滿熱情。他是“Architecting Modern Java EE Applications”一書的作者。Sebastian正在參與JCP,協助制定Java EE的未來標準,是JAX-RS、JSON-P和Config專家組的成員,并在各種開源項目上進行協作。由于在Java社區和生態系統中的貢獻,他獲得了Java Champion、Oracle Developer Champion和2016年JavaOne Rockstar的殊榮。除了Java之外,Sebastian還是Linux和云原生技術的重要用戶。他通過博客和Twitter(@DaschnerS)傳播計算機科學實踐。工作之余,他喜歡乘飛機或騎摩托車旅行。
\\查看英文原文:Improving Testability of Java Microservices with Container Orchestration and a Service Mesh
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的通过容器编排和服务网格来改进Java微服务的可测性的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 对WIFI通信的一些理解(经常更新修改)
- 下一篇: 函数 重点