如何搭建go-micro开发环境
16lz
2021-01-22
还有个 protoc-gen-go 也需要放进去,可以用下面的方式下载。
go get -u github.com/golang/protobuf/protogo get -u github.com/golang/protobuf/protoc-gen-go
example
现在让我们写一个 demo 来练习一下。
一共有三个文件,server.go
,client.go
,greeter.proto
greeter.proto
syntax = "proto3";package protos;service Greeter { rpc Hello (Request) returns (Response){};}message Request { string name = 1;}message Response { string greeting = 2;}
server.go
package mainimport ( "context" "fmt" "github.com/micro/go-micro/v2")type Greeter struct {}func (g *Greeter) Hello(context context.Context, req *Request, rsp *Response) error { rsp.Greeting = "Hello " + req.Name return nil}func main() { service := micro.NewService( micro.Name("greeter"), ) service.Init() err := RegisterGreeterHandler(service.Server(), new(Greeter)) if err != nil { fmt.Println(err) } if err := service.Run(); err != nil { fmt.Println(err) }}
client.go
package mainimport ( "context" "fmt" "github.com/micro/go-micro/v2")func main() { service := micro.NewService(micro.Name("greeter.client")) service.Init() greeter := NewGreeterService("greeter", service.Client()) rsp, err := greeter.Hello(context.TODO(), &Request{Name: "Zaun pianist"}) if err != nil { fmt.Println(err) } fmt.Println(rsp.Greeting)}
强烈建议使用 go mod 来管理依赖,项目更新速度很快,百度上的很多教程都不行了,安装过程各种错误
这是我的 mod 文件
module hellogo 1.14require ( github.com/golang/protobuf v1.4.0 github.com/micro/go-micro/v2 v2.9.1 google.golang.org/protobuf v1.22.0)
注意,我的 greeter.proto 和 server.go、client.go 文件是放在同一个文件夹下面的
编译greeter.proto
protoc --micro_out=. --go_out=. greeter.proto
编译完成之后,会生成两个 go 源代码文件:
greeter.pb.go
greeter.pb.micro.go
运行
现在可以运行 server 了,这里因为 client 和 server 是放在同一个文件夹,也就是同一个包中,两个都有 main 函数,所以不能用 go run ./
,至于为什么要加上另外两个,这个是 go 语言编译器的要求,必须要指明编译所需要用到的文件。
go run server.go greeter.pb.go greeter.pb.micro.go
可以用 micro 来查看当前正在运行的微服务
micro list services
也可以在 web 端查看
micro web
如果没有出错,这个时候是可以看到服务已经注册成功了。
$ micro list servicesgo.micro.webgreeter
测试
现在可以运行客户端来测试一下了
go run client.go greeter.pb.go greeter.pb.micro.go
我在测试的时候出了问题,服务已经注册好了,但是 client 去调用的时候,缺返回了
{"id":"go.micro.client","code":408,"detail":"context deadline exceeded","status":"Request Timeout"}panic: runtime error: invalid memory address or nil pointer dereference[signal 0xc0000005 code=0x0 addr=0x28 pc=0xeef454]
检查一下服务的信息
micro get service greeter
$ micro get service greeter service greeter version latest ID Address Metadata greeter-5d86321e-86f2-41a6-8230-f015466bf791 10.198.75.60:51395 broker=http,protocol=grpc,registry=mdns,server=grpc,transport=grpc Endpoint: Greeter.Hello Request: { message_state MessageState { no_unkeyed_literals NoUnkeyedLiterals do_not_compare DoNotCompare do_not_copy DoNotCopy message_info MessageInfo } int32 int32 unknown_fields []uint8 name string } Response: { message_state MessageState { no_unkeyed_literals NoUnkeyedLiterals do_not_compare DoNotCompare do_not_copy DoNotCopy message_info MessageInfo } int32 int32 unknown_fields []uint8 greeting string }
注意看里面的 IP 地址,注册到了 10.198.xx 去了,因此才会报错???
因此在注册服务的时候,指定 IP 地址
go run server.go greeter.pb.go greeter.pb.micro.go --server_address=localhost:8888
这个时候再用 client 调用就不会出错了。
$ go run client.go greeter.pb.go greeter.pb.micro.goHello Zaun pianist
更多相关文章
- windows10下编译go项目为linux可执行文件
- 分享5种文件变更时自动重载Go程序的方法
- 分享golang实现文件传输小demo
- 详解Golang编译成DLL文件
- 两个Golang超大文件读取的方案
- go-carbon1.2.5版本发布,新增两个互转方法!
- go语言删除文件的方法
- XML文件结构和基本语法
- JS解析XML文件和XML字符串详解