摘要: 目录 1. UI 界面 2. Portal 服务 3. admin 服务 4. 总结 1. UI 界面 2. Portal 服务 当我们点击上面的发布按钮的时候,调用的当然是 portal 的接口。具体代码如下: 接口职责不多:是否符合紧急发布的数据校验,调用 Service, 发布“配置发布”事件 阅读全文
posted @ 2018-08-15 08:35 莫那-鲁道 阅读(1526) 评论(1) 推荐(0) 编辑
摘要: 目录 1. Controller 层 2. Service 层 publish 方法 3. 发送 ReleaseMessage 消息 4. 总结 1. Controller 层 主版本发布即点击主版本发布按钮: 具体接口位置: 包下 实际上灰度版本发布也是调用这个接口的。 代码: 该层主要做了 2 阅读全文
posted @ 2018-08-05 22:36 莫那-鲁道 阅读(1187) 评论(0) 推荐(0) 编辑
摘要: 源码 Apollo 长轮询的实现,是通过客户端轮询 接口实现的。具体代码在 com.ctrip.framework.apollo.configservice.controller.NotificationControllerV2.java。 这个类也是实现了 ReleaseMessageListen 阅读全文
posted @ 2018-07-31 06:12 莫那-鲁道 阅读(2385) 评论(4) 推荐(1) 编辑
摘要: 目录 1. 设计 2. 代码实现 3. 总结 1.设计 Apollo 为了减少依赖,将本来 MQ 的职责转移到了 Mysql 中。具体表现为 Mysql 中的 ReleaseMessage 表。 具体官方文档可见: "发送ReleaseMessage的实现方式" 用张图简单的来表示一下 : 有人肯定 阅读全文
posted @ 2018-07-30 06:15 莫那-鲁道 阅读(1217) 评论(0) 推荐(0) 编辑
摘要: 大纲 看本文之前,建议看看 apollo 的官方文档,特别是数据库设计文档。 1. 主流程分析 2.1 聊聊细节 2.2 loadConfig() 加载配置 2.3 auditReleases() 方法记录此次访问详情 1. 主流程分析 具体代码在 方法中。 代码如下: 代码有点长,具体细节等下慢慢 阅读全文
posted @ 2018-07-26 07:12 莫那-鲁道 阅读(5969) 评论(0) 推荐(0) 编辑
摘要: 目录: 0. 前言 1. 处理方案 2. 简单例子 前言 有的时候,你可能需要在 Spring 环境中放入一些配置,但这些配置无法写死在配置文件中,只能运行时放入。那么,这个时候该怎么办呢? Apollo 就是搞配置的,那么自然会遇到这个问题,他是如何处理的呢? 处理方案 首先要知道 Spring 阅读全文
posted @ 2018-07-09 23:52 莫那-鲁道 阅读(1007) 评论(0) 推荐(0) 编辑
摘要: 前言 之前聊了客户端的一些功能,例如融入 Spring, @value 注解的自动刷新实现,长轮询等,这次从客户端的整体设计来聊聊。 设计 上图是 client 项目的包结构。 其中,核心包就是 internals 包,包含了客户端的主要功能逻辑。主要有以下功能: 0. 获取 ConfigServi 阅读全文
posted @ 2018-07-03 22:55 莫那-鲁道 阅读(1046) 评论(1) 推荐(0) 编辑
摘要: 前言 如上图所示,Apollo portal 更新配置后,进行轮询的客户端获取更新通知,然后再调用接口获取最新配置。不仅仅只有轮询,还有定时更新(默认 5 分钟一次)。目的就是让客户端能够稳定的获取到最新的配置。 一起来看看他的设计。 核心代码 具体的类是 ,每一个 Config —— 也就是 na 阅读全文
posted @ 2018-07-02 21:47 莫那-鲁道 阅读(3509) 评论(0) 推荐(4) 编辑
摘要: 前言 Apollo 在 v0.10.0 版本后,支持自动更新。v0.10.0之前的版本在配置变化后不会重新注入,需要重启才会更新。 也就是说,如果一个属性加入了 @Value 注解,并且这个配置在配置中心也存在,那么,配置中心修改属性值后,就会自动更新这个值。同时,有个开关可以控制这个功能是否关闭( 阅读全文
posted @ 2018-06-30 17:10 莫那-鲁道 阅读(2653) 评论(1) 推荐(1) 编辑
摘要: 前言 Spring 作为 Java 世界非官方标准框架,任何一个中间件想要得到良好的发展,必须完美支持 Spring 的各种特性,即:无缝融入 Spring。 Apollo 作为分布式配置中心,服务于 Java 应用程序,Java 应用程序可以通过 Apollo 提供的 Client 获取远程配置信 阅读全文
posted @ 2018-06-30 17:09 莫那-鲁道 阅读(3242) 评论(0) 推荐(1) 编辑
摘要: 经验之谈 工作中,我们常常需要将基础架构部门的 jar 包提供给业务部门的同事使用,那么,需要将 jar 包 deploy 到 nexus 私服上,网上资料不是很多,这里说一下具体细节。 首先,是打 jar 包,maven 默认是不会将依赖的 jar 打入到新包中的,而是通过 pom 文件进行构建。 阅读全文
posted @ 2018-06-27 22:27 莫那-鲁道 阅读(1826) 评论(0) 推荐(0) 编辑
摘要: 前言 当一个对象的构造十分复杂时,我们需要将“构造过程”和他的“表示”进行分离,使得同样的构建过程可以表示不同的对象。 这个时候,需要使用 Builder 模式。用户只需指定建造者的类型就可以得到对应的产品。而具体如何构造用户并不关心。 而不同的对象的构造又是不同的,因此需要不同的建造者一一对应。 阅读全文
posted @ 2018-06-14 01:28 莫那-鲁道 阅读(237) 评论(0) 推荐(0) 编辑
摘要: 前言 熟悉 Java 并发编程的都知道,JMM(Java 内存模型) 中的 happen before(简称 hb)规则,该规则定义了 Java 多线程操作的有序性和可见性,防止了编译器重排序对程序结果的影响。 按照官方的说法: 当一个变量被多个线程读取并且至少被一个线程写入时,如果读操作和写操作没 阅读全文
posted @ 2018-06-01 23:34 莫那-鲁道 阅读(1150) 评论(0) 推荐(0) 编辑
摘要: 前言 楼主今天在面经上看到这个题,挺有意思,小小的题目对多线程的考量还挺多。大部分同学都会使用 synchronized 来实现。楼主今天带来另外两种优化实现,让你面试的时候,傲视群雄! 第一种 synchronized 我们通过使用 CAS,避免线程的上下文切换,然后呢,使用一个 volatile 阅读全文
posted @ 2018-05-26 00:55 莫那-鲁道 阅读(22405) 评论(7) 推荐(6) 编辑
摘要: 前言 让我们继续探秘 Java 热部署。在前文 "探秘 Java 热部署二(Java agent premain)" 中,我们介绍了 Java agent premain。通过在main方法之前通过类似 AOP 的方式添加 premain 方法,我们可以在类加载之前做修改字节码的操作,无论是第一次加 阅读全文
posted @ 2018-05-20 00:03 莫那-鲁道 阅读(12475) 评论(1) 推荐(0) 编辑
摘要: 楼主学习 JVM 总结的知识点,用思维脑图串起来,温故而知新,其中含有类加载器,内存布局,GC(右侧)。 最多的就是 GC 的内容了。 内容有错误之处,还请指正。 "大图地址" 阅读全文
posted @ 2018-05-20 00:03 莫那-鲁道 阅读(1420) 评论(0) 推荐(0) 编辑
摘要: 前言 在之前的 "深入浅出 JVM ClassLoader" 一文中,我们说可以通过修改默认的类加载器实现热部署,但在 Java 开发领域,热部署一直是一个难以解决的问题,目前的 Java 虚拟机只能实现方法体的修改热部署,对于整个类的结构修改,仍然需要重启虚拟机,对类重新加载才能完成更新操作。对于 阅读全文
posted @ 2018-05-20 00:02 莫那-鲁道 阅读(2228) 评论(1) 推荐(0) 编辑
摘要: 前言 在前文 "探秘 Java 热部署" 中,我们通过在死循环中重复加载 ClassLoader 和 Class 文件实现了热部署的功能,但我们也指出了缺点 不够灵活。需要手动修改文件等操作。 如果有那么一种功能,当你需要重新加载类并修改类的时候,有那么一个转换器自动帮你修改已有的 Class 文件 阅读全文
posted @ 2018-05-20 00:02 莫那-鲁道 阅读(3563) 评论(0) 推荐(1) 编辑
摘要: 前言 从前面的3篇文章中,我们分析了5个垃圾收集器,还有一些 GC 的算法,那么,在 GC 调优中,我们肯定会先判断哪里出现的问题,然后再根据出现的问题进行调优,而调优的手段就是 JVM 提供给我们的那些参数或者说选项,这些参数将会改变 GC 的运行方式。因此,他们显得极为重要。 我们将每一个垃圾收 阅读全文
posted @ 2018-05-20 00:01 莫那-鲁道 阅读(3619) 评论(0) 推荐(1) 编辑
摘要: 前言 在 JVM 综述里面,我们说,JVM 做了三件事情,Java 程序的内存管理, Java Class 二进制字节流的加载(ClassLoader),Java 程序的执行(执行引擎)。我们也说,我们大部分情况下只关注前2个。在前面的文章中,我们已经分析了内存关系相关的,包括运行时数据区,GC 相 阅读全文
posted @ 2018-05-20 00:01 莫那-鲁道 阅读(396) 评论(0) 推荐(0) 编辑