标准例子
通过前面的章节
-
我们知道了Jimmer最核心的三大功能点,对其有了基本印象,
-
也通过一个简单的项目了解了Jimmer的基本用法,包括其Annotation Processor*(Java)/KSP(Kotlin)*的使用方法。
然而,对于一个综合性的解决方案,有丰富的例子更好。Jimmer提供了一系列标准例子
结合附带的例子,会事半功倍,是熟悉Jimmer最高效的方法。
事先需知
由于Jimmer高度依赖Annotation Processor*(Java)/KSP(Kotlin)*,有一个问题需要注意。
当用户第一次使用IDE(比如Intellij)打开项目配套的例子时,会发现一些本该被自动生成的类不存在。
这时不要惧怕,点下运行按钮,所有错误会自动消失。
例子介绍
Jimmer提供的配套示例,对快速掌握Jimmer非常有帮助
所有例子的总目录:https://github.com/babyfish-ct/jimmer-examples
该项目提供5个例子,每个例子都有Java和Kotlin两个版本,共计10个例子。
Java | Kotlin | 描述 | 运行方法 | 重要性 |
---|---|---|---|---|
java/jimmer-core | java/jimmer-core-kt | ORM无关示例,展示immer风格的不可变对象 | 运行main方法 | ★★★★ |
java/jimmer-sql | java/jimmer-sql-kt | 利用Jimmer快速构建REST服务。这个例子展示了大部分Jimmer的功能,是最重要的最基础的例子 |
| ★★★★★ |
java/jimmer-sql-graphql | java/jimmer-sql-graphql-kt | 利用Jimmer快速构建GraphQL服务 |
| ★★ |
java/jimmer-cloud | java/jimmer-cloud-kt | 基于Spring Cloud的微服务项目,展示Jimmer的远程关联 |
备注 本机启动所有项目后,如果微服务彼此通讯有故障且等待一段时间仍如此, 请访问 http://localhost:7000 打开eureka注册中心, 将其中各服务注册的机器名添加到本机hosts文件中。 | ★ |
java/save-command | kotlin/save-command-kt | 针对保存指令的专项例子 | 运行所有单元测试 | ★★★ |
初次上手,最重要的例子是jimmer-sql
,按照你的语言喜好,打开这两个例子中任何一个即可
非缓存模式
非缓存模式是所有例子的默认运行方式,无需安装任何外部环境,所有例子都可以直接运行。
如果某个例子依赖于数据库,非缓存模式下它会使用H2内存数据,并在启动时刻自动创建数据库。
可见,非缓存模式非常简单,非常适合快速熟悉例子。
缓存模式
上文介绍了10个附带例子,其中有4个例子可以演示Jimmer的缓存及其一致性保证。
默认情况下,它们不使用缓存,基于内嵌的内存数据库运行且自动初始化数据 库,这保证了无需安装任何外部环境,单击运行按钮即可示范。
你也可以让它们用缓存模式启动,只需以spring-boot profilemaxwell
或debezium
运行程序即可。
这两个spring profile利用了maxwell或debezium的CDC推送让能力实现
,因此,需要安装外部环境。事实上,借助maxwell或debezium这样的CDC推送服务并非实现
的唯一途径,即使不借助于任何外部技术帮助,Jimmer也可以实现这个能力。-
Jimmer自己捕获数据变化的功能叫
Transaction触发器
-
通过外部CDC技术把数据库的变化推送给Jimmer的功能叫
BinLog触发器
请参见触发器分类。
BinLog触发器
既具有更好的性能,又具备更好的普适性 (即使绕过Jimmer修改数据库的API,通过其他方式修改数据库,比如直接利用SQL IDE修改数据,也可以被拦截),是推荐方案。
因此,虽然Transaction触发器
可以在不依赖于任何特殊外部环境的情况下实现
BinLog触发器
来同步缓存,毕竟这是更值得推荐的方式。所以,我们需要搭建maxwell或debezium这样的CDC服务把数据库的变化推送给Jimmer。
启用缓存模式需要搭建外部环境。
-
首先,你需要在本机安装docker
-
安装外部环境
附带例子支持两种外部环境,你可以随意选择一种方式体验
Maxwell + MySQL
虽然Maxwell只支持MySQL,但它是所有数据库变更推送技术中最简单的。因此,有示范价值。
打开命令行,进入jimmer-examples/env-with-cache/maxwell所对应的本地目录,执行
bash ./install.sh
安装完成后,docker宿主机的端口占用启用如下
容器名 | 端口 | 描述 |
---|---|---|
maxwell-demo-zookeeper | 4000 | 支撑Kafka,用户不会直接使用 |
maxwell-demo-kafka | 4100 | 对外暴露的地址为localhost,即,假设docker宿主是你的本机。如果要使用远程服务器作为docker宿主,需自行修改install.sh中的kafka安装命令,并修改例子中的spring-boot配置文件 |
maxwell-demo-kafdrop | 4101 | 一个Kafka图形界面工具,用浏览器访问 http://localhost:4101 即可 |
maxwell-demo-mysql | 4200 | 此模式下的数据库服务 |
maxwell-demo-maxwell | NA | 负责把MySQL的变化事件推送给Kafka的后台服务 |
maxwell-demo-redis | 4400 | 此模式下的缓存服务 |
Debezium + Postgres
Debezium支持很多种数据库,具备很好的普通性,例子使用它来支持Postgres的变更推送。
Postgres是一个非常优秀的开源数据库。如果你的项目是全新的,没有任何历史包袱,可以考虑尝试使用Postgres。这也是Jimmer的例子使用Debezium支持Postgres的原因。
打开命令行,进入jimmer-examples/env-with-cache/debezium所对应的本地目录,执行
bash ./install.sh
安装完成后,docker宿主机的端口占用启用如下
容器名 | 端口 | 描述 |
---|---|---|
debezium-demo-zookeeper | 5000 | 支撑Kafka,用户不会直接使用 |
debezium-demo-kafka | 5100 | 对外暴露的地址为localhost,即,假设docker宿主是你的本机。如果要使用远程服务器作为docker宿主,需自行修改install.sh中的kafka安装命令,并修改例子中的spring-boot配置文件 |
debezium-demo-kafdrop | 5101 | 一个Kafka图形界面工具,用浏览器访问 http://localhost:5101 即可 |
debezium-demo-postgres | 5200 | 此模式下的数据库服务 |
debezium-demo-connect | 5300 | 负责把Postgres的变化事件推送给Kafka的kafka-connector,可以通过http://localhost:5300/connectors来检验名为`debezium-connector`的pg-connector是否成功安装 |
debezium-demo-redis | 5400 | 此模式下的缓存服务 |
注意事项
如果把Maxwell + MySQL
和Debezium + Postgres
的外部环境都安装了,有可能因内存不足导致部分容器无法启动。
以我的Mac为例,默认情况下,Mac为docker分配2GB内存,把上述容器都安装并启动,再加上几个其他与此无关的容器,导致内存不足 ,设置为3GB后问题解决。