阿里中间件——diamond

news2024/11/15 6:57:36

一、前言

       最近工作不忙闲来无事,仔细分析了公司整个项目架构,发现用到了很多阿里巴巴集团开源的框架,今天要介绍的是中间件diamond.

二、diamond学习笔记

      1、diamond简介

      diamond是一个管理持久配置(持久配置是指配置数据会持久化到磁盘和数据库中)的系统。无可厚非,淘宝内部正在使用diamond,在淘宝内部的绝大多数系统的配置都是由diamond统一管理的。diamond最大的特点就是简单、可靠、易用。diamond的简单是指diamond整体结构非常简单,从而减少了出错的可能性;diamond的可靠是指应用方在任何情况下都可以启动,例如:淘宝的核心系统最初一年多是由diamond所管理,在这期间并没有发生什么大的故障;diamond的易用是指客户端使用只需要两行代码,暴露出的接口都非常简单,易于理解。

     对于应用系统而言,diamond为其提供获取配置的服务,应用不仅可以在启动时从diamond获取相关的配置,而且可以在运行中对配置数据的变化进行感知并获取变化后的配置数据。

      2、快速使用

      源码检出:http://code.taobao.org/svn/diamond/trunk。

      server搭建:

         a. mysql

         mysql的安装(安装步骤请自行查阅资料,本人建议按照mysql官方文档),以root用户登录,建立用户并赋予权限,建立数据库,然后建表。脚本如下:

create database diamond;  
grant all on diamond.* to CK@'%' identified by 'abc';  
  
use diamond  
create table config_info (  
  'id' bigint(64) unsigned NOT NULL auto_increment,  
  'data_id' varchar(255) NOT NULL default ' ',  
  'group_id' varchar(128) NOT NULL default ' ',  
  'content' longtext NOT NULL,  
  'md5' varchar(32) NOT NULL default ' ',  
  'gmt_create' datetime NOT NULL default '2010-05-05 00:00:00',  
  'gmt_modified' datetime NOT NULL default '2010-05-05 00:00:00',  
  PRIMARY KEY  ('id'),  
  UNIQUE KEY 'uk_config_datagroup' ('data_id','group_id')  
);  

完成后,请将数据库的配置信息(IP,用户名,密码)添加到diamond-server工程的src/resources/jdbc.properties文件中的db.url,db.user,db.password属性上面,这里建立的库名,用户名和密码,必须和jdbc.properties中对应的属性相同。

        b. tomcat

        tomcat是diamond server的运行容器,而对于tomcat的安装请自行查阅资料,推荐使用tomcat7和安装tomcat的官方文档。tomcat安装后,不需要做任何改动。

        c. diamond server

        在diamond-server源代码根目录下,执行mvn clean package -Dmaven.test.skip,成功后会在diamond-server/target目录下生成diamond-server.war(如果没有安装maven,请参考maven官方文档进行安装)。打包完成后,将diamond-server.war放在tomcat的webapps目录下。启动tomcat,即启动了diamond-server。

        d. http server

        http server用来存放diamond server等地址列表,可以选用任何http server,这里以tomcat为例。一般来讲,http server和diamond server是部署在不同机器上的,这里简单起见,将二者部署在同一个机器下的同一个tomcat的同一个应用中,注意,如果部署在不同的tomcat中,端口号一定是8080,不能修改(所以必须部署在不同的机器上)。在上一步的tomcat的webapps中的diamond-server中建立文件diamond,文件内容是diamond-server的地址列表,一行一个地址,地址为IP,例如:127.0.0.1。完成以上4步后,server端的搭建就完成了。

      发布数据:

         diamond发布数据通过手工的方式进行。在浏览器中输入http://ip:8080/diamond-server/,ip为server搭建的第二步中的地址,以user为用户名,123为密码,登录后进入后台管理界面,然后点击“配置信息管理”—— “添加配置信息”,在输入框中输入dataId、group、内容,最后点击“提交”即可。成功后,可以在“配置信息管理”中查询到发布的数据。

      订阅数据:

         diamond客户端API主要提供了订阅数据的功能:

         a. 客户端获取服务端地址
         获取服务端地址对客户端是透明的,客户端仅仅需要在本地进行如下域名绑定即可:ip a.b.c,ip为前面搭建的http-server的ip。

         b. 创建订阅者        

  1. DiamondManager manager = new DefaultDiamondManager(group, dataId, new ManagerListener() {  
  2.    public Executor getExecutor() {  
  3.        return null;  
  4.    }  
  5.   
  6.    public void receiveConfigInfo(String configInfo) {  
  7.       // 客户端处理数据的逻辑  
  8.   
  9.    }  
  10. });  

        参数说明:group和dataId为String类型,二者结合为diamond-server端保存数据的惟一key。ManagerListener 是客户端注册的数据监听器, 它的作用是在运行中接受变化的配置数据,然后回调receiveConfigInfo()方法,执行客户端处理数据的逻辑。如果要在运行中对变化的配置数据进行处理,就一定要注册ManagerListener。

        c. 获取配置数据    

  1. String configInfo = manager.getAvailableConfigureInfomation(timeout);  

        diamond-server端保存的配置全都为文本类型,返回给客户端的配置数据为java.lang.String类型,timeout为从网络获取配置数据的超时时间。客户端调用每次调用该方法,都能够保证获取一份最新的可用的配置数据。

      2、核心原理

      diamond核心原理主要包括server集群的数据同步、client获取server地址、client从server获取数据、client运行时感知server的数据变化,这四部分。

        a. server集群的数据同步

        diamond-server将数据存储在mysql和本地文件中,mysql是一个中心,diamond认为存储在mysql中的数据绝对正确,除此之外,server会将数据存储在本地文件中。

        同步数据有两种方式:

        server写数据时,先将数据写入mysql,然后写入本地文件,写入完成后发送一个HTTP请求给集群中的其他server,其他server收到请求,从mysql中dump刚刚写入的数据至本地文件。

        server启动后会启动一个定时任务,定时从mysql中dump所有数据至本地文件。

        b. client获取server地址

        diamond-client在使用时没有指定server地址的代码,地址获取对用户是透明的。server地址存储在一台具有域名的机器上的HTTP server中,我们称它为地址服务器,diamond-client使用前需要在本地进行正确的域名绑定,启动时它会根据域名绑定,去对应环境的地址服务器上获取diamond-server地址列表。获取的地址列表,会保存在client本地,当出现网络异常,无法从网络获取地址列表时,client会使用本地保存的地址列表。client启动后会启动一个定时任务,定时从HTTP server上获取地址列表并保存在本地,以保证地址是最新的。

        c. client从server获取数据

        client调用getAvailableConfigInfomation(), 即可获取一份最新的可用的配置数据,获取过程实际上是拼接http url,使用http-client调用http method的过程。为了避免短时间内大量的获取数据请求发向server,client端实现了一个带有过期时间的缓存,client将本次获取到的数据保存在缓存中,在过期时间内的所有请求,都返回缓存内的数据,不向server发出请求。

        d. client运行时感知server的数据变化

        这是diamond最为核心的一个功能。这个特性是通过比较client和server的数据的MD5值实现的。server在启动时,会将所有数据的MD5加载到内存中(MD5根据某算法得出,保证数据内容不同,MD5不同,MD5存储在mysql中),数据更新时,会更新内存中对应的MD5。client在启动并第一次获取数据后,会将数据的MD5保存在内存中,并且在启动时会启动一个定时任务,定时去server检查数据是否变化。每次检查时,client将MD5传给server,server比较传来的MD5和自身内存中的MD5是否相同,如果相同,说明数据没变,返回一个标示数据不变的字符串给client;如果不同,说明数据变了,返回变化数据的dataId和group给client.  client收到变化数据的dataId和group,再去server请求一次数据,拿回数据后回调监听器。

     3、diamond架构

     diamond服务是一个集群,是一个去除单点的协作集群。如下图所示:

     对该图进行一些说明:

     a. 作为一个配置中心,diamond的功能分为发布和订阅两部分。因为diamond存放的是持久数据,这些数据的变化频率不会很高,甚至很低,所以发布采用手工的形式,通过diamond后台管理界面发布;订阅是diamond的核心功能,订阅通过diamond-client的API进行。

     b. diamond服务端采用mysql加本地文件的形式存放配置数据。发布数据时,数据先写到mysql,再写到本地文件;订阅数据时,直接获取本地文件,不查询数据库,这样可以最大程度减少对数据库的压力。

     c. diamond服务端是一个集群,集群中的每台机器连接同一个mysql,集群之间的数据同步通过两种方式进行,一是每台server定时去mysql dump数据到本地文件,二是某一台server接收发布数据请求,在更新完mysql和本机的本地文件后,发送一个HTTP请求(通知)到集群中的其他几台server,其他server收到通知,去mysql中将刚刚更新的数据dump到本地文件。

     d. 每一台server前端都有一个nginx,用来做流量控制。

     e. 图中没有将地址服务器画出,地址服务器是一台有域名的机器,上面运行有一个HTTP server,其中有一个静态文件,存放着diamond服务器的地址列表。客户端启动时,根据自身的域名绑定,连接到地址服务器,取回diamond服务器的地址列表,从中随机选择一台diamond服务器进行连接。

     4、容灾机制

     diamond容灾机制涉及到client和server两部分,主要包括以下几个方面:

     a. server存储数据的方式

     server存储数据是“数据库 + 本地文件”的方式,集群间的数据同步我们在之前的文章中讲过(请参考专题二的原理部分),client订阅数据时,访问的是本地文件,不查询数据库,这样即使数据库出问题了,仍然不影响client的订阅。

     b. server是一个集群

     这是一个基本的容灾机制,集群中的一台server不可用了,client发现后可以自动切换到其他server上进行访问,自动切换在client内部实现。

     c. client保存snapshot

     client每次从server获取到数据后,都会将数据保存在本地文件系统,diamond称之为snapshot,即数据快照。当client下次启动发现在超时时间内所有server均不可用(可能是网络故障),它会使用snapshot中的数据快照进行启动。

     d. client校验MD5

     client每次从server获取到数据后,都会进行MD5校验(数据保存在response body,MD5保存在response header),以防止因网络故障造成的数据不完整,MD5校验不通过直接抛出异常。

     e. client与server分离

     client可以和server完全分离,单独使用,diamond定义了一个“容灾目录”的概念,client在启动时会创建这个目录,每次主动获取数据(即调用getAvailableConfigInfomation()方法),都会优先从“容灾目录”获取数据,如果client按照一个固定的规则,在“容灾目录”下配置了需要的数据,那么client直接获取到数据返回,不再通过网络从diamond-server获取数据。同样的,在每次轮询时,都会优先轮询“容灾目录”,如果发现配置还存在于其中,则不再向server发出轮询请求。 以上的情形, 会持续到“容灾目录”的配置数据被删除为止。

    根据以上的容灾机制,我们可以总结一下diamond整个系统完全不可用的条件:

    数据库不可用;

    所有server均不可用;

    client主动删除了snapshot;

    client没有备份配置数据,导致其不能配置"容灾目录";

    本人在公司的线上环境仔细分析过,同时满足这四点条件的概率那是相当小!

三、总结

    通过对diamond源码的阅读及架构的分析,可以得出这样一个结论:diamond简单、可靠、易用的特点是相辅相成的,即diamond之所以简单是因为使用的都是一些最常用的技术以及产品,它之所以表现得非常稳定,跟其架构简单是分不开的,当然,稳定的另一个主要原因是它具备一套比较完善的容灾机制。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2109064.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

倒计时7天!CCS2024大模型安全与产业应用创新研讨活动诚邀你来

当下,“人工智能”已成为催生新质生产力的重要引擎,大模型在加速产业升级和经济增长的同时,也为网络安全带来了全新的机遇与挑战。「大模型安全与产业应用创新研讨活动」由百度安全、成都无糖信息联合承办,特邀云安全联盟CSA大中华…

Windows用户取消共享文件夹密码方法(Method for Windows Users to Cancel Shared Folder Password)

Windows用户取消访问共享文件夹密码方法 💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您…

IP学习——oneday

1.什么是网络?为什么需要网络? 空间,时间;传统的邮件传输要考虑到距离,网络解决了空间距离(太远)、解决了时间问题(旧音乐等) 云:面向客户的虚拟化服务 运营商公司主营…

【运维监控】influxdb 2.0+telegraf 监控tomcat 8.5运行情况(1)

关于java应用的监控本系列有文章如下: 【运维监控】influxdb 2.0telegraf 监控tomcat 8.5运行情况 【运维监控】influxdb 2.0grafana 监控java 虚拟机以及方法耗时情况 【运维监控】Prometheusgrafana监控tomcat运行情况 【运维监控】Prometheusgrafana监控spring b…

02 Flask-快速上手

创建项目文件 从电脑选择一个盘符(来存放之后学习的项目文件) 这里选择以电脑C盘的桌面来做演示 在选择的盘符里面创建一个文件夹(来保存之后的学习文件) 使用 poetry 创建一个初始配置项(pyproject.toml) 详情参考 poetry init创建虚拟环境 poetry env use python激活虚拟…

面向可信和节能的雾计算医疗决策支持系统的优化微型机器学习与可解释人工智能

这篇论文的标题为《Optimized Tiny Machine Learning and Explainable AI for Trustable and Energy-Efficient Fog-Enabled Healthcare Decision Support System》,发表在《International Journal of Computational Intelligence Systems》2024年第17卷&#xff0c…

Gemini的AI生图消失数月终重返!Imagen 3或成谷歌“大招”,为避免Deepfake绞尽脑汁,网友:最逼真的AI人像!

谷歌Gemini的AI生图功能在漫长的沉寂后官宣重返!并推出了重大升级后的模型Imagen 3! 此前,Gemini的这项功能因为过分注重“政治正确”而被群嘲。例如生成了黑人形象的华盛顿等等,在引起广泛争议之后,这项功能随之被禁用。 现在,谷歌对其进行了升级,并准备在“未来几天…

[数据集][目标检测]电动车头盔佩戴检测数据集VOC+YOLO格式4235张5类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):4235 标注数量(xml文件个数):4235 标注数量(txt文件个数):4235 标注…

Github 2024-09-02 开源项目周报 Top13

根据Github Trendings的统计,本周(2024-09-02统计)共有13个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目3TypeScript项目3Vue项目2Rust项目2Go项目2Dart项目1Jupyter Notebook项目1Shell项目1Dockerfile项目1PHP项目1Blade项目1AI.AppFlow…

聚铭网络受邀成为ISC终端安全生态联盟首批成员单位

近日,在2024数博会这一行业盛会上,全国首个专注于终端能力的联盟——ISC终端安全生态联盟正式成立,聚铭网络受邀成为该联盟的首批成员单位之一。 ISC终端安全生态联盟由360集团发起,并联合20余家业内领先企业共同创立。联盟旨在通…

fortran安装

编写时间: 2024年9月5日10:36:40 Fortran环境配置: Visual Studio 2022 Intel oneAPI Base Toolkit Intel HPC Toolkit 演示环境: Windows 10 x64 VMware虚拟机 准备工作 下载Visual Studio 2022 下载链接: https://visual…

JAVA—单元测试

单元测试:就是针对最小的功能单元(方法),编写测试代码对其进行正确性测试 之前是使用main函数调用来进行检测,无法实现自动化测试 也会影响其他方法的测试 目录 1.junit框架概述 2.junit框架的常见注解 1.junit框架…

【软件测试专栏】自动化测试函数篇

博客主页:Duck Bro 博客主页系列专栏:软件测试专栏关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞👍收藏⭐评论✍ 自动化测试函数篇 关键词:函数、浏览器参数、常用函数…

JVM系列(十) -垃圾收集器介绍

一、摘要 在之前的几篇文章中,我们介绍了 JVM 内部布局、对象的创建过程、运行期的相关优化手段以及垃圾对象的回收算法等相关知识。 今天通过这篇文章,结合之前的知识,我们一起来了解一下 JVM 中的垃圾收集器。 二、垃圾收集器 如果说收集算法是内存回收的方法论,那么…

前端面试题——栈与队列、动态路由、链表

栈、队列与链表 Java数据结构栏目总结-CSDN博客 栈(Stack) 栈是一种后进先出(LIFO, Last In First Out)的数据结构。它只允许在栈顶进行添加(push)或删除(pop)元素的操作。 基本操…

学习笔记八:基于Jenkins+k8s+Git+DockerHub等技术链构建企业级DevOps容器云平台

基于Jenkinsk8sGitDockerHub等技术链构建企业级DevOps容器云平台 测试jenkins的CI/CD在Jenkins中安装kubernetes插件安装blueocean插件配置jenkins连接到我们存在的k8s集群配置pod-template添加自己的dockerhub凭据测试通过Jenkins部署应用发布到k8s开发环境、测试环境、生产环…

连锁美业门店如何寻找精准客户?美业SaaS拓客系统管理系统源码

连锁美业门店要寻找精准客户,可以采取多种方法结合现实因素进行推广和营销。以下是博弈美业系统给出的一些建议: 1.定位目标客户群体: 首先,门店需要确定目标客户是谁。这可能包括年龄、性别、收入水平、生活方式以及消费习惯等…

AI+RuoYi

1.RuoYi-Vue入门 采用了前后端分离的单体架构设计 1.1运行后端项目 1.Git下载 打开gitee - 点击克隆 -复制https - 打开IDEA关闭project - get vcs - 粘贴 通过idea克隆若依源码,仓库地址:RuoYi-Vue: 🎉 基于SpringBoot,Sprin…

屎记·大夏王本纪

大夏王,古遂州人氏。公元 2023 年冬,君临绵州,是为称王,国号 CW,建元 BK,意为可递万世而为君。以颈上常年绿光,自以为祥瑞,故又自号“森林”。其人方头大耳,幼时则谓富贵…

【学术会议征稿】第二届人工智能、系统与网络安全国际学术会议 (AISNS 2024)

第二届人工智能、系统与网络安全国际学术会议 (AISNS 2024) 2024 2nd International Conference on Artificial Intelligence, Systems and Network Security 由湖南工程学院主办的第二届人工智能、系统与网络安全国际学术会议 (AISNS 2024)将于2024年…