go-go-micro微服务框架记录
代码实践仓库: https://github.com/yangxuan0261/GoMicro
fork 官方 examples: https://github.com/yangxuan0261/examples
架构图:
常见的微服务架构图. 出处
参考: https://gitissue.com/issues/5a20634a9a954719b8dd694e - Q: micro 在 创建并运行之后 时,各个 options/plugin 的默认值是什么?
各个 option/plugin 的默认值是:
参考: Go_go-micro入门示例.md, 会生成一个可执行程序
go get -v -u github.com/micro/micro // micro工具包
λ micro list services
user
λ micro get service user
service user
version 2019.09.28.03.28
ID Address Metadata
user-bf42f3a1-d870-45a6-9c9e-18ba99279dd5 192.168.1.190:59462 registry=mdns,server=mucp,transport=http,broker=http,protocol=mucp
version 2019.09.28.02.04
ID Address Metadata
user-d9a8a8db-28c6-424f-ab2a-843f80049cea 192.168.1.190:53802 broker=http,protocol=mucp,registry=mdns,server=mucp,transport=http
Endpoint: User.Hello
Metadata: stream=false
Request: {
name string
}
Response: {
msg string
}
F:\a_link_workspace\go\GoWinEnv_Test01 (master -> origin)
λ micro web // 指令
2019/09/28 15:23:02 HTTP API Listening on [::]:8082 // 默认端口
2019/09/28 15:23:02 Transport [http] Listening on [::]:60676
2019/09/28 15:23:02 Broker [http] Connected to [::]:60677
2019/09/28 15:23:02 Registry [mdns] Registering node: go.micro.web-4832fb75-d027-4b66-a420-09abae8e6ecb
然后打开 http://localhost:8082/registry 就能访问已有的服务
点击 user 查看服务的具体信息
用于 负载均衡, 选择节点
参考 github.com/micro/examples/client/dc_selector/dc_selector.go 中的代码
请求拦截, 鉴权等, 合法才调用对应的请求
参考: src/github.com/micro/examples/wrapper
内置支持的几种传输方式在
github.com/micro/go-micro/transport
目录下
默认使用的是 http 作为传输层, 直接 run 一个空服务就可以看出来
f:\a_link_workspace\go\GoWinEnv_Test01\src\GoMicro\test001\srv (master -> origin)
$ go run service.go
2019/10/08 19:46:32 Transport [http] Listening on [::]:58351 // 这里可以看出来
2019/10/08 19:46:32 Broker [http] Connected to [::]:58352
2019/10/08 19:46:32 Registry [mdns] Registering node: user-0f5e2541-bfb2-47a4-a645-e2199a33a2c0
要求 client - server 必须同时 grpc 方式传输, 否则调用不到
使用非常简单
import (
"github.com/micro/go-micro/transport/grpc" // 引入 grpc
)
func main() {
service := micro.NewService(
...
micro.Transport(grpc.NewTransport()), // Transport 指定为 grpc
)
}
启动是就可以看到 transport 使用的 grpc
$ go run service.go
2019/10/08 19:53:58 Transport [grpc] Listening on [::]:58927 // grpc
2019/10/08 19:53:58 Broker [http] Connected to [::]:58928
2019/10/08 19:53:58 Registry [mdns] Registering node: user-0c12feb1-56b4-4496-a743-f22cc4ebd8ac
--- req, name:World ^_^
参考: test_broker_grpc
import (
"github.com/micro/go-plugins/broker/grpc"
)
var grpcBroker broker.Broker
func main() {
cmd.Init()
grpcBroker = grpc.NewBroker()
if err := grpcBroker.Init(); err != nil {
log.Fatalf("Broker Init error: %v", err)
}
if err := grpcBroker.Connect(); err != nil {
log.Fatalf("Broker Connect error: %v", err)
}
go sub()
service := micro.NewService(
micro.Name("test_broker_grpc_consumer"),
micro.Broker(grpcBroker),
)
...
}
build 或 run 报错: go: xxx requires
需要在 GOPATH 目录下使用命令 build 或 run
E:\ws_go\GoWinEnv (master -> origin) $ go build -o mainWithEtcdv3.exe ./src\github.com\micro\micro/main.go ./src\github.com\micro\micro/plugins.go
verifying ‘protobuf’ malformed record data
错误:
verifying github.com/gogo/[email protected]/go.mod: github.com/gogo/[email protected]/go.mod: malformed record data
可能引用的版本不对. 参考: https://github.com/golang/go/issues/34394
在 go.mod 文件中, 替换合法的版本
replace github.com/gogo/protobuf v0.0.0-20190410021324-65acae22fc9 => github.com/gogo/protobuf v0.0.0-20190723190241-65acae22fc9d