携程Apollo一键打包/部署方案

廉价感情. 提交于 2020-08-19 20:45:42

Apollo-docker

携程Apollo一键打包/部署方案。

几乎不需要修改任何Apollo源码或配置,实现快速开发/测试环境搭建。

基于Apollo 1.6.1

支持WindowsLinux

1、下载源码

Apollo

git clone https://gitee.com/nobodyiam/apollo.git

编译脚本

git clone https://gitee.com/ellipse/apollo-docker.git

项目目录结构:

apollo-docker/
-- apollo/   <--预编译版
   -- admin/
   -- config/
   -- portal/
   -- apollo.env
   -- docker-compose.yml
-- build/    <--编译脚本
   -- gulpfile.js
   -- ...

2、环境准备

JDK

必不可少

Maven

Apollo项目使用Maven构建。如果没安装maven,会调用apollo项目根目录下的mvnw(会自动下载maven),但由于网络原因导致命令卡住。建议手动安装maven并配置环境变量,同时建议将仓库修改为国内仓库。

Node.js

脚本使用Gulp编写,需要Node.js

Docker

测试服务器需要安装DockerDocker compose

3、兼容性检查

使用脚本打包前,先检查下maven版本兼容性。运行项目自带的编译脚本,如不报错则通过。

// 在项目根目录下运行
cd scripts
build.bat  或  ./build.sh

我的maven版本是3.6.3,在Windows中编译会报错:

[INFO] Apollo ConfigService ............................... FAILURE [  5.037 s]
[INFO] Apollo AdminService ................................ SKIPPED
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  49.311 s
[INFO] Finished at: 2020-05-23T11:08:01+08:00
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-assembly-plugin:2.6:single (default) on project apollo-configservice: Execution default of goal org.apache.maven.plugins:maven-assembly-plugin:2.6:single failed: An API incompatibility was encountered while executing org.apache.maven.plugins:maven-assembly-plugin:2.6:single: java.lang.ExceptionInInitializerError: null
.....
.....
[ERROR] Number of foreign imports: 1
[ERROR] import: Entry[import  from realm ClassRealm[maven.api, parent: null]]
[ERROR]
[ERROR] -----------------------------------------------------
[ERROR] : Index 1 out of bounds for length 1

异常信息很不直观,经过一番摸索是maven-assembly-plugin与maven版本不兼容导致的。

修改根目录下的pom.xml文件,将maven-assembly-plugin版本修改为3.3.0。

<!-- v1.6.1 494-498行 -->
<plugin>
	<groupId>org.apache.maven.plugins</groupId>
	<artifactId>maven-assembly-plugin</artifactId>
	<version>3.3.0</version>
</plugin>

修改完毕再次运行build.bat脚本,编译通过。

在CentOS_8测试环境未发现该问题。

4、编译

将本项目的build文件夹复制到apollo的根目录,目录结构为:

/
-- apollo-portal/
-- build/
   -- gulpfile.js

在build目录下打开控制台,执行下列操作

# ~/apollo/build/
# 需要安装 Node.js
npm i -g gulp     # 全局安装gulp
npm i             # 安装项目依赖
gulp              # 运行脚本

如果安装依赖过程中长时间卡住不动,就修改npm镜像为国内镜像

npm config set registry https://registry.npm.taobao.org

稍事等待后编译完成。如果编译过程中发生未知错误,请先按章节3、兼容性检查操作。

/
-- build/
   -- apollo/
      -- admin/
      -- config/
      -- portal/
      -- apollo.env           <- 通用环境变量
      -- docker-compose.yml   <- 运行脚本
   -- gulpfile.js

根据需要修改apollo.envdocker-compose.yml

# apollo.env
DS_IP=192.168.0.109                    # 数据库所在主机的IP
DS_PORT=3306                           # 数据库端口
HOST_IP=192.168.0.103                  # Docker宿主机IP,只在环境变量中引用

DS_URL=jdbc:mysql://${DS_IP}:${DS_PORT}/${DB_NAME}?characterEncoding=utf8
DS_USERNAME=root                       # 数据库用户名
DS_PASSWORD=123456                     # 数据库密码
eureka.instance.ip-address=${HOST_IP}  # 向Eureka注册时所指定的IP,这里使用的是宿主机IP
# docker-compose.yml
version: '3'
services:
  apollo-config-01:
    container_name: apollo-configservice-01
    build: ./config
    ports:
      - 8080:8080
    volumes:
      - /data/apollo/config01:/opt/logs/100003171
    env_file:
      - apollo.env
    environment:
      - DB_NAME=ApolloConfigDB_Docker      # 数据库名
...
...
  apollo-portal-01:
    container_name: apollo-portalservice-01
    build: ./portal
    ports:
      - 8070:8070
    volumes:
      - /data/apollo/portal01:/opt/logs/100003173
    env_file:
      - apollo.env
    environment:
      - DB_NAME=ApolloPortalDB_Docker
      - LOCAL_META=http://192.168.0.103:8080   # Eureka的地址
      - DEV_META=http://192.168.0.103:8080     #
      - FAT_META=http://192.168.0.103:8080     #
      - UAT_META=http://192.168.0.103:8080     #
      - LPT_META=http://192.168.0.103:8080     #
      - PRO_META=http://192.168.0.103:8080     #

除此之外,其他的Spring配置都可以加到 environment 中从而覆盖Apollo的默认参数,例如

environment:
  - server.port=18080

5、单机部署

测试环境为:CentOS8 (Vmware) 并安装DockerDocker compose

将新生成的apollo文件夹上传到服务器

/
-- build/
   -- apollo/      <-- 上传这个文件夹
   -- gulpfile.js

命令行进入apollo文件夹,运行

docker-compose up -d

检查是否启动成功

docker-compose ps
          Name                        Command               State           Ports
-----------------------------------------------------------------------------------------
apollo-adminservice-01    /apollo-adminservice/scrip ...   Up      0.0.0.0:8090->8090/tcp
apollo-configservice-01   /apollo-configservice/scri ...   Up      0.0.0.0:8080->8080/tcp
apollo-portalservice-01   /apollo-portal/scripts/sta ...   Up      0.0.0.0:8070->8070/tcp

注:docker-compose必须在包含docker-compose.yml文件的目录下才能执行。

若启动失败,在服务器/data/apollo/中查看日志。前面的配置中已将docker中的日志位置重定向到了宿主机。

如果是网络原因无法启动,参考这篇文章:https://my.oschina.net/u/580483/blog/4264763

由于服务注册和发现过程较慢,启动后需要等待约30秒(人肉计时)

浏览器中访问Eureka管理页面http://192.168.0.103:8080/,可以看到APOLLO-ADMINSERVICEAPOLLO-CONFIGSERVICE已经成功注册,并且ip地址也是正确的。

访问ApolloPortal管理页面http://192.168.0.103:8070/,管理员工具>系统信息,可以看到环境信息中已经成功获取了APOLLO-ADMINSERVICEAPOLLO-CONFIGSERVICE

注:如果服务器开了防火墙,需要开放相应端口,并重启防火墙

firewall-cmd --zone=public --add-port=8080/tcp --permanen

6、分布式部署

6.1 测试环境

测试机1:CentOS 8(Vmware) 192.168.0.103
---- ConfigService
---- AdminService
---- Portal

测试机2:CentOS 8(Vmware) 192.168.0.104
---- ConfigService
---- AdminService

6.2 修改配置

这里选择预编译版本进行部署。

数据库

UPDATE serverconfig
SET `Value` = "http://192.168.0.103:8080/eureka/,http://192.168.0.104:8080/eureka/"
WHERE `Key` = "eureka.service.url"

测试机1

复制本项目根目录下的apollo文件夹,命名为apollo_103。修改apollo.env`,其他按实际环境修改。

HOST_IP=192.168.0.103

修改docker-compose.yml,其他按实际环境修改。

apollo-portal-01:
  ...
  environment:
    - DB_NAME=ApolloPortalDB_Docker
    - LOCAL_META=http://192.168.0.103:8080,http://192.168.0.104:8080
    - DEV_META=http://192.168.0.103:8080,http://192.168.0.104:8080

测试机2

复制apollo_103并重命名为apollo_104。修改apollo.env,其他按实际环境修改。

HOST_IP=192.168.0.104

修改docker-compose.yml,注释掉(或删除)apollo-portal-01部分。其他按实际环境修改。

#  apollo-portal-01:
#    container_name: apollo-portalservice-01
#    build: ./portal
#    ports:
#      - 8070:8070
#    volumes:
#      - /data/apollo/portal01:/opt/logs/100003173
#    env_file:
#      - apollo.env
#    environment:
#      - DB_NAME=ApolloPortalDB_Docker
#      - LOCAL_META=http://192.168.0.103:8080,http://192.168.0.104:8080
#      - DEV_META=http://192.168.0.103:8080,http://192.168.0.104:8080
#      - FAT_META=http://192.168.0.103:8080,http://192.168.0.104:8080
#      - UAT_META=http://192.168.0.103:8080,http://192.168.0.104:8080
#      - LPT_META=http://192.168.0.103:8080,http://192.168.0.104:8080
#      - PRO_META=http://192.168.0.103:8080,http://192.168.0.104:8080

6.3 启动Apollo

分别登录两台服务器,在apollo_10X目录下执行:

docker-compose up -d
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!