kratos中集成定时任务介绍
项目地址
https://gitee.com/huoyingwhw/kratos-cron-task
碎碎念
定时任务项目是笔者从Python程序员转Golang做的第一个项目,记得当时项目没有用固定的框架,每个功能都是做的“缝合”,写法相对来说自由一些。
现在做的Golang项目用的go-kratos这个开源项目,今天介绍一下如何在go-kratos这个开源项目中集成定时任务。
方法一
执行定时任务需要一些必要的条件,比如yaml配置、初始化数据库与Redis操作的client等等,而这些在kratos项目中是biz层与data层的功能,所以我们自然而然的会想到初始化完biz与data层的资源后,将这些资源再当作定时服务的基本资源去初始化定时服务,方法一在internal/cron_task1中初始化biz与data后拿着这2个资源去初始化cron服务,最终在cmd/app/main.go中将定时任务跑起来,这样做的好处是业务代码可以写在biz与data层,符合kratos框架的编程规范。
但是问题比较严重,实际上我们是将定时服务与kratos中的grpc与http服务“分割开了”,同时初始化了2次数据库与redis资源(初始化数据与redis的代码执行了2次),这样做不够“统一”,虽然定时服务一般不会占用太多的数据库与Redis的操作资源,但是这样写项目不是很合理。
方法二
我们知道,kratos项目分层如下:App -> Server(registry等) -> Service -> biz -> data,在初始化资源的时候通过依赖注入的方式按照从右往左的顺序初始化并且先初始化的资源会当成下一级资源的“参数”。
~~~