SpringCloud
Spring Cloud是在Spring Boot的基礎上構建的,用於簡化分佈式系統構建的工具集,爲開發人員提供快速建立分佈式系統中的一些常見的模式。
實際操作以前先介紹一些微服務概念。
服務發現
在微服務架構中,服務發現(Service Discovery)是關鍵原則之一。手動配置每個客戶端或某種形式的約定是很難做的,並且很脆弱。Spring Cloud提供了多種服務發現的實現方式,例如:Eureka、Consul、Zookeeper。
Spring Cloud支持得最好的是Eureka,其次是Consul,最次是Zookeeper。服務提供者及服務消費者
服務提供者 服務的被調用方(即:爲其他服務提供服務的服務)
服務消費者 服務的調用方(即:依賴其他服務的服務)熔斷器(CircuitBreaker)
在微服務架構中通常會有多個服務層調用,基礎服務的故障可能會導致級聯故障,進而造成整個系統不可用的情況,這種現象被稱爲服務雪崩效應。服務雪崩效應是一種因“服務提供者”的不可用導致“服務消費者”的不可用,並將不可用逐漸放大的過程。
熔斷器的原理很簡單,如同電力過載保護器。它可以實現快速失敗,如果它在一段時間內偵測到許多類似的錯誤,會強迫其以後的多個調用快速失敗,不再訪問遠程服務器,從而防止應用程序不斷地嘗試執行可能會失敗的操作,使得應用程序繼續執行而不用等待修正錯誤,或者浪費CPU時間去等到長時間的超時產生。熔斷器也可以使應用程序能夠診斷錯誤是否已經修正,如果已經修正,應用程序會再次嘗試調用操作。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