搭建微服務中台
中台整個預占地址段【8090-8999】
- 注冊中心預占地址段為【8090-8099】實際使用端口號為8090、8091
- 商品中心預占地址段為【8901-8910】實際使用端口號為8910
- 配置中心預占地址段為【8911-8920】實際使用端口號為 apollo-configservice:8911 apollo-adminservice:8912 apollo-portal:8913
Eureka 注冊中心、服務注冊
預占【8090-8099】端口段,實際使用端口號為8090、8091
基於Dockerfile創建Eureka鏡像
首先是編寫Dockerfile文件,需要注意的是這里的Dockerfile文件名是個固定值,不能改變的,否則就會提示找不到Dockerfile文件。Dockerfile文件的語法請自行百度,此處只記錄我這里用到的內容:
FROM centos:7
MAINTAINER pf
ADD jdk-8u191-linux-x64.tar.gz /usr/local/
COPY microservice-discovery-eureka-0.0.1-SNAPSHOT.jar my-eureka.jar
ENV JAVA_HOME /usr/local/java/jdk1.8.0_191
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
接下來就是build自定義的鏡像了,cd 到Dockerfile文件的目錄,執行如下命令(不要忘記最后面的那個 .):
docker build -t myeureka .
執行命令成功后,會生成一個myeureka的鏡像,接下來分別啟動2個容器eurekafirstblood與eurekadoublekill,命令如下:
docker run -p 8090:8090 --name eurekafirstblood --net=host -d -it myeureka /bin/bash
docker run -p 8091:8091 --name eurekadoublekill --net=host -d -it myeureka /bin/bash
這里需要注意的是: 創建容器的時候一定要使用 -it /bin/bash這種方式,要不然jdk的容器起不來
然后使用docker exec -it 命令分別進入到容器shell中,並啟動eureka服務,命令如下:
docker exec -it eurekafirstblood /bin/bash
java -jar my-eureka.jar --spring.profiles.active=firstblood
docker exec -it eurekadoublekill /bin/bash
java -jar my-eureka.jar --spring.profiles.active=doublekill
安裝vim編輯器,修改host文件
apt-get update
apt-get install -y vim
vi /etc/hosts
在eurekafirstblood 容器中 修改host添加 172.31.119.58 doublekill
在eurekadoublekill 容器中 修改host添加 172.31.119.58 firstblood
Eureka使用問題收集
EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT. RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE.
出現以上紅色字體警告時,表示存在注冊到Eureka的client,低於閥值。但是Eureka為了避免因為網絡波動造成的短暫心跳連通問題直接把節點給踢出,采取的保護策略。此處延伸出閥值的概念,如下圖中所示:
Eureka server和client之間每隔30秒會進行一次心跳通信,告訴server,client還活着。由此引出兩個名詞:
Renews threshold:server期望在每分鍾中收到的心跳次數
Renews (last min):上一分鍾內收到的心跳次數。
renews:
1)自注冊 2 + 21
2)非自注冊:21
以上統稱為自我保護機制:某時某刻一個微服務不可用了,Eurake 不會立即清理,依舊會對該微服務的信息進行保存
默認情況下,如果 EurakeServer 在一定時間內沒有接收到某個服務實例的心跳,EurakeServer 將會注銷實例(默認90秒)。但是當網絡分區故障發生時,微服務與 EurakeServer 之間無法正常通信,以上行為可能變的非常危險,因為微服務本身是健康的,此時本不應該注銷這個服務。Eurake 通過“自我保護”來解決這個問題,當 EurakeServer 節點在短時間內丟失過多客戶時(可能發生了網絡分區故障),那么這個節點就會進入自我保護模式。一旦進入該模式,EurakeServer 就會保護服務注冊表中的信息,不在刪除服務注冊表中的數據(也就是不會注銷任何微服務)。當故障恢復后,該 EurakeServer 節點會自動退出自我保護模式
配置中心
之前用的spring cloud config 后面准備換成apollo,2個都記錄一下吧。
spring cloud config
springboot與spring cloud的版本問題要好好搞一下。
config-server 與Eureka聯合使用, pom中需要引用:
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
</dependencies>
apollo
配置中心預占地址段為【8911-8920】
實際使用端口號為
- apollo-portal 總的為 8913
- dev環境 apollo-configservice:8911 apollo-adminservice:8912
- prod環境 apollo-configservice:8914 apollo-adminservice:8915
apollo部署流程
整個教程參見 官方部署指南
- 創建數據庫 Apollo服務端依賴於MySQL數據庫,所以需要事先創建並完成初始化
數據庫創建很簡單,直接從apollo項目中獲取現成的sql導入數據庫即可,值得注意的是需要修改配置。
- 獲取安裝包 Apollo服務端安裝包共有3個:apollo-configservice, apollo-adminservice, apollo-portal可以直接下載我們事先打好的安裝包,也可以自己通過源碼構建
分別修改3個項目中的script文件,修改端口號為我們前面定義的
修改build.bat文件,這個文件是全項目執行maven 編譯打包的,會生成對應項目的jar文件和zip文件。取zip文件傳到服務器上。
- 部署Apollo服務端 獲取安裝包后就可以部署到公司的測試和生產環境了
為apollo-configservice build專屬鏡像,Dockerfile直接使用官方下載下來的,打包鏡像命令如下:
docker build -t apollo-configservice-dev .
啟動apollo-configservice-dev容器
docker run -p 8911:8911 --name apollo-configservice-dev --net=host -d apollo-configservice-dev
為apollo-adminservice build 專屬鏡像,Dockerfile直接使用官方下載下來的,打包鏡像命令如下:
docker build -t apollo-adminservice-dev .
啟動apollo-adminservice-dev容器
docker run -p 8912:8912 --name apollo-adminservice-dev --net=host -d apollo-adminservice-dev
為apollo-portal build專屬鏡像,Dockerfile直接使用官方下載下來的,打包鏡像命令如下:
docker build -t apollo-portal-dev .
啟動apollo-portal容器
docker run -p 8913:8913 --name apollo-portal-dev --net=host -d apollo-portal-dev
分別啟動后,這時候查看日志應該是一堆報錯,因為還沒連上注冊中心呢。那既然要連上注冊中心,肯定需要修改相關配置,這個配置是存在數據庫當中的,在ApolloConfigDb數據庫的ServerConfig表中, 最后還需要分別修改hosts文件,使其能夠以域名方式到注冊中心。
然后在瀏覽器輸入www.forever24.cn:8913 ,喜聞樂見的可視化配置界面新鮮出爐,不枉我費了半天勁改成apollo。可以接入自己的權限驗證系統,比如cas,oauth2的,但是portal提供了一套默認的基於oauth簡單認證的方式,初始賬號:apollo,密碼:admin
Hystrix 斷路器、熔斷避免雪崩
Hystrix dashboard 可視化查看調用成功率及熔斷開關
ribbon、feign 負載均衡下的服務消費
Zuul api網關
中台部分
商品中心goods-center
預占端口范圍【8901-8910】
當前使用的端口號是8910