Go微服务框架go-micro学习(1)基本使用
Go微服务框架go-micro学习(1)基本使用
1. 简介
Go Micro提供了分布式系统开发的核心要求,包括RPC和事件驱动的通信。go-micro哲学是可插拔体系结构的默认设置。我们提供了默认设置,可帮助您快速入门,但所有内容都可以轻松换出。
2. 特性
Go Micro提取了分布式系统的详细信息。这是主要功能。
-
服务发现-自动服务注册和名称解析。服务发现是微服务开发的核心。当服务A需要与服务B通话时,它需要该服务的位置。默认发现机制是多播DNS(mdns),一种零配置系统。
-
负载均衡-基于服务发现的客户端负载平衡。一旦获得了服务的任意数量的实例的地址,我们现在需要一种方法来确定要路由到的节点。我们使用随机散列负载平衡来提供服务之间的平均分配,并在出现问题时重试其他节点。
-
消息编码-基于内容类型的动态消息编码。客户端和服务器将使用编解码器以及content-type来为您无缝编码和解码Go类型。各种消息可以被编码并从不同的客户端发送。客户端和服务器默认情况下会处理此问题。默认情况下,这包括protobuf和json。
-
请求响应-基于RPC的请求/响应,支持双向流。我们为同步通信提供了一个抽象。对服务的请求将被自动解决,负载均衡,拨号和流式传输。缺省传输是gRPC。
-
异步消息传递-PubSub内置为异步通信和事件驱动的体系结构的一流公民。事件通知是微服务开发中的核心模式。默认消息系统是嵌入式NATS 服务器。
-
可插拔接口-Go Micro对每个分布式系统抽象都使用Go接口。因此,这些接口是可插入的,并允许Go Micro与运行时无关。您可以插入任何基础技术。在github.com/micro/go-plugins中找到插件 。
3. 依赖
Protobuf
使用protobuf生成API接口
go get github.com/micro/protoc-gen-micro/v2
安装protoc
https://github.com/protocolbuffers/protobuf/releases
go get github.com/micro/protobuf/protoc-gen-go
发现*
服务发现用于将服务名称解析为地址。默认情况下,我们提供使用多播DNS的zeroconf发现系统。这是大多数操作系统内置的。如果您需要更具弹性和多主机的功能,请使用etcd。
Etcd
Etcd可用作替代服务发现系统。
- 下载并运行etcd
- 传递
--registry=etcd
给任何命令或环境变量MICRO_REGISTRY=etcd
4. 安装
1import "github.com/micro/go-micro/v2"
5. Helloworld服务
服务协议
微服务的关键要求之一是严格定义接口。Micro使用protobuf来实现这一目标。
在这里,我们使用Hello方法定义了Greeter处理程序。它需要带有两个字符串参数的Request和Response。
1mkdir $GOPATH/hellworld/server/proto -p
2cd $GOPATH/hellworld/server/proto
greeter.proto
1syntax = "proto3";
2
3service Greeter {
4 rpc Hello(Request) returns (Response) {}
5}
6
7message Request {
8 string name = 1;
9}
10
11message Response {
12 string greeting = 2;
13}
生成原型
编写原型定义后,我们必须使用带有微型插件的protoc对其进行编译。
1protoc --proto_path=$GOPATH/src:. --micro_out=. --go_out=. greeter.proto
会生成两个文件
1ls -lh
2total 24
3-rw-r--r-- 1 jerry staff 3.9K 3 10 14:10 greeter.pb.go
4-rw-r--r-- 1 jerry staff 2.1K 3 10 14:10 greeter.pb.micro.go
5-rw-r--r-- 1 jerry staff 165B 3 10 14:09 greeter.proto
服务实现
现在,我们已经定义了服务接口,我们需要实现服务。
以下是helloworld服务的代码。它执行以下操作:
- 实现为Greeter处理程序定义的接口
- 初始化微服务
- 注册Greeter处理程序
- 运行服务
main.go
1package main
2
3import (
4 "context"
5 "fmt"
6
7 micro "github.com/micro/go-micro/v2"
8 proto "helloworld/server/proto"
9)
10
11type Greeter struct{}
12
13func (g *Greeter) Hello(ctx context.Context, req *proto.Request, rsp *proto.Response) error {
14 rsp.Greeting = "Hello " + req.Name
15 return nil
16}
17
18func main() {
19 // Create a new service. Optionally include some options here.
20 service := micro.NewService(
21 micro.Name("greeter"),
22 )
23
24 // Init will parse the command line flags.
25 service.Init()
26
27 // Register handler
28 proto.RegisterGreeterHandler(service.Server(), new(Greeter))
29
30 // Run the server
31 if err := service.Run(); err != nil {
32 fmt.Println(err)
33 }
34}
运行服务
现在使用Go运行示例。
1go mod init
2go build
3./server
42020-03-10 14:26:41 Starting [service] greeter
52020-03-10 14:26:41 Server [grpc] Listening on [::]:52254
62020-03-10 14:26:41 Registry [mdns] Registering node: greeter-6e43fd5e-3a90-4fce-93e4-07e302dc4c2b
写客户端
一旦获得服务,我们实际上需要一种查询它的方法。这是微服务的核心,因为我们不仅提供服务,而且还使用其他服务。下面是查询helloworld服务的客户端代码。
1mkdir $GOPATH/hellworld/client
2cd $GOPATH/hellworld/client
3cp -r ../server/proto .
生成的原型包括一个问候客户端,以减少样板代码。
client.go
1package main
2
3import (
4 "context"
5 "fmt"
6
7 micro "github.com/micro/go-micro/v2"
8 proto "helloworld/client/proto"
9)
10
11func main() {
12 // Create a new service
13 service := micro.NewService(micro.Name("greeter.client"))
14 // Initialise the client and parse command line flags
15 service.Init()
16
17 // Create new greeter client
18 greeter := proto.NewGreeterService("greeter", service.Client())
19
20 // Call the greeter
21 rsp, err := greeter.Hello(context.TODO(), &proto.Request{Name: "John"})
22 if err != nil {
23 fmt.Println(err)
24 }
25
26 // Print response
27 fmt.Println(rsp.Greeting)
28}
现在运行客户端
1go build
2./client
3Hello John
- 原文作者:黄忠德
- 原文链接:https://huangzhongde.cn/post/Golang/go_microservice_framework_go-micro_1/
- 版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。