springCloud微服务之docker化部署

springCloud微服务系列逐渐接近尾声了,后面也会更新关于springCloud系列的其他文章,在前面的章节已经将springCloud微服务相关的技术都做了简单的介绍,也完成基本的微服务架构设计需求,当然前路漫漫依然有更多精彩的技术等我们去挖掘,这一节主要讲解如何将那么多的微服务部署到docker环境中。

采用docker部署微服务是非常快速的,只需要在maven中添加插件依赖即可,而且对于微服务的高可用扩展docker都可以快速实现,无疑是天作之合

1、安装好docker,这里用的centos7系统

centos中docker的安装参考以下文章

2、安装好项目用到的第三方服务

第三方服务清单,以下服务的安装可以参考docker系列的相关文章

  • mysql8.0 项目主数据库
  • mysql5.7 zipkin数据库,后面采用了es存储可以不需要
  • rabbitmq zipkin微服务链路追踪通信采用此服务
  • elk7.1.1 微服务链路追踪日志分析服务

3、创建docker本地私服

docker run -d -p 5000:5000 --restart=always --name registry2 registry:2

4、在所有微服务模块中添加docker插件依赖

docker-maven-plugin的主要作用是生成dockerfile文件用于微服务镜像的构建

execution 此处作用是在maven 打包的时候自动执行docker构建命令
imageName 这个是镜像名 这里将其推送到docker私服上面
baseImage 基础镜像,需要java运行环境,采用java8
entryPoint jar包启动命令
dockerHost 因为docker没有在本地机器 所以写虚拟机ip或者hosts映射的电脑名(docker 2375端口如何打开,网上可以找到)
forceTags 强制发布
<build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>com.spotify</groupId>
                <artifactId>docker-maven-plugin</artifactId>
                <version>0.4.13</version>
                <executions>
                    <execution>
                        <id>build-image</id>
                        <phase>package</phase>
                        <goals>
                            <goal>build</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <imageName>apg-server:5000/${project.groupId}/${project.artifactId}:${project.version}</imageName>
                    <baseImage>java:8</baseImage>
                    <entryPoint>["java","-jar","/${project.build.finalName}.jar"]</entryPoint>
                    <dockerHost>http://apg-server:2375</dockerHost>
                    <forceTags>true</forceTags>
                    <resources>
                        <resouce>
                            <targetPath>/</targetPath>
                            <directory>${project.build.directory}</directory>
                            <include>${project.build.finalName}.jar</include>
                        </resouce>
                    </resources>
                </configuration>
            </plugin>
        </plugins>
    </build>

5、修改服务发现配置文件使其高可用

修改cloud-eureka模块下的application.yml文件

spring:
  application:
    name: cloud-eureka
---
spring:
  profiles: eureka1
server:
  port: 8801
eureka:
  instance:
    hostname: eureka1
  client:
    service-url:
      defaultZone: http://cloud-eureka2:8800/eureka
---
spring:
  profiles: eureka2
server:
  port: 8800
eureka:
  instance:
    hostname: eureka2
  client:
    service-url:
      defaultZone: http://cloud-eureka:8801/eureka

6、在maven打包的同时将所有微服务发布到docker私服

在maven父模块执行打包命令,会把所有的子模块都打包,如果有单独更新的可以到单独的模块中执行打包命令

7、在服务器查看发布到私服的镜像

执行docker-images命令

8、编写docker-compose文件 进行微服务编排

在服务器创建一个springCloudStudy目录

由于配置中心采用的码云上面的配置文件,而且采取了ssh的方式登录,这里需要弄一个ssh目录存放公钥私钥和允许的主机名,关于这三个文件可以用宿主机上面的ssh,在码云上面记得添加公钥上去。

known_hosts使用以下命令

ssh-keyscan gitee.com > /opt/springCloudStudy/cloudConfigSSH/known_hosts

最终 cloudConfigSSH 该目录下有这三个文件,id_rsa和id_rsa.pub可以拷贝宿主机的过来

id_rsa id_rsa.pub known_hosts

这里还有一个wait-for-it.sh文件,这个用来控制各个服务启动顺序的,比如配置中心如果还没启动的话,用户微服务启动就会报错,因为读不到连接数据库的配置文件,这个文件是github开源的一个文件,以下是获取该文件的地址

文件地址:https://github.com/vishnubob/wait-for-it

最终 springCloudStudy 目录

cloudConfigSSH docker-compose.yml wait-for-it.sh

数据库mysql-db的服务名,这个配置也是单独的数据库和微服务都是同一个网段的,此文件单独放到对于数据库编排的目录下,如果不想更改原来数据库的也可直接采用apg-server的方式实现,比如rabbitmq就是采用这种方式实现的。

以下是mysql-db服务的配置
version: '3'
networks:
  cloud-network:
    external: true
services:
  mysql-db:
    image: mysql:8.0
    container_name: mysql8
    restart: always
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: 123456
      MYSQL_DATABASE: apg
      MYSQL_USER: apg
      MYSQL_PASSWORD: apg
    volumes:
      - ./data:/var/lib/mysql
      - ./conf:/etc/mysql
    networks:
      cloud-network:

微服务的docker-compose.yml文件

version: '3'
networks:
  cloud-network:
    external: true
services:
  cloud-eureka:
    image: apg-server:5000/com.apgblogs/cloud-eureka:1.0-SNAPSHOT
    container_name: cloud-eureka
    ports:
      - 8801:8801
    environment:
      - spring.profiles.active=eureka1
    networks:
      cloud-network:
  
  cloud-eureka2:
    image: apg-server:5000/com.apgblogs/cloud-eureka:1.0-SNAPSHOT
    container_name: cloud-eureka2
    ports:
      - 8800:8800
    environment:
      - spring.profiles.active=eureka2
    networks:
      cloud-network:

  cloud-zuul:
    image: apg-server:5000/com.apgblogs/cloud-zuul:1.0-SNAPSHOT
    container_name: cloud-zuul
    depends_on:
      - cloud-eureka
    ports:
      - 8802:8802
    volumes:
      - ./wait-for-it.sh:/wait-for-it.sh
    entrypoint: "bash /wait-for-it.sh cloud-eureka:8801 -- java -jar /cloud-zuul-1.0-SNAPSHOT.jar"
    networks:
      cloud-network:

  cloud-config:
    image: apg-server:5000/com.apgblogs/cloud-config:1.0-SNAPSHOT
    container_name: cloud-config
    depends_on:
      - cloud-eureka
    extra_hosts:
      - "apg-server:192.168.113.168"
    entrypoint: "bash /wait-for-it.sh cloud-eureka:8801 -- java -jar /cloud-config-1.0-SNAPSHOT.jar"
    networks:
      cloud-network:
    ports:
      - 8804:8804
    volumes:
      - ./cloudConfigSSH/:/root/.ssh/
      - ./wait-for-it.sh:/wait-for-it.sh

  cloud-turbine:
    image: apg-server:5000/com.apgblogs/cloud-turbine:1.0-SNAPSHOT
    container_name: cloud-turbine
    depends_on:
      - cloud-eureka
    volumes:
      - ./wait-for-it.sh:/wait-for-it.sh
    entrypoint: "bash /wait-for-it.sh cloud-eureka:8801 -- java -jar /cloud-turbine-1.0-SNAPSHOT.jar"
    networks:
      cloud-network:

  cloud-user:
    image: apg-server:5000/com.apgblogs/cloud-user:1.0-SNAPSHOT
    depends_on:
      - cloud-eureka
      - cloud-config
    extra_hosts:
      - "apg-server:192.168.113.168"
    volumes:
      - ./wait-for-it.sh:/wait-for-it.sh
    entrypoint: "bash /wait-for-it.sh cloud-config:8804 -- java -jar /cloud-user-1.0-SNAPSHOT.jar"
    networks:
      cloud-network:

  cloud-order:
    image: apg-server:5000/com.apgblogs/cloud-order:1.0-SNAPSHOT
    container_name: cloud-order
    depends_on:
      - cloud-eureka
      - cloud-config
    extra_hosts:
      - "apg-server:192.168.113.168"
    volumes:
      - ./wait-for-it.sh:/wait-for-it.sh
    entrypoint: "bash /wait-for-it.sh cloud-config:8804 -- java -jar /cloud-order-1.0-SNAPSHOT.jar"
    networks:
      cloud-network:

  cloud-good:
    image: apg-server:5000/com.apgblogs/cloud-good:1.0-SNAPSHOT
    container_name: cloud-good
    depends_on:
      - cloud-eureka
      - cloud-config
    extra_hosts:
      - "apg-server:192.168.113.168"
    volumes:
      - ./wait-for-it.sh:/wait-for-it.sh
    entrypoint: "bash /wait-for-it.sh cloud-config:8804 -- java -jar /cloud-good-1.0-SNAPSHOT.jar"
    networks:
      cloud-network:

  cloud-user-center:
    image: apg-server:5000/com.apgblogs/cloud-user-center:1.0-SNAPSHOT
    container_name: cloud-user-center
    depends_on:
      - cloud-eureka
      - cloud-user
      - cloud-order
      - cloud-config
    extra_hosts:
      - "apg-server:192.168.113.168"
    entrypoint: "bash /wait-for-it.sh cloud-config:8804 -- java -jar /cloud-user-center-1.0-SNAPSHOT.jar"
    volumes:
      - ./wait-for-it.sh:/wait-for-it.sh
    networks:
      cloud-network:

9、启动并部署

docker-compose up -d

10、访问测试

可以看到所有微服务都启动了,如果出现异常的,请手动重启试试,或者看看日志信息

11、利用docker对用户微服务缩放,使其高可用

可以发现用户微服务只有一个,一个的话不支持高可用也不支持负载均衡,这里利用docker实现用户微服务的高可用,其他的微服务实现方式都是类似的

采用scale缩放时,就不能指定container_name容器名了,请注意。

docker-compose scale cloud-user=3

可以看到用户微服务已经扩展成3个了

12、文章源码地址

码云:https://gitee.com/apgblogs/springCloudStudy/tree/docker/

现在所有的微服务都已经运行到docker容器上面了,这里只用了一台虚拟机,对于内存消耗还是比较大的,后面可以采用k8s对docker容器进行编排使其支持分布式的集群环境。

发表评论