Apollo系列入门

Apollo配置中心总体设计

What is Apollo

Apollo是携程开发的一款注册中心,主要用于参数配置,各种开关,服务器地址等等。具有热发布,灰度发布,分环境、分集群管理配置,完善的权限、审核机制……
如图:是Apollo portal(管理界面)
Apollo管理界面
从图中可看出,Apollo的一个应用(Appid)分集群(Cluster),namespace(理解为一个配置文件,存储着各种配置值)

Apollo设计模型

如图:这是Apollo最简单的模型图
Apollo模型图
上图屏蔽了Apollo服务端的信息
Apollo完整模型图
Portal是Apollo的管理界面,通过metaServer,从Eureka中查找AdminService地址,然后修改DB数据
ConfigService负责查找配置信息,AdminService负责修改配置信息。

Apollo重要概念

1.namespace

namespace理解为一个配置文件,相当于SpringBoot中的properties文件,里面存储着各种配置。

2.cluster

每个应用可以分属于不同集群,集群可以按照

3.appid

appid代表着一个应用,如编写的每一个服务,又如图一的SampleDemo即为一个appid。

4.meta.server

  1. Portal通过域名访问Meta Server获取Admin Service服务列表(IP+Port)
  2. Client通过域名访问Meta Server获取Config Service服务列表(IP+Port)
  3. Meta Server从Eureka获取Config Service和Admin Service的服务信息,相当于是一个Eureka Client
  4. 增设一个Meta Server的角色主要是为了封装服务发现的细节,对Portal和Client而言,永远通过一个Http接口获取Admin Service和Config Service的服务信息,而不需要关心背后实际的服务注册和发现组件
  5. Meta Server只是一个逻辑角色,在部署时和Config Service是在一个JVM进程中的,所以IP、端口和Config Service一致

5.configService

  1. 提供配置获取接口
  2. 提供配置更新推送接口(基于Http long polling)
  3. 服务端使用Spring DeferredResult实现异步化,从而大大增加长连接数量
  4. 目前使用的tomcat embed默认配置是最多10000个连接(可以调整),使用了4C8G的虚拟机实测可以支撑10000个连接,所以满足需求(一个应用实例只会发起一个长连接)。
  5. 接口服务对象为Apollo客户端

6.Admin Service

  1. 提供配置管理接口
  2. 提供配置修改、发布等接口
  3. 接口服务对象为Portal

7.Portal

提供Web界面供用户管理配置
通过Meta Server获取Admin Service服务列表(IP+Port),通过IP+Port访问服务
在Portal侧做load balance、错误重试

Apollo实战

Quick Start

1.下载JDK1.8+

2.部署Mysql

3.下载QuickStart示例代码

示例代码:百度网盘地址:提取码9wwe

4.创建表

执行apolloconfigdb.sql,apolloportaldb.sql即可创建ApolloPortalDB,创建ApolloConfigDB

5.启动配置中心

利用下载的代码,运行./demo.sh start 即可启动配置中心,输入localhost:8070打开Portal

6.编写Idea源码

@EnableApolloConfig
@Configuration
public class AppConfig {
    @Bean
    public TestJavaConfigBean javaConfigBean() {
        return new TestJavaConfigBean();
    }

}

public class TestJavaConfigBean {
    @Value("${timeout:100}")
    private int timeout;
    private int batch;

    @Value("${batch:200}")
    public void setBatch(int batch) {
        this.batch = batch;
    }

    public int getTimeout() {
        return timeout;
    }

    public int getBatch() {
        return batch;
    }
}

public class ApolloUtil {

    public void getAndListenChange() {

        Config config = ConfigService.getAppConfig();
        config.addChangeListener(
                new ConfigChangeListener() {
                    @Override
                    public void onChange(ConfigChangeEvent changeEvent) {
                        for (String key : changeEvent.changedKeys()) {
                            ConfigChange change = changeEvent.getChange(key);
                            System.out.println(String.format(
                                    "Found change - key: %s, oldValue: %s, newValue: %s, changeType: %s",
                                    change.getPropertyName(), change.getOldValue(),
                                    change.getNewValue(), change.getChangeType()));
                        }
                    }
                }
        );
    }
}

@RestController
public class TestController {

    @Autowired
    private TestJavaConfigBean testJavaConfigBean;

    @RequestMapping("get")
    public String get() {
        int batch = testJavaConfigBean.getBatch();
        int timeout = testJavaConfigBean.getTimeout();
        Config config = ConfigService.getAppConfig();
//        Config config2 = ConfigService.getConfig("");
        config.addChangeListener(new ConfigChangeListener() {
            @Override
            public void onChange(ConfigChangeEvent changeEvent) {
                System.out.println
                        ("namespace变更:" + changeEvent.getNamespace() + "变更值:" + "set:" + changeEvent.changedKeys().toString());
            }
        });
        Integer defaultRequestTimeout = 200;
        Integer requestTimeout = config.getIntProperty("requestTimeout", defaultRequestTimeout);
        return "batch:" + batch + ", timeout:" + timeout + "requestTimeout:" + requestTimeout;
    }

}

ApolloUtill的设计

主要用于Apollo meta.server(实际就是ConfigServer的地址)的配置,Config的初始化,以及getProperty()方法的编写。

其它知识

OpenApi,分布式配置,metaserver路由选择。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值