SpringCloud微服務部署方案

SpringCloud微服務部署方案

該文章需要一定的docker基礎才能看懂,不會的也可以先了解,萬一老闆讓你出個方案呢?

適用於中小規模的微服務,該文章基於Docker進行部署

1 整體思路

  1. 項目集成docker插件,用於上傳鏡像到私有倉庫
  2. Jenkins創建與服務數相等的構建流水線,負責編譯/打包/測試/上傳
  3. 對預先準備好的compose配置文件修改成本次部署所需的參數,手動執行命令,或使用Portainer等可視化頁面的方式進行操作(建議手動)
  4. 驗證部署結果

實際流程

1 首先對服務添加maven插件(該配置基於阿里雲私有鏡像倉庫,如你也使用該方法可以直接複製)

           <plugin>
               <groupId>com.spotify</groupId>
               <artifactId>docker-maven-plugin</artifactId>
               <version>1.2.2</version>
               <executions>
                   <execution>
                       <id>build-image</id>
                       <!-- 調用package時 觸發下面的操作-->
                       <phase>package</phase>
                       <goals>
                        <!-- 打包爲鏡像,需要Dockerfile,放入resource下即可-->
                           <goal>build</goal>
                        <!-- 推送到鏡像倉庫-->
                           <goal>push</goal>
                       </goals>
                   </execution>
               </executions>
               <configuration>
                   <!-- 鏡像名 地址 / 命名空間 / 倉庫 / 鏡像名 : 版本 -->
                   <imageName>registry.aliyuncs.com/namespace/鏡像名稱:標籤</imageName>
                   <dockerDirectory>${project.basedir}/src/main/resources</dockerDirectory>
                   <!-- 服務器上用專有網絡速度快 改成阿里雲的地址 -->
                   <registryUrl>registry-vpc.cn-beijing.aliyuncs.com</registryUrl>
                   <!-- 修改settings.xml配置阿里雲賬號密碼,服務器上的maven也需要 -->
                   <serverId>aliyun-register</serverId>
                   <imageTags>
                       <!--docker的tag爲項目版本號、latest-->
                       <imageTag>latest</imageTag>
                   </imageTags>
                   <resources>
                       <resource>
                           <targetPath>/</targetPath>
                           <directory>${project.build.directory}</directory>
                           <include>${project.build.finalName}.jar</include>
                       </resource>
                   </resources>
               </configuration>
           </plugin>

2 配置jenkins

這裏我對jenkins鏡像做了一層包裝,將git,maven放入jenkins鏡像中,方便服務器遷移,如果宿主機已經安裝了git ,maven 則可以直接進行掛載也很方便

這裏稍微貼一下自定義jenkins的Dockerfile

FROM jenkins/jenkins:alpine
USER root
RUN echo http://mirrors.ustc.edu.cn/alpine/v3.10/main > /etc/apk/repositories && \
echo http://mirrors.ustc.edu.cn/alpine/v3.10/community >> /etc/apk/repositories
ADD apache-maven-3.6.3-bin.tar.gz /usr/local
RUN apk add git
RUN cd /usr/local && rm -rf *.gz
ENV MAVEN_HOME=/usr/local/apache-maven-3.6.3
ENV PATH=$PATH:$JAVA_HOME/bin:$MAVEN_HOME/bin
ENTRYPOINT ["/sbin/tini","--","/usr/local/bin/jenkins.sh"]

這裏在簡單提一嘴必須掛載的內容

  1. settings.xml >>> 配置國內加速鏡像,倉庫位置,阿里雲私有鏡像賬號配置
  2. m2 >>> 防止每次都download到容器內部,刪除了容器就沒了
  3. docker.sock >>> 需要執行docker命令
  4. jenkinsHome

Jenkins需要配置jdk(jenkins鏡像自帶,因爲jenkins是java寫的),maven差價,git插件,以及settings.xml配置文件位置,最後構建maven風格的流水線即可,不需寫腳本等,從拉取最新代碼,到打包上傳,從頁面簡單配置即可,很簡單這裏不貼圖了(和打包SpringBoot應用一樣,只不過減少了後續的腳本調用

到這裏就完成了鏡像上傳到了阿里雲私有鏡像倉庫的第一步操作

3 配置DockerSwarm

由於服務規模較小,沒有使用較爲流行的k8s,選擇了更加輕量級學習成本更低的swarm,這裏swarm用於對服務動態擴展和調度,配置的過程這裏不再闡述,比較簡單,這裏只講一些坑和使用方法

  1. 創建docker-compose.yml用來部署服務
  2. 通過docker stack deploy來調用配置
  3. 通過docker service scale動態控制服務副本數量
  4. 將master節點配置爲drain狀態就不會將服務調度到主節點

首先說一下遇到的坑,當執行命令時,會在work節點上pull配置文件中指定好的鏡像,如果是DockerHub中存在的鏡像則無問題,如果是私有鏡像,就算是登錄了也無法獲取

解決辦法:在stack deploy後添加–with-registry-auth即可

然後就是網絡的問題,默認會應用一個 ingress的overlay網絡,其實沒有特殊要求的話使用這個就足夠了,注意一下注冊到註冊中心的ip即可,如果是nacos記得指定網卡,否則可能會應用其他網卡的ip

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