分布式配置中心设计实现

最近自己用go语言设计了一个简易但功能完整的分布式配置中心,项目已完整开源于:https://github.com/LeechanX/sona

下文是详细的设计介绍

Sona

Sona是一个go语言实现的高效、实时、高可用的linux分布式配置中心,轻量级支持(Golang/C++/Java/Python)主流编程语言接口

    ___  ___  _ __   __ _ 
   / __|/ _ \| '_ \ / _` |
   \__ \ (_) | | | | (_| |   
   |___/\___/|_| |_|\__,_|   

特点

sona配置中心采用了经典一中心(broker)多agent的分布式架构,基于共享内存下发、存储各节点所需配置,为业务提供KV方式访问(最新)配置

  • 高度可用:agent即使挂掉也不影响已有业务读配置,而broker以keepalived组件保证其高可用
  • 一致性:broker采用主备模式,仅主对外服务,正常情况下保证数据完全一致; 仅在主备切换时可能有短时间最新数据的延迟。总体而言实现了数据的最终一致性
  • 实时更新:正常情况下,数据实时更新到各节点;仅在主备切换时刻,可能有短时间的数据延迟
  • API简单:无配置文件概念,故业务无需关心配置文件解析; 数据实时更新对业务完全透明,业务无需编写配置更新的回调函数

USAGE

提供C/C++/Java/Python/Golang多语言支持,基于protobuf-2.6.1

go语言:

import "sona/api"

configApi, err := api.GetApi("nba.player.info") //获取nba.player.info服务的配置
if err == nil {
    defer configApi.Close()

    value := configApi.Get("lebron-james","number") //获取lebron-james.number值 (string)

    list := configApi.GetList("lebron-james","friends") //获取lebron-james.friends值列表 ([]string)
}

C++: 见目录api/cpp

#include "sona_api.h"

sona_api* api = init_api("nba.player.info"); //获取nba.player.info服务的配置
if api != NULL {
    string value = api->get("lebron-james", "number"); //获取lebron-james.number值 (string)
    vector<string> list = api->get_list("lebron-james","friends"); //获取lebron-james.friends值列表 (vector<string>)
}

Java: jar包在api/java/sona_api/lib/sona_api.jar,源码见api/java/sona_api/src

import org.sona.api.SonaApi;

SonaApi api = null;
try {
    api = new SonaApi("lebron.james.info"); //获取lebron.james.info服务的配置
} catch (Exception e) {
}

if (api != null) {
    String value = api.Get("player", "number"); //获取player.number值 (string)
    System.out.println(value);
    ArrayList<String> list = api.GetList("friends", "list"); //获取friends.list值列表 (ArrayList<string>)
    for (String item: list) {
        System.out.println(item);
    }
}

Python: python2.7、python3.6兼容的代码(如果要使用python3,请重新编译protocol/base_protocol.proto并将产生的base_protocol_pb2.py替换到api/python/sona目录下)

from sona import api

try:
    api = api.SonaApi("lebron.james.info")
except Exception as e:
    api = None
    print(e)
    
if api:
    print(api.get("player", "team")) #获取player.number值 (string)
    print(api.get_list("friends", "list")) #获取friends.list值列表 (List<string>)

原理介绍

arch

  • broker做数据中心管控,管理配置数据的增、改、订阅、下发,使用keepalived做高可用
  • agent做各节点配置代理,管理下发到各个节点的配置、业务订阅配置等
  • 共享内存是sona核心结构,agent实际在这里管理配置,业务实际也从这里读取最新配置

数据介绍 data readme

共享内存模型与agent、api mem readme

broker介绍 broker readme

猜你喜欢

转载自www.cnblogs.com/java-daixie/p/config_center.html