1. 程式人生 > >利用Java上手微服務架構

利用Java上手微服務架構

作者: 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日誌管理等等。

推薦閱讀

相關推薦

利用Java上手服務架構

作者: Alexsandro Souza​ 幾乎每個人都在關注微服務架構,我們也不例外。作為一個與時俱進的程式設計師,我一直在努力瞭解這一架構,希望尋找一種通過Spring在Java中實現微服務架構的方法。 我們公司雖然很棒,但技術堆疊略顯過時,至今還沒有使

Java程式設計服務架構框架-監控與管理(SpringBoot)

       在微服務架構中,我們將原本龐大的單體系統拆分成多個提供不同服務的應用。 雖然 各個應用的內部邏輯因分解而得以簡化,但是由於部署應用的數量成倍增長,使得系統的 維護複雜度大大提升。 對於運維人員來說,隨著應用的不斷增多,系統叢集中出現故障的 頻率也變得越來 越高,

JAVA項目實戰,項目架構,高並發,分布式,服務架構信支付,支付寶支付,理財系統,並發編程

等等 搭建 服務器 net 三方庫 必須 服務發現 netflix 分布式 Spring Cloud集成項目有很多,下面我們列舉一下和Spring Cloud相關的優秀項目,我們的企業架構中用到了很多的優秀項目,說白了,也是站在巨人的肩膀上去整合的。在學習Spring Cl

Java架構師,服務架構設計,並發編程,java8新特性,P2P金融項目,高並發,分布式

環境 span acc 要掌握 system 精益 app 擴展 ant 微服務架構設計 微服務 軟件架構是一個包含各種組織的系統組織,這些組件包括 Web服務器, 應用服務器, 數據庫,存儲, 通訊層), 它們彼此或和環境存在關系。系統架構的目標是解決利益

JAVA服務架構,高併發,高效能,高可用,分散式,叢集,快取,電商實戰教程下載

JAVA微服務架構,高併發,高效能,高可用,分散式,叢集,快取,電商實戰教程下載39套Java架構師,高併發,高效能,高可用,分散式,叢集,電商,快取,微服務,微信支付寶支付,公眾號開發,java8新特性,P2P金融專案,程式設計,功能設計,資料庫設計,第三方支付,web安全,效能調優,設計模式,資

JAVA效能優化,架構師,分散式框架,高可用框架,服務架構,資料庫優化

程式碼優化,一個很重要的課題。可能有些人覺得沒用,一些細小的地方有什麼好修改的,改與不改對於程式碼的執行效率有什麼影響呢?這個問題我是這麼考慮的,就像大海里面的鯨魚一樣,它吃一條小蝦米有用嗎?沒用,但是,吃的小蝦米一多之後,鯨魚就被餵飽了。 程式碼優化也是一樣,如果專案著眼於儘快無BUG上線,那麼此時可以抓

最新Java服務架構教程

2018年Java微服務架構視訊教程 ├─第1章 微服務簡介   4課 │      Java教程:001構建單體應用.mp4 │      Java教程:002微服務解決複雜問題.mp4 │&nbs

如何快速搭建一個服務架構-咕泡學院Java架構VIP試聽視訊

  如何快速搭建一個微服務架構-咕泡學院Java架構VIP試聽視訊https://pan.baidu.com/s/1I4fs5juFNY_sV8yc_zwcYQ  密碼:bsvl 咕泡學院Java架構師每日錄播視訊索取加QQ群:788692365咕泡學院Java架構師往期視訊

Java高併發高效能分散式框架從無到有服務架構設計

微服務架構模式(Microservice Architect Pattern)。近兩年在服務的瘋狂增長與雲端計算技術的進步,讓微服務架構受到重點關注 微服務架構是一種架構模式,它提倡將單一應用程式劃分成一組小的服務,服務之間互相協調、互相配合,為使用者提供最終價值。每個服務執行在其獨立的程序中,

Java架構學習(四十)SpringCloud基礎&網站架構演變&服務架構概述&SpringCloud概述&服務註冊與服務發現&搭建註冊中心Euraka&rest和fegin呼叫原理

一、網站架構演變過程 微服務架構 為什麼出現了SpringCloud 網站架構模式: 單點應用---->分散式系統面向於服務架構(SOA)體系 webservice---->微服務架構 web專案三層架構 如果在網際網路公司中,使用傳統架構技術

更多免費初級中級高階大資料java視訊教程下載 加(***信((號keepper,請備註java或掃下面2二3維4碼第31: 2017年7月最新服務架構的分散式事務解決方案價值1399

更多免費初級中級高階大資料java視訊教程下載 加(微***信((號keepper,請備註java或掃下面2二3維4碼第31: 2017年7月最新微服務架構的分散式事務解決方案價值1399java視訊教程01 課程介紹.wmvjava視訊教程02 解決方案的效果演示(結合支付系統真實應用場景).mp4java

Java開發大型網際網路服務架構簡述之sprng boot入門

1.new Thread的弊端 執行一個非同步任務你還只是如下new Thread嗎 new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated me

Java支付系統服務架構系統實戰視訊教程

網際網路乾貨:包含分散式事務以及統一性訊息機制可靠訊息服務的設計與實現TCC型分散式事務框架的設計【課程內容】效果演示常用的分散式事務解決方案訊息傳送一致性常規MQ佇列訊息的處理流程和特點訊息重複傳送問題及業務介面可靠訊息最終一致性方案的設計可靠訊息服務的設計與實現可靠訊息最

從無到有構建大型電商服務架構(一),eclipse構建springcloud消費者方引起的問題(Caused by: java.lang.NoClassDefFoundError: feign/Feign$Builder)

1 2018-12-31 14:28:38.180 INFO 37860 --- [ main] s.c.a.AnnotationConfigApplicationContext : Refreshing org.spring[email protected]a9cd3

Java架構書籍:服務架構必讀書單(附服務架構模式進階導圖)

微服務架構必讀書單   《深入理解Spring Cloud與微服務構建》 方誌朋 著 談到微服務,大家眾說紛紜,但卻很難有一個清晰的概念來描述。微服務不是“銀彈”,我理解的微服務是一種文化,而我們要做的就是將微服務的理念運用到實際開發中。經過一系列的技術選型,最終Sp

[java]服務架構連載No4 Hystrix+Dashboard+Turbine實現斷路器(限流,超時,異常...)和服務監控

Hyxtrix:通過訪問遠端系統,服務,和第三方節點,從而對故障和延遲提供了強大的容錯能力,具備了服務降級,服務熔斷,遠端隔離,請求快取,請求合併已經服務監控等強大功能 本編文章架構圖如下 新建6個工程 spring-cloud-03-hystrix-eureka (服

Java高併發、分散式框架,從無到有服務架構設計

微服務架構模式(Microservice Architect Pattern)。近兩年在服務的瘋狂增長與雲端計算技術的進步,讓微服務架構受到重點關注微服務架構是一種架構模式,它提倡將單一應用程式劃分成一組小的服務,服務之間互相協調、互相配合,為使用者提供最終價值。每個服務執行

java服務架構的分散式事務解決方案

分散式系統架構中,分散式事務問題是一個繞不過去的挑戰。而微服務架構的流行,讓分散式事問題日益突出! 下面我們以電商購物支付流程中,在各大參與者系統中可能會遇到分散式事務問題的場景進行詳細的分析!   如上圖所示,假設三大參與平臺(電商平臺、支付平臺、銀行)的系統都

Java高級架構服務架構的核心概念

很多 重寫 取代 原來 進程間 所有 服務架構 gist 函數式 微服務現在辣麽火,業界流行的對比的卻都是所謂的Monolithic單體應用,而大量的系統在十幾年前都是已經是分布式系統了,那麽微服務作為新的理念和原來的分布式系統,或者說SOA(面向服務架構)是什麽區別呢?

Java 服務架構選型

聯合 開源 5.7 多協議 阻塞 接受 trace 情況 項目 轉載自 https://www.cnblogs.com/xishuai/p/dubbo-and-spring-cloud.html 微服務(Microservices)是一種架構風格,一個大型復雜軟件應用由一個