文档章节

diamond源码分析(一)之diamond-server

winnie_tour
 winnie_tour
发布于 2014/10/15 16:47
字数 1085
阅读 374
收藏 2

1. diamond-service启动时,通过spring注解@PostConstruct 标注NotifyService的loadNodes方法来获取所有node.properties里配置的节点信息。

2. @RequestMapping(params = "method=login", method = RequestMethod.POST),通过params="method=xxx"来指定某个url访问到controller的方法,例如xxx.do?method=login是访问Controller的login方法,是通过applicationContext.xml的org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter配置实现。

3. 用户登录:在AdminService这个类初始化时候load了user.properties到properties对象中,然后通过登录时提交的用户名和密码与properties对象中的用户名和密码比较。

4. 用户管理:都是对user.properties的增删改查。

5. 添加配置信息:对应的AdminController的postConfig方法,保存顺序:数据库->更新md5cache->本地磁盘->通知其他节点更新;md5cache是用ConcurrentHashMap<String, String>存储的,key是group/dataId,value是content的md5字符串,MD5类是单例的,对数据进行md5的算法加了锁。通知其他节点更新的方式:首先获取node.properties保存的地址,然后通过http方式。调用NotifyController的notifyConfigInfo方法来保存配置信息到磁盘,值得一提是DiskService的saveToDisk方法使用了ConcurrentHashMap的putIfAbsent来进行并发写入的控制,类似于memcache的cas原子操作。

6. 更新配置信息:更新的方式同添加,区别只是入库的操作由insert->update。

7. 预览的方法是调用了一个servlet,ConfigServlet,为什么预览操作用了最传统的servlet而非springmvc的controller呢,肯定是为了效率,servlet直接由tomcat处理请求,框架还要多包一层,况且这个servlet不光后台用到,在client端同步数据的时候也用到了。预览的操作走的是doGet方法,读取的是本地config-data目录下的对应文件,ConfigServlet中有个doPost方法是client端同步数据时调用的。

8. 保存磁盘:该方法调用的就是更新配置信息时最后一步调用的通知其他节点更新的controller。

9. 删除配置信息:顺序是先根据配置信息的数据库的主键id查找ConfigInfo->删除对应的本地磁盘文件->清除对应的md5cache->删除数据库中相应数据->通知其他节点更新,同样的删除对应的本地磁盘文件时也使用了ConcurrentHashMap的putIfAbsent来进行并发写入的控制,删除文件时group这级目录是会保留的,只是删除了对应dataId的文件。

10. server端的定时任务:TimerTaskService这个类被spring容器初始化完成时会启动一个单线程的定时器,定时器的目的是每间隔一段时间将数据库中几乎所有数据从数据库中dump到磁盘。并更新md5cache,定时任务的间隔时间是从system.properties中获取的,单位为秒。在启动定时器之前会先dump一次数据。

问题来了:TimerTaskService中注解了@PreDestroy的方法什么时候执行呢? 实际上是在调用了WebApplicationContext的close方法时候,正常的close掉tomcat(运行shutdown脚本,eclipse的话点击tomcat的stop)。

通知其他节点更新操作:这个操作上次没有说清楚,实际操作是获取diamond-server事先配置的node.properties,我在本地做的实验如下,搭建两个centos虚拟机,每个服务器下部署一个tomcat,然后将主机的diamond-server的node.properties配置成如下:当有写入操作时就如之前分析会远程调用对应地址diamond-server的NotifyController的notifyConfigInfo方法来保存配置信息到磁盘,这就是通知机制的实现,至此diamond-server分析完毕!

#ip\:port=

#第一个虚拟机ip地址

10.100.17.62\:8080 

#第二个虚拟机ip地址

10.100.17.40\:8080



© 著作权归作者所有

winnie_tour
粉丝 4
博文 1
码字总数 1085
作品 0
通州
程序员
私信 提问
淘宝JAVA中间件Diamond详解(1)-简介&快速使用

淘宝JAVA中间件Diamond详解(一)---简介&快速使用 大家好,今天开始为大家带来我们通用产品团队的产品 —— diamond的专题,本次为大家介绍diamond的概况和快速使用。 一、概况 diamond是淘...

azikaxu
2014/05/29
12.5K
7
深入淘宝Diamond之客户端架构解析

说明:本文不介绍如何使用Diamond,只介绍Diamond的实现原理 一、什么是Diamond diamond是淘宝内部使用的一个管理持久配置的系统,它的特点是简单、可靠、易用,目前淘宝内部绝大多数系统的配...

colincheng
2016/04/12
0
0
分布式数据层-TDDL

注意:tddl2.0是2010年的版本,已经没有人维护了。当前版本是5.1.7,网上能够找到的最新版本。项目地址为:https://www.oschina.net/p/tddl5 淘宝根据自己的业务特点开发了TDDL(Taobao Dist...

匿名
2014/02/24
49.2K
5
super-diamond配置管理系统

super-diamond 配置管理系统提供系统参数配置管理,例如数据库的配置信息等,配置参数修改以后可以实时推送到客户端(基于netty4), 方便系统动态修改运行参数。 可以建多个项目,每个项目分为...

蔡少东
2015/08/29
2.7K
0
ceph监控管理平台calamari

更新时间:20170803 (之前网盘链接被吞了) 前言 各种搜索无果,官方文档是基于Ubuntu,没有找到一篇清晰明朗的适合新手安装的centos7文档,之前测试环境倒腾过2次均不了了之,当集群正式跑出...

linux_wei
2017/07/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

golang-字符串-地址分析

demo package mainimport "fmt"func main() {str := "map.baidu.com"fmt.Println(&str, str)str = str[0:5]fmt.Println(&str, str)str = "abc"fmt.Println(&s......

李琼涛
今天
4
0
Spring Boot WebFlux 增删改查完整实战 demo

03:WebFlux Web CRUD 实践 前言 上一篇基于功能性端点去创建一个简单服务,实现了 Hello 。这一篇用 Spring Boot WebFlux 的注解控制层技术创建一个 CRUD WebFlux 应用,让开发更方便。这里...

泥瓦匠BYSocket
今天
9
0
从0开始学FreeRTOS-(列表与列表项)-3

FreeRTOS列表&列表项的源码解读 第一次看列表与列表项的时候,感觉很像是链表,虽然我自己的链表也不太会,但是就是感觉很像。 在FreeRTOS中,列表与列表项使用得非常多,是FreeRTOS的一个数...

杰杰1号
今天
9
0
Java反射

Java 反射 反射是框架设计的灵魂(使用的前提条件:必须先得到代表的字节码的 Class,Class 类 用于表示.class 文件(字节码)) 一、反射的概述 定义:JAVA 反射机制是在运行状态中,对于任...

zzz1122334
今天
7
0
聊聊nacos的LocalConfigInfoProcessor

序 本文主要研究一下nacos的LocalConfigInfoProcessor LocalConfigInfoProcessor nacos-1.1.3/client/src/main/java/com/alibaba/nacos/client/config/impl/LocalConfigInfoProcessor.java p......

go4it
昨天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部