美文网首页
Apolloconfig

Apolloconfig

作者: 想成为大师的学徒小纪 | 来源:发表于2022-03-28 16:40 被阅读0次

一、Apollo简介

Apollo(阿波罗)是一款可靠的分布式配置管理中心,诞生于携程框架研发部,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性,适用于微服务配置管理场景。

服务端基于Spring Boot和Spring Cloud开发,打包后可以直接运行,不需要额外安装Tomcat等应用容器。

Java客户端不依赖任何框架,能够运行于所有Java运行时环境,同时对Spring/Spring Boot环境也有较好的支持。

.Net客户端不依赖任何框架,能够运行于所有.Net运行时环境。

二、Apollo特性

  • 统一管理不同环境、不同集群的配置

    • Apollo提供了一个统一界面集中式管理不同环境(environment)、不同集群(cluster)、不同命名空间(namespace)的配置。
    • 同一份代码部署在不同的集群,可以有不同的配置,比如zookeeper的地址等。
    • 通过命名空间(namespace)可以很方便地支持多个不同应用共享同一份配置,同时还允许应用对共享的配置进行覆盖。
  • 配置修改实时生效(热发布)

    • 用户在Apollo修改完配置并发布后,客户端能实时(1秒)接收到最新的配置,并通知到应用程序
  • 版本发布管理

    • 所有的配置发布都有版本概念,从而可以方便地支持配置的回滚
  • 灰度发布

    • 支持配置的灰度发布,比如点了发布后,只对部分应用实例生效,等观察一段时间没问题后再推给所有应用实例
  • 权限管理、发布审核、操作审计

    • 应用和配置的管理都有完善的权限管理机制,对配置的管理还分为了编辑和发布两个环节,从而减少人为的错误。
    • 所有的操作都有审计日志,可以方便地追踪问题
  • 客户端配置信息监控

    • 可以在界面上方便地看到配置在被哪些实例使用
  • 提供Java和.Net原生客户端

    • 提供了Java和.Net的原生客户端,方便应用集成
    • 支持Spring Placeholder, Annotation和Spring Boot的ConfigurationProperties,方便应用使用(需要Spring 3.1.1+)
    • 同时提供了Http接口,非Java和.Net应用也可以方便地使用
  • 提供开放平台API

    • Apollo自身提供了比较完善的统一配置管理界面,支持多环境、多数据中心配置管理、权限、流程治理等特性。不过Apollo出于通用性考虑,不会对配置的修改做过多限制,只要符合基本的格式就能保存,不会针对不同的配置值进行针对性的校验,如数据库用户名、密码,Redis服务地址等
    • 对于这类应用配置,Apollo支持应用方通过开放平台API在Apollo进行配置的修改和发布,并且具备完善的授权和权限控制
  • 部署简单

    • 配置中心作为基础服务,可用性要求非常高,这就要求Apollo对外部依赖尽可能地少
    • 目前唯一的外部依赖是MySQL,所以部署非常简单,只要安装好Java和MySQL就可以让Apollo跑起来
    • Apollo还提供了打包脚本,一键就可以生成所有需要的安装包,并且支持自定义运行时参数

三、工作流程

  1. 客户端和服务端保持了一个长连接,从而能第一时间获得配置更新的推送
  2. 客户端还会定时从Apollo配置中心服务端拉取应用的最新配置
  3. 客户端从Apollo配置中心服务端获取到应用的最新配置后,会保存在内存中
  4. 客户端会把从服务端获取到的配置在本地文件系统缓存一份
  5. 应用程序从Apollo客户端获取最新的配置、订阅配置更新通知

四、分布式部署

使用主机:

apollo-dev  10.81.0.100

apollo-fat  10.81.0.101

apollo-uat  10.81.0.102

mysql  10.81.0.103

1、传统部署

  • 运行环境依赖

    所有apollo主机执行

    • Java:1.8+
    $ yum -y install java-1.8.0-openjdk*
    

    mysql主机执行

    • MySQL:5.6.5+
    $ sh /root/scripts/mysql_install.sh
    
  • 创建数据库

    获取创建数据库sql脚本apolloportaldb.sqlapolloconfigdb.sql。(更具需求修改建库库名)

    $ mysql -u root -p -P63307 -e "source /root/apolloportaldb.sql;"
    $ mysql -u root -p -P63307 -e "source /root/apolloconfigdb.sql;"
    $ mysql -u root -p -P63307 -e "create user apollo_user@'%' identified by 'abc123456';"
    $ mysql -u root -p -P63307 -e "grant all on apolloportaldb.* to apollo_user@'%';"
    $ mysql -u root -p -P63307 -e "grant all on apolloconfigdb_dev.* to apollo_user@'%';"
    $ mysql -u root -p -P63307 -e "grant all on apolloconfigdb_fat.* to apollo_user@'%';"
    $ mysql -u root -p -P63307 -e "grant all on apolloconfigdb_uat.* to apollo_user@'%';"
    $ mysql -u root -p -P63307 -e "flush privileges;"
    
  • 安装软件包

    apollo-uat主机执行

    $ cd /usr/local/src
    $ wget https://github.com/apolloconfig/apollo/releases/download/v1.5.0/apollo-adminservice-1.5.0-github.zip
    $ wget https://github.com/apolloconfig/apollo/releases/download/v1.5.0/apollo-configservice-1.5.0-github.zip
    $ wget https://github.com/apolloconfig/apollo/releases/download/v1.5.0/apollo-portal-1.5.0-github.zip
    $ mkdir /usr/local/apollo-adminservice-1.5.0
    $ unzip -q apollo-adminservice-1.5.0-github.zip -d /usr/local/apollo-adminservice-1.5.0/
    $ mkdir /usr/local/apollo-configservice-1.5.0
    $ unzip -q apollo-configservice-1.5.0-github.zip -d /usr/local/apollo-configservice-1.5.0/
    $ mkdir /usr/local/apollo-portal-1.5.0
    $ unzip -q apollo-portal-1.5.0-github.zip -d /usr/local/apollo-portal-1.5.0/
    

    apollo-dev、apollo-fat主机执行

    $ cd /usr/local/src
    $ wget https://github.com/apolloconfig/apollo/releases/download/v1.5.0/apollo-adminservice-1.5.0-github.zip
    $ wget https://github.com/apolloconfig/apollo/releases/download/v1.5.0/apollo-configservice-1.5.0-github.zip
    $ mkdir /usr/local/apollo-adminservice-1.5.0
    $ unzip -q apollo-adminservice-1.5.0-github.zip -d /usr/local/apollo-adminservice-1.5.0/
    $ mkdir /usr/local/apollo-configservice-1.5.0
    $ unzip -q apollo-configservice-1.5.0-github.zip -d /usr/local/apollo-configservice-1.5.0/
    
  • 配置数据库连接信息

    所有apollo主机执行

    根据各主机部署的服务及对应的环境进行数据库连接配置

    $ vim /usr/local/apollo-configservice-1.5.0/config/application-github.properties
    # DataSource
    spring.datasource.url = jdbc:mysql://10.81.0.103:63307/库名_环境?useSSL=false&characterEncoding=utf8
    spring.datasource.username = apollo_user
    spring.datasource.password = abc123456
    
    $ vim /usr/local/apollo-adminservice-1.5.0/config/application-github.properties
    # DataSource
    spring.datasource.url = jdbc:mysql://10.81.0.103:63307/库名_环境?useSSL=false&characterEncoding=utf8
    spring.datasource.username = apollo_user
    spring.datasource.password = abc123456
    
    $ vim /usr/local/apollo-portal-1.5.0/config/application-github.properties
    # DataSource
    spring.datasource.url = jdbc:mysql://10.81.0.103:63307/库名_环境?useSSL=false&characterEncoding=utf8
    spring.datasource.username = apollo_user
    spring.datasource.password = abc123456
    
  • Portal添加环境列表

    • protaldb增加环境

      apollo.portal.envs配置项统一存储在ApolloPortalDB.ServerConfig表中,默认值是dev,如果portal需要管理多个环境的话,以逗号分隔即可(大小写不敏感)。也可以通过管理员工具 - 系统参数页面进行配置,无特殊说明则修改完一分钟实时生效

    • 配置apollo-portal的meta service信息

      $ vim /usr/local/apollo-portal-1.5.0/config/apollo-env.properties
      dev.meta=http://dev-apollo.testing.com
      fat.meta=http://fat-apollo.testing.com
      uat.meta=http://uat-apollo.testing.com
      
  • 修改启动参数

    • apollo-configservice

      1. 修改JVM参数,可以修改scripts/startup.sh的JAVA_OPTS部分
      2. 调整服务的日志输出路径,可以修改scripts/startup.sh和apollo-configservice.conf中的LOG_DIR
      3. 调整服务的监听端口,可以修改scripts/startup.sh中的SERVER_PORT。另外apollo-configservice同时承担meta server职责,如果要修改端口,注意要同时ApolloConfigDB.ServerConfig表中的eureka.service.url配置项以及apollo-portal和apollo-client中的使用到的meta server信息
    • apollo-adminservice

      1. 修改JVM参数,可以修改scripts/startup.sh的JAVA_OPTS部分
      2. 调整服务的日志输出路径,可以修改scripts/startup.sh和apollo-adminservice.conf中的LOG_DIR
      3. 调整服务的监听端口,可以修改scripts/startup.sh中的SERVER_PORT
    • apollo-portalservice

      1. 修改JVM参数,可以修改scripts/startup.sh的JAVA_OPTS部分
      2. 调整服务的日志输出路径,可以修改scripts/startup.sh和apollo-portal.conf中的LOG_DIR
      3. 调整服务的监听端口,可以修改scripts/startup.sh中的SERVER_PORT
  • 配置nginx反向代理

    server {
      listen 80;
      server_name dev-apollo.testing.com;
      location / {
        proxy_pass http://10.81.0.100:8080;
      }
    }
    
    server {
      listen 80;
      server_name fat-apollo.testing.com;
      location / {
        proxy_pass http://10.81.0.101:8080;
      }
    }
    
    server {
      listen 80;
      server_name uat-apollo.testing.com;
      location / {
        proxy_pass http://10.81.0.102:8080;
      }
    }
    
    server {
      listen 80;
      server_name apollo-portal.testing.com;
      location / {
        proxy_pass http://10.81.0.102:8070;
      }
    }
    
  • 启动服务

    启动顺序:configservice-->adminservice-->portal

    configservice内置了Eureka和Meta Server需要优先重启

    $ /usr/local/apollo-configservice-1.5.0/scripts/startup.sh
    $ /usr/local/apollo-adminservice-1.5.0/scripts/startup.sh
    $ /usr/local/apollo-portal-1.5.0/scripts/startup.sh
    
  • 访问web页面

    http://apollo-portal.testing.com

    apollo

2、Docker部署

提前部署好docker环境

  • 拉启apollo容器将容器目录cp到主机

    $ mkdir -p /data/docker/apollo-deploy/apollo-{config,admin,portal}
    $ cd /data/docker/apollo-deploy
    $ docker cp apollo-config:/apollo-configservice/scripts apollo-config/
    $ docker cp apollo-config:/apollo-configservice/config apollo-config/
    $ docker cp apollo-admin:/apollo-adminservice/scripts apollo-admin/
    $ docker cp apollo-admin:/apollo-adminservice/config apollo-admin/
    $ docker cp apollo-portal:/apollo-portal/scripts apollo-portal/
    $ docker cp apollo-portal:/apollo-portal/config apollo-portal/
    
  • 按照传统部署步骤修改本地配置、数据库配置及启动脚本

  • 使用docker-compose文件启动服务

    docker-compose.yml

    version: '3'
    services:
      apollo-config:
        image: 'apolloconfig/apollo-configservice:1.9.2'
        container_name: 'apollo-config'
        dns:
          - 192.168.109.104
          - 192.168.94.95
        expose:
          - 8080
        extra_hosts:
          - "dev-apollo.testing.com:192.168.87.194"
          - "uat-apollo.testing.com:192.168.87.194"
        ports:
          - "8080:8080"
        networks:
          - apollo
        volumes:
          - /opt/logs:/opt/logs
          - ./apollo-config/scripts:/apollo-configservice/scripts
          - ./apollo-config/config:/apollo-configservice/config
        environment:
          - LOG_FOLDER=/opt/logs/apolloconfig 
      apollo-admin:
        image: 'apolloconfig/apollo-adminservice:1.9.2'
        container_name: 'apollo-admin'
        depends_on:
          - apollo-config
        dns:
          - 192.168.109.104
          - 192.168.94.95
        expose:
          - 8090
        extra_hosts:
          - "dev-apollo.testing.com:192.168.87.194"
          - "uat-apollo.testing.com:192.168.87.194"
        ports:
          - "8090:8090"
        networks:
          - apollo
        volumes:
          - /opt/logs:/opt/logs
          - ./apollo-admin/scripts:/apollo-adminservice/scripts
          - ./apollo-admin/config:/apollo-adminservice/config
        environment:
          - LOG_FOLDER=/opt/logs/apolloadmin
      apollo-portal:
        image: 'apolloconfig/apollo-portal:1.9.2'
        container_name: 'apollo-portal'
        depends_on:
          - apollo-config
          - apollo-admin
        dns:
          - 192.168.109.104
          - 192.168.94.95
        expose:
          - 8070
        extra_hosts:
          - "dev-apollo.testing.com:192.168.87.194"
          - "uat-apollo.testing.com:192.168.87.194"
        ports:
          - "8070:8070"
        networks:
          - apollo
        volumes:
          - /opt/logs:/opt/logs
          - ./apollo-portal/config:/apollo-portal/config
          - ./apollo-portal/scripts:/apollo-portal/scripts
        environment:
          - LOG_FOLDER=/opt/logs/apolloportal
    networks:
      apollo:
        name: apollo
    
    $ cd /data/docker/apollo-deploy && docker-compose config     #检查compose文件是否正确
    $ docker-compose up -d
    

五、客户端使用

1、Java客户端使用

Spring Boot集成方式

  • 通过Spring Boot的配置文件配置连接Apollo信息

    #设置应用的身份信息
    app.id=YOUR-APP-ID
    #设置连接meta server地址,meta server和config service是部署在同一个JVM进程,所以meta server的地址就是config service的地址
    apollo.meta=http://config-service-url
    #设置连接集群
    apollo.cluster=SomeCluster
    #自定义缓存路径
    apollo.cacheDir=/opt/data/some-cache-dir
    #设置内存中的配置项是否保持和页面上的顺序一致
    apollo.property.order.enable=true
    #注入多个namespace
    apollo.bootstrap.enabled = true
    apollo.bootstrap.namespaces = application,FX.apollo,application.yml
    
  • 修改pom文件添加依赖

    Apollo的客户端jar包已经上传到中央仓库,应用在实际使用时只需要按照如下方式引入即可

        <dependency>
            <groupId>com.ctrip.framework.apollo</groupId>
            <artifactId>apollo-client</artifactId>
            <version>1.5.0</version>
        </dependency>
    

2、.NET客户端使用

  • DLL引用

    在Nuget上引入Com.Ctrip.Framework.Apollo.Configuration的依赖

    $ dotnet add package Com.Ctrip.Framework.Apollo --version 2.4.1
    $ dotnet add package Com.Ctrip.Framework.Apollo.Configuration --version 2.4.1
    
  • appsettings.json中添加apollo配置

    {
      "apollo": {
        "AppId": "YOUR-APP-ID",
        "Cluster": "SomeCluster",
        "Env": "UAT",
        "LocalCacheDir": "/opt/data/some-cache-dir",
        "Meta": {
          "DEV": "http://dev-apollo.testing.com",
          "FAT": "http://fat-apollo.testing.com",
          "UAT": "http://uat-apollo.testing.com"
        },
        "Namespaces": [ "some namespace", "application.json", "application" ]
      }
    }
    
  • 修改Program.cs文件

    .ConfigureAppConfiguration((hostingContext, builder) =>
    {    
        builder
      .AddApollo(builder.Build().GetSection("apollo"))
      .AddDefault()
      .AddNamespace("some namespace")
      .AddNamespace("application.json")
        .AddNamespace("application");
    })
    

相关文章

  • Apolloconfig

    一、Apollo简介 Apollo(阿波罗)是一款可靠的分布式配置管理中心,诞生于携程框架研发部,能够集中化管理应...

  • 配置中心apollo

    github地址: https://github.com/apolloconfig/apollohttps://w...

  • Apollo搭建过程

    Apollo 简介 Apollo[https://github.com/apolloconfig](阿波罗)是携程...

网友评论

      本文标题:Apolloconfig

      本文链接:https://www.haomeiwen.com/subject/hlbpjrtx.html