1.kafka源码阅读之MacBook Pro M1搭建Kafka2.7版本源码运行环境
2.scala manifeståclassmanifestçåºå«
3.Scala基础——常用数据结构
4.Scala中的码阅WrappedArray源码详解
5.idea实用系列4使用Maven构建Scala项目
6.Scala3 浅尝
kafka源码阅读之MacBook Pro M1搭建Kafka2.7版本源码运行环境
在探索Kafka源码的过程中,决定搭建本地环境进行实际运行,码阅以辅助理解和注释。码阅由于日常开发中常使用Kafka 2.7版本,码阅选择了在MacBook Pro M1笔记本上搭建此版本的码阅源码环境。搭建过程中,码阅游戏源码编程简单记录了遇到的码阅障碍,方便未来再次搭建时不必从头开始。码阅 搭建Kafka 2.7源码环境需要准备以下基础环境:一、码阅Zulu JDK1.8
在MacBook Pro M1笔记本上,码阅基本都已安装JDK,码阅版本不同而已。码阅使用的码阅是Zulu JDK1.8版本,通过下载.dmg格式的码阅一键安装,环境自动配置,码阅安装路径通常在 /Library/Java/JavaVirtualMachines。二、Scala 2..1
并未在系统里安装Scala,而是直接利用IDEA。按照Preferences -> Plugins -> Scala安装。选择IDEA的不同Scala JDK版本。三、安装Gradle6.6
通过官网gradle.org/releases/下载Gradle6.6版本。如国内下载速度较慢,可直接从百度网盘下载安装包。安装完成后,解压并放置在目录/Users/helloword/software/gradle-6.6,通过mac终端执行指令配置环境。四、指标原源码Zookeeper3.4.6安装
直接从百度网盘下载zookeeper-3.4.6.tar.gz包,解压后放置在三台机器的/app目录下。在每个目录中创建data子目录,并建立myid文件,按照特定数字填写。在zoo.cfg文件中进行配置并复制至其他机器。五、Kafka2.7源码部署
从官网下载Kafka 2.7源码,或从百度网盘获取。解压至目录/Users/helloword/software/kafka/kafka-2.7.0-src,并通过Gradle构建环境。在mac终端执行指令,生成gradle-wrapper.jar,配置依赖。将源码导入IDEA,加载Gradle构建的项目。六、源码运行
确保源码运行打印日志,需将log4j.properties复制到core的 resources目录,并在build.gradle中添加log4配置。修改config/server.properties配置,包括zookeeper路径和broker的ip。配置server、consumer、producer三个进程,确保Kafka服务、消费者和生产者能够正常工作。 整个Kafka 2.7版本源码的kfchat客服源码本地搭建步骤完成。后续计划撰写系列文章总结阅读源码的经验。关注公众号写代码的朱季谦,获取更多分类归纳的博客。scala manifeståclassmanifestçåºå«
Manifestæ¯scala2.8å¼å ¥çä¸ä¸ªç¹è´¨ï¼ç¨äºç¼è¯å¨å¨è¿è¡æ¶ä¹è½è·åæ³åç±»åçä¿¡æ¯ãå¨JVMä¸ï¼æ³ååæ°ç±»åTå¨è¿è¡æ¶æ¯è¢«âæ¦æâæçï¼ç¼è¯å¨æTå½ä½Objectæ¥å¯¹å¾ ï¼æ以Tçå ·ä½ä¿¡æ¯æ¯æ æ³å¾å°çï¼ä¸ºäºä½¿å¾å¨è¿è¡æ¶å¾å°Tçä¿¡æ¯ï¼scalaéè¦é¢å¤éè¿Manifestæ¥åå¨Tçä¿¡æ¯ï¼å¹¶ä½ä¸ºåæ°ç¨å¨æ¹æ³çè¿è¡æ¶ä¸ä¸æã
def test[T] (x:T, m:Manifest[T]) { ... }
æäºManifest[T]è¿ä¸ªè®°å½Tç±»åä¿¡æ¯çåæ°mï¼å¨è¿è¡æ¶å°±å¯ä»¥æ ¹æ®mæ¥æ´åç¡®çå¤æTäºãä½å¦ææ¯ä¸ªæ¹æ³é½è¿ä¹åï¼è®©æ¹æ³çè°ç¨è è¦é¢å¤ä¼ å ¥måæ°ï¼é常ä¸å好ï¼ä¸å¯¹æ¹æ³ç设计æ¯ä¸é伤ç¤ã好å¨scalaä¸æéå¼è½¬æ¢ãéå¼åæ°çåè½ï¼å¨è¿ä¸ªå°æ¹å¯ä»¥ç¨éå¼åæ°æ¥åè½»è°ç¨è ç麻ç¦ã
è·åclass manifestsç两ç§åºæ¬æ¹å¼:
1 def classOf[T <: Any](implicit m: scala.reflect.Manifest[T]): Class[T] = m.erasure.asInstanceOf[Class[Tï¼½
éè¿implicit m: scala.reflect.Manifest[T]声æä¸ä¸ªéå¼åæ°ï¼è¿æ ·scalaç¼è¯å¨è½å¨ç¼è¯æ¶æä¾Tçç±»åä¿¡æ¯äº
2 def classOf[T <: Any : Manifest] : Class[T] = manifest[T].erasure.asInstanceOf[Class[Tï¼½
å ¶ä¸ T <: Any : Manifestï¼æåæ两é¨åæ¥ç
T <: Any
T æ¯Anyçåç±»åï¼å³å¯ä»¥æ¯ä»»æåºæ¬ç±»åscala.AnyVal åå¼ç¨ç±»å scala.AnyRef)
T : Manifest ç¸å½äºå¯¹classOf æ¹æ³currying
éå¼å¢å åæ°å表å¦ä¸ï¼(implicit evidence$1: Manifest[T])ï¼
éè¿manifest[T] æ¹æ³å³å¯è·åManifestå®ä¾
å¯è§å½¢å¼1 åå½¢å¼2å®è´¨æ¯ä¸æ ·çã
åºç¨ï¼
1æ常è§çæ¯è·åç±»ååæ°çClassï¼å½¢å¦someMethod[Type]
å¦akkaä¸æºç ï¼ def actorOf[T <: Actor : Manifest]: ActorRef = actorOf(manifest[T].erasure.asInstanceOf[Class[_ <: Actorï¼½)
class Worker extends Actor {
def receive = {
case Work(start, nrOfElements) =>
self reply Result(calculatePiFor(start, nrOfElements)) // perform the work
}
}
å°±å¯ä»¥å¦æ¤ä½¿ç¨äºï¼ val workerActorRef = actorOf[Worker]
2 ç¼ç¨æ¹å¼å建èåæ°ç»
def evenElems[T: ClassManifest](xs: Vector[T]): Array[T] = {
val arr = new Array[T]((xs.length + 1) / 2)
for (i <- 0 until xs.length by 2)
arr(i / 2) = xs(i)
arr
}
scala> evenElems(Vector("a","b","c"))
res: Array[java.lang.String] = Array(a, c)
Scala基础——常用数据结构
“大家都在这里做什么?”“不做什么。就是等夏天结束。”
从前到现在,Scala入门指引中我们已经介绍了Scala的基本语法,以及Scala函数进阶中的一些简单函数式编程用法。
然而,仅仅了解基本语法并不足以掌握一门语言。为了熟练运用Scala,我们还需要深入了解其数据结构。
因此,本次文章将介绍Scala中常用的数据结构。
Scala中常用的数据结构包括Array、Tuple、可变和不可变的Seq、Set和Map等。以下是Scala常用数据结构的大致介绍,以及详细继承关系和实现,可参考源码。
Tuple是可以通过下标取值的固定不变的结构,通常用于函数的多个返回值。Tuple最多可以包含个元素,即Tuple。
Array是一个固定长度的集合,创建时需要指定元素的泛型集合的长度。与Java中的修复源码论坛数组类似,但具有更多的语法糖。支持在原数组的某个位置上更新元素,并在头部或末尾添加一个或多个元素。函数操作的返回值是新的数组,但原数组保持不变。
ArrayBuffer相对于Array,长度和元素都是可变的。
Seq是有序队列,不可变的List是Seq的一种实现,其长度和元素都不可变。任何更新操作都会返回一个新的List,而原List保持不变。List是基于链表的实现,数据结构更符合栈的LIFO特性,对于头部元素的插入和删除性能更好。
Queue是对List的进一步封装,具有FIFO特性。
不可变的Set是不可重复元素集合,支持集合的交集、并集和差集等运算。可变的Set则允许元素重复。
不可变的Map是一组Key不重复的键值对,当Key重复时,后面的Key对应的Value会覆盖前面的。可变的Map允许Key重复。
为了更好地了解Scala数据结构的使用,以下是一个简单的词频统计例子。给定一些句子,文章归档源码统计单词出现的频率,并按频率排序输出。
总结:Scala中常见的集合包括Tuple、Array、Seq、Set和Map等结构,其中Array、Seq、Set、Map都有对应的可变和不可变的结构。Scala对这些常见的数据结构进行了大量封装,方便我们进行数据加工。
Scala中的WrappedArray源码详解
WrappedArray是Scala中的一个类,用于表示Array[T]。它的设计旨在方便地使用Java数组,并为Scala数组添加额外方法和功能。WrappedArray实现多个特质,如AbstractSeq、IndexedSeq、ArrayLike和CustomParallelizable,使其在多种上下文中与Scala集合类型一样使用。
WrappedArray的主要用法包括获取数组长度、访问数组元素、使用foreach遍历数组、将WrappedArray转换为Array、使用zipWithIndex获取元素及其索引、使用reduce求和、使用distinct去除重复元素、使用exists判断是否存在满足条件的元素以及使用toArray方法指定类型转换。
这段代码定义了`WrappedArray`抽象类,用于表示`Array[T]`类型的包装数组。它继承了多个特质以提供序列、索引访问、数组操作和并行操作支持。重要成员包括元素类型标签、数组长度、获取和更新元素的方法、底层数组、克隆对象、构建器创建新集合等。
这段代码的伴生对象包含辅助方法和具体实现类。它提供了创建空的`WrappedArray`实例、根据给定值创建实例、为隐式转换提供支持以在构建集合时生成`WrappedArray`实例、返回构建器用于构建`IndexedSeq`类型集合等功能。此外,还有针对引用类型和其他基本数据类型的实现类,提供相应的方法和属性。
通过使用`WrappedArray`伴生对象,可以创建和操作不同类型的包装数组。利用`WrappedArray`类,可以对数组进行封装,并进行序列、数组和并行操作。
idea实用系列4使用Maven构建Scala项目
借助Maven构建Scala项目可简化整个流程,因为它倾向于使用约定而非繁杂配置。Maven通过分析pom.xml文件,使得开发者能快速理解项目的结构和配置。
要构建Scala项目,通常采用Scala Maven插件。它作为最流行的Scala项目构建工具,自动从中央仓库下载Scala和其他依赖项,无需额外安装。
在Linux(如Debian)系统中,利用apt-get命令即可轻松安装Maven。通过下载并解压Maven文件,然后配置到环境变量中,Windows和Red Hat Linux用户也能简便安装Maven。
为创建Scala项目,Maven提供了一个便于使用的archetype。运行archetype插件时,Maven会下载核心依赖。随后,用户只需提供一些基础信息,如groupId、artifactId和package,就能生成包含Scala和测试框架(JUnit、ScalaTest和Specs2)的初始项目结构。
项目创建后,会在当前目录下生成一个新文件夹,用于存放项目代码和测试文件。Maven管理依赖,确保项目运行所需的所有库都已正确下载。在编写代码之前,项目目录将包含一个pom.xml文件,明确项目依赖关系和构建目标。
项目结构包括src(存放源代码)和test(存放测试代码)文件夹,以及一个用于存放构建产物的target文件夹。在src文件夹内,进一步组织代码结构,通常包括主代码和测试代码。构建文件通过mvn package命令生成。
若需创建包含附加属性的Jar文件,添加Maven Assembly插件能实现这一目标,简化构建过程。
常用Maven命令,如mvn dependency:copy-dependencies, mvn clean, mvn package等,使得项目管理更加高效。添加依赖项时,根据项目需求在pom.xml中输入相应的Maven坐标。
其他有关Maven的深入阅读和资源可通过访问其官方文档和相关社区获得,提供全面指导与案例解析。
Scala3 浅尝
自从Scala3于年5月日正式发布以来,已经更新了多个小版本,预计很快将迎来3.2.0版本。我过去有较多的Scala2./2.使用经验,但最近没有实际项目可用,因此没有机会实际体验Scala3。最近有空闲时间,将一些库迁移到Scala3,记录一些体会。
在学习新的编程语言时,一个好的IDE支持能极大提高效率。我之前在IDEA中编写Scala2代码。目前IDEA对Scala3的支持还处于可用阶段,但还有不少不足,期待在未来的版本中得到优化。当前IDE水平对Scala3推广仍然存在阻碍,因为IDE的依赖度非常高。
在迁移过程中,发现大多数Scala2代码可以简单迁移至Scala3,甚至直接复制源代码。官方提供了良好的迁移指南。但在迁移Scala-sql和编写新wsql库时,我选择放弃Scala2兼容语法,以亲身体验Scala3的新风格。虽然Macros迁移较为困难,Scala3的Macros实现与Scala2不兼容,API概念虽相似但API完全不同。我花了大约两个周末完成第一个Macro迁移,随后速度加快,逐渐掌握了窍门,并整理了文档,准备进一步分享。
调试Macros时,善用IDE的调试器,了解各个数据结构至关重要。在IDEA中开启远程调试,可以将sbt命令执行时的宏代码调试起来。结合Macro和inline是有趣实践,Scala-sql在2.0.X版本中生成的ResultSetMapper存在开销,但在Scala3中尝试结合Macro和inline,实现了“zero-cost”的ResultSetMapper。Java框架往往忽视开销,Scala-sql生成的代码质量更优,享受编译时期静态类型检查带来的好处。
在开发新接口自动化测试平台时,考虑使用Scala DSL来提供简单易用的用户界面。Scala3的Context Function简化了DSL编写,具体案例完成后将提供演示。此外,Scala3的Null Safe特性尚在实验阶段,我对其非常感兴趣。在Java中,null和NPE是普遍的错误使用模式,Kotlin/Dart等语言拥抱了Null Safe特性。利用这个新特性,发现了一些Scala-sql中没有妥善处理null的问题,当前将其放入scala3-nullsafe分支,待稳定后合并到master分支。
2024-12-24 10:40
2024-12-24 10:36
2024-12-24 10:08
2024-12-24 09:50
2024-12-24 08:47
2024-12-24 08:44
2024-12-24 08:39
2024-12-24 08:37