阿波罗分布式配置中心

执行流程

image.png
image.png
image.png

工作原理:

发布配置原理:

image.png

各个模块和职责

image.png
  • 用户在Potral后台更新配置后,点击发布按钮,会通过AdminSercie向ReleaseMessage表新增一条数据.
  • ReleaseMessage是阿波罗自己使用数据表ReleaseMessage实现的类似消息队列机制.
  • 客户端接收到配置的修改有两种方式:
    第一:ConfigService查询ReleaseMessage表如果有新配置修改,则会主动发送一个http长连接请求给Client.
    第二:Client每5分钟向ConfigService发送一次请求,查询最新配置信息(备选)

环境搭建

基础环境要求:

jdk1.8, mysql数据库建议5.7以上版本,低于5.7版本数据库默认不支持一个表中有两个时间时间戳timestamp类型字段的.如果是虚拟机安装虚拟内存>2G;
apollo-build-scripts-master 整个阿波罗环境包,使用一个命令启动整个阿波罗环境.
appollo-master 源码和依赖包,建议打包到master本地仓库.

创建两个数据库:
apolloconfigdb 存放配置文件信息数据.
apolloportaldb 存放阿波罗管理后台信息数据
* 参考搭建文章: Apollo配置中心搭建 & SpringBoot整合Apollo客户端

  • 我将安装包解压到 /usr/local 目录下了:
    image.png
  • 进入 apollo-build-scripts-master目录下修改demo.sh脚本,修改数据库连接信息和8080,8090和8070三个服务端口, 我修改80808081后服务始终启动不起来,所以我就把本地8080端口先暂时停掉,启动apollo就ok了
  • 启动 ./demo.sh start
    image.png
  • 8080 端口是eureka注册中心端口,因为apollo依赖与eureka, 将admin Serverconfig Server两个服务注册到注册中心,访问:http://127.0.0.1:8080/,结果如下:
    image.png
  • 8070端口是apollo后台管理端口:http://127.0.0.1:8070,默认的账号是 apollo,密码: admin
  • 目前为止,阿波罗的配置中心就搭建完成了.

SpringBoot整合Apollo客户端实现从配置中心读取配置信息及配置中心更改配置后通知客户端实时更新

  • 安装apollo依赖到本地或私服, 解压缩 apollo-master.zip, 进入到脚本文件目录:
    unzip apollo-master.zip
    cd apollo-master/scripts
    ./build.sh
  • 在configCenter父目录下创建一个maven Module项目apollo-client项目;
    image.png
  • pom.xml内容如下:
      <?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>
          <artifactId>configCenter</artifactId>
          <groupId>configCenter</groupId>
          <version>1.0-SNAPSHOT</version>
          </parent>
          <modelVersion>4.0.0</modelVersion>
    
          <artifactId>apollo-client</artifactId>
          <dependencies>
          <!-- 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>
          </dependencies>
      </project>
    
  • 新建配置文件apollo-env.properties,内容如下:
    image.png
  local.meta=http://127.0.0.1:8080
  dev.meta=http://127.0.0.1:8080
  fat.meta=${fat_meta}
  uat.meta=${uat_meta}
  lpt.meta=${lpt_meta}
  pro.meta=${pro_meta}
  • 在application.yml中配置从apollo服务端读取的app.id
      app.id: appId_1001
    
  • 在apoll-client所在服务器中,修改/opt/settings/server.properties文件(没有则新建),内容如下:
        env=DEV
    
  • 项目启动文件ApolloClientApplication.java添加@EnableApolloConfig注解启动apollo客户端.
  package apolloClient;

import com.ctrip.framework.apollo.spring.annotation.EnableApolloConfig;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

@SpringBootApplication
//@EnableEurekaClient 将当前服务注册到Eureka
@EnableEurekaClient
//启用apollo客户端
@EnableApolloConfig
public class ApolloClientApplication extends SpringBootServletInitializer {
    public static void main(String[] args) {
        SpringApplication.run(ApolloClientApplication.class, args);
    }
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(ApolloClientApplication.class);
    }
}
  • 新建DemoController.java读取远程apollo服务中的配置文件信息.
package apolloClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class DemoController {
    //这里是读取配置中心里面的自定义name属性,如果没有查询到name值默认=test
    @Value("${name:test}")
    String name;

    @GetMapping("apollo")
    public String getName() {
        return name;
    }
}
  • 在apollo后台 (portal web) 中创建项目:


    image.png

    image.png
  • 阿波罗会为你的这个项目默认生成一个DEV环境,你可以通过新增配置按钮来新增配置项、通过发布按钮发布新建的配置项。
  • 阿波罗客户端启动时会读取发布状态的配置项,如果在应用运行时发布修改过的或新增的配置项,应用也会通过tcp长连接监听到并及时同步。
  • 这里新增一个配置 key=name,value=liangxifeng


    image.png
  • 然后点击发布按钮, 发布后会显示已发布状态
    image.png
  • 启动apollo-client客户端后,访问:http://127.0.0.1:8201/apollo,就可以得到apllo服务端配置文件的name值.
  • 在远程服务端可以修改name值,修改后点击发布,客户端就可以动态获取最新值.

点击查看测试代码