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