跳到主要内容

标准例子

通过前面的章节

  • 我们知道了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个例子。

JavaKotlin描述运行方法重要性
java/jimmer-corejava/jimmer-core-ktORM无关示例,展示immer风格的不可变对象运行main方法★★★★
java/jimmer-sqljava/jimmer-sql-kt利用Jimmer快速构建REST服务。这个例子展示了大部分Jimmer的功能,是最重要的最基础的例子
  1. 运行main方法
  2. 访问swagger页面: http://localhost:8080/ui
  3. 下载客户端TypeScript代码:http://localhost:8080/ts.zip
★★★★★
java/jimmer-sql-graphqljava/jimmer-sql-graphql-kt利用Jimmer快速构建GraphQL服务
  1. 运行main方法
  2. 访问GraphiQL界面: http://localhost:8080/graphiql
★★
java/jimmer-cloudjava/jimmer-cloud-kt基于Spring Cloud的微服务项目,展示Jimmer的远程关联
  1. 启动注册中心,运行registry-center子项目的main方法
  2. 启动所有微服务,运行store-service、book-service和author-service中的main方法
  3. 等待大约半分钟,确保注册中心正确识别所有微服务,避免下个步骤中的某些swagger调用发生无法识别远程服务的异常。
  4. 访问以下任何一个微服务的swagger-ui

备注

本机启动所有项目后,如果微服务彼此通讯有故障且等待一段时间仍如此, 请访问 http://localhost:7000 打开eureka注册中心, 将其中各服务注册的机器名添加到本机hosts文件中。

java/save-commandkotlin/save-command-kt针对保存指令的专项例子运行所有单元测试★★★
提示

初次上手,最重要的例子是jimmer-sql,按照你的语言喜好,打开这两个例子中任何一个即可

非缓存模式

非缓存模式是所有例子的默认运行方式,无需安装任何外部环境,所有例子都可以直接运行。

如果某个例子依赖于数据库,非缓存模式下它会使用H2内存数据,并在启动时刻自动创建数据库。

可见,非缓存模式非常简单,非常适合快速熟悉例子。

缓存模式

上文介绍了10个附带例子,其中有4个例子可以演示Jimmer的缓存及其一致性保证。

默认情况下,它们不使用缓存,基于内嵌的内存数据库运行且自动初始化数据库,这保证了无需安装任何外部环境,单击运行按钮即可示范。

你也可以让它们用缓存模式启动,只需以spring-boot profilemaxwelldebezium运行程序即可。

这两个spring profile利用了maxwelldebezium的CDC推送让能力实现

,因此,需要安装外部环境。

提示

事实上,借助maxwelldebezium这样的CDC推送服务并非实现

的唯一途径,即使不借助于任何外部技术帮助,Jimmer也可以实现这个能力。

  • Jimmer自己捕获数据变化的功能叫Transaction触发器

  • 通过外部CDC技术把数据库的变化推送给Jimmer的功能叫BinLog触发器

请参见触发器分类

BinLog触发器既具有更好的性能,又具备更好的普适性 (即使绕过Jimmer修改数据库的API,通过其他方式修改数据库,比如直接利用SQL IDE修改数据,也可以被拦截),是推荐方案。

因此,虽然Transaction触发器可以在不依赖于任何特殊外部环境的情况下实现

, 但是,官方附带例子仍然使用BinLog触发器来同步缓存,毕竟这是更值得推荐的方式。

所以,我们需要搭建maxwell或debezium这样的CDC服务把数据库的变化推送给Jimmer。

启用缓存模式需要搭建外部环境。

  1. 首先,你需要在本机安装docker

  2. 安装外部环境

    附带例子支持两种外部环境,你可以随意选择一种方式体验

Maxwell + MySQL

虽然Maxwell只支持MySQL,但它是所有数据库变更推送技术中最简单的。因此,有示范价值。

打开命令行,进入jimmer-examples/env-with-cache/maxwell所对应的本地目录,执行

bash ./install.sh

安装完成后,docker宿主机的端口占用启用如下

容器名端口描述
maxwell-demo-zookeeper4000支撑Kafka,用户不会直接使用
maxwell-demo-kafka4100对外暴露的地址为localhost,即,假设docker宿主是你的本机。如果要使用远程服务器作为docker宿主,需自行修改install.sh中的kafka安装命令,并修改例子中的spring-boot配置文件
maxwell-demo-kafdrop4101一个Kafka图形界面工具,用浏览器访问 http://localhost:4101 即可
maxwell-demo-mysql4200此模式下的数据库服务
maxwell-demo-maxwellNA负责把MySQL的变化事件推送给Kafka的后台服务
maxwell-demo-redis4400此模式下的缓存服务

Debezium + Postgres

Debezium支持很多种数据库,具备很好的普通性,例子使用它来支持Postgres的变更推送。

信息

Postgres是一个非常优秀的开源数据库。如果你的项目是全新的,没有任何历史包袱,可以考虑尝试使用Postgres。这也是Jimmer的例子使用Debezium支持Postgres的原因。

打开命令行,进入jimmer-examples/env-with-cache/debezium所对应的本地目录,执行

bash ./install.sh

安装完成后,docker宿主机的端口占用启用如下

容器名端口描述
debezium-demo-zookeeper5000支撑Kafka,用户不会直接使用
debezium-demo-kafka5100对外暴露的地址为localhost,即,假设docker宿主是你的本机。如果要使用远程服务器作为docker宿主,需自行修改install.sh中的kafka安装命令,并修改例子中的spring-boot配置文件
debezium-demo-kafdrop5101一个Kafka图形界面工具,用浏览器访问 http://localhost:5101 即可
debezium-demo-postgres5200此模式下的数据库服务
debezium-demo-connect5300负责把Postgres的变化事件推送给Kafka的kafka-connector,可以通过http://localhost:5300/connectors来检验名为`debezium-connector`的pg-connector是否成功安装
debezium-demo-redis5400此模式下的缓存服务

注意事项

警告

如果把Maxwell + MySQLDebezium + Postgres的外部环境都安装了,有可能因内存不足导致部分容器无法启动。

以我的Mac为例,默认情况下,Mac为docker分配2GB内存,把上述容器都安装并启动,再加上几个其他与此无关的容器,导致内存不足,设置为3GB后问题解决。