程序员的资源宝库

网站首页 > gitee 正文

【Distributed】分布式配置中心 分布式方案

sanyeah 2024-03-29 17:44:13 gitee 7 ℃ 0 评论

  • 一、概述
    • 1.1 什么是分布式配置中心
    • 常用分布式配置中心框架
  • 二、Apollo阿波罗
    • 2.1 Apollo特点
    • 2.2 Apollo整体架构原理
    • 2.3 Apollo Portol 环境搭建
      • Linux上
      • 创建数据库
      • 确保端口未被占用
      • 执行启动脚本
      • 使用Apollo配置中心
    • 2.4 Apollo配置中心客户端集成
      • 打入本地Maven仓库
      • Maven依赖信息
      • application.yml配置文件信息
      • 修改环境
      • 创建apollo-env配置文件信息
      • App信息
      • 项目启动
      • 监听服务器通知
    • 2.5 Apollo原理分析

一、概述

1.1 什么是分布式配置中心

  项目中配置文件比较繁杂,而且不同环境的不同配置修改相对频繁,每次发布都需要对应修改配置,如果配置出现错误,需要重新打包发布,时间成本较高,因此需要做统一的分布式注册中心,能做到自动更新配置文件信息,解决以上问题

常用分布式配置中心框架

  1. Disconf(依赖于zookpeer)
  2. Zookpeer:保证配置文件信息实时更新 (事件通知)
  3. Diamond(阿里)
  4. 阿波罗Apollo(携程的)
  5. Redis
  6. XXl-conf
    大型互联网公司自己内部都有自己独立分布式配置中心
    独立RPC、独立分布式各种解决方案
  7. 注册中心解决 rpc服务治理
  8. 分布式配置中心 解决分布式配置文件管理

二、Apollo阿波罗

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

2.1 Apollo特点

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

  1. 统一管理不同环境、不同集群的配置,所有的配置发布都有版本概念,从而可以方便的支持配置的回滚。
  2. 配置修改实时生效(热发布),用户在Apollo修改完配置并发布后,客户端能实时(1秒)接收到最新的配置,并通知到应用程序
  3. 版本发布管理,所有的配置发布都有版本概念,从而可以方便的支持配置的回滚
  4. 灰度发布,支持配置的灰度发布,比如点了发布后,只对部分应用实例生效,等观察一段时间没问题后再推给所有应用实例。
  5. 权限管理、发布审核、操作审计,应用和配置的管理都有完善的权限管理机制,对配置的管理还分为了编辑和发布两个环节,从而减少人为的错误。所有的操作都有审计日志,可以方便的追踪问题。
  6. 客户端配置信息监控,可以方便的看到配置在被哪些实例使用
  7. 提供了Java和.Net的原生客户端,方便应用集成
  8. 支持Spring Placeholder, Annotation和Spring Boot的ConfigurationProperties,方便应用使用(需要Spring 3.1.1+)
  9. 同时提供了Http接口,非Java和.Net应用也可以方便的使用
  10. 提供开放平台API

  • Apollo自身提供了比较完善的统一配置管理界面,支持多环境、多数据中心配置管理、权限、流程治理等特性。
  • 不过Apollo出于通用性考虑,对配置的修改不会做过多限制,只要符合基本的格式就能够保存。
  • 在我们的调研中发现,对于有些使用方,它们的配置可能会有比较复杂的格式,如xml, json,需要对格式做校验。
  • 还有一些使用方如DAL,不仅有特定的格式,而且对输入的值也需要进行校验后方可保存,如检查数据库、用户名和密码是否匹配。
  • 对于这类应用,Apollo支持应用方通过开放接口在Apollo进行配置的修改和发布,并且具备完善的授权和权限控制
  • 部署简单,配置中心作为基础服务,可用性要求非常高,这就要求Apollo对外部依赖尽可能地少, 目前唯一的外部依赖是MySQL,所以部署非常简单,只要安装好Java和MySQL就可以让Apollo跑起来,Apollo还提供了打包脚本,一键就可以生成所有需要的安装包,并且支持自定义运行时参数

2.2 Apollo整体架构原理

Apollo整体架构
?

2.3 Apollo Portol 环境搭建

Linux上

  1. 环境要求:首选虚拟机内存在2g 以上,一定提前安装好java1.8k环境
  2. 搭建数据库 创建表
  3. apollo-build-scripts-master 整个阿波罗环境包 使用一个命令启动整个阿波罗服务环境
  4. 创建两个数据库,分别为:apolloconfigdb(存放配置文件信息)apolloportaldb(门户网站)
  5. 建议数据库mysql在5.7以上,如果在低版本数据库执行阿波罗结构时,默认是不能支持在一个表中有两个时间戳类型字段,所以建议大家使用mysql在5.7以上。
  6. yum -y install zip unzip
  7. apollo-master 源码和依赖jar包(建议打到本地maven仓库中)

创建数据库

Apollo服务端共需要两个数据库:ApolloPortalDB和ApolloConfigDB,我们把数据库、表的创建和样例数据都分别准备了sql文件,只需要导入数据库即可。

注意:如果你本地已经创建过Apollo数据库,请注意备份数据。我们准备的sql文件会清空Apollo相关的表。

配置数据库连接信息
Apollo服务端需要知道如何连接到你前面创建的数据库,所以需要编辑demo.sh,修改ApolloPortalDB和ApolloConfigDB相关的数据库连接串信息。

注意:填入的用户需要具备对ApolloPortalDB和ApolloConfigDB数据的读写权限

#apollo config db info
apollo_config_db_url=jdbc:mysql://localhost:3306/ApolloConfigDB?characterEncoding=utf8
apollo_config_db_username=用户名
apollo_config_db_password=密码(如果没有密码,留空即可)
# apollo portal db info
apollo_portal_db_url=jdbc:mysql://localhost:3306/ApolloPortalDB?characterEncoding=utf8
apollo_portal_db_username=用户名
apollo_portal_db_password=密码(如果没有密码,留空即可)

确保端口未被占用

Quick Start脚本会在本地启动3个服务,分别使用8070, 8080, 8090端口,请确保这3个端口当前没有被使用。
例如,在Linux/Mac下,可以通过如下命令检查:

执行启动脚本

./demo.sh start
当看到如下输出后,就说明启动成功了!

使用Apollo配置中心

访问网址:打开http://localhost:8070

输入用户名apollo,密码admin后登录

2.4 Apollo配置中心客户端集成

打入本地Maven仓库

外网是没有的,需要从git下载下来已下载将apollo-master 打入到本地Maven仓库中

  1. 首先需要配置Maven的环境变量
  2. 解压apollo-master ,运行/apollo-master/scripts/ 目录下的脚本 文件build.bat 或者 build.sh(Mac或者Linux)

Maven依赖信息

<parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.0.1.RELEASE</version>
            <relativePath /> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <spring-cloud.version>Finchley.RC1</spring-cloud.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <!-- <exclusions> <exclusion> <groupId>com.fasterxml.jackson.core</groupId> 
                <artifactId>jackson-databind</artifactId> </exclusion> </exclusions> -->
        </dependency>

        <!-- apollo 携程apollo配置中心框架 -->
        <dependency>
            <groupId>com.ctrip.framework.apollo</groupId>
            <artifactId>apollo-client</artifactId>
            <version>1.0.0</version>
        </dependency>
        <dependency>
            <groupId>com.ctrip.framework.apollo</groupId>
            <artifactId>apollo-core</artifactId>
            <version>1.0.0</version>
        </dependency>


        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.3</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-resources-plugin</artifactId>
                <version>3.0.1</version>
                <executions>
                    <execution>
                        <id>copy-conf</id>
                        <phase>package</phase>
                        <goals>
                            <goal>copy-resources</goal>
                        </goals>
                        <configuration>
                            <encoding>UTF-8</encoding>
                            <outputDirectory>${project.build.directory}/ext/conf</outputDirectory>
                            <resources>
                                <resource>
                                    <directory>ext/conf</directory>
                                    <includes>
                                        <include>logback.xml</include>
                                    </includes>
                                    <filtering>true</filtering>
                                </resource>
                            </resources>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.jacoco</groupId>
                <artifactId>jacoco-maven-plugin</artifactId>
                <version>0.7.5.201505241946</version>
                <executions>
                    <execution>
                        <id>default-prepare-agent</id>
                        <goals>
                            <goal>prepare-agent</goal>
                        </goals>
                    </execution>
                    <execution>
                        <id>default-prepare-agent-integration</id>
                        <goals>
                            <goal>prepare-agent-integration</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>com.spotify</groupId>
                <artifactId>docker-maven-plugin</artifactId>
                <version>0.4.3</version>
                <configuration>
                    <imageName>hy_uav_gateway</imageName>
                    <dockerDirectory>src/main/docker</dockerDirectory>
                    <resources>
                        <resource>
                            <targetPath>/</targetPath>
                            <directory>${project.build.directory}</directory>
                            <include>${project.build.finalName}.jar</include>
                            <include>ext/conf/logback.xml</include>
                        </resource>
                    </resources>
                </configuration>
            </plugin>
        </plugins>
    </build>

    <repositories>
        <repository>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <url>https://repo.spring.io/milestone</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>

application.yml配置文件信息

server:
      port: 8001
    spring:
      application:
        name: itmayiedu_a
    eureka:
      client:
        service-url:
          defaultZone: http://192.168.212.162:8080/eureka

修改环境

修改/opt/settings/server.properties(Mac/Linux)或C:\opt\settings\server.properties(Windows)文件,设置env为DEV:
env=DEV

创建apollo-env配置文件信息

apollo-env.properties

local.meta=http://192.168.212.162:8080
    dev.meta=http://192.168.212.162:8080
    fat.meta=${fat_meta}
    uat.meta=${uat_meta}
    lpt.meta=${lpt_meta}
    pro.meta=${pro_meta}

App信息

在META-INF文件夹创建app.properties 指定appid

 app.id=appid_0064

项目启动

@Configuration
@EnableApolloConfig
@SpringBootApplication
@EnableAutoConfiguration
public class App {
    
    public static void main(String[] args) {
        SpringApplication.run(App.class, args);
    }

}

监听服务器通知

使用以下方法可以监听配置文件是否被修改

@Component
public class TestJavaConfigBean {
    
    // config change listener for namespace application
@ApolloConfigChangeListener("application")
private void anotherOnChange(ConfigChangeEvent changeEvent) {

    ConfigChange change = changeEvent.getChange("zhangsan_conf");
    System.out.println(String.format("Found change - key: %s, oldValue: %s," + "newValue: %s, changeType: %s",
            change.getPropertyName(), change.getOldValue(), change.getNewValue(), change.getChangeType()));
}

}

2.5 Apollo原理分析

[GitHub官方参考地址](https://github.com/ctripcorp/apollo/wiki/Apollo%E9%85%8D%E7%BD%AE%E4%B8%AD%E5%BF%83%E8%AE%BE%E8%AE%A1)

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表