前言
好久不见了,我们来回顾一下。
在《茶艺师学微服务(准备篇)》中,我们开始对微服务架构有了大致的了解。
在《茶艺师学微服务(准备篇2)》中,我们试着深入了解微服务架构中的经常会提到的 grpc ,尝试写出 grpc 所需的 proto 文件并生成出对应的 go 、grpc 协议的代码文件。
在《茶艺师学微服务(准备篇3)》中,我们接着使用这些生成出来的代码文件,实现出一个简单的测试样例来体会一下 grpc 的通信。
有了这些准备,我们可以继续实践微服务化。
测试先行,测试驱动
假设我们手上已经有了一个准备微服务化的单体应用,那么先要做的,就是给这应用补写单元测试、集合测试。
写测试不光是注意代码覆盖率越高越好,还要注意:
- 没有覆盖到的代码会不会有 BUG ?
- 主要的业务场景有没有遗漏?(就算是代码全覆盖了,也不等于业务场景全覆盖)
在整个微服务化的过程中,我们都会写很多这样的测试。 把代码拆分了,引入微服务架构,就会为我们引入很多未知的 BUG 。
因此,"测试能确认代码在变动之前是正确的,但凡变动后运行出现 BUG 了,这能方便帮助我们定位到问题出在哪里。"
应用拆分路线
如何拆分应用,相信相关的教程网上一搜索一大把。
其中不乏"在这次微服务化,我们选择了 XX 架构,这个 XX 架构有什么特点,我们将应用拆分完微服务化,降本增效的效果显著 ..."。
也许是他们的功底深厚,对整个微服务过程十分熟悉,因此他们关注的重点是"使用什么微服务架构"。
我们是做不到"直接一个模块拆分出去成微服务",但可以走"步步为营"的路线,就像下图所示:
这样的好处是我们能有"后悔药"吃,哪里有问题了就停下来。
缺点也是很明显,就是没法验证完整流程(相比于"直接一个应用拆分出去成微服务"路线),到时遇到问题了得临时解决。
那如果说,"我就是要试试直接拆出一个模块将其微服务化"呢?
这里也是有个相对稳妥的步骤可供参考:

同时别忘记,测试,测试,测试。
模块微服务化
在这我们不妨假设已经把一个模块分拆出来,并准备补好了它对应的测试,那么我们该做的,就是把这模块微服务化。
这个过程,我自己作为茶艺师的理解,就是"上个包装":我这里一饼茶正常售卖就一个包装,但如果客人是要送人的,那我得挑个礼盒把这饼茶给好好包起来,说不定还要写给卡片什么的。在这其中,茶就是"那个模块",把这茶装礼盒了,这个过程就可比喻为"微服务化"。
(学到这里,我自己感觉,"包层东西",这操作真是编程里很常见的操作,最著名的莫过于网络协议的层层包装。)
回到这模块身上,我们要做的,就是:

涉及 grpc 相关的操作,大家可以再看看《准备篇2》《准备篇3》,就不再赘述。
在这里说两个需要注意的点:
- 模块的 proto 文件,以及对应由 grpc 工具生成的代码文件放在哪里,这也是学问。目前有三种方案,如图:

-
还记得《准备篇2》中用来生成代码的相关命令吗?又臭又长,我们可以使用 buf 工具来简化
工具下载地址:buf.build
在项目的顶层目录编写好 bef.gen.yaml 文件,接着运行命令 buf generate [proto文件存放目录]
,就可完成相关代码文件的编译了。详细内容可参考相关文档。

结语
当代码文件生成出来后,服务端的实现,客户端的实现,如果是你来,相信已经是手到擒来了。
下一篇我们就能来聊聊**带回滚方案的 client **要怎么弄了。