大家可以发现,Go越来越流行,其一是目前云计算领域基本是使用Go作为底层开发语言;其二是随着区块链的火爆,引申出了其背后很多开源项目,很多都是使用Go语言进行开发;其三就是在微服务方面,Go也展示很大的优势性。那么微服务是什么,如何将其与Go做一个整合,来提升整体开发生产效率,下面会进行详细讲解。
什么是微服务
图 1
图 1 所示是最传统的一个应用软件架构,最顶层是 load balancer ,下面布局很多cuisine,这些cuisine共享一个数据库。
图 2
图 2 是微服务的架构图,由图中我们可以看出整体架构分布的改变,一个服务被分成A、B、C三种服务,每个服务有自己的数据库,前面都会有一个 API Gateway将其三者链接起来。显而易见,微服务的难点也就在服务的划分上,通俗点讲就是如何服务其中的微服务。
这里大概介绍了微服务的基本概念,但是微服务并非良药,很多架构并非刚开始就会采用微服务的方式,后续会对这方面做更加详细的介绍。
GRPC介绍
gRPC是由Google主导开发的RPC框架,使用HTTP/2协议并用Protobuf作为序列化工具。与REST不同的是,REST是基于HTTP1.1 JOSN格式的一种轻量级服务模式,那么从这两方面来对比gRPC与REST就比较容易了。
首先可以从JOSN与Protobuf之间的差别入手进行对比,Protobuf很难读,它是面向机器的文字格式,而JOSN则是面向人的;Protobuf相对于JOSN而言编解码速度都非常快;最后就是兼容性,现在基本所有浏览器都支持JOSN格式,而Protobuf目前仅部分语言支持。
图 3
图 3 所示是一个 REST API 的代码示例,其中validate是一个校验函数,可以校验input的内容是否合法,如果校验失败输出false,反之则输出”200“ 那么同样功能的一个API,图 5 展示了gRPC API 当中的内容。
图 4
因为先前有提到,使用gRPC时,传递的是 Protobuf 那么首先我们就需要去定义一个Protobuf文件,,如图 4。
图 5
图 5 当中定义的参数如 InfoRequest 等在图 4 描述的定义文件中都有详细的参数说明。那么通过gRPC与REST的接口内容对比我们可以看出,gRPC的代码更加简洁。那么这是接口代码的对比,性能上它们有什么差异性呢?
图 6
如图 6 所示,是gRPC与REST之间性能方面的对比,我们可以看出来性能差异还是比较大的,在请求相同内容时,差异性也是比较大的,gRPC会跑1000000次,每次时长大致为2063ns/op,但是REST在同等情况下只会跑3000次,每次耗时为40493772ns/op。
以上是两者的对比,从前面的对比我们也可以看出,两者之间的差异性,那么问题很明显,两者之间的转换就背负着很大的历史包袱,所以,今天会着重去介绍如何使用gRPC+HTTP去打造一个微服务。
如何使用 GRPC+HTTP 打造微服务
图7
图 7 所示是现在常见的微服务架构方式,由图中我们可以看出,最前面试load balance,后面紧接着是API gateway,主要做一些聚合的工作。对外采用REST API方式相互调用,对内则采用gGPC API的方式相互进行调用。
图 8
图 8 所示举了一个例子,比如我拥有一个www的网站,这个网站页面使用的是react,现在不论是那种页面框架都会遵循以上的方式去调用API,那么调用的API是基于JOSN+HTTP,后面紧跟四个gRPC的service,参照图 8 所示的流程,每个调用都是循序渐进的。
图 9
图 9 所示是以上流程图所提供的五个服务的代码架构,其中包含API服务,认证(auth)服务,geo服务(根据当天的位置反馈定位经纬度),profile服务(获取经纬度周边信息)以及rate服务(获取酒店排名信息)。由图中所示,可以看出对外统一是采取REST的方式,而对内则都使用Protobuf,只需要定义一些文件的内容即关于service是什么即可。最后可以在API当中注册service,那么之后API在被调用的时候,去调用相应服务即可。
图 10
首先是测试,测试包括两个方面:单元测试和集成测试。所谓的单元测试(图 10)在Go中是比较被推崇的一种方式,在单元测试当中要生成一个stract就必须要声明其中的输入和输出,对于需要测试的函数只需要增加一个for循环,那么每当增加一行代码需要进行测试时,只需要增加一行要测试的input和outout即可。
其次是Tracing,当微服务被引入后,每个服务的运行时长会变得很难追踪,当调试一个问题时,因为微服务很多(尤其是上千个时)此时去找问题就会很麻烦,那么通过Tracing的方式就可以很容易的找到调用的东西从而大大降低了寻找问题的时间成本。
图 11
图 12
图 13
theus.io/ 以及 https://grafana.com 这两个网址的内容进行了解。
最后讲一下Debug,其实应该改成logging。在微服务当中一直在讲三个东西,一是Tracing,其次是prometheus需要收集的东西,最后就要介绍一下logging。现在写log经常会分不同的level,比如infor、running、debug等,实际上其实我们去查log时并不会太过于关注这些东西,Dave之前写了这篇blog:https://dave.cheney.net/2015/11/05/lets-talk-about-logging 有兴趣的朋友可以去看一下,里面就提到两种真正要的level。
图 14
图 14 所示是微服务架构的核心。那么讲了这么多,微服务架构到底是不是最完美的架构,答案当然是否定的,如果一个公司的团队要上微服务架构前提是需要考虑你们团队的整体实力,如果有能力,那么我建议大家上微服务,如果没有,我不建议大家去迁微服务的架构。
为什么 Go 适合微服务
首先是考虑到语言的复杂程度,一些静态语言效率的确很高,可是非常复杂,比如C++,复杂性太高,大家都喜欢简单的东西,所以复杂的都被排除在外。其次考虑到性能问题。最后考虑到并发编程环境,一般来说并发的编程环境很难处理,因为要考虑线程、锁等问题。所以,一般提到这些,都会提及速度、简单、可读这三个关键指标去评判一项语言,那么Go是不是可以三者兼并呢?大家在编程时都希望越简单越好,简单就意味着”小“,说到小,微服务的概念似乎更小。我个人认为,Go之所以适合做微服务,是因为它本身就很小,这个小蕴含两层意思:其一,编译出来的东西小;其二,关键字小导致核心小,学起来也比较简单。
总而言之,Go相对其他所有语言来说,它是简单易读的,Go是工程性的语言,它们都是从工程上的东西出发,完全按照工程师的思路,从工程师思路出发,去辅助你完成工作,这样在接触Go的时候就会有很大的亲切感。
我觉得,相对于其他语言来说,Go最大的优点:其一是高并发,但是其实Go的并发并没有C好,但是在多层情况下,C需要多核使用,对程序员要求很高;其二是Team协作,Go由将近一万人在共同协作,代码当然也可以从一千万行协作;其三是高性能,因为它的性能以及简单性,让其在PHP与C之间找到了平衡点,PHP可以快速开发,但是性能说到底比C还是差一点,但是C的学习成本又很高,所以Go刚好在两者之间找到了平衡点;四是对运行非常友好,所有写的东西编译之后就是二进制的文件,部署时直接就可以使用。
综上,也就是我对于Go为何适用于微服务的一些看法,当然任何技术也在不断迭代更新,我们也仍需要去不断更新自己的知识库。
ECUG 走过了十年,今年,我们在上海带来一场行业内最高水准的技术交流与分享,年底最不容错过的一场技术盛典(点击“阅读原文”报名参加 ECUG 十年高峰盛会)
微服务实践Go - CSDN博客
2018-5-8
grpc(3):使用 golang 开发 grpc 服务端和客户端
1,关于grpc-gogolang 可以可以做grpc的服务端和客户端。 官网的文档: http://www.grpc.io/docs/quickstart/go.html https://gi...
[goa]golang微服务框架学习--安装使用 - CSDN博客
当项目逐渐变大之后,服务增多,开发人员增加,单纯的使用go来写服务会遇到风格不统一,开发效率上的问题。 之前研究go的微服务架构go-kit最让人头疼的就是定义服务...
2018-4-9
微服务和Go语⾔的应⽤
微服务和Go语⾔的应⽤ 全球互联网大会GIAC 2017上的分享... 微服务和Go语⾔的应⽤ 全球互联网大会GIAC ...beego官方中文教程 立即下载 上传者: 陈晓明st...
2018-5-4
golang 实现一个restful微服务
如何用net/http构建一个简单的web服务 Golang提供了简洁的方法来构建web服务 package main import ( "net/http" ) func Hel...
微服务实践Go - CSDN博客
2018-4-23
微服务架构基础框架选择Spring Cloud还是Dubbo - CSDN博客
2018-4-30
提升微服务实施效率的7个步骤
《微服务进展缓慢的5个难点》中描述了实施微服务常见的主要阻碍。本文针对前文提到的5个难点提出了7个步骤。每个步骤分别包含了管理和技术两方面的建议。 如果以上5点都让你膝盖中箭。那么根据我个人的经...
微服务架构的好处与坏处 - CSDN博客
beego 1篇 Supervisord 3篇 storm 2篇 jstorm 1篇 golang 7篇 go...微服务架构模式有很多好处。首先,通过分解巨大单体式应用为多个服务方法解决了复杂...
2018-5-7
微服务实践Go
微服务实践Go 转自:http://www.open-open.com/lib/view/open1473391214741.html 简介 近一两年来,微服务架构已经成为热门话题(...
beego搭建api服务 - CSDN博客
2018-4-7
grpc应用于微服务的分析,基于python
grpc应用于微服务的分析 gRPC 是一个高性能、开源和通用的 RPC 框架,面向移动和 HTTP/2 设计,目前提供 C、Java 和 Go 语言版本,分别是:grpc, grpc-...
Golang 微服务框架 Go kit 介绍
go-kit 入门 1. microservice Go-Kit go kit 是一个分布式的开发工具集,在大型的组织(业务)中可以用来构建微服务。其解决了分布式系统中的大多数常见问...
grpc-gateway:grpc转换为http协议对外提供服务
我所在公司的项目是采用基于Restful的微服务架构,随着微服务之间的沟通越来越频繁,就希望可以做成用rpc来做内部的通讯,对外依然用Restful。于是就想到了google的grpc。 使用g...
最好的6个Go语言Web框架
GO 语言爱好者的最佳Web框架 如果你是自己写一个小应用程序,那你可能不需要Web框架。但是如果你要做产品,那么你肯定需要一个好的框架。 如果你认为你有相应的知识和经验,你会自己编写所有...
微服务架构的好处与坏处
微服务架构的好处与坏处 转自:http://kb.cnblogs.com/page/521880/ 微服务架构的好处 微服务架构模式有很多好处。首先,通过分解巨大单体式应用为多个...
[goa]golang微服务框架学习(二)-- 代码自动生成
之前用过go语言的反射来做一些代码生成,参考这篇。 但是这种方式,入侵太强,需要执行对应的申明调用, 所以对GOA框架的自动生成非常感兴趣,于是仔细研究了一下,发现用的比较巧妙, 这里先卖个关子...
二、go-kit 与 grpc 结合开发微服务
二、go-kit 与 grpc 结合开发微服务 介绍 go-kit 是一个微服务的开发工具集,微服务系统中的大多数常见问题,因此,使用者可以将精力集中在业务逻辑上。 grpc缺乏服务治理的功能,...
在Go中构建微服务
黄金法则:你可以在不更改任何其他代码的前提下更改服务并重新部署吗?——Sam Newman,Building Microservices作者 我们构建的每个服务都应该是微服务,正如本书前面提到的...
GRPC 配置、使用、安装文档 java-windows
官方文档:http://www.grpc.io/ 中文版:https://doc.oschina.net/grpc 目录: 一、利用maven compile 来将proto生成java文件 ...
go语言使用grpc的步骤
grpc提供了很好的rpc远程过程调用功能,封装了中间环节,让使用rpc的客户服务端只需要关注自己的业务即可。 go语言下使用gprc的步骤如下: 1、安装go语言 go语言的安装不再详...
Golang gRPC实践 连载三 Protobuf语法
Protobuf语法 gRPC推荐使用proto3,本节只介绍常用语法,更多高级使用姿势请参考官方文档 Message定义 一个message类型定义描述了一个请求或相应的消息格...
微服务的一种开源实现方式——dubbo+zookeeper
微服务架构成了当下的技术热点,实现微服务是要付出很大成本的,但也许是因为微服务的优点太过于吸引人,以至于大部分开发者都将它当成未来的发展趋势。 微服务架构的演进过程 ...
grpc(5):使用grpc+consul 开发服务调用
1,consul 服务发现在使用了几次之后终于感受到了这个系统挺好的了。 在一个小的团队里面,要做服务发现,做的简单高效。 可以直接使用 consul 作为服务发现,服务检查的系统。 不用自己去...
微服务的调用和接口
微服务的调用和接口 微服务的调用: 微服务也是服务,我们一般认为微服务都是不同的实例提供的。这些实例通常和调用者运行在不同的进程中(根据部署模式不同,多个微服务实例到是有可能在一...
grpc(4):使用 golang 调用consul api 接口,注册user-tomcat服务
1,关于consuldubbo的注册中心是zookeeper,redis。 motan的注册中心是zookeeper,consul。 kubernetes的注册中心是 etcd。 使用consu...
简单RPC框架-基于Consul的服务注册与发现
一般我们常见的RPC框架都包含如下三个部分: 注册中心,用于服务端注册远程服务以及客户端发现服务服务端,对外提供后台服务,将自己的服务信息注册到注册中心客户端,从注册中心获取远程服务的注...
Go1.9接入prometheus监控小实例
package mainimport ( "bytes" "fmt" "net/http" "strings" "sync/atomic" "github...
高效传输数据格式以及基于HTTP2的RPC框架---gRPC的使用
google有一款非常高效的数据传输格式框架ProtoBuffer。基于该数据传输的RPC框架会非常高效,如果再让该RPC在基于HTTP2.......
没有更多推荐了,返回首页