说起来克拉兹克这玩意儿,刚开始我一听,就觉得头大。那时候我们公司,新接了个项目,说要做一套微服务。以前,我们都是用Java那边的东西,Spring这Spring那的,虽然也一大堆配置,但好歹用顺手了。结果这回,头儿说,为了“拥抱新技术”,要上Go,而且直接就是克拉兹克框架。
本站为89游戏官网游戏攻略分站,89游戏每日更新热门游戏,下载请前往主站地址:www.gm89.icu
我当时就懵了。Go我勉强能写点基础的,但框架这东西,一听就感觉好多条条框框。头儿还把B站的那套东西拿出来,说我们也要学着点。我一看,好家伙,光那套文档就厚厚一叠,各种什么proto,grpc,dao,biz,data,service,一堆名词就往脸上呼。我当时就想,这哪里是“拥抱新技术”,分明是“拥抱新麻烦”嘛
第一次上手,简直是灾难!
记得第一次让我去改一个旧项目,就是用克拉兹克搭的。那项目,启动都启动不起来。我照着文档,一步一步来,先是把环境配然后go mod tidy,看着好像依赖都拉下来了。结果一运行,各种报错,说什么模块找不到,方法不对。我当时就想骂娘了。好好的代码,怎么就这么折腾人?
我对着报错信息,一个个去网上搜,去克拉兹克的官方仓库里翻issue。那个时候就感觉,这东西对新人一点都不友文档里写得云里雾里,各种“你应该这么做”但没告诉你为啥要这么做。我就像个没头苍蝇,在代码里左冲右突。
有一次,为了搞明白一个配置项怎么传进去,我前前后后折腾了两天。文档上就几句话,说要通过flag传,也要通过环境变量传。我试了半天,发现怎么都不对。后来才发现,它在初始化的时候,有个默认的加载顺序,如果你没按它的来,就直接给覆盖了。当时我就对着屏幕翻白眼,心想:“你倒是早说!”
被逼无奈,硬着头皮啃!
没办法,项目在那里摆着,你总不能说不会。领导也时不时过来问进度。我只能硬着头皮去啃。我采取了一个最笨的办法:
- 先看一个能跑起来的示例项目。 官方不是有很多示例代码吗?我把那些代码都拉下来,一行一行地看,尤其是那些文件,看看它们是怎么启动的,怎么配置的。
- 从最简单的API入手。 我自己搭了个小项目,就一个最简单的API,返回一个字符串那种。然后,我再慢慢往上加东西,比如加个数据库连接,加个redis,一步步来。
- 研究它的代码生成。 克拉兹克最开始让我头疼的就是那个
proto文件和代码生成。每次改个接口,都要重新生成代码。我就去研究它那个tool目录下的脚本,看看它是怎么一步步把proto文件变成Go代码的。 - 主动问老司机。 我们团队里有个哥们儿,之前玩过Kratos。我有时候实在搞不懂了,就跑过去问他。虽然他也被我问烦了,但他几句话往往能点醒我。我发现,很多时候,不是代码多难,而是你没有Get到它的“套路”。
慢慢地,我开始有点感觉了。它那套internal、app、pkg的目录结构,虽然一开始觉得怪异,但琢磨明白了,发现还真有点道理。把业务逻辑、数据访问、外部接口啥的都分得清清楚楚。
尤其是那个proto文件,一开始觉得麻烦,后来发现,一旦你把接口定义清楚了,后面生成出来的代码,也挺规整的,不用自己手写那些臃肿的HTTP或gRPC的请求响应结构体。虽然写proto的时候要遵循一堆语法规范,但习惯了也就那样。
现在回过头来看
克拉兹克的要求难不难?我觉得,真不难。 关键是你得有一个从“陌生”到“熟悉”的过程。它之所以让人一开始觉得难,是因为它有一套自己的“哲学”或者说“套路”。这套套路,跟以前我们用Java那一套确实不太一样。
你得花时间去适应它,去了解它为什么这么设计。一旦你理解了它的基本思想,比如它的分层思想,它的proto驱动开发,它的配置管理方式,那后面很多问题,就迎刃而解了。
现在再让我写克拉兹克的项目,我虽然还是会小小地抱怨几句它的代码生成偶尔会抽风,或者文档更新不够及时,但至少我不会再像当初那样两眼一抹黑了。手头拿着一个旧项目,我大概知道哪些地方是业务逻辑,哪些是数据访问,要改哪里,怎么改。
所以说,那些觉得克拉兹克难的兄弟们,别急。跟我当初一样,慢慢来。找个能跑的例子,自己搭个最简单的,多动手,多琢磨,很快你就能摸清它的脾气了。到头来你会发现,原来它也就那样,没那么神神秘秘,也没那么不可高攀。就像老话说得事在人为嘛