springCloud微服务之docker化部署

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

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

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

请在centos7中安装好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 强制发布

 
 
 org.springframework.boot
 spring-boot-maven-plugin
 
 
 com.spotify
 docker-maven-plugin
 0.4.13
 
 
 build-image
 package
 
 build
 
 
 
 
 apg-server:5000/${project.groupId}/${project.artifactId}:${project.version}
 java:8
 ["java","-jar","/${project.build.finalName}.jar"]
 http://apg-server:2375
 true
 
 
 /
 ${project.build.directory}
 ${project.build.finalName}.jar
 
 
 
 
 
 

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父模块执行打包命令,会把所有的子模块都打包,如果有单独更新的可以到单独的模块中执行打包命令

springCloud微服务之docker化部署

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

执行docker-images命令

springCloud微服务之docker化部署

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开源的一个文件,以下是获取该文件的地址

文件地址:

最终 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、访问测试

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

springCloud微服务之docker化部署

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

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

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

docker-compose scale cloud-user=3

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

springCloud微服务之docker化部署

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


分享到:


相關文章: