得益于Go语言的编译快性能高特点,在云原生时代其作为服务端编程语言发展迅速,尤其是微服务领域,已逐渐形成一个良好的生态,基于Golang的微服务框架如今有很多,如go-kit、go-micro、kite、gizmo等,每一种都自有其优点。今天就来探一探go-micro框架。

一、go-micro 是什么

go-micro是基于Go语言实现的插件化RPC微服务框架,与go-kit,kite等微服务框架相比,它具有易上手、部署简单、工具插件化等优点。

go-micro框架提供了服务发现、负载均衡、同步传输、异步通信以及事件驱动等机制,它尝试去简化分布式系统间的通信,让我们可以专注于自身业务逻辑的开发。所以对于新手而言,go-micro是个不错的微服务实践的开始。

二、go-micro 架构

2.1 分层架构

下图为官方博客提供的go-micro架构图:

go-micro是组件化的框架,每一个基础功能都是一个interface,方便扩展。同时,组件又是分层的,上层基于下层功能向上提供服务,整体构成go-micro框架。
go-micro的组件包括:

  • Registry组件:服务发现组件,提供服务发现机制:解析服务名字至服务地址。目前支持的注册中心有consul、etcd、 zookeeper、dns、gossip等
  • Selector组件:构建在Registry之上的客户端智能负载均衡组件,用于Client组件对Registry返回的服务进行智能选择。
  • Broker组件:发布/订阅组件,服务之间基于消息中间件的异步通信方式,默认使用http方式,线上通常使用消息中间件,如Kafka、RabbitMQ等。
  • Transport组件:服务之间同步通信方式。
  • Codec组件:服务之间消息的编码/解码。
  • Server组件:服务主体,该组件基于上面的Registry/Selector/Transport/Broker组件,对外提供一个统一的服务请求入口。
  • Client组件:提供访问微服务的客户端。类似Server组件,它也是通过Registry/Selector/Transport/Broker组件实现查找服务、负载均衡、同步通信、异步消息等功能。

所有以上组件功能共同构成一个go-micro微服务。

2.2 微服务之间通信

两个微服务之间的通信是基于C/S模型,即服务发请求方充当Client,服务接收方充当Server。
其通信过程大致如下图:

上图大致描绘了go-micro服务内各组件的职责与交互。

三、实现一个简单的微服务

纸上得来终觉浅,下面就来搭建环境,实现一个简单的基于go-micro的微服务。
为简单起见,client与server之间我们使用点对点的同步方式(Transport),即无需消息中间件(Broker),注册中心采用consul系统。

3.1 安装consul - 注册中心

服务注册中心我们选择consul:

  • mac:brew install consul
  • windows:直接官网下载consul.exe可执行程序

运行consul:启动Consul agent的开发模式:

consul agent -dev

该命令快速启动一个单节点的consul,且为集群的领袖

查看Consul集群的成员:打开另一个终端执行:

consul members

停止Agent:使用 Ctrl-C,优雅的关闭Agent

也可以通过WebUI来查看各service状态:http://localhost:8500/

3.2 安装micro:微服务管理工具

micro是以go-micro框架为核心的微服务管理工具,通过它可以方便查看go-micro服务情况。

在$GOPATH目录下,执行go get github.com/micro/micro,该命令会在bin目录($GOBIN)下生成micro(.exe)工具
micro命令行工具可以提供诸如服务列表查看、服务详情查看、调用服务接口等功能。

3.3 安装goprotobuf相关工具:GRPC相关工具

  • protoc:Protobuf(Protocol Buffers - Google's data interchange format)编译器:

    • windows下直接下载 相关win的zip压缩文件(内含protoc.exe)
    • mac: brew install protobuf
  • protoc-gen-go:goprotobuf 提供的 Protobuf 插件:在$GOPATH目录下执行go get github.com/micro/protobuf/{proto,protoc-gen-go},该命令会在bin目录下生成protoc-gen-go(.exe)工具,protoc编译器利用protoc-gen-go插件将.proto文件转换为Golang源文件
  • protoc-gen-micro(Protobuf code generation for micro):在$GOPATH目录下执行go get github.com/micro/protoc-gen-micro,该命令会在bin目录下生成protoc-gen-micro(.exe),protoc编译器利用protoc-gen-micro插件将.proto文件转换为micro代码风格文件

goprotobuf编译参数:

  • -I参数:指定import路径,可以指定多个-I参数,编译时按照顺序查找,不指定时默认查找当前目录
  • --go_out:Golang编译支持,支持以下参数

    - `plugins=plugin1+plugin2`:指定插件,支持grpc/micro,即:plugins=grpc+micro
    - `M`参数:指定导入的.proto文件路径编译后对应的goalng包名(不指定默认.proto文件中import语句路径)
    - `import_prefix=xxx`:为所有import路径添加前缀,主要用于编译子目录内的多个proto文件
    - `import_path=foo/bar`:指定未声明package或go_package的文件的包名,最右边的斜线前的字符会被忽略
    

3.4 编写一个简单的Hello服务

至此,go-micro框架的编程环境已基本搭建好,接下来就是写代码了。

下面实现一个Hello服务:它接收一个字符串类型参数请求,返回一个字符串问候语:Hello 『参数值』。
1)定义API

创建proto/hello.proto文件:
使用protobuf文件来定义服务API接口

syntax = "proto3";
service Hello {rpc Ping(Request) returns (Response) {}
}
message Request {string name = 1;
}
message Response {string msg = 1;
}

执行protoc命令,生成当前pb文件的go实现:

protoc --go_out=plugins=micro:. ./proto/hello.proto

2)创建service

创建services/hello.go文件:

package mainimport ("context""fmt"proto "winmicro/proto"micro "github.com/micro/go-micro"
)type Hello struct{}func (h *Hello) Ping(ctx context.Context, req *proto.Request, res *proto.Response) error {res.Msg = "Hello " + req.Namereturn nil
}
func main() {service := micro.NewService(micro.Name("hellooo"), // 服务名称)service.Init()proto.RegisterHelloHandler(service.Server(), new(Hello))if err := service.Run(); err != nil {fmt.Println(err)}
}

3)模拟client

创建Clients/helloclient.go文件:

package mainimport ("context""fmt"proto "winmicro/proto"micro "github.com/micro/go-micro"
)func main() {service := micro.NewService(micro.Name("hello.client")) // 客户端服务名称service.Init()helloservice := proto.NewHelloService("hellooo", service.Client())res, err := helloservice.Ping(context.TODO(), &proto.Request{Name: "World ^_^"})if err != nil {fmt.Println(err)}fmt.Println(res.Msg)
}

3.5 运行Hello服务

启动consul之后
执行micro list services 查看当前已有服务:

> micro list services
consul

执行go run services/hello.go命令,启动hellooo服务:

>go run services/hello.go
2018/11/29 20:18:08 Listening on [::]:61463
2018/11/29 20:18:08 Broker Listening on [::]:61464
2018/11/29 20:18:08 Registering node: hellooo-74122f56-4728-4449-a9d4-6c3c85ba2fcb
....

再次执行micro list services 查看当前已有服务:

> micro list services
consul
hellooo

即hellooo服务已启动

通过WebUI来查看各service信息:http://localhost:8500/

请求服务
执行go run clients/helloclient.go命令,向hellooo服务发起请求:

>go run clients/helloclient.go
Hello World ^_^

References

https://github.com/micro/go-m...
https://micro.mu/docs/go-micr...
https://lixiangyun.gitbooks.i...
https://github.com/hb-go/micro

go-micro 框架初探相关推荐

  1. 牌类游戏使用微服务重构笔记(四): micro框架使用经验

    项目依赖 推荐使用go module, 我选择go module的最主要原因是足够简单,可以脱离gopath,就跟写nodejs一样,随便在一个地方新建一个文件夹就可以撸代码了,clone下来的源码也 ...

  2. C# WPF Caliburn.Micro框架下利用Mef加载其它项目界面

    01 - 前言 MEF是微软自家的托管可扩展框架,在这里我把它用成了ioc容器.在Caliburn.Micro框架下,view和viewmodel被注入到CompositionContainer容器中 ...

  3. 开发指南专题二:JEECG微云快速开发平台JEECG框架初探

    开发指南专题二:JEECG微云快速开发平台JEECG框架初探 2.JEECG框架初探 2.1演示系统 打开浏览器输入JEECG演示环境地址:http://demo.jeecg.org:8090/可以看 ...

  4. C# WPF MVVM模式Caliburn.Micro框架下事件发布与订阅

    01 - 前言 处理同模块不同窗体之间的通信和不同模块之间不同窗体的通信,Caliburn提供了一种事件机制,可以在应用程序中低耦合的模块之间进行通信,该机制基于事件聚合器服务,允许发布者和订阅者之间 ...

  5. Dorado7之BDF3框架初探

    Dorado7之BDF3框架初探 先吐槽一下 新的改变 项目地址和开发工具 项目搭建 项目预览 先吐槽一下 这个CSDN账号搞丢了两年,一直用有道云笔记啊,onenote写,很不得劲儿,现在找回来了, ...

  6. Zipline框架初探(上)

    为了朝着量化交易的方向努力行进,数学和编码是必须提高的垫脚石,财务分析则属于业余爱好加分项.数学方面借着报名"七月在线 - 机器学习数学班"重温数学基础以图从机器学习的角度入手,而 ...

  7. Camera框架初探

    先解释一些概念,然后带着思考去解读 1.CameraService. 2.Camera 3.BnCameraClient 4.BnCamera 5.Client 不得不说的是android对于bind ...

  8. [转]Java7中的ForkJoin并发框架初探(上)——需求背景和设计原理

    详见: http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp83 这篇我们来简要了解一下JavaSE7中提供的一个新特性 -- For ...

  9. scrapy获取a标签的连接_Python爬虫 scrapy框架初探及实战!

    Scrapy框架安装 操作环境介绍 操作系统:Ubuntu19.10 Python版本:Python3.7.4 编译器:pycharm社区版 安装scrapy框架(linux系统下) 安装scrapy ...

  10. Scrapy框架初探

    Scrapy 貌似是 Python 最出名的爬虫框架 0. 文档 中文文档:https://scrapy-chs.readthedocs.io/zh_CN/0.24/intro/tutorial.ht ...

最新文章

  1. “提高一下dotnet程序的效率一”中关于exception的问题
  2. json字符串中的大括号转义传到后台_json转义问题
  3. MFC VS2005 添加Override 和 Message
  4. Android的引用jar包
  5. 解决: libcimtd.lib not found, rpcndr.lib not found
  6. 《趣学JavaScript——教孩子学编程》——1.5 本章小结
  7. Iterator(迭代器)-对象行为型模式
  8. epson r1900 清零软件_EPSON 1430 R1900 1500 R330 R1800 R2000 R230 打印机清零软件
  9. Sublime Text 3使用SublimeLinter配置JS,CSS,HTML语法检查(实用)
  10. LeetCode 1429. First Unique Number
  11. 初学python------写一个心理测试
  12. ffmpeg生成缩略图
  13. 南阳oj入门题-A+B Problem
  14. 20200422his系统实施工程师经验分享(助产士系统实施过程总结)
  15. 面试常问VueX是什么?
  16. 怎么制作小怪兽打凹凸曼的游戏~
  17. word 分章节,如何下一章页眉单独改动,不影响上一章
  18. Ubuntu 怎么重启网络
  19. canvas画图--流畅没有齿痕的线,图像画线
  20. CSS复合选择器,挥泪整理面经

热门文章

  1. linux 修改git端口号,SSH默认端口更改后使用Git
  2. android下在屏幕适配小总结
  3. win7重启mysql服务器_Win7系统下怎么重启iis服务?
  4. mysql server 6.0_MySQL Server 6.0完全卸载以及卸载中遇到的问题
  5. dingtalk 推送手机号信息 golang_PureQuant使用功能介绍(二):通过配置模块导入API信息...
  6. python 教材 配套 试题库_Python语言应用2020满分完整版考 试题库大全
  7. arcgis数据量大显示慢_优化MapGIS地图显示速度我的七个方法
  8. mysql 创建外键语句,MySQL 创建主键,外键和复合主键的语句 | 很文博客
  9. 肌电信号 原始信号 积分_实验室人必看!复杂的色谱峰要如何正确积分?
  10. 基于fpga的dds函数信号发生器的设计_低频信号发生器