docker-compose 部署apollo springboot整合(多环境)

1.前言

由于项目需求,需要在单台服务器上部署apollo,并配置多环境,试了官网的快速开始docker,用里面的sh文件启动,实现多环境较为麻烦(需要该配置文件和脚本文件),后来在网上

2. 部署说明

  1. 版本:apollo-1.8.0
  2. 部署方式:docker-compose

3. 部署步骤

3.1 下载源码,创建数据库

源码地址:

https://github.com/ctripcorp/apollo/tree/v1.2.0

创建数据库

apollo 要部署三个模块:apollo-configservice,apollo-adminservice,apollo-portal
其中apollo-configservice,apollo-adminservice要分环境部署,各个环境下apollo-configservice,apollo-adminservice公用一个数据库(参考官网),apollo-portal独用一个数据库
共五个个数据库,apollo-configservice,apollo-adminservice分别在dev,fat,uat,pro一个数据库,apollo-portal一个数据库,如下图所示:
在这里插入图片描述

数据库修改ServerConfig表中的记录:

在这里插入图片描述
下面每一个表的eureka.service.url都做对应修改

ApolloConfigDB_DEV
http://192.168.64.201:8080/eureka/
ApolloConfigDB_FAT
http://192.168.64.201:8081/eureka/
ApolloConfigDB_UAT
http://192.168.64.201:8082/eureka/
ApolloConfigDB_PRO
http://192.168.64.201:8083/eureka/

ApolloPortalDB

apollo-portal 的修改有所不同,同样是ServerConfig表,但是不是配置URL而是配置启用的环境,如下
dev,fat,uat,pro

3.2 编译源码

官网下载对应的版本的源码,导入idea,如下图,我这里标记了几个重要的模块以及目录
在这里插入图片描述
直接使用maven打包(不用apollo自带的build.sh,这种方式要改配置),直接打包后,取到config、admin、portal对应的zip包以及对应的Dockerfile文件,以及创建.env文件、docker-compose.yml、apollo-env.properties文件,最终文件目录结构如下:
在这里插入图片描述

3.3 编写docker-compose.yml

.env文件

该文件用于定义docker-compose.yml文件中使用的变量,主要是暴露的端口定义,数据库连接串信息

VERSION=1.2.0

LOG_BASE_DIR=/data/apollo
BUILD_BASE_DIR=/data/docker-image


IP_ADDRESS=192.168.64.201

CONFIG_PORT_DEV=8080
CONFIG_PORT_FAT=8081
CONFIG_PORT_UAT=8082
CONFIG_PORT_PRO=8083

ADMIN_PORT_DEV=8090
ADMIN_PORT_FAT=8091
ADMIN_PORT_UAT=8092
ADMIN_PORT_PRO=8093

DATASOURCE_URL_DEV=jdbc:mysql://192.168.64.201:13306/huayun_ApolloConfigDB_DEV?characterEncoding=utf8
DATASOURCE_URL_FAT=jdbc:mysql://192.168.64.201:13306/huayun_ApolloConfigDB_FAT?characterEncoding=utf8
DATASOURCE_URL_UAT=jdbc:mysql://192.168.64.201:13306/huayun_ApolloConfigDB_UAT?characterEncoding=utf8
DATASOURCE_URL_PRO=jdbc:mysql://192.168.64.201:13306/huayun_ApolloConfigDB_PRO?characterEncoding=utf8

PORTAL_DATASOURCE_URL=jdbc:mysql://192.168.64.201:13306/huayun_ApolloPortalDB?characterEncoding=utf8


DATASOURCE_USERNAME=root
DATASOURCE_PASSWORD=root

apollo-env.properties

dev.meta=http://192.168.64.201:8080
fat.meta=http://192.168.64.201:8081
uat.meta=http://192.168.64.201:8082
pro.meta=http://192.168.64.201:8083

docker-compose.yml

version: '3'
services:
  # 开发环境  configservice
  apollo-configservice-dev:
    container_name: apollo-configservice-dev
    build: apollo-configservice/
    image: apollo-configservice
    restart: always
    environment:
      SPRING_DATASOURCE_URL: ${DATASOURCE_URL_DEV}
      SPRING_DATASOURCE_USERNAME: ${DATASOURCE_USERNAME}
      SPRING_DATASOURCE_PASSWORD: ${DATASOURCE_PASSWORD}
      EUREKA_INSTANCE_IP_ADDRESS: ${IP_ADDRESS}
      EUREKA_INSTANCE_HOME_PAGE_URL: http://${IP_ADDRESS}:${CONFIG_PORT_DEV}
    volumes:
      - ${LOG_BASE_DIR}/apollo-configservice-dev/logs:/opt/logs
    ports:
      - "${CONFIG_PORT_DEV}:8080"

  # 开发环境  adminservice
  apollo-adminservice-dev:
    container_name: apollo-adminservice-dev
    build: apollo-adminservice/
    image: apollo-adminservice
    restart: always
    depends_on:
      - apollo-configservice-dev
    environment:
      SPRING_DATASOURCE_URL: ${DATASOURCE_URL_DEV}
      SPRING_DATASOURCE_USERNAME: ${DATASOURCE_USERNAME}
      SPRING_DATASOURCE_PASSWORD: ${DATASOURCE_PASSWORD}
      EUREKA_INSTANCE_IP_ADDRESS: ${IP_ADDRESS}
      EUREKA_INSTANCE_HOME_PAGE_URL: http://${IP_ADDRESS}:${ADMIN_PORT_DEV}
    volumes:
      - ${LOG_BASE_DIR}/apollo-adminservice-dev/logs:/opt/logs
    ports:
      - "${ADMIN_PORT_DEV}:8090"

  # fat  configservice
  apollo-configservice-fat:
    container_name: apollo-configservice-fat
    build: apollo-configservice/
    image: apollo-configservice
    restart: always
    environment:
      SPRING_DATASOURCE_URL: ${DATASOURCE_URL_FAT}
      SPRING_DATASOURCE_USERNAME: ${DATASOURCE_USERNAME}
      SPRING_DATASOURCE_PASSWORD: ${DATASOURCE_PASSWORD}
      EUREKA_INSTANCE_IP_ADDRESS: ${IP_ADDRESS}
      EUREKA_INSTANCE_HOME_PAGE_URL: http://${IP_ADDRESS}:${CONFIG_PORT_FAT}
    volumes:
      - ${LOG_BASE_DIR}/apollo-configservice-fat/logs:/opt/logs
    ports:
      - "${CONFIG_PORT_FAT}:8080"

  # fat  adminservice
  apollo-adminservice-fat:
    container_name: apollo-adminservice-fat
    build: apollo-adminservice/
    image: apollo-adminservice
    restart: always
    depends_on:
      - apollo-configservice-fat
    environment:
      SPRING_DATASOURCE_URL: ${DATASOURCE_URL_FAT}
      SPRING_DATASOURCE_USERNAME: ${DATASOURCE_USERNAME}
      SPRING_DATASOURCE_PASSWORD: ${DATASOURCE_PASSWORD}
      EUREKA_INSTANCE_IP_ADDRESS: ${IP_ADDRESS}
      EUREKA_INSTANCE_HOME_PAGE_URL: http://${IP_ADDRESS}:${ADMIN_PORT_FAT}
    volumes:
      - ${LOG_BASE_DIR}/apollo-adminservice-fat/logs:/opt/logs
    ports:
      - "${ADMIN_PORT_FAT}:8090"

  # uat  configservice
  apollo-configservice-uat:
    container_name: apollo-configservice-uat
    build: apollo-configservice/
    image: apollo-configservice
    restart: always
    environment:
      SPRING_DATASOURCE_URL: ${DATASOURCE_URL_UAT}
      SPRING_DATASOURCE_USERNAME: ${DATASOURCE_USERNAME}
      SPRING_DATASOURCE_PASSWORD: ${DATASOURCE_PASSWORD}
      EUREKA_INSTANCE_IP_ADDRESS: ${IP_ADDRESS}
      EUREKA_INSTANCE_HOME_PAGE_URL: http://${IP_ADDRESS}:${CONFIG_PORT_UAT}
    volumes:
      - ${LOG_BASE_DIR}/apollo-configservice-uat/logs:/opt/logs
    ports:
      - "${CONFIG_PORT_UAT}:8080"

  # uat  adminservice
  apollo-adminservice-uat:
    container_name: apollo-adminservice-uat
    build: apollo-adminservice/
    image: apollo-adminservice
    restart: always
    depends_on:
      - apollo-configservice-uat
    environment:
      SPRING_DATASOURCE_URL: ${DATASOURCE_URL_UAT}
      SPRING_DATASOURCE_USERNAME: ${DATASOURCE_USERNAME}
      SPRING_DATASOURCE_PASSWORD: ${DATASOURCE_PASSWORD}
      EUREKA_INSTANCE_IP_ADDRESS: ${IP_ADDRESS}
      EUREKA_INSTANCE_HOME_PAGE_URL: http://${IP_ADDRESS}:${ADMIN_PORT_UAT}
    volumes:
      - ${LOG_BASE_DIR}/apollo-adminservice-uat/logs:/opt/logs
    ports:
      - "${ADMIN_PORT_UAT}:8090"


  # pro  configservice
  apollo-configservice-pro:
    container_name: apollo-configservice-pro
    build: apollo-configservice/
    image: apollo-configservice
    restart: always
    environment:
      SPRING_DATASOURCE_URL: ${DATASOURCE_URL_PRO}
      SPRING_DATASOURCE_USERNAME: ${DATASOURCE_USERNAME}
      SPRING_DATASOURCE_PASSWORD: ${DATASOURCE_PASSWORD}
      EUREKA_INSTANCE_IP_ADDRESS: ${IP_ADDRESS}
      EUREKA_INSTANCE_HOME_PAGE_URL: http://${IP_ADDRESS}:${CONFIG_PORT_PRO}
    volumes:
      - ${LOG_BASE_DIR}/apollo-configservice-pro/logs:/opt/logs
    ports:
      - "${CONFIG_PORT_PRO}:8080"

  # pro  adminservice
  apollo-adminservice-pro:
    container_name: apollo-adminservice-pro
    build: apollo-adminservice/
    image: apollo-adminservice
    restart: always
    depends_on:
      - apollo-configservice-pro
    environment:
      SPRING_DATASOURCE_URL: ${DATASOURCE_URL_PRO}
      SPRING_DATASOURCE_USERNAME: ${DATASOURCE_USERNAME}
      SPRING_DATASOURCE_PASSWORD: ${DATASOURCE_PASSWORD}
      EUREKA_INSTANCE_IP_ADDRESS: ${IP_ADDRESS}
      EUREKA_INSTANCE_HOME_PAGE_URL: http://${IP_ADDRESS}:${ADMIN_PORT_PRO}
    volumes:
      - ${LOG_BASE_DIR}/apollo-adminservice-pro/logs:/opt/logs
    ports:
      - "${ADMIN_PORT_PRO}:8090"

  # portal
  apollo-portal:
    container_name: apollo-portal
    build: apollo-portal/
    image: apollo-portal
    restart: always
    depends_on:
      - apollo-adminservice-dev
      - apollo-adminservice-fat
      - apollo-adminservice-uat
      - apollo-adminservice-pro
    environment:
      SPRING_DATASOURCE_URL: ${PORTAL_DATASOURCE_URL}
      SPRING_DATASOURCE_USERNAME: ${DATASOURCE_USERNAME}
      SPRING_DATASOURCE_PASSWORD: ${DATASOURCE_PASSWORD}
      APOLLO_PROFILE: github,auth
    volumes:
      - ${LOG_BASE_DIR}/apollo-portal/logs:/opt/logs
      - ${BUILD_BASE_DIR}/docker-compose-huayun/apollo-env.properties:/apollo-portal/config/apollo-env.properties
    ports:
      - "8070:8070"

各个环境下的apollo-configservice和apollo-adminservice中有两个参数解释一下:

EUREKA_INSTANCE_IP_ADDRESS  指定服务想eureaka注册时使用物理机器IP地址


EUREKA_INSTANCE_HOME_PAGE_URL 该参数配置当前服务的注册全路径,如果不配置,Java应用客户端无法连接apollo服务端

3.4 启动容器

将修改后的docker-compose文件夹打包,上传到centos主机的/data/docker-image目录下(你可以更改,记得更改.env中的配置的BUILD_BASE_DIR对应的值为你的目录即可),解压,如下:

进入docker-compose目录

启动容器
docker-compose up -d
观察各个服务启动的日志(我这里的日志挂在在了物理机的/data/apollo目录下),服务一开始会有报错,因为注册中心启动需要一定的时间

3.5 apollo后台多环境验证,以及后台功能验证

确认服务启动

查看日志,看到portal有如下日志,则服务都已启动

或查看注册中心注册的服务信息,地址分别是:

http://192.168.64.201:8080/
http://192.168.64.201:8081/
http://192.168.64.201:8082/
http://192.168.64.201:8083/

看到服务注册成功即可。
访问apollo后台

http://192.168.64.201:8070/

登录用户名密码:apollo/admin
登录后验证创建用户,看是不是会报错,能创建用户成功就OK了。

3.6 apollo客户端(Java应用)接入测试

新建一个springboot2的web项目,整合apollo客户端,项目结构如下:

pom.xml,加入apollo客户端依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.6.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.huayun</groupId>
    <artifactId>huayun-apollo-test</artifactId>
    <version>1.0-SNAPSHOT</version>


    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.8</version>
        </dependency>
        <dependency>
            <artifactId>apollo-client</artifactId>
            <groupId>com.ctrip.framework.apollo</groupId>
            <version>1.5.0</version>
        </dependency>
    </dependencies>


</project>

启动类App.java,加@EnableApolloConfig开启apollo

package com.huayun.apollo;

import com.ctrip.framework.apollo.spring.annotation.EnableApolloConfig;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;


@EnableApolloConfig
@SpringBootApplication
public class App {

    public static void main(String[] args) {
        SpringApplication.run(App.class,args);
    }
}
application.yml定义服务端口
server:
  port: 8001

apollo-env.properties定义apollo服务的meta信息

dev.meta=http://192.168.64.201:8080
fat.meta=http://192.168.64.201:8081
uat.meta=http://192.168.64.201:8082
pro.meta=http://192.168.64.201:8083

app.properties定义appid,与apollo服务端appId对应
app.id=huayun-apollo-test

测试controller ApolloController.java,就是简单的获取apollo中配置的aaa的值,并返回

package com.huayun.apollo.controller;

import com.ctrip.framework.apollo.Config;
import com.ctrip.framework.apollo.ConfigService;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;


@RestController
public class ApolloController {


    @GetMapping("/test")
    public Object test(){
        Config config = ConfigService.getAppConfig(); //config instance is singleton for each namespace and is never null
        String someKey = "aaa";
        int someDefaultValue = -1;
        int value = config.getIntProperty(someKey, someDefaultValue);
        return value;
    }
}

apollo服务端配置aaa在各个环境不同的值

为测试项目配置App的启动参数 -Denv=dev

分别为env配置不同的环境,测试获取到的aaa的值,aaa的值为对应的环境的值,那么就成功了。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值