参考文档
go-micro开发文档:https://micro.mu/docs/framework.html
protobuf开发文档:https://developers.google.com/protocol-buffers/
环境配置
安装protobuf:https://github.com/protocolbuffers/protobuf
安装protobuf-gen-go: https://github.com/golang/protobuf
安装protobuf-gen-micro: https://github.com/micro/protoc-gen-micro
set GO111MODULE=on
set GOPROXY=https://goproxy.cn,direct
go get -u -v github.com/golang/protobuf/protoc-gen-go
go get -u -v github.com/micro/protoc-gen-micro
契约编写
定义protobuf文件
syntax = "proto3";
service Greeter {
rpc Hello(Request) returns (Response) {}
}
message Request {
string name = 1;
}
message Response {
string greeting = 2;
}
生成golang的接口文件
protoc.exe --proto_path=. --micro_out=. --go_out=. greeter.proto
服务编写
签发证书
mkdir ca
openssl genrsa -out ca/ca-key.pem 1024
openssl req -new -out ca/ca-req.csr -key ca/ca-key.pem -subj "/C=CN/ST=guangdong/L=shenzhen/O=company/OU=section/CN=root"
openssl x509 -req -in ca/ca-req.csr -out ca/ca-cert.pem -signkey ca/ca-key.pem -days 3650
mkdir server
openssl genrsa -out server/server-key.pem 1024
openssl req -new -out server/server-req.csr -key server/server-key.pem -subj "/C=CN/ST=guangdong/L=shenzhen/O=company/OU=section/CN=xxx.yyy.com"
openssl x509 -req -in server/server-req.csr -out server/server-cert.pem -signkey server/server-key.pem -CA ca/ca-cert.pem -CAkey ca/ca-key.pem -CAcreateserial -days 3650
mkdir client
openssl genrsa -out client/client-key.pem 1024
openssl req -new -out client/client-req.csr -key client/client-key.pem -subj "/C=CN/ST=guangdong/L=shenzhen/O=company/OU=CNCF/CN=example.com"
openssl x509 -req -in client/client-req.csr -out client/client-cert.pem -signkey client/client-key.pem -CA ca/ca-cert.pem -CAkey ca/ca-key.pem -CAcreateserial -days 3650
安装nats-server
下载nats-server https://nats.io/download/nats-io/nats-server/
nats-server 集群模式可选两种建立模式。
- 启动一个Seed节点,其他节点连上Seed节点后,自动获取其他节点的路由信息。
- 每一个节点启动的时候都配置其他节点的信息,节点启动后主动互相连接。
var qouta = []byte(`"`)
func (j *jsonValue) Bytes() []byte {
b, err := j.Json.Bytes()
if err != nil {
// try return marshalled
b, err = j.Json.MarshalJSON()
if err != nil {
return []byte{}
}
return b
}
return bytes.Join([][]byte{qouta,b,qouta},[]byte(""))
}