愛油科技基於SpringCloud的微服務實踐
個人簡介
劉思賢(微博@starlight36),愛油科技架構師、PMP。主要負責業務平臺架構設計,DevOps實施和研發過程持續改進等,關注領域驅動設計與微服務、建設高效團隊和工程師文化培養。
摘要
本次分享主要介紹了愛油科技基於Docker和Spring Cloud將整體業務微服務化的一些實踐經驗,主要包括:
- 微服務架構的分層和框架選型
- 服務發現和配置管理
- 服務整合和服務質量保證
- 基於領域驅動設計
-
實施DevOps
從單體應用到微服務
單體應用
優點
- 小而美,結構簡單易於開發實現
- 部署門檻低,單個Jar包或者網站打包即可部署
- 可快速實現多例項部署
缺點
- 隨著業務發展更多的需求被塞進系統,體系結構逐漸被侵蝕反應堆林立
- 被技術綁架,難以為特定業務選擇平臺或框架,儘管可能有更適宜的技術做這件事
- 協作困難,不同業務的團隊在一個系統上進行開發相互衝突
- 難以擴充套件,為了熱點業務而不得不同時擴容全部業務,或者難以繼續擴容
架構拆分
拆分:按行分層,按列分業務
在我們的微服務體系中,所有的服務被劃分為了三個層次:
- 基礎設施層:為所有業務提供基礎設施,包括服務註冊、資料庫和NoSQL、物件儲存、訊息佇列等基礎設施服務,這一層通常是由成熟元件、第三方服務組成。
- 業務服務層:業務微服務,根據業務領域每個子域單獨一個微服務,分而治之。
- 接入層:直接對外提供服務,例如網站、API介面等。接入層不包含複雜的業務邏輯,只做呈現和轉換。
專案中我們主要關注業務服務層和接入層,對於沒有足夠運維力量的我們,基礎設施使用雲服務是省事省力的選擇。
業務服務層我們給他起名叫作Epic,接入層我們起名Rune,建立之初便訂立了如下原則:
- 業務邏輯層內所有服務完全對等,可相互呼叫
- 業務邏輯層所有服務必須是無狀態的
- 接入層所有服務可呼叫業務邏輯層所有服務,但接入層內部同層服務之間不可呼叫
- 接入層不能包含業務邏輯程式碼
- 所有微服務必須執行在Docker容器裡
業務邏輯層我們主要使用使用Java,接入層我們主要使用PHP或Node。後來隨著團隊的成長,逐步將接入層全部遷移至Node。
框架選型
愛油科技作為一家成品油行業的初創型公司,需要面對非常複雜的業務場景,而且隨著業務的發展,變化的可能性非常高。所以在微服務架構設計之初,我們就期望我們的微服務體系能:
- 不繫結到特定的框架、語言
- 服務最好是Restful風格
- 足夠簡單,容易落地,將來能擴充套件
- 和Docker相容性好
目前常見的微服務相關框架:
- Dubbo、DubboX
- Spring Cloud
- Motan
- Thrift、gRPC
這些常見的框架中,Dubbo幾乎是唯一能被稱作全棧微服務框架的“框架”,它包含了微服務所需的幾乎所有內容,而DubboX作為它的增強,增加了REST支援。
它優點很多,例如:
- 全棧,服務治理的所有問題幾乎都有現成答案
- 可靠,經過阿里實踐檢驗的產品
- 實踐多,社群有許多成功應用Dubbo的經驗
不過遺憾的是:
- 已經停止維護
- 不利於裁剪使用
- “過於Java”,與其他語言相容性一般
Motan是微博平臺微服務框架,承載了微博平臺千億次呼叫業務。
優點是:
- 效能好,源自於微博對高併發和實時性的要求
- 模組化,結構簡單,易於使用
- 與其他語言相容性好
不過:
- 為“短平快”業務而生,即業務簡單,追求高效能高併發。
Apache Thrift、gRPC等雖然優秀,並不能算作微服務框架,自身並不包括服務發現等必要特性。
如果說微服務少不了Java,那麼一定少不了Spring,如果說少不了Spring,那麼微服務“官配”Spring Cloud當然是值得斟酌的選擇。
優點:
- “不做生產者,只做搬運工”
- 簡單方便,幾乎零配置
- 模組化,鬆散耦合,按需取用
- 社群背靠Spring大樹
不足:
- 輕量並非全棧
- 沒解決RPC的問題
- 實踐案例少
根據我們的目標,我們最終選擇了Spring Cloud作為我們的微服務框架,原因有4點:
- 雖然Dubbo基礎設施更加完善,但結構複雜,我們很難吃得下,容易出坑
-
基於
Apache Thrift
和gRPC
自研,投入產出比很差 - 不想過早引入RPC以防濫用,Restful風格本身就是一種約束。
-
做選擇時,
Motan
還沒有釋出
Spring Cloud
Spring Cloud是一個整合框架,將開源社群中的框架整合到Spring體系下,幾個重要的家族專案:
-
spring-boot
,一改Java應用程式執行難、部署難,甚至無需Web容器,只依賴JRE即可 -
spring-cloud-netflix
,整合Netflix優秀的元件Eureka、Hystrix、Ribbon、Zuul,提供服務發現、限流、客戶端負載均衡和API閘道器等特性支援 -
spring-cloud-config
,微服務配置管理 -
spring-cloud-consul
,整合Consul支援
服務發現和配置管理
Spring Cloud Netflix提供了Eureka服務註冊的整合支援,不過沒選它是因為:
- 更適合純Java平臺的服務註冊和發現
- 仍然需要其他分散式KV服務做後端,沒解決我們的核心問題
Docker作為支撐平臺的重要技術之一,Consul幾乎也是我們的必選服務。因此我們覺得一事不煩二主,理所應當的Consul成為我們的服務註冊中心。
Consul的優勢:
- 使用Raft一致性演算法,能保證分散式叢集內各節點狀態一致
- 提供服務註冊、服務發現、服務狀態檢查
- 支援HTTP、DNS等協議
- 提供分散式一致性KV儲存
也就是說,Consul可以一次性解決我們對服務註冊發現、配置管理的需求,而且長期來看也更適合跟不同平臺的系統,包括和Docker排程系統進行整合。
最初打算自己開發一個Consul和Spring Cloud整合的元件,不過幸運的是,我們做出這個決定的時候,spring-cloud-consul
剛剛釋出了,我們可以拿來即用,這節約了很多的工作量。
因此藉助Consul和spring-cloud-consul
,我們實現了
-
服務註冊,引用了
srping-cloud-consul
的專案可以自動註冊服務,也可以通過HTTP介面手動註冊,Docker容器也可以自動註冊 - 服務健康狀態檢查,Consul可以自動維護健康的服務列表
- 異構系統可以直接通過Consul的HTTP介面拉取並監視服務列表,或者直接使用DNS解析服務
- 通過分散式一致性KV儲存進行微服務的配置下發
- 為一些業務提供選主和分散式鎖服務
當然也踩到了一些坑:
spring-cloud-consul
服務註冊時不能正確選判本地ip地址。對於我們的環境來說,無論是在伺服器上,還是Docker容器裡,都有多個網路介面同時存在,而spring-cloud-consul
在註冊服務時,需要先選判本地服務的IP地址,判斷邏輯是以第一個非本地地址為準,常常錯判。因此在容器中我們利用entrypoint指令碼獲取再通過環境變數強制指定。
12345678910111213141516171819202122 |
set -e# If service runs as Rancher service, auto set advertise ip address# from Rancher metadata service.if [ -n "$RUN_IN_RANCHER" ]; then echo "Waiting for ip address..." # Waiting for ip address sleep 5 RANCHER_MS_BASE=http://rancher-metadata/2015-12-19 PRIMARY_IP=`curl -sSL $RANCHER_MS_BASE/self/container/primary_ip` SERVICE_INDEX=`curl -sSL $RANCHER_MS_BASE/self/container/service_index` if [ -n "$PRIMARY_IP" ]; then export SPRING_CLOUD_CONSUL_DISCOVERY_HOSTNAME=$PRIMARY_IP fi echo "Starting service #${SERVICE_INDEX-1} at $PRIMARY_IP."fiexec "[email protected]" |
我們的容器執行在Rancher中,所以可以利用Rancher的metadata服務來獲取容器的IP地址,再通過SPRING_CLOUD_CONSUL_DISCOVERY_HOSTNAME
環境變數來設定服務發現的註冊地址。基於其他容器排程平臺也會很相似。
另外一些服務中內建了定時排程任務等,多例項啟動時需要單節點執行排程任務。通過Consul的分散式鎖服務,我們可以讓獲取到鎖的節點啟用排程任務,沒獲取到的節點等待獲取鎖。
服務整合
為了方便開發人員使用,微服務框架應當簡單容易使用。對於很多微服務框架和RPC框架來說,都提供了很好的機制。在Spring Cloud中通過OpenFeign
實現微服務之間的快速整合:
服務方宣告一個Restful的服務介面,和普通的Spring MVC控制器幾乎別無二致:
1234567891011121314 |
"/users")public class UserResource { (value = "{id}", method = RequestMethod.GET, produces = "application/json") public UserRepresentation findOne(@PathVariable("id") String id) { User user = this.userRepository.findByUserId(new UserId(id)); if (user == null || user.getDeleted()) { throw new NotFoundException("指定ID的使用者不存在或者已被刪除。"); } return new UserRepresentation(user); }}( |
相關推薦
愛油科技基於SpringCloud的微服務實踐
個人簡介 劉思賢(微博@starlight36),愛油科技架構師、PMP。主要負責業務平臺架構設計,DevOps實施和研發過程持續改進等,關注領域驅動設計與微服務、建設高效團隊和工程師文化培養。 摘要 本次分享主要介紹了愛油科技基於Docker和Sp
基於SpringCloud 微服務架構下 廣告系統設計與實現
互聯 編碼 課程總結 搭建 增刪 統一 維護 boa lan 第1章 課程簡介本章對這門課程進行說明,包括:廣告系統的介紹、課程使用的技術介紹、課程的學習規劃等。 第2章 廣告系統概覽與準備工作本章會介紹廣告系統的思想、廣告系統的技術實現架構、學習本課程之前的準備工作和廣告
《基於SpringCloud微服務架構廣告系統設計與實現》筆記
img span 設計與實現 微服務 課程 png 1-1 分享圖片 bubuko 1-1 課程導學 什麽是廣告系統? 2-1 廣告系統概覽 2-2 廣告系統架構 2-3 準備工作與系統目錄結構 《基於SpringCl
【SpringCloud】(1)---基於RestTemplate微服務項目案例
mys cee 父類 image 沒有 idl 1.3 start aps 基於RestTemplate微服務項目 在寫SpringCloud搭建微服務之前,我想先搭建一個不通過springcloud只通過SpringBoot和Mybatis進行模塊之間額通訊。
大型電商基於Springboot+Springcloud微服務+Dubbo分散式,JVM虛擬機器,併發原理程式設計,實現微服務架構
大型電商基於Springboot+Springcloud微服務+Dubbo分散式,JVM虛擬機器,併發原理程式設計,實現微服務架構39套Java架構師,高併發,高效能,高可用,分散式,叢集,電商,快取,微服務,微信支付寶支付,公眾號開發,java8新特性,P2P金融專案,程式設計,功能設計,資料庫設
個推基於Docker和Kubernetes的微服務實踐
2016年伊始Docker無比興盛,如今Kubernetes萬人矚目。在這個無比需要創新與速度的時代,由容器、微服務、DevOps構成的雲原生席捲整個IT界。個推針對Web服務場景,基於OpenResty和Node.js搭建了微服務框架,提高了開發效率。在微服務的基礎上,我們結合Doc
基於kubernetes和SpringCloud微服務構建方案
很久沒有寫部落格了,不是因為最近學習鬆懈,而是因為發現自己以前寫的部落格大多都比較水,真正有意義、有價值的文章需要大量的學習與時間去積澱。以後儘量提高自己部落格的質量,走的再遠,工作再忙,也要堅持看書,堅持學習,成長的道路有多長?我想大概是一生。這篇文章算是我這
2、springcloud微服務:基於Feign的服務呼叫
摘要:Feign是一個宣告式、模板化的HTTP客戶端呼叫元件,它可以像呼叫本地方法一樣呼叫遠端服務。建立一個新的服務:microservice-provider-user,在microservice-provider-user中使用Feign呼叫microservice-pr
基於Spring Cloud的微服務實踐
內容包含微服務框架選型、CI/CD、容器編排的經驗,旨在幫助大家低成本、快速落地微服務,在刀刀見血的網際網路大潮中,快速迭代,快速交付。相關趨勢圖首先給大家看一張百度指數上,關於微服務、Spring Boot、Spring Cloud、Dubbo的趨勢圖:從圖中可見,Dubb
生產環境-微服務實踐架構(springcloud)流程圖分享
線上微服務架構圖 注: 繪圖工具:https://www.processon.com 參考連結: 史上最簡單的 Spri
SpringCloud微服務:基於Nacos元件,整合Dubbo框架
原始碼地址:[GitHub·點這裡](https://github.com/cicadasmile/spring-cloud-base) || [GitEE·點這裡](https://gitee.com/cicadasmile/spring-cloud-base) # 一、基礎元件簡介 ## 1、Dubb
微服務實踐之路-起始
進行 技術棧 com https logs rabbit 服務 ring .com 由於各種原因,公司要對現有的營銷產品進行微服務化,如果可以,則對公司所有產品逐步進行微服務化。 而本人將作為主力去探索這條路,很艱難,但幹勁十足。整個過會記錄下來,以便以後查閱。 感謝公司!
(三)springcloud - 微服務架構代碼結構
article 搭建 ring 分享 組件 particle ima api 微服務雲架構 我們根據微服務化設計思想,結合spring cloud本身的服務發現、治理、配置化管理、分布式等項目優秀解決方案,我們使用Maven技術將框架進行模塊化、服務化、原子化封裝,也為後期
基於容器微服務的PaaS雲平臺設計(一) 實現容器微服務和持續集成
顯示 一次 target 全部 ext neu openshift svn客戶端 enc 版權聲明:本文為博主原創文章,歡迎轉載,轉載請註明作者、原文超鏈接 ,博主地址:http://www.cnblogs.com/SuperXJ/ 前言:關於什麽是容器微服務Paa
springcloud微服務實戰:Eureka+Zuul+Ribbon+Hystrix+SpringConfig
app 支持 pro def ipa not color ins enable 原文地址:http://blog.csdn.net/yp090416/article/details/78017552 springcloud微服務實戰:Eureka+Zuul+Ribbon
微服務實踐(七):從單體式架構遷移到微服務架構
ron title 微服務架構 需要 body ros 螞蟻金服 html 分離 微服務實戰(一):微服務架構的優勢與不足 微服務實戰(二):使用API Gateway 微服務實戰(三):深入微服務架構的進程間通信 微服務實戰(四):服務發現的可行方案以及實踐案例 微服務
微服務實踐(五):微服務的事件驅動數據管理
圖片 -h bili 3.3 部署 數據不一致 時間 想要 很難 微服務實戰(一):微服務架構的優勢與不足 微服務實戰(二):使用API Gateway 微服務實戰(三):深入微服務架構的進程間通信 微服務實戰(四):服務發現的可行方案以及實踐案例 微服務實踐(五):微
從零開始,輕松搞定SpringCloud微服務系列
markdown class net 配置中心 html div .html href .com 本系列博文目錄 【微服務】之一:從零開始,輕松搞定SpringCloud微服務系列–開山篇(spring boot 小demo) 【微服務】之二:從零開始,輕松搞定Spring
【微服務】之七:輕松搞定SpringCloud微服務-API權限控制
cat https lte urn 錯誤碼 netflix req ons 體系 權限控制,是一個系統當中必須的重要功能。張三只能訪問輸入張三的特定功能,李四不能訪問屬於趙六的特定菜單。這就要求對整個體系做一個完善的權限控制體系。該體系應該具備針區分用戶、權限、角色等各種
【微服務】之六:輕松搞定SpringCloud微服務-API網關zuul
公司 create lan ice 子項目 專題 系統 如果 rose 通過前面幾篇文章的介紹,我們可以輕松搭建起來微服務體系中比較重要的幾個基礎構建服務。那麽,在本篇博文中,我們重點講解一下,如何將所有微服務的API同意對外暴露,這個就設計API網關的概念。 本系列教