1. 程式人生 > >愛油科技基於SpringCloud的微服務實踐

愛油科技基於SpringCloud的微服務實踐

個人簡介

劉思賢(微博@starlight36),愛油科技架構師、PMP。主要負責業務平臺架構設計,DevOps實施和研發過程持續改進等,關注領域驅動設計與微服務、建設高效團隊和工程師文化培養。

摘要

本次分享主要介紹了愛油科技基於Docker和Spring Cloud將整體業務微服務化的一些實踐經驗,主要包括:

  • 微服務架構的分層和框架選型
  • 服務發現和配置管理
  • 服務整合和服務質量保證
  • 基於領域驅動設計
  • 實施DevOps

    從單體應用到微服務

單體應用

優點

  • 小而美,結構簡單易於開發實現
  • 部署門檻低,單個Jar包或者網站打包即可部署
  • 可快速實現多例項部署

缺點

  • 隨著業務發展更多的需求被塞進系統,體系結構逐漸被侵蝕反應堆林立
  • 被技術綁架,難以為特定業務選擇平臺或框架,儘管可能有更適宜的技術做這件事
  • 協作困難,不同業務的團隊在一個系統上進行開發相互衝突
  • 難以擴充套件,為了熱點業務而不得不同時擴容全部業務,或者難以繼續擴容

架構拆分

拆分:按行分層,按列分業務

在我們的微服務體系中,所有的服務被劃分為了三個層次:

  1. 基礎設施層:為所有業務提供基礎設施,包括服務註冊、資料庫和NoSQL、物件儲存、訊息佇列等基礎設施服務,這一層通常是由成熟元件、第三方服務組成。
  2. 業務服務層:業務微服務,根據業務領域每個子域單獨一個微服務,分而治之。
  3. 接入層:直接對外提供服務,例如網站、API介面等。接入層不包含複雜的業務邏輯,只做呈現和轉換。

專案中我們主要關注業務服務層和接入層,對於沒有足夠運維力量的我們,基礎設施使用雲服務是省事省力的選擇。

業務服務層我們給他起名叫作Epic,接入層我們起名Rune,建立之初便訂立了如下原則:

  1. 業務邏輯層內所有服務完全對等,可相互呼叫
  2. 業務邏輯層所有服務必須是無狀態的
  3. 接入層所有服務可呼叫業務邏輯層所有服務,但接入層內部同層服務之間不可呼叫
  4. 接入層不能包含業務邏輯程式碼
  5. 所有微服務必須執行在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點:

  1. 雖然Dubbo基礎設施更加完善,但結構複雜,我們很難吃得下,容易出坑
  2. 基於Apache ThriftgRPC自研,投入產出比很差
  3. 不想過早引入RPC以防濫用,Restful風格本身就是一種約束。
  4. 做選擇時,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
#!/usr/bin/env bashset -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
@RestController@RequestMapping("/users")public class UserResource {    @RequestMapping(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網關的概念。 本系列教