利用Java上手微服务架构
2019獨角獸企業重金招聘Python工程師標準>>>
作者: Alexsandro Souza?
幾乎每個人都在關注微服務架構,我們也不例外。作為一個與時俱進的程序員,我一直在努力了解這一架構,希望尋找一種通過Spring在Java中實現微服務架構的方法。
我們公司雖然很棒,但技術堆棧略顯過時,至今還沒有使用Java 8或微服務,因此我需要從外部了解更多關于微服務架構的經驗和方法。我決定通過創建一個“to-do system”項目來梳理經驗以供將來參考。
概覽
本文的目標是為不同的微服務提供源代碼walkthrough,因此我不打算深入概念和工具,而是提出一個包含用于開發微服務的模式、工具、技術的應用示例。
“to-do system”將由8個應用組成:
- Reminder
- User
- Service Discovery System
- Mailer
- OAuth Server
- System Integration Test
- API Gateway
- Web Application Client
系統如何工作
上圖未系統與微服務的交互。用戶訪問Angular2編寫的應用,該應用鏈接OAuth Authorization server,通過OAuth Authorization server分配用戶和權限。此server將返回一個Jason Web Token,其中包含有關客戶端及其權限的信息以及格式的范圍。當用戶認證通過并擁有token之后,Web應用可以與API Gateway通信。API Gateway將利用JWT驗證請求是否來自授權server,而后調用微服務并構建響應。
OAuth server通過User service獲取用戶權鑒細節,API Gateway從OAuth server獲取用戶信息。
Reminder service是安置ToDo功能的地方,ToDo服務按計劃檢查reminders并通過電子郵件通知用戶,電子郵件由Mail service發送,該事件由使用Kafka的事件提醒服務觸發。
System Integration Test是負責聯絡Reminder Service endpoints的Java應用。
連接微服務
在微服務架構中,我們需要處理許多在不同IP和端口上運行的微服務。因此有必要找到一種無需硬編碼的方式來管理每個地址。
Netflix Eureka是一種很好的解決方案,作為客戶端服務發現,Eureka允許服務自動查找和相互通信。我們有必要理解eureka的工作原理,一邊了解REST服務在不同微服務之間的通信。利用eureka來管理服務運行位置,我們可以添加instance,并通過負載均衡實現在微服務之間分配incoming application traffic。】
在我們的系統中,使用Netflix Ribbon作為客戶端負載均衡器,實現容錯并通過冗余增加可靠性和可用性。我們使用Netflix Feign編寫聲明性REST客戶端,并集成Ribbon和Eureka來提供負載平衡HTTP客戶端。
我們正在使用Netflix Hystrix斷路器將我們的應用程序與依賴性故障隔離開來。它有助于阻止cascading failure,并允許我們快速恢復或添加fallbacks。Hystrix為每個依賴關系提供一個thread-pool。當thread-pool耗盡,hystrix將拒絕請求。Hystrix同時提供斷路器功能,可以停止對依賴關系的所有請求,在請求失敗、拒絕或超時時,還可以實現備用邏輯。
Authentication
對于任何系統來說,安全性都是非常重要的,微服務架構也一樣。我們通過OAuth2來保持微服務的安全性。OAuth2作為一項知名Authorization,早已廣泛應用于Google,Facebook和Github。
在我們的這個項目中,同時還應用了Spring Security,并在安全問題上增加了一個元素:JSON Web Token(JWT)。
如果我們僅使用OAuth,我們將需要一個OAuth授權服務器來驗證用戶,生成令牌并充當資源服務器的endpoints,詢問該令牌是否有效以及授權的權限。與Authorization Server相比,這需要兩倍的請求。而JWT提供了一種在access token中傳輸權限和用戶數據的簡單方法。一旦所有數據都已經存在于token string中,資源服務器就不需要再請求令牌檢查。所有信息都被序列化為JSON,用base64編碼,最后用私有RSA密鑰簽名。它假設所有資源服務器都將有一個公鑰,以檢查令牌是否為適當的私鑰簽名,并對令牌進行反序列化以獲取信息。
REST
在我們的系統中,我們有兩種交互方式:同步和異步。對于異步風格,我們使用分布式事件與Kafka,遵循模型發布/訂閱。對于同步,我們有支持JSON和XML的REST風格。
對于RESTful,有四個成熟級別。我們的微服務處于2級,為了簡單起見,我決定不使用HATEOAS設計模式實現超媒體控件。
因為我們正在使用Spring Cloud,所以我們要“out-of-box“一些可擴展性模式,把它們放在HTTP連接中,如斷路器、bulkhead、負載均衡、連接池、超時和重試。
分布式事件
如上所述,我們通過使用Kafka將Reminder服務和Mailer服務之間的通信異步地與其他微服務進行通信。在Reminder中,我們有一個計劃任務來檢查提醒時間并發布RemainderFound事件。Mailer服務中將會有一個訂閱的事件,它將開始向用戶發送電子郵件的過程。我邀請您看看我們如何進行這種整合,以及我如何在Kafka事件模塊中寫入發送到Kafka的數據的序列化/反序列化。
Event sourcing及CQRS
一體化應用通暢具有單個關系數據庫。我們可以使用ACID transaction。因此,如果出現問題,我們的應用程序可以簡單地開始一個transaction、更改多個行并提交transaction。但處理微服務架構中的數據訪問要復雜得多,這是因為數據分布在不同的數據庫中。跨多個服務實施業務transactions是一個很大的挑戰。
在我們的“To-Do system“中,我們正在使用事件來處理跨多個服務的業務事務。您可以查看在Mailer服務中應用的CQRS實施事件采購。您可以看到如何分離讀和寫,使我們能夠輕松地縮放每個部分。我們使用關系數據庫作為事件存儲,然后使用Kafka分發事件。我們將需要使這兩個動作為Atomic并避免存儲事件,這樣就不會發布最終的JVM崩潰。我不使用Kafka作為事件存儲,因為從關系數據庫構建聚合更簡單。我們正在努力使事情變得容易!
下一步
在To-Do-System已經包含許多微服務架構涉及到的方方面面,另一方面也仍然存在諸多挑戰。我們未來計劃在此項目基礎上增加更多東西,例如Spring云配置、Docker容器、與Jenkins的持續集成、Spring Sleuth分布式跟蹤、ELK日志管理等等。
推薦閱讀
開源項目:[云框架]基于Spring Cloud的微服務架構,提供Spring Cloud微服務架構最佳實踐,即插即用
在好雨云幫一鍵部署基于Spring Cloud的微服務架構
轉載于:https://my.oschina.net/zhouyq/blog/1502695
總結
以上是生活随笔為你收集整理的利用Java上手微服务架构的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c3p0数据库连接池+mysql数据库基
- 下一篇: $.ajax详解