用Go语言构建微服务(1)简介和基本原理

作者简介:

用Go语言构建微服务(1)简介和基本原理_第1张图片

在这个博客系列中,将使用Go编程语言构建微服务,并逐步添加必要的集成,以使它们在Spring Cloud / Netflix OSS环境中,很好地运行在Docker swam

如果您不确定微服务是什么,建议您阅读Martin Fowler关于这方面的文章。有关微服务的操作模型的更多信息,我的同事Magnus这篇博文很好地解释了关键概念。

这个博客系列不会成为Go编程的初学者指南,尽管在编写博客的同时也会编写一些代码,我将捎带解释一些关键的Go概念。同时,还将会看到很多代码,特别是在第一部分,将介绍基本功能、单元测试和其他核心主题的部分。

注意:在这个博客系列中提到“Doc​​ker Swarm”时,指的是以群集模式运行Docker 1.12或更高版本。随着Docker 1.12的发布,作为独立概念的“ Docker Swarm ”终止了。

架构概述

下图展示了将在整个博客系列中构建的系统架构的总体视图。我们将会从头开始编写第一个Go微服务,然后沿着博客系列的各个部分前进,逐步接近下面的视图。

用Go语言构建微服务(1)简介和基本原理_第2张图片

视图基本涵盖:

·        虚线的白色框:在一个或多个节点上运行的物理Docker集群。

·        蓝色框:支持SpringCloud / Netflix OSS堆栈或Zipkin等其他服务的服务。

·        沙色/白色盒子:一种实际的微服务。

这几乎与MagnusLarssons微服务博客系列中使用的相同,其主要区别在于:实际的微服务用Go语言而不是用Java实现。quotes-service是一个例外,因为它提供了一个基于JVM的微服务,与基于go语言的服务进行对比实验。

关键原因 - 运行时内存

有人可能会问为什么要在Go中编写微服务?除了作为一种非常有趣、高效的语言之外,用go语言来构建微服务的主要理由是:程序运行时占用的内存空间很小。让我们来看下面的截图,在这里运行了几个Go微服务以及基于DockerSwarm Spring BootSpring Cloud基础架构的微服务:


quotes-service是基于Spring boot的,而compserviceaccountservice是基于go语言的。两者都是HTTP服务器,并且部署了很多库来处理与Spring cloud基础架构的集成。

这在2017年真的很重要吗?这几天我们在服务器上实施了大容量内存,不是很容易就能运行基于java的应用程序吗?这是事实——但是一个大型企业并不止运行数十个服务,它们很可能在云提供商上运行成百上千的集装箱化(微)服务。当运行大量的容器时,节约资源可以为公司节省大量的资金。

让我们看一看Amazon EC2定价,用于一般用途的按需实例(2017-02-15):

用Go语言构建微服务(1)简介和基本原理_第3张图片

通过比较各种t2实例,不难看出,对于给定核数的CPURAM的数量翻倍(例如:从t2增加48 GB中等到t2大)也会使每小时的成本翻倍。如果不是受限cpu,那么能够将微服务的数量增加到一个给定的实例的两倍,理论上可以使您的云提供商账单减半。正如将在后面博客文章中看到的,即使在负载下,Go服务使用的RAM比基于Spring boot的占用内存要少得多。

微服务的非功能需求

这个博客系列不仅仅是关于如何使用Go来构建微服务 -同样重要的是让它在Spring cloud环境中表现得非常好,并符合一个生产环境的微服务所需要的特性

考虑(无特定顺序):

·        集中配置

·        服务发现

·        日志记录

·        分布式追踪

·        断路

·        负载均衡

·        边缘

·        监控

·        安全

所有这些都是我认为在决定采用微服务架构时必须考虑的问题,无论您是使用GoJavajspythonC#还是其他任何您喜欢的语言编写代码。在这个博客系列中,我将尝试从Go的角度来涵盖所有这些主题。

另一个视角是实际的微服务实现中的内容。不管您来自哪里,可能已经和一些图书馆合作过,比如:

·        HTTP / RPC / REST / SOAP /任何API

·        持久性APIDB客户端,JDBCO / R映射器)

·        消息APIMQTTAMQPJMS

·        可测试性(单元/集成/系统/验收)

·        构建工具/ CI /CD

·        更多

我不会涉及所有这些主题。如果愿意,我可以写一本书而不是一个博客系列,但至少会覆盖其中的一些。

这个博客系列的系统环境的一个基本前提是:DockerSwarm作为运行时环境,这意味着所有的服务——无论是支持的服务(配置服务器、edge等等),还是实际的微服务实现将被部署为DockerSwarm服务。在博客系列的最后,有下面的Docker命令:

docker service ls

将向我们展示在示例环境中部署的所有服务的列表,每个服务都有一个副本。

用Go语言构建微服务(1)简介和基本原理_第4张图片

请注意,上面列出的服务包含了比在博客系列的第5部分中建立的集群时所拥有的更多的服务。

性能

的确,微服务占用的内存很小——但是它们会执行吗?以一种有意义的方式对编程语言进行基准测试是相当困难的。也就是说,如果你看一看像基准游戏这样的网站,人们可以提交多种语言的显式算法的实现,并让它们彼此进行基准测试,那么Go的速度通常比Java 8稍微快一些,但也有一些明显的例外。在启动阶段,通常与C++差不多,或者在一些基准测试中,速度要慢得多。也就是说,对于典型的微服务工作负载,通常执行得很好——服务于http/rpc、序列化/反序列化数据结构、处理网络IO等。

Go的另一个重要属性是它是一种垃圾收集的语言。Garbage Collector for Go 1.5重写之后,GC暂停最多只需要几毫秒。如果您来自jvm的世界(就像我自己做的那样),Go垃圾收集器可能不那么成熟,但在Go 1.2之后的某些地方引入了更改后,它似乎非常可靠。这也是一个不可配置的奇迹——有一个开关(GOGC),可以针对Go中的GC行为进行调整,该行为控制堆相对于可达对象大小的总大小。

然而,跟踪性能的影响,我们将构建第一个microservice然后添加诸如断路器、跟踪、日志记录等可以很有趣。所以我们将在即将发布的博客文章中使用Gatling测试来了解性能随着添加越来越多的微服务功能而发生的变化。

启动时间

典型的Go应用程序的另一个优势是启动速度非常快。带有一些路由、JSON序列化等的简单HTTP服务器通常最多在几百毫秒内启动。当我们开始在Docker容器中运行Go微服务时,会看到它们在几秒钟内完成服务,而基于Spring Boot的微服务准备就绪通常需要至少10秒钟。也许不是最重要的特征,但是当您的环境需要通过快速扩展来处理突发的流量激增时,它肯定会有所帮助。

静态链接的二进制文件

Docker容器中运行基于Go的微服务的另一大优势是:可以在一个可执行二进制文件中获得一个静态链接的二进制文件,其中包含所有的依赖关系,尽管该文件不是非常紧凑(实际微服务通常为10-20 mb),但是最大的好处是可以获得非常简单的dockerfile,并且可以使用非常简单的Docker基础镜像。我使用的是一个叫做iron/base基础镜像,其体积仅为6 mb

FROM iron/base

EXPOSE 6868
ADD eventservice-linux-amd64 /
ENTRYPOINT ["./eventservice-linux-amd64", "-profile=test"]

换句话说 - 除了基本镜像中包含的标准C库(libc)之外,不需要JVM或其他运行时组件。

我们将在以后的博客文章中更详细地介绍如何构建二进制文件以及 profile = test

概要

在这篇博客文章中,我们介绍了使用Go构建微服务的一些关键原因,如占用内存小,性能良好和便利的静态链接二进制文件。

接下来的部分,我们将构建第一个基于go的微服务。


原文: http://callistaenterprise.se/blogg/teknik/2017/02/17/go-blog-series-part1/

你可能感兴趣的:(用Go语言构建微服务,用Go语言构建微服务)