正文
Go微服务理论基础介绍
蓝图概述
下图是我们整个系列文章中构建的系统蓝图整体视图。然而,我们将从头开始写我们的第一个Go微服务,然后当我们沿着博客系列的各部分进展时,我们将会越来越接近下面的图所代表的结构。
图例基本如下:
-
虚线白框: 在一个或多个节点上运行的逻辑Docker Swarm集群。
-
蓝色框: 来自Spring Cloud/Netflix OSS栈或其他服务例如Zipkin的支持服务。
-
沙色/白盒: 实际的微服务。
它或多或少和Magnus Larssons微服务博客系列中使用的蓝图相同,主要区别在于实际微服务是使用Go嵌入Java来实现的。qutoes-service是一个例外,它为我们提供了基于JVM的微服务, 我们可以用于和我们的基于Go的微服务的无缝集成对比以及测试平台。
理论基础: 运行信息
有人会问,为什么我们要使用Go来写微服务呢? 除了可以使用这么有趣和具有创造性的语言干活之外,使用Go构建微服务的主要理由是具有微小的内存占用。让我们看看下面的截图,我们正运行在Docker Swarm下的Go微服务以及基于Spring Bot和Spring Cloud架构的微服务。
quotes-service是Spring启动的,而compservice和accountservice是基于Go的。两者都是使用大量类库部署和Spring Cloud基础设施集成起来用于处理HTTP的服务器。
2017年真的重要吗? 看看Java实现的微服务和Go实现的微服务所占的内存大小,就会让我们感觉到吃惊, 相差几十倍。确实如此,对于大型企业来说,运行数十个服务都是少的,很多公司会运行成千上万的放在云提供上的微服务。当我们运行大量的容器,节约资源会为公司节省大量的资金。
微服务的非功能性需求
本文不仅仅是关于如何使用Go语言构建微服务的 - 它同样是一个在Spring Cloud环境中表现良好的,并且是符合一个生产就绪的微服务领域所需要的品质。
考虑如下(顺序无特殊考虑):
-
集中化配置: Centralized configuration.
-
服务发现: Service Discovery.
-
日志: Logging.
-
分布式跟踪: Distributed Tracing.
-
断路器: Circuit Breaking.
-
负载均衡: Load balancing.
-
边界: Edge.
-
监控: Monitoring.
-
安全: Security.
所有这些东西我认为当你决定尝试微服务的时候都需要考虑的,而不用管你具体使用Go语言、Java语言、js、python、C#还是其他你喜欢的语言来编码。这个博客序列我们从Go语言的视角来揭示所有的这些话题。
另外一个视角是在你实际的微服务实现中的东西。不管你来自什么语言,你都可能有提供了如下功能的类库:
-
HTTP/RPC/REST/SOAP/诸如此类的API.
-
持久化API(DB客户端、JDBC、O/R映射).
-
消息API(MQTT、AMQP、JMS).
-
可测试性(单元测试/集成测试/系统测试/验收测试).
-
构建工具(CI/CD)
-
更多...
我不会涵盖这些话题的所有内容。如果我要这么做,我将会写一本书而不是博客系列文章。我将涵盖它们中的一小部分。
在Docker Swarm模式下运行
这些文章系列中的系统领域的基本前提是我们的运行环境是Docker Swarm。意思就是所有服务 - 支持服务(配置服务器、边界服务等)或实际微服务实现都是部署为Docker Swarm服务中的。 当我们到文章序列末尾的时候,有如下Docker命令: