go-micro 框架初探

栏目: 服务器 · 发布时间: 7年前

内容简介:得益于Go语言的编译快性能高特点,在云原生时代其作为服务端编程语言发展迅速,尤其是微服务领域,已逐渐形成一个良好的生态,基于Golang的微服务框架如今有很多,如go-kit、go-micro、kite、gizmo等,每一种都自有其优点。今天就来探一探go-micro框架。go-micro是基于Go语言实现的插件化RPC微服务框架,与go-kit,kite等微服务框架相比,它具有易上手、部署简单、工具插件化等优点。go-micro框架提供了服务发现、负载均衡、同步传输、异步通信以及事件驱动等机制,它尝试去简

得益于 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 框架初探

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的微服务。

3.1 安装 consul - 注册中心

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

运行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;
}

2)创建service

创建services/hello.go文件:

package main

import (
    "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.Name
    return 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 main

import (
    "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 service 查看当前已有服务:

> micro list service
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 service 查看当前已有服务:

> micro list services
consul
hellooo

即hellooo服务已启动

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

References


以上所述就是小编给大家介绍的《go-micro 框架初探》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

The Art of Computer Programming, Volume 2

The Art of Computer Programming, Volume 2

Knuth, Donald E. / Addison-Wesley Professional / 1997-11-04 / USD 79.99

Finally, after a wait of more than thirty-five years, the first part of Volume 4 is at last ready for publication. Check out the boxed set that brings together Volumes 1 - 4A in one elegant case, and ......一起来看看 《The Art of Computer Programming, Volume 2》 这本书的介绍吧!

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具