一路走来,多么奇妙的一段旅程啊!完成这些文章花了好几个月的时间。第一篇文章发布于 2017 年底,现在 2018 年已经过去快一半了,我才刚刚在写本系列最后一篇文章。
写这一系列文章花费了我不少时间和精力。对我来说这是一个令人生畏的任务,首先是因为我对各部分知识只是有个大概的了解,其实,写这些文章的部分初衷也是想提高我对相关知识的理解,同时也想得到社区的反馈,没有比得到社区的认可更棒的事情了。在写作过程中,我学到了很多,和很多又酷又聪明的人进行了讨论,他们给了我很大帮助。其次,这一系列文章涉及的范围很广,涵盖了实现微服务的各个阶段以及如何部署,其中用到了许多不同的技术,比如数据库、服用提供者、最佳实践等等,这是我所做的工作中最困难的一个。
不过除了这些,我也学到了比想象中多得多的东西,我很高兴许多人给我发邮件,这几个月里我一共收到了超过 50 封,有的是问我下一篇什么时候发布的,有的是感谢我的,有的是鼓励我的,这对我完成这一系列文章真的很有帮助。所以我要感谢发邮件给我的人,同时我也很抱歉有些邮件我回复的不是太及时。
我要感谢 Asim,他经常要花时间回答我的一些关于微服务的简单问题,作为回报,我把这一系列文章提供给了微服务的官方组织,他们把这些文章放在了 examples/tutorials 目录,希望能够对新接触微服务的人有一些帮助。
我要感谢 Ke Ding,他把这一系列文章翻译成了中文,不管你知道还是不知道,在中国 Go 社区的规模是非常大的,而且还在增长,所以我非常感谢他做出的贡献。
如果你正在用非母语阅读这篇文章,并且想翻译成你的母语,就发邮件给我,我会把翻译后的文章链接放到原文里。我之前收到了一封邮件,说是想要把这些文章翻译成俄文,但可惜的是我找不到那封邮件了,所以如果你正在阅读这篇文章,请再给我发封邮件,翻译成俄文是一件很酷的事情。
## 我学到的东西和不足的地方
我不仅学到了文章里涉及到的许多技术知识,也学会了写文章的一些技巧。我学到的最大的东西就是:保持简单,不要在一篇文章里涉及太多东西。这对读者和作者都有许多好处。在写这些文章期间,有好多次,我感觉自己同一时间在处理太多的事情。我创建了好几个微服务,当我不小心在一个微服务中犯了一些错误时,我就不得不去更改其它几个微服务的代码。对我来说,这是一个非常繁琐的事情,对读者来说可能也是这样。
我遇到的最大的问题是没能找到一个合适的方法把几个微服务放到一个项目中。社区给了我一些好的建议,但是我觉得要实现这些想法得花费好多时间,所以在写到一半时我不得不把项目拆分成了好几个子项目,我觉得这个决定让我失去了不少读者,这是我在写这一系列文章中觉得不太满意的。这样做很明显是忽略了读者的感受,从一些层面上,我想再一次说明:要是重写的话我要么把第一篇文章写的微服务做为一个单独的项目,要么找到为一个合适的方法,把所有微服务放到一个项目中。
我也弄丢了之前各个部分的代码分支,也就是说目前不能检出之前的代码来查看代码演化过程。我发现在使用 Go 的 Vendor 机制时,不知道 什么时候就会产生很多分支,这让维护起来非常困难。但丢失了这些宝贵的分支仍然让我十分烦恼。
另一个问题是:随着我理解的加深,我不得不回过头来,根据我新的理解,对先前的代码进行修改,有时候改得就像完全是一篇新的文章一样。幸运的是,社区的人通过邮件指出了文章中的一些问题,所以如果你发现了一些前后矛盾的地方,请让我知道。
最后一个问题是:我感觉一些文章写得不太深入。篇幅比较短,只涵盖了最基本的内容。这是因为涉及的技术太多,如果对每一个技术都写的很细,我怕永远也完不成这一系列文章了。但是如果你想知道任何技术的更加详细的内容,请发邮件给我或者在 [Patreon](https://www.patreon.com/ewanvalentine) 上关注我,如果有这方面需求的人很多,我一定会写文章做深入的解释。
## 他们是怎么做的?
通过谷歌的分析,这些文章有超过 50,000 阅读量,我对这个数据感觉很高兴。你可能注意到的在文章中有一些广告,但是他们产生的收益其实不太多,还不够支付我因为忘记关掉谷歌云上运行的集群的费用。但这不是问题,我并不是为了钱而写这些文章的,这些广告收入只是些很好的奖励。你可能还注意到了我在每篇文章开始和结束加的 Patreon,我最近得到了一个人的赞助,我非常感谢他。如果你觉得这些文章对你有价值,也希望你能提供一些赞助,这可以让我花更多时间来写这些文章。
## 关于微服务最后的想法
尽管我发现微服务有很多好处,我也对只是因为这是一个好注意就全盘拿来用的做法抱谨慎的态度。对于每件事情,都需要时间和空间。我们最终完成的这个应用,是从一个未经雕琢的原始应用,经过这一系列文章中描述的技术和模式的打磨下,最后变成了几个有用的微服务。
我写这一系列文章的部分原因就是来分享我在把一个大的应用拆分成几个微服务的过程中学到的东西,并且通过社区的反馈来更深入的理解微服务,同时也验证我方法的正确性。
我们把微服务优化的太多了吗?非常有可能,我们原来的应用工作得很好,程序代码经过了许多修改完善,里面包含了许多从来也不会再用的代码,或者是公司之前迭代的产物,由于兼容性的问题保留了下来。我想说的是:现在这个程序很杂,比较难于维护。我们写的微服务的例子只是一个试验产品,我们正在考虑实现一些商业案例,但我们真的不确定是不是要扩展这个示例产品。
我感觉我在我们的应用上添加了越来越多的东西,但是只有少数得到了应用,使应用变得非常难以维护。也许采用微服务还不太成熟,但是我感觉微服务技术可以让我们构建更好的原型,去测试一些功能,如果不合适,可以丢掉不用,这样很灵活。所以尽管采用这种新的模式可能要花费很多的精力,但是这样做可以带给我们尝试新想法的灵活性,写出的代码也更加清晰,更加易于维护。我甚至发现我们更加擅长写测试了,比什么东西都在一个项目里会简单一些。做为一个简单的示例程序采用微服务可能有点早,但是我很高兴最后我们还是采用了这种方式。
许多人会告诉你,如果你正要开始开发一个项目,应该尽量不要使用微服务,因为在微服务中添加功能会花费特别多的时间。但我认为这只说对了一部分,最好是让事情在开始的时候是正确的,这样你就有了一个好的构建的基础,而且我认为在微服务中添加功能也不是太难。更确切的说应该是从头创建一个微服务会花许多时间的精力。如果争论点在这的话,我百分百赞同这个观点。但是我认为现在工具和概念正变得更简单也更易理解,创建和维护微服务不会花特别多时间和精力。
目前,大多数云服务提供商都集成了 Kubernetes ,信息全在那里,在应用本系列文章中的方法时不会遇到太多问题。 AWS 甚至提供了像 Pargate 这样的工具帮助我们处理大部分困难的工作。
不要犹豫,如果你的程序中有多个特性,一定要考虑一下是否可以采用微服务。不要因为许多人说不可以就被吓到,现在来说使用微服务没有什么难的。但话又说回来了,如果你对现有的程序还比较满意,也不要对非要采用一种新的方法感觉有很大的压力。
基本原则是:如果还能用,就不要去修改它!
## 接下来是什么
首先,我要整理还没有处理的反馈信息,改进之前的一些文章,我不会因为已经写完了就忘这个事情,我会时常回头来看看它们,如果我对哪一部分技术有了更加深入的理解,我就会更新相关的文章。
完成了这些文章,我感觉非常好,所以我想乘着这股劲儿,马上开始写新的系列文章。我已经想了好几个月应该写什么内容,最后决定还是写 serverless 的相关内容。当然还是用 Golang。但这一次是在 AWS lambda 平台上,我也会集中精力来创建一个完整的产品,而不只是一些代码示例。
我会用 AWS serverless 技术创建一个不是太实用,但是有很多功能的示例程序
除了这些,我也正在考虑把这些文章从我的个人博客移到一些更加专业的 Go 学习网站上。不过实现起来可能有点困难,因为它可能需要自己的品牌和市场,但这只是我在考虑的事情。总之,随时欢迎大家对这些想法的反馈。
再一次感谢大家对我的支持和反馈:)
## 最终的文章列表
- [Getting started, gRPC](https://ewanvalentine.io/microservices-in-golang-part-1) [《GCTT 中译文》](https://studygolang.com/articles/12060)
- [Docker and micro](https://ewanvalentine.io/microservices-in-golang-part-2) [《GCTT 中译文》](https://studygolang.com/articles/12094)
- [Docker compose and datastores](https://ewanvalentine.io/microservices-in-golang-part-3) [《GCTT 中译文》](https://studygolang.com/articles/12452)
- [Authentication and JWT](https://ewanvalentine.io/microservices-in-golang-part-4) [《GCTT 中译文》](https://studygolang.com/articles/12485)
- [Event brokering](https://ewanvalentine.io/microservices-in-golang-part-5) [《GCTT 中译文》](https://studygolang.com/articles/12488)
- [Web Clients](https://ewanvalentine.io/microservices-in-golang-part-6) [《GCTT 中译文》](https://studygolang.com/articles/12798)
- [Terraform](https://ewanvalentine.io/microservices-in-golang-part-7) [《GCTT 中译文》](https://studygolang.com/articles/12799)
- [Kubernetes](https://ewanvalentine.io/microservices-in-golang-part-8) [《GCTT 中译文》](https://studygolang.com/articles/12836)
- [CircleCI](https://ewanvalentine.io/microservices-in-golang-part-9) [《GCTT 中译文》](https://studygolang.com/articles/13515)
如果你发现这篇文章有价值,并且你也在用 ad-blocker(谁能责怪你呢)。请为了我花费的时间和精力提供一些赞助,非常感谢!
[https://monzo.me/ewanvalentine](https://monzo.me/ewanvalentine)
或者,在 [Patreon](https://www.patreon.com/ewanvalentine) 赞助我,好让我写出更多的像这样的文章
via: https://ewanvalentine.io/microservices-in-golang-part-10/
作者:Ewan Valentine 译者:jettyhan 校对:polaris1119
本文由 GCTT 原创翻译,Go语言中文网 首发。也想加入译者行列,为开源做一些自己的贡献么?欢迎加入 GCTT!
翻译工作和译文发表仅用于学习和交流目的,翻译工作遵照 CC-BY-NC-SA 协议规定,如果我们的工作有侵犯到您的权益,请及时联系我们。
欢迎遵照 CC-BY-NC-SA 协议规定 转载,敬请在正文中标注并保留原文/译文链接和作者/译者等信息。
文章仅代表作者的知识和看法,如有不同观点,请楼下排队吐槽
有疑问加站长微信联系(非本文作者))