使用Spring Cloud和Docker構建微服務

2021-02-21 分布式實驗室


Spring Cloud 是Pivotal提 供的用於簡化分布式系統構建的工具集。Spring Cloud引入了雲平臺連接器(Cloud Connector)和服務連接器(Service Connector)的概念。雲平臺連接器是一個接口,需要由雲平臺提供者進行實現,以便庫中的其他模塊可以與該雲平臺協同工作。(更多介紹,可以閱讀 InfoQ的這篇文章:http://www.infoq.com/cn/news/2014/06/spring-cloud-platform-abstract。)

在Spring Cloud提供的解決方案中,你將會發現如下的內容:

Configuration Service(http://12factor.net/config)

Discovery Service(https://en.wikipedia.org/wiki/Service_discovery)

Circuit breakers(http://martinfowler.com/bliki/CircuitBreaker.html)

Distributed sessions(https://en.wikipedia.org/wiki/Distributed_cache)

Spring Cloud最重要的一點是它可以和Spring Boot一起工作,Spring Boot可以幫助開發者更容易地創建基於Spring的應用程式和服務。

從Spring Boot項目名稱中的Boot就可以看出來,Spring Boot的作用在於創建和啟動新的基於Spring框架的項目。Spring Boot會選擇最適合的Spring子項目和第三方開源庫進行整合。大部分Spring Boot應用只需要非常少的配置就可以快速運行起來。Spring Boot包含的特性如下:

創建可以獨立運行的Spring應用。

直接嵌入Tomcat或Jetty伺服器,不需要部署WAR文件。

提供推薦的基礎POM文件來簡化Apache Maven配置。

儘可能的根據項目依賴來自動配置Spring框架。

提供可以直接在生產環境中使用的功能,如性能指標、應用信息和應用健康檢查。

沒有代碼生成,也沒有XML配置文件。

每一個服務都含有一個特定意義的微服務架構。當你在Spring Cloud上構建微服務架構時,這裡有幾個基本概念需要首先澄清下。首先,你需要要先創建Configuration Service和Discovery Service兩個基礎服務。如下圖所示:


上面的圖片說明了四個微服務以及各個服務之間的依賴關係。

Configuration service處於最頂端,黃色標識,而且被其它微服務所依賴。

Discovery service處於最低端,藍色標識,同時也被其它服務所依賴。

綠色標識的兩個微服務是我們本系列博文中用到的兩個應用案例:電影和觀影建議。

Configuration Service

Configuration Service在微服務架構中是一個非常重要的組件。如12要素理論所說, 微服務應用的配置應該存儲在環境中,而不是本地項目中。

Configuration service(配置服務)是一個必不可少的基礎組件的原因是因為它可以對所有通過點對點和檢索的基礎服務進行服務管理。

假 設我們有多個部署環境。比如我們有一個臨時環境和一個生產環境,針對每個環境的配置將會是不同的。每一個configuration service 將會由一個獨立的Git倉庫來存放環境配置。沒有其它環境能夠訪問到這個配置倉庫,它只是提供該環境中運行的配置服務罷了。


當Configuration service啟動後,它將會指向那些根據配置文件配置的路徑並啟動對應服務。每一個微服務通過讀取自己配置文件中的具體環境來運行。在這一過程中,配置是通過版本管理來進行的內部和集中化管理,更改配置不需要重啟服務。

通過Spring Cloud提供的服務終端,你可以更改環境配置,並向Discovery service(發現服務)發送一個刷新信號,所有的用戶都會收到新的配置通知。

Discovery Service

Discovery Service(發現服務)是另一個重要的微服務架構的組件。Discovery Service管理運行在容器中的眾多服務實例,而這些實例工作在集群環境下。在這些應用中,我們使用客戶端的方式稱之為從服務到服務。舉個例子,我使用Spring Cloud Feign ,這是一個基於Restful風格的微服務提供的客戶端開源項目,它是從Netflix OSS project項目中派生出來的。

@FeignClient("movie")public interface MovieClient {@RequestMapping(method = RequestMethod.GET, value = "/movies")PagedResources findAll();@RequestMapping(method = RequestMethod.GET, value = "/movies/{id}")Movie findById(@RequestParam("id") String id);@RequestMapping(method = RequestMethod.POST, value = "/movies", produces = MediaType.APPLICATION_JSON_VALUE)void createMovie(@RequestBody Movie movie);}

在上面的例子中,我創建了一個Feign 客戶端,並映射了一個REST API方法來暴露電影服務。使用@FeignClient註解,可以聲明我想要為movie微服務而創建的客戶端API。接下來我聲明了一個我想要實現的服務映射。通過在方法上聲明一個URL規則來描述一個REST API的路由規則。

更令人興奮的是,這一切在Spring Cloud中都很容易,我所要做的僅僅是知道service ID來創建我的Feign 客戶端。服務的URL地址在運行時環境是自動配置的,因為每一個在集群中的微服務將會在啟動時通過綁定serviceid的方式來進行註冊。

微服務架構中的其它服務,也是通過上面提到的方式運行。我只需要知道進行通訊服務的serviceid,所有的操作都是通過Spring自動綁定的。

API Gateway 服務是Spring Cloud的另一個重要組件(關於它的介紹可以閱讀http://my.oschina.net/douxingxiang/blog/358173)。它可以用來管理集群服務中的領域實體。下圖的綠色六邊形是我們提供的數據驅動服務,主要用來管理自己的實體類和資料庫。通過添加API Gateway服務,我們可以為通過下面綠顏色的服務為每一個API路由創建一個代理暴露接口。


假 設推薦服務和電影服務都暴露他們自己的REST API在自己管理的域實體上。API gataway通過discovery service和從其它服務注入的基於代理路由的 API方法。通過這種方式,包括推薦服務和電影服務將擁有一個完整定義的路由,通過暴露的REST API獲得本地的微服務。API Gateway將會重定義路由請求到服務實例,這些請求都是基於HTTP的。

我已經在GitHub(https://github.com/kbastani/spring-cloud-microservice-example)上創建了一個實例項目,這個項目是一個端到端的原生雲平臺,使用Spring Cloud構建實際的微服務架構。

基本概念:

使用Docker進行集成測試

混合持久化

微服務架構

服務發現

API網關

使用Docker對每一個服務進行構建和部署。使用Docker Compose在一個開發機上進行端到端的集成測試。

混合持久化其實就是說使用多種資料庫來存儲。不同的微服務實例都會使用它們自己的資料庫,並通過REST服務或者消息總線來通信,舉個例子,你可以使用基於以下資料庫來構建微服務:

Neo4j(圖形化)

MongoDB(文檔化)

MySQL(關聯)

這個例子演示了如何使用微服務創建一個新的應用。由於在項目中的每一個微服務只有一個單一的父項目。開發者為此得到的收益是可以在本機上運行和開發每一個微服務。添加一個新的微服務非常簡單,當發現微服務時將會自動發現運行時的集群環境上。

項目中包含兩個發現服務,一個在Netflix Eureka,另一個使用了
Consul from Hashicorp。多種發現服務提供了多種選擇,一個是使用(Consul)來做DNS服務集群,另一個是(Consul)基於代理的API 網關。

每 一個微服務都關聯Eureka,在整個集群中檢索API路由。使用這個策略,每一個在集群上運行的微服務只需要通過一個共同的API網關進行負載均衡和暴 露接口,每一個服務也會自動發現並將路由請求轉發到自己的路由服務中。這個代理技術有助於開發用戶界面,作為平臺完整的API通過自己的主機映射為代理服 務。

下面的實例將會通過Maven來構建,使用Docker為每一個微服務構建容器鏡像。我們可以很優雅的使用Docker Compose在我們自己的主機上搭建全部的微服務集群。

在這之前,請先移步至項目的GitHub 倉庫。

https://github.com/kbastani/spring-cloud-microservice-example

克隆或者fork這個項目並且把源碼下載到自己的電腦上。下載完畢後,你需要使用Maven和Docker來編譯和構建本地的容器鏡像。

下載Docker

首先,如果你還沒有Docker請先下載它。可以跟隨這個指南(https://docs.docker.com/compose/install/)來獲取Docker,然後在開發機上安裝並運行。

當然你也需要安裝Docker Compose,這個指南(https://docs.docker.com/compose/install/)將會幫到你。

環境要求

能夠運行實例程序,需要在你的開發機上安裝下面的軟體:

Maven 3

Java 8

Docker

Docker Compose

通過命令行方式來構建當前項目,在項目的根目錄中運行如下的命令:

$ mvn clean install

項目將會根據pom.xml中的每一個項目聲明中下載相應的依賴jar包。每一個服務都將會被構建,同時Maven的Docker插件將會自動從本地Docker Registry中構建每一個容器鏡像。Docker將會在構建成功後,根據命令行運行mvn clean install來清除相應的資源。

在項目成功構建後,你將會看到如下的輸出:

[INFO] --[INFO] Reactor Summary:[INFO][INFO] spring-cloud-microservice-example-parent SUCCESS [ 0.268 s]
…………[INFO] --[INFO] BUILD SUCCESS[INFO] --

現在每一個鏡像都成功構建完畢,我們使用Docker Compose來加速啟動我們的集群。我已經將Docker Compose的yaml文件包含進了項目中,大家可以從GitHub上獲取。

現在我們通過下面的命令行啟動微服務集群:

$ docker-compose up

如果一切配置都是正確的,每一個容器鏡像將會通過在Docker上的虛擬容器和自動發現的網絡服務來運行。當他們開始順序啟動時,你將會看到一系列的日誌輸出。這可能需要一段時間來完成,取決於運行你實例程序的機器性能。

一旦容器啟動成功,你將會通過Eureka主機看到通過Discovery service註冊上來的應用服務。

通過命令行終端複製粘貼下面的命令到Docker中定義的$DOCKER_HOST環境變量中。

$ open $(echo \"$(echo $DOCKER_HOST)\"|\sed 's/tcp:\/\//http:\/\//g'|\sed 's/[0-9]\{4,\}/8761/g'|\sed 's/\"//g')

如果Eureka正確的啟動,瀏覽器將會啟動並打開Eureka服務的儀錶盤,如下圖所示:


我們將會看到每一個正在運行的服務實例和狀態。通過下面的命令來獲取數據驅動服務,例如 movie 服務。

$ open $(echo \"$(echo $DOCKER_HOST)/movie\"| \sed 's/tcp:\/\//http:\/\//g'| \sed 's/[0-9]\{4,\}/10000/g'| \sed 's/\"//g')

這個命令將會訪問根據導航網關終端提供的代理方式訪問movie服務的REST API終端。這些REST API使用HATEOAS 來配置,它是一個通過內嵌連結的方式支持自動發現服務的接口。

{ "_links" : {"self" : { "href" : "http://192.168.59.103:10000/movie"},"resume" : { "href" : "http://192.168.59.103:10000/movie/resume"},
………… "autoconfig" : { "href" : "http://192.168.59.103:10000/movie/autoconfig"} }}

這是使用Spring Cloud和Docker構建微服務架構的系列博文的第一部分。在本文中,我們接觸到了如下的概念:

在這之後的博文中,我們將會演示如何使用後臺服務來構建前端應用程式,同時也會介紹一個混合性持久化的實例,使用MySQL和Neo4j。

DockOne,新圈子,新思路,新視野。


相關焦點

  • Netflix之後,如何用Spring Cloud 新組件構建微服務架構?
    不久前,Spring 正式發布新版本,該版本最大的變化是移除了多個之前處於維護模式的 Netflix 組件,如 Ribbon、Hystrix 和 Zuul。本文基於 Spring Cloud 新組件,闡述了如何構建微服務架構。
  • Spring Cloud構建微服務架構:消息驅動的微服務(入門)【Dalston版】
    在該文中,我們通過簡單的配置和註解就能實現向RabbitMQ中生產和消費消息。實際上我們使用的對RabbitMQ的starter就是通過Spring Cloud Stream中對RabbitMQ的支持來實現的。下面我們就通過本文來了解一下Spring Cloud Stream。Spring Cloud Stream是一個用來為微服務應用構建消息驅動能力的框架。
  • 使用Spring Boot和Docker構建微服務架構
    本文是《使用Spring Boot和Docker構建微服務架構》系列四部曲的前兩篇,對微服務架構以及容器化概念作一個概述,
  • 使用windows版Docker並在IntelliJ IDEA使用Docker運行Spring Cloud項目
    我這裡下載了java以及nginx的鏡像 其中還有我已經打包好的spring cloud的eureka註冊中心的鏡像使用docker run命令來運行鏡像,我這裡運行nginx的鏡像 好的,在運行了第一個鏡像之後,我們要開始在IntelliJ IDEA中使用docker並構建我們的第一個spring boot程序放到docker中去運行IDEA的準備工作
  • 使用Spring Cloud進行微服務開發
    前一篇文章為大家介紹了什麼是微服務、為什麼選擇微服務,本篇文章我們來介紹如何使用Spring Cloud來進行微服務的開發。
  • Spring Boot 2.0(四):使用 Docker 部署 Spring Boot
    -3.5.2 /usr/local/maven3修改環境變量, 在 /etc/profile中添加以下幾行MAVEN_HOME=/usr/local/maven3export MAVEN_HOMEexport PATH=${PATH}:${MAVEN_HOME}/bin記得執行 source /etc
  • Spring Cloud Gateway微服務網關
    官網地址:https://spring.io/projects/spring-cloud-gatewayZuul是由Netflix開源的API網關,基於servlet的,使用阻塞API,它不支持任何長連接。
  • SpringCloud Alibaba微服務實戰二十一 - 整合Dubbo
    概述在Spring Cloud構建的微服務系統中,大多數的開發者使用都是官方提供的Feign組件來進行內部服務通信,這種聲明式的HTTP客戶端使用起來非常的簡潔、方便、優雅,但是有一點,在使用Feign消費服務的時候,相比較Dubbo這種RPC框架而言,性能較差。
  • 十年架構師用一文帶你搞懂微服務的協調者SpringCloud
    而Spring Cloud 正是考慮到上述微服務開發過程中的痛點,為廣大的開發人員提供了快速構建微服務架構系統的工具。什麼是Spring Cloud使用Spring Cloud,開發人員可以開箱即用地實現這些模式的服務和應用程式。
  • SpringBoot在OpenShift的部署1: 面向實踐的SpringCloud
    .ats.com gateway 8080 Noneservice-config service-config-springcloud.apps.ocp46.ats.com service-config 8888 Noneservice-registry
  • 部署微服務的時候,Spring Cloud 和 Kubernetes 哪個更好?
    Lukyanchikov寫的一篇非常精彩的文章[1],講的是用 Spring Cloud 和 Docker 來構建微服務架構。如果你還沒讀過,你應該讀一下,因為它給出了一個關於如何利用 Spring Cloud 來創建一個簡單的基於微服務的系統的綜合視角。為了構建一個能擴展到數千個服務的可擴展且有彈性的微服務系統,它就必須有一套擁有廣泛的構建時和運行時能力的工具集來幫助管理和控制。
  • 使用 Docker 部署 Spring Boot 項目
    Docker 技術發展為微服務落地提供了更加便利的環境,使用 Docker 部署 Spring Boot 其實非常簡單,這篇文章我們就來簡單學習下。首先構建一個簡單的 Spring Boot 項目,然後給項目添加 Docker 支持,最後對項目進行部署。
  • 如何使用 Node.js 和 Docker 構建高質量的微服務
    微服務的服務範圍越來越廣泛,尤其是在構建複雜應用中,下面我主要從以下幾點分享如何使用 Node.js 和 Docker 構建高質量的微服務
  • Spring Cloud Alibaba之一:Nacos
    從官方文檔的定義看,Nacos致力於幫助我們發現、配置和管理微服務,它提供了一組簡單易用的特性集,幫助我們快速實現動態服務發現、服務配置、服務元數據及流量管理等功能。啊這.看完我當場就懵逼了,說人話行不行。
  • 5w 字 | 172 圖 | 超級賽亞級 Spring Cloud 實戰
    免sudo使用docker命令當以普通用戶身份去使用docker images時,出現以下錯誤:Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock
  • Spring Cloud (十四):Spring Cloud 開源軟體都有哪些?
    3、 spaascloud-masterspring cloud + vue 全家桶實戰,模擬商城,完整的購物流程、後端運營平臺,可以實現快速搭建企業級微服務項目。技術點:核心技術為springcloud+vue兩個全家桶實現,採取了取自開源用於開源的目標,所以能用開源絕不用收費框架,整體技術棧只有阿里雲簡訊服務是收費的,都是目前java前瞻性的框架,可以為中小企業解決微服務架構難題,可以幫助企業快速建站。由於伺服器成本較高,儘量降低開發成本的原則,本項目由10個後端項目和3個前端項目共同組成。
  • Spring Cloud 項目綜述(技術棧一覽)
    要運行自己的伺服器,請使用spring-cloud-config-server依賴項和@EnableConfigServer註解。如果您設置spring.config.name=configserver,則應用程式將在埠8888上運行,並從樣本存儲庫(sample repository)提供數據。
  • SpringCloud之Eureka使用篇
    springcloud和springboot的關係●SpringBoot專注於快速方便的開發單個個微服務.●SpringBoot是關注全局的微服務協調整理治理框架,它將SpringBoot開發的一個個單體微服務整合併管理起來,為各個微服務之間提供,配置管理、服務發現、斷路器、路由、微代理、事件總線、全局鎖、決策競選、分布式會話等等集成服務。
  • 基於k8s、docker、jenkins、springboot構建docker服務.
    ,並上傳到registry,確保docker registry已經啟動$ docker build -t springcloudenv .$ docker tag springcloudenv springcloudenv:v1$ docker push springcloudenv:v1// 查看registry中的鏡像$ curl http://10.12.5.110:5000/v2/_catalog
  • 使用Sidecar搭建異構平臺的微服務
    此外,它們通常需要使用與父應用程式相同的語言或者技術棧來實現。因此,組件和應用程式彼此之間具有密切的相互依賴性。如果將應用程式分解為服務,則可以使用不同的語言和技術構建每個服務。雖然這提供了更大的靈活性,但這意味著每個組件都有自己的依賴關係,並且需要特定於語言的庫來訪問底層平臺以及與父應用程式共享的任何資源。此外,將這些功能部署為單獨的服務可能會增加應用程式的延遲。