前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >基于Docker 5分钟搭建携程Apollo分布式配置中心

基于Docker 5分钟搭建携程Apollo分布式配置中心

作者头像
一行Java
发布2022-04-06 14:04:35
1.6K0
发布2022-04-06 14:04:35
举报
文章被收录于专栏:用户9257747的专栏

前言

由于一开始对Apollo的架构方式了解的不够升入,同时为了能够使得安装过程更加的简单,做到一条指令实现Apollo环境的搭建,经历了比较多的测试;本文基于apollo 1.6.0的版本进行编译打包的,后面会将整个镜像的创建过程逐一的列举出来,避免想了解的朋友再次花时间去研究;

什么是Apollo

携程官方Apollo仓库对该分布式配置中心做了详细的说明,这里就不再对起解析过多的解释,官方文档永远是最新、最全、最权威的介绍,下面只引用官方的一张图来简单说明一下;

总体设计

上图简要描述了Apollo的总体设计,我们可以从下往上看:

  • Config Service 提供配置的读取、推送等功能,服务对象是Apollo客户端
  • Admin Service 提供配置的修改、发布等功能,服务对象是Apollo Portal(管理界面)
  • Config ServiceAdmin Service都是多实例无状态部署,所以需要将自己注册到Eureka中并保持心跳
  • 在Eureka之上我们架了一层Meta Server用于封装Eureka的服务发现接口
  • Client通过域名访问Meta Server获取Config Service服务列表(IP+Port),而后直接通过IP+Port访问服务,同时在Client侧会做load balance、错误重试
  • Portal通过域名访问Meta Server获取Admin Service服务列表(IP+Port),而后直接通过IP+Port访问服务,同时在Portal侧会做load balance、错误重试
  • 为了简化部署,我们实际上会把Config Service、Eureka和Meta Server三个逻辑角色部署在同一个JVM进程中
修改流程图

更多详细的介绍,请通读官方,读官方,官方,方的文档,读完之后,详细你会对Apollo有一个全面及系统的认识;这里主要是想如何以最快的方式将环境搭建起来。

Docker 安装apollo

Docker安装及基础操作

参考此:CentOS 7下安装Docker及基础操作 博客,这里不是重点,所以也就不做过多的说明及解释

镜像介绍

apollo-portal

apollo-configservice

apollo-adminservice

apollo-mysql

安装Apollo

创建一个apollo环境管理的配置文件

代码语言:javascript
复制
#本地默认环境配置,没啥用
local.meta=http://localhost:8080
#下面的环境,你有几个就添加几个,没有的或者不需要的可以直接删掉
dev.meta=http://fill-in-dev-meta-server:8080
fat.meta=http://fill-in-fat-meta-server:8080
uat.meta=http://fill-in-uat-meta-server:8080
lpt.meta=http://fill-in-lpt-meta-server:8080
pro.meta=http://fill-in-pro-meta-server:8080

创建docker-conpose.yml文件

代码语言:javascript
复制
version: "3"

services:
  apollo-mysql:
    container_name: apollo-mysql
    image: pengfeilu/apollo/apollo-mysql:5.7.22_1.6.0
    ports:
      - "13306:3306"
    environment:
      - MYSQL_ROOT_PASSWORD=你的数据库密码
      - UPDATE_EUREKA_URL_SQL=update ApolloConfigDB.ServerConfig set `Value`="http://部署环境的主机IP:8080/eureka/" where `Key`="eureka.service.url"
  apollo-configservice:
    container_name: apollo-configservice
    image: pengfeilu/apollo-configservice:1.6.0
    ports:
      - "8080:8080"
    depends_on:
      - apollo-mysql
    volumes:
      - "/opt/logs/100003171:/opt/logs/100003171"
    environment:
      - spring_datasource_url=jdbc:mysql://数据库的主机IP:13306/ApolloConfigDB?characterEncoding=utf8
      - spring_datasource_username=数据库名称
      - spring_datasource_password=数据库密码
      - host_ip=这个是我自己加的Eureka上服务的IP地址(部署服务的宿主机IP)
  apollo-adminservice:
    container_name: apollo-adminservice
    image: pengfeilu/apollo-adminservice:1.6.0
    ports:
      - "8090:8090"
    depends_on:
      - apollo-mysql
      - apollo-configservice
    links:
      - apollo-configservice
    volumes:
      - "/opt/logs/100003172:/opt/logs/100003172"
    environment:
      - spring_datasource_url=jdbc:mysql://数据库的主机IP:13306/ApolloConfigDB?characterEncoding=utf8
      - spring_datasource_username=数据库的用户名
      - spring_datasource_password=数据库密码
      - host_ip=这个是我自己加的Eureka上服务的IP地址(部署服务的宿主机IP)
  apolo-portal:
    container_name: apollo-portal
    image: pengfeilu/apollo-portal:1.6.0
    ports:
      - "8070:8070"
    volumes:
      - "/opt/logs/100003173:/opt/logs/100003173"
      - "$PWD/apollo-env.properties:/apollo-portal/config/apollo-env.properties"
    environment:
      - spring_datasource_url=jdbc:mysql://数据库的主机IP:13306/ApolloPortalDB?characterEncoding=utf8
      - spring_datasource_username=数据库的用户名
      - spring_datasource_password=数据库密码
  • host_ip 这也是自定义的一个变量,用于admin和config服务注册到Eureka的时候,指明自己服务所处的IP地址,由于使用Docker安装,如果不指定服务注册到eureka上的地址就是容器内部的IP,从而导致客户端访问配置的时候失败;官方在分布式部署中的1.4中有介绍网络策略,这里使用的是其中的第二种。
  • apolo-portal环境配置文件挂载 "$PWD/apollo-env.properties:/apollo-portal/config/apollo-env.properties" 该配置为将不同环境相关的配置信息挂载到容器下对于的路径,这样,环境的增加及移除只需要修改对应的文件,并将apollo-portal容器重启一下即可
  • configservice和adminservice 各个环境服务,每个环境需要单独部署;同时每个环境各自关联着各自的ApolloConfigDB数据库,互不干扰,互不影响;

启动服务

重启容器 (着重关注)

在docker-compose.yml中虽然指定了容器之间的关联关系,但是Mysql在首次启动的时候会比较慢一点,从而会导致admin、config或者portal在启动的时候,mysql服务还没有准备好,导致服务启动失败;这个时候我们只需要等mysql初始化好之后再把所有的服务重新启动一遍就好了。

测试
  • 查看Eureka http://ip:8080 如:http://192.168.1.22:8080 看adminservice和configservice服务是否注册上来
  • 查看Apollo配置管理平台 http://ip:8070 如: http://192.168.1.22:8070 默认管理员用户名:apollo 密码: admin
添加环境

上面默认我们创建了一个Dev的环境,但是实际的使用过程中并不是只有一个环境,可能还有测试环境预发布环境正式环境;那我们如何来添加一个环境呢?有了上面的基础镜像,这个事情就变的非常的简单了;一句话,将上面的docker-compose.yml配置文件的apollo-portal相关的服务去掉并启动即可

第一步:准备docker-compose.yml

代码语言:javascript
复制
version: "3"

services:
  apollo-mysql:
    container_name: apollo-mysql
    image: pengfeilu/apollo/apollo-mysql:5.7.22_1.6.0
    ports:
      - "13306:3306"
    environment:
      - MYSQL_ROOT_PASSWORD=你的数据库密码
      - UPDATE_EUREKA_URL_SQL=update ApolloConfigDB.ServerConfig set `Value`="http://部署环境的主机IP:8080/eureka/" where `Key`="eureka.service.url"
  apollo-configservice:
    container_name: apollo-configservice
    image: pengfeilu/apollo-configservice:1.6.0
    ports:
      - "8080:8080"
    depends_on:
      - apollo-mysql
    volumes:
      - "/opt/logs/100003171:/opt/logs/100003171"
    environment:
      - spring_datasource_url=jdbc:mysql://数据库的主机IP:13306/ApolloConfigDB?characterEncoding=utf8
      - spring_datasource_username=数据库名称
      - spring_datasource_password=数据库密码
      - host_ip=这个是我自己加的Eureka上服务的IP地址(部署服务的宿主机IP)
  apollo-adminservice:
    container_name: apollo-adminservice
    image: pengfeilu/apollo-adminservice:1.6.0
    ports:
      - "8090:8090"
    depends_on:
      - apollo-mysql
      - apollo-configservice
    links:
      - apollo-configservice
    volumes:
      - "/opt/logs/100003172:/opt/logs/100003172"
    environment:
      - spring_datasource_url=jdbc:mysql://数据库的主机IP:13306/ApolloConfigDB?characterEncoding=utf8
      - spring_datasource_username=数据库的用户名
      - spring_datasource_password=数据库密码
      - host_ip=这个是我自己加的Eureka上服务的IP地址(部署服务的宿主机IP)

第二步:启动并二次重启服务

第三步,修改环境配置文件apollo-env.properties

第四步,修改ApolloPortalDB.ServerConfig表中的envs字段

第五步,重启apollo-portal服务

到此,分布式的apollo环境搭建就完成了;集群就在以上环境下做相关配置即可。

镜像创建过程

apollo-mysql镜像

获取sql脚本,下载

配置文件

代码语言:javascript
复制
[mysql]
default-character-set = utf8
[mysql.server]
default-character-set = utf8
[mysqld_safe]
default-character-set = utf8
[client]
default-character-set = utf8
[mysqld]
character_set_server=utf8
init_connect='SET NAMES utf8'

添加初始化数据库脚本

代码语言:javascript
复制
mysql -uroot -p$MYSQL_ROOT_PASSWORD <<EOF
source $WORK_PATH/apolloconfigdb.sql;
source $WORK_PATH/apolloportaldb.sql;
EOF
mysql -uroot -p$MYSQL_ROOT_PASSWORD <<EOF
$UPDATE_EUREKA_URL_SQL;
EOF

创建Dockerfile

构建镜像即可

adminservice、configservice和portal镜像构建

下载官方代码

微调一点Eureka配置

分别在application.yml添加以下配置

亲测上面这种忽略网卡的做法貌似不会生效,因此,这里再添加下面的一行配置 分别在bootstrap.yml添加以下配置

Maven编译

使用各个项目的Docker脚本将打好的包打成镜像

  • 找到Dockerfile 将apollo-configservice、apollo-adminservice和apollo-portal下,target目录中的apollo-*-1.6.0-SNAPSHOT-github.zip文件分别拷贝到各自项目的src/main/docker/目录下

到此,所有的镜像即创建完成!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-11-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 一行Java 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 什么是Apollo
    • 总体设计
      • 修改流程图
      • Docker 安装apollo
        • Docker安装及基础操作
          • 镜像介绍
            • 安装Apollo
              • 测试
                • 添加环境
                • 镜像创建过程
                  • apollo-mysql镜像
                    • adminservice、configservice和portal镜像构建
                    相关产品与服务
                    容器镜像服务
                    容器镜像服务(Tencent Container Registry,TCR)为您提供安全独享、高性能的容器镜像托管分发服务。您可同时在全球多个地域创建独享实例,以实现容器镜像的就近拉取,降低拉取时间,节约带宽成本。TCR 提供细颗粒度的权限管理及访问控制,保障您的数据安全。
                    领券
                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档