使用Springcloud及Docker實現微服務架構

SpringCloud

Spring Cloud是在Spring Boot的基礎上構建的,用於簡化分佈式系統構建的工具集,爲開發人員提供快速建立分佈式系統中的一些常見的模式。
實際操作以前先介紹一些微服務概念。

  1. 服務發現
    在微服務架構中,服務發現(Service Discovery)是關鍵原則之一。手動配置每個客戶端或某種形式的約定是很難做的,並且很脆弱。Spring Cloud提供了多種服務發現的實現方式,例如:Eureka、Consul、Zookeeper。
    Spring Cloud支持得最好的是Eureka,其次是Consul,最次是Zookeeper。

  2. 服務提供者及服務消費者
    服務提供者 服務的被調用方(即:爲其他服務提供服務的服務)
    服務消費者 服務的調用方(即:依賴其他服務的服務)

  3. 熔斷器(CircuitBreaker)
    在微服務架構中通常會有多個服務層調用,基礎服務的故障可能會導致級聯故障,進而造成整個系統不可用的情況,這種現象被稱爲服務雪崩效應。服務雪崩效應是一種因“服務提供者”的不可用導致“服務消費者”的不可用,並將不可用逐漸放大的過程。
    熔斷器的原理很簡單,如同電力過載保護器。它可以實現快速失敗,如果它在一段時間內偵測到許多類似的錯誤,會強迫其以後的多個調用快速失敗,不再訪問遠程服務器,從而防止應用程序不斷地嘗試執行可能會失敗的操作,使得應用程序繼續執行而不用等待修正錯誤,或者浪費CPU時間去等到長時間的超時產生。熔斷器也可以使應用程序能夠診斷錯誤是否已經修正,如果已經修正,應用程序會再次嘗試調用操作。

  4. API Gateway
    使用API Gateway後,客戶端和微服務之間的網絡圖變成下圖:
    這裏寫圖片描述

準備微服務代碼

  • 配置本地hosts文件
    在生產環境下,我們往往會爲每個應用配置一個host,使用host而非IP進行訪問。爲了更加貼近生產環境,以及後文Docker章節的講解,我們首先配置一下Host
AMIDdeAir:~ amid$ sudo cat /etc/hosts
127.0.0.1 localhost discovery config-server gateway movie user 
  • 準備微服務程序
    我們這裏新建下面幾個項目,由於項目程序較多,可以到github上下載源碼,這裏就不貼源碼了。github地址:https://github.com/39627020/spring-cloud-study
    1.microservice-api-gateway(api gateway服務)8500端口
    2.microservice-discovery-eureka(服務發現服務)8761端口
    3.microservice-provider-user(用戶服務提供者)8000端口
    4.microservice-consumer-movie-ribbon(用戶服務消費者)8010端口

  • Dockerfile
    以Discovery服務的Dockerfile爲例介紹下Dockerfile文件。
    新建discovery目錄,將microservice-discovery-eureka-0.0.1-SNAPSHOT.jar文件拷貝到文件夾當中,然後新建Dockerfile文件。

AMIDdeAir:image amid$ mkdir image
AMIDdeAir:image amid$ cd image
AMIDdeAir:image amid$ mkdir discovery
AMIDdeAir:image amid$ cd discovery
AMIDdeAir:discovery amid$ ls
Dockerfile                                              microservice-discovery-eureka-0.0.1-SNAPSHOT.jar
AMIDdeAir:discovery amid$ vi Dockerfile
#基於哪個鏡像
FROM java:8

# 將本地文件夾掛載到當前容器
VOLUME /tmp

# 拷貝文件到容器,也可以直接寫成ADD microservice-discovery-eureka-0.0.1-SNAPSHOT.jar /app.jar
ADD microservice-discovery-eureka-0.0.1-SNAPSHOT.jar /app.jar
#RUN bash -c 'touch /app.jar'

# 開放8761端口
EXPOSE 8761

# 配置容器啓動後執行的命令
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]                                                                                      

退到image目錄,編輯docker-compose.yml文件,同時管理多個docker容器。

discovery:
  build: ./discovery
  ports:
    - "8761:8761" #將宿主機8761端口綁定到容器8761端口
  expose:
    - 8761        #暴露容器8761端口
user:
  build: ./user
  ports:
    - "8000:8000"
  expose:
    - 8000
  links:
    - discovery   #可以訪問discovery容器
movie:
  build: ./movie
  ports:
    - "8010:8010"
  expose:
    - 8010
  links:
    - discovery
    - user
gateway:
  build: ./gateway
  ports:
    - "8050:8050"
  expose:
    - 8050
  links:
    - discovery
    - user
    - movie

完成後執行sudo docker-compose up,進行構建。

AMIDdeAir:image amid$ sudo docker-compose up

訪問http://localhost:8761/,確認服務都已經註冊到Eureka服務器。
這裏寫圖片描述

訪問http://localhost:8000/1, 確認用戶服務提供者已經啓動。
這裏寫圖片描述

訪問http://localhost:8010/ribbon/2,確認用戶服務消費者已經啓動。
這裏寫圖片描述

訪問http://localhost:8050/microservice-consumer-movie-ribbon/ribbon/3, 確認api gateway正常運行。
這裏寫圖片描述

到此基於Springcloud及Docker實現的微服務例子就結束了,歡迎一起討論,學習。
QQ:39627020
源碼地址:https://github.com/39627020/spring-cloud-study

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章