读 Kafka 源码写优雅业务代码:配置类
这个 Kafka 的专题,我会从系统整体架构,设计到代码落地。和大家一起杠源码,学技巧,涨知识。希望大家持续关注一起见证成长!
我相信:技术的道路,十年如一日!十年磨一剑!
往期文章
Kafka 探险 - Kafka 探险 - 生产者源码分析: 核心组件
前言
首先还是看一眼 Kafka 生产者中的方法,核心分为三类:构造器,消息发送,其他。

我们今天要探讨的是在构造器中初始化配置时用到的配置类,看起来是构造方法中一个不起眼的参数,但是代码中暗藏了很多技巧。而这些技巧应用于平时的开发,也能让我们在写业务代码的时享受到写底层中间件的感觉,让代码看起来简洁,健壮,易扩展,有层次。

四个构造方法,其余三个构造器最终都调用到 :KafkaProducer(ProducerConfig, Serializer<K>, Serializer<V>)
第一个参数是 生产者配置类,他继承了 AbstractConfig , 这个配置类中大部分内容为 : 配置项的 key 和 配置项代表的含义 doc ,例如

但是还有一个非常重要的字段: ConfigDef CONFIG , ConfigDef 这个类定义了一份配置的元数据,并且提供了: 继承,分组,存储的能力。分别对应 ConfigDef 的以下三个字段:

配置定义
配置存储
配置存储即通过 ConfigKey 来完成,他定义了配置的元数据,包括 数据类型,key,分组,优先级,校验器。通过一个抽象的 Validator 接口实现添加配置时的校验逻辑

为每个字段设置校验器,各个字段校验器有各自的实现类,这一点可以借鉴下,对于字段的校验 自定义校验器,将校验逻辑集中封装,而不是散落在代码的各个位置

配置继承
配置的继承实现非常简单,直接传递一个配置类,将里面存储的配置和分组拷贝过来

配置分组
一方面通过 ConfigKey 中定义的 group 字段,另外在定义配置项的时候将 key 与 group 的关系存放到 Map 中。

配置操作
看完了配置元数据的定义后,继续回到构造方法 KafkaProducer(ProducerConfig, Serializer<K>, Serializer<V>) ,可以看到需要传递一个 ProducerConfig ,他其实就是Kafka 的配置类,而这个配置类恰巧就对应了 producer.properties 这个配置文件。看到这里是不是发现这与 Spring 中的 JavaConfig 同 Xml 有异曲同工之妙?事实正是如此大多数框架都会有一套配置文件与 Java 类的映射关系,方便默认配置加载,或者配置的动态加载,网络加载等等...
生产者的配置类为 ProducerConfig 消费者为 ConsumerConfig 他们都继承了 AbstractConfig 从下面的图看一看到,Kafka 中所有的配置都是由这个基类来驱动的。

我们需要关注的方法主要为: 构造器、取配置值、其他

构造方法

整体代码相对比较简单,将传入的原始 Map 配置解析到当前类的 values 成员变量中,此时 values 也是一个 Map ,只不过他的 value 不是简单的字符串了而是解析后的对象类型。
这里需要注意的一点在于他的 postProcessParsedConfig() 方法,这个方法在当前类是一个空实现,具体的实现是在子类实现的。在有类的继承关系的时候某些通用的前置后置操作,但是这些操作根据不同的子类需要不同的实现的时候我们经常会这么处理,这种方法也叫做模板方法或者称作 模板设计模式 。

取值方法
这些方法比较简单,但是非常有必要。我经常在很多项目里面看到这样的代码

我相信大家都不陌生,在很多工程中都会见到这样的代码,某个类中定义了一个 Map 或者一个 JSONObject 但是并没有封装对应值的方法,而是在使用到的时候直接 get 一个字符串,然后类型强转。
这样的代码显然是低质量的代码,缺点很明显我们并不知道这个 Map 都会有哪些 key,每次取数据的时候只能使用魔法字符串。另外取出来的值有可能是空,直接强壮很有可能 NPE 。需要做判空操作,强制类型转换,这些非常常用的基础代码会散落在项目的各个文件中。
一般来说我们最好直接定义类,少定义 Map 或者 JSON 。那么万一使用了我们又该如何让他变得 易懂,易维护,易使用呢?
首先针对使用魔法值 get 的问题,我们需要针对这个 Map 定义一个常量,定义 Map 中所有会存储和取出的 Key 每次如果需要往这个 Map 中写入新的 Key 需要修改下这个常量类。
而对于每次根据 key 取数据,并强转的问题我们可以定义一些基础方法,例如 getIntExtVal() getLongExtVal() 等等一系列的方法,将判空和强转一并解决了甚至还可以配置默认值。简化下大概长下面这样,是不是代码瞬间清晰了很多,调用起来也变得方便了。

尾声(唠叨)
过完春节的第一个周末,终于也是写完这篇文章了。只是好久没有锻炼身体了,上周打完羽毛球胳膊简直废了,后面要好好运动!
另外:大家也可以关注下我的微信公众号哦~【 徐笔笔 】
读 Kafka 源码写优雅业务代码:配置类的更多相关文章
- Spring5源码解析2-register方法注册配置类
接上回已经讲完了this()方法,现在来看register(annotatedClasses);方法. // new AnnotationConfigApplicationContext(AppCon ...
- 【Kafka源码】Kafka代码模块
Kafka源码依赖于Scala环境,首先需要安装scala,这块请自行百度进行安装. 传送门 当然,我们要分析源码,需要下载源码,请自行从github上面下载. 说明:本文使用的kafka版本为0.1 ...
- Kafka源码分析(二) - 生产者
系列文章目录 https://zhuanlan.zhihu.com/p/367683572 目录 系列文章目录 一. 使用方式 step 1: 设置必要参数 step 2: 创建KafkaProduc ...
- kafka源码分析之一server启动分析
0. 关键概念 关键概念 Concepts Function Topic 用于划分Message的逻辑概念,一个Topic可以分布在多个Broker上. Partition 是Kafka中横向扩展和一 ...
- 读 Zepto 源码系列
虽然最近工作中没有怎么用 zepto ,但是据说 zepto 的源码比较简单,而且网上的资料也比较多,所以我就挑了 zepto 下手,希望能为以后阅读其他框架的源码打下基础吧. 源码版本 本文阅读的源 ...
- Kafka源码分析(三) - Server端 - 消息存储
系列文章目录 https://zhuanlan.zhihu.com/p/367683572 目录 系列文章目录 一. 业务模型 1.1 概念梳理 1.2 文件分析 1.2.1 数据目录 1.2.2 . ...
- 开始读 Go 源码了
原文链接: 开始读 Go 源码了 学完 Go 的基础知识已经有一段时间了,那么接下来应该学什么呢?有几个方向可以考虑,比如说 Web 开发,网络编程等. 在下一阶段的学习之前,写了一个开源项目|Go ...
- 【读fastclick源码有感】彻底解决tap“点透”,提升移动端点击响应速度
申明!!!最后发现判断有误,各位读读就好,正在研究中.....尼玛水太深了 前言 近期使用tap事件为老夫带来了这样那样的问题,其中一个问题是解决了点透还需要将原来一个个click变为tap,这样的话 ...
- 读jQuery源码 - Deferred
Deferred首次出现在jQuery 1.5中,在jQuery 1.8之后被改写,它的出现抹平了javascript中的大量回调产生的金字塔,提供了异步编程的能力,它主要服役于jQuery.ajax ...
随机推荐
- 2.了解nginx常用的配置
作者 微信:tangy8080 电子邮箱:914661180@qq.com 更新时间:2019-07-10 20:56:10 星期三 欢迎您订阅和分享我的订阅号,订阅号内会不定期分享一些我自己学习过程 ...
- JavaScript 词法 All In One
JavaScript 词法 All In One JavaScript 词法 这部分描述了JavaScript 的词法(lexical grammar). ECMAScript 源码文本会被从左到右扫 ...
- SSH Keys vs GPG Keys
SSH Keys vs GPG Keys SSH Keys SSH keys allow you to establish a secure connection between your compu ...
- 使用 HTML5 & CSS 实现一个自定义开关按钮 switch button
使用 HTML5 & CSS 实现一个自定义开关按钮 switch button switch button <div class="switch"> < ...
- CVS、SVN、Git、GitHub :版本控制系统
1 1 1 Git常用命令 1 1 1 1 1 1 https://www.codecademy.com/learn/learn-git Learn Git You have now been int ...
- 2020 Web 全栈面经
2020 Web 全栈面经 1.简历 2. 技术 3. 项目 4. 架构 5. 沟通,协作 6.成长 7. 面试技巧 准备 电话确认,面试流程,五险一金缴纳情况 有无笔试,几轮,面试时间,答复时间 细 ...
- Contributor License Agreement
Contributor License Agreement CLA https://cla.js.foundation/lodash/lodash?pullRequest=4756 https://g ...
- jsbridge 原理 & 通信原理
jsbridge 原理 & 通信原理 Hybrid 方案是基于 WebView 的,JavaScript 执行在 WebView 的 Webkit 引擎中; 因此,Hybrid 方案中 JSB ...
- web performance optimise & css
web performance optimise & css 俄罗斯套娃 clients hints https://cloudinary.com/blog/automatic_respons ...
- 12月15日BGV币行情分析
今日,DeFi市场格外精彩.各主流概念币种走势出现了涨跌各半的两极态势.笔者认为,由于并没有总体可以利好DeFi市场的基本面因素,所以各DeFi概念币种的涨跌态势,还是与各自的基本面和技术面走势相关. ...