使用Spring Cloud和Docker構建微服務

jopen 9年前發布 | 355K 次閱讀 Docker

這是系列博文中的第一篇,本文作者使用Spring Cloud和docker構建微服務平臺,文章的例子淺顯易懂,希望了解微平臺構建的同學能夠從這里會收獲良多.

這篇系列博文主要向大家介紹如何使用Spring Cloud和Docker構建微服務平臺。

什么是Spring Cloud?

Spring Cloud 是一個 pivotal提供的用于進行分布式系統構建時提供一些常用的解決方案的工具集。如果你對使用 Spring Framework構建應用程序很熟悉的話,Spring Cloud 提供了一些常用基礎組件的構建服務。

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

  • Configuration Service
  • Discovery Service
  • Circuit breakers
  • Distributed sessions
  • </ul>

    Spring Boot

    關于Spring Cloud 最重要的部分就是啟動Spring Boot的概念模型上。

    對于那些剛使用Spring Boot的人而言,他所要做的僅僅是起一個名副其實的項目名,你就會構建一個使用Spring Framework開發的微系統項目,可以直接轉換成使用最小配置,萬事俱備的完美的系統應用了。

    服務發現和智能路由

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

     使用Spring Cloud和Docker構建微服務

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

    configuration service 處于最頂端,黃色標識,而且被其他微服務所依賴。

    discovery service 處于最低端,藍色標識,同時也被其他服務所依賴。

    綠色標識的兩個微服務只是一個本地實例應用的一部分,下面我將會使用他們創建博客,分別是:電影和觀影建議。

    Configuration Service

    Configuration Service 在微服務架構中是一個非常重要的組件。基于在 twelve-factor app上構建的應用,配置你的微服務應用在環境中而不是在本地項目中。
    configuration service 是一個必不可少的基礎組件的原因是因為它可以對所有通過點對點和檢索的基礎服務進行服務管理。他的優勢在于多用途。

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

     使用Spring Cloud和Docker構建微服務

    當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); } </pre>
    在上面的例子中,我創建了一個Feign客戶端 映射了一個REST API方法來暴露我的電影服務.使用@FeignClient注解,我聲明了我想要為movie微服務而創建的客戶端API.接下來我聲明了一個我想要實現的服務映射.通過在方法上聲明一個URL規則來描述一個REST API的路由規則。

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

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

    API Gateway

    API Gateway 服務是Spring Cloud的另一個重要組件.它主要用來創建服務集群并管理自己域名下的應用實例.下圖的綠色六邊形是我們提供的數據驅動服務,主要用來管理自己域名下的 實體類和數據庫.通過添加 API Gateway 服務,我們可以為通過下面綠顏色的服務為每一個API路由創建一個代理暴露接口。

     使用Spring Cloud和Docker構建微服務

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

    示例項目

    我已經在github上創建了一個實例項目,這個項目是一個端到端的原生云平臺,使用Spring Cloud 構建實際的微服務架構。

    基本概念:

    • 使用Docker進行集成測試
    • 混合持久化
    • 微服務架構
    • 服務發現
    • API網關
    • </ul>

      Docker

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

      混合持久化

      實例程序中的一個核心概念是如何將混合持久化轉化為實際.項目中的微服務使用自己的數據庫同時集成通過REST或者消息總線方式從其他的服務提供的數據接入。舉個例子,你可以擁有從以下數據庫中提供的微服務:

      • Neo4j(圖形化)
      • MongoDB(文檔化)
      • MySQL(關聯)
      • </ul>

        微服務架構

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

        Service Discovery

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

        API 網關

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

        Docker 實例

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

        開始構建

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

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

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

        下載Docker

        首先,如果你還沒有Docker請先下載它。可以跟隨這個 指南來獲取docker,安裝并運行在你的開發機上。

        當然你也需要安裝 Docker Compose,這個 指南將會幫到你。

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

        • Maven 3
        • Java 8
        • Docker
        • Docker Compose
        • </ul>

          構建項目

          通過命令行方式,構建當前項目,在項目的根目錄運行下面的命令.

          $ 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] users-microservice ................................ SUCCESS [ 11.929 s]
          [INFO] discovery-microservice ............................ SUCCESS [  5.640 s]
          [INFO] api-gateway-microservice .......................... SUCCESS [  5.156 s]
          [INFO] recommendation-microservice ....................... SUCCESS [  7.732 s]
          [INFO] config-microservice ............................... SUCCESS [  4.711 s]
          [INFO] hystrix-dashboard ................................. SUCCESS [  4.251 s]
          [INFO] consul-microservice ............................... SUCCESS [  6.763 s]
          [INFO] movie-microservice ................................ SUCCESS [  8.359 s]
          [INFO] movies-ui ......................................... SUCCESS [ 15.833 s]
          [INFO] ------------------------------------------------------------------------
          [INFO] BUILD SUCCESS
          [INFO] ------------------------------------------------------------------------

          通過Docker compose 啟動集群

          現在每一個鏡像都成功構建完畢,我們使用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/\"http://g')

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

           使用Spring Cloud和Docker構建微服務

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

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

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

          {
            "_links" : {
          "self" : {
            "href" : "http://192.168.59.103:10000/movie"
          },
          "resume" : {
            "href" : "http://192.168.59.103:10000/movie/resume"
          },
          "pause" : {
            "href" : "http://192.168.59.103:10000/movie/pause"
          },
          "restart" : {
            "href" : "http://192.168.59.103:10000/movie/restart"
          },
          "metrics" : {
            "href" : "http://192.168.59.103:10000/movie/metrics"
          },
          "env" : [ {
            "href" : "http://192.168.59.103:10000/movie/env"
          }, {
            "href" : "http://192.168.59.103:10000/movie/env"
          } ],
          "archaius" : {
            "href" : "http://192.168.59.103:10000/movie/archaius"
          },
          "beans" : {
            "href" : "http://192.168.59.103:10000/movie/beans"
          },
          "configprops" : {
            "href" : "http://192.168.59.103:10000/movie/configprops"
          },
          "trace" : {
            "href" : "http://192.168.59.103:10000/movie/trace"
          },
          "info" : {
            "href" : "http://192.168.59.103:10000/movie/info"
          },
          "health" : {
            "href" : "http://192.168.59.103:10000/movie/health"
          },
          "hystrix.stream" : {
            "href" : "http://192.168.59.103:10000/movie/hystrix.stream"
          },
          "routes" : {
            "href" : "http://192.168.59.103:10000/movie/routes"
          },
          "dump" : {
            "href" : "http://192.168.59.103:10000/movie/dump"
          },
          "refresh" : {
            "href" : "http://192.168.59.103:10000/movie/refresh"
          },
          "mappings" : {
            "href" : "http://192.168.59.103:10000/movie/mappings"
          },
          "autoconfig" : {
            "href" : "http://192.168.59.103:10000/movie/autoconfig"
          }
            }
          }  


          總結

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

          • Service Discovery
          • Externalized Configuration
          • API Gateway
          • Service Orchestration with Docker Compose
          • </ul>
            在這之后的博文中,我們將會演示如何使用后臺服務來構建前端應用程序.同時也會介紹一個混合性持久化的實例,使用MySQL和Neo4j.

            特別感謝

            首先我會特別感謝 Josh Long何spring團隊的其他成員給我提供了第一手的令人激動的Spring framework項目.沒有Josh Long的支持,我無法用言語表達Spring生態圈給我的研究所帶來的令人驚奇的事情。

            我還要感謝那些開源工具,例如Spring Cloud,沒有這些領軍人物的思想,我也無法繼續研究。包括 Adrian Cockcroft(Netflix的運營支撐系統), Martin Fowler(所有事), Sam Newman( O'Reilly's 構建的微服務), Ian Robinson(消費者驅動約定), Chris Richardson(VMware的Cloud Foundry)和其他那些使用開源技術改變現在社會的人。

            原文鏈接:Building Microservices with Spring Cloud and Docker(翻譯:隋鑫)
            來自:http://dockone.io/article/510

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!