最近因为要用到 go-micro,所以在学习微服务相干的内容,这一篇是记录 micro 的搭建过程。
装置环境
micro 提供了一个 runtime,在应用 go-micro 之前须要先装置它。有以下几种形式装置
源码
go get github.com/micro/micro/v2
这种形式我装不上,不是网络的起因,不晓得哪里有抵触。。。
docker
docker pull micro/micro
二进制
# MacOS
curl -fsSL https://raw.githubusercontent.com/micro/micro/master/scripts/install.sh | /bin/bash
# Linux
wget -q https://raw.githubusercontent.com/micro/micro/master/scripts/install.sh -O - | /bin/bash
# Windows
powershell -Command "iwr -useb https://raw.githubusercontent.com/micro/micro/master/scripts/install.ps1 | iex"
举荐应用这种形式下载安装,把编译好的二进制包增加到环境变量就能间接应用了。不想用脚本装置能够在 github 的 release 页面下载
https://github.com/micro/micro/releases
测试一下
当初曾经装置好 micro 了,测试一下。
micro web
输入
$ micro web
2020-07-05 04:24:16 file=http/http.go:90 level=info service=web HTTP API Listening on [::]:8082
2020-07-05 04:24:16 file=v2@v2.9.1/service.go:200 level=info service=web Starting [service] go.micro.web
2020-07-05 04:24:16 file=grpc/grpc.go:864 level=info service=web Server [grpc] Listening on [::]:26449
2020-07-05 04:24:16 file=grpc/grpc.go:697 level=info service=web Registry [mdns] Registering node: go.micro.web-b76a12a1-5226-429f-9633-ce304f179657
当初拜访 localhost:8082
就能够查看 micro 的 web 页面了。
装置 protoc
protoc 是 protobuf 的编译器,而 protobuf 是一种用来传输数据的格局,相似 json、xml 这些。
protoc 下载地址
https://github.com/protocolbuffers/protobuf/releases
下载好之后,bin 文件夹中有个 protoc 的可执行文件,把这个也增加到环境变量。(能够间接把它放到曾经增加了环境变量的文件夹下就能够了,能够防止电脑里写满了各种环境变量,并且常用工具放到一个文件夹也方便管理)
还有个 protoc-gen-go 也须要放进去,能够用上面的形式下载。
go get -u github.com/golang/protobuf/proto
go 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 main
import (
"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 main
import (
"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 hello
go 1.14
require (
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 services
go.micro.web
greeter
测试
当初能够运行客户端来测试一下了
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.go
Hello Zaun pianist
公众号:没有幻想的阿巧 后盾回复 “ 群聊 ”,一起学习,一起提高