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