最近接了一个项目,需要用到go微服务架构开发,由于本人是初次接触go语言,也是第一次自己搭建实现微服务框架,故对其实现细节先不进行深入解析,仅记录基本开发步骤。
在经过一段时间的初步调研,决定选择go-micro为本次的开发框架,go-micro的基本原理网上有很多资料,再此就不过多阐述。想要了解的可以访问micro文档,其基本框架可以引用官方的一个框架图说明:
其中各个子模块的说如下:
其中除了Service,其他都是可插拔的。
编译安装好go-micro,可运行 micro new 项目名称 自动创建项目,其运行结果如下:
需要注意的是用这次方式创建的默认通信为RPC(只支持POST请求),关于这方面的知识后面再说。
打开test.proto,可看到如下自动生成的接口:
syntax = "proto3";
package go.micro.srv.test;
service Test {
rpc Call(Request) returns (Response) {}
rpc Stream(StreamingRequest) returns (stream StreamingResponse) {}
rpc PingPong(stream Ping) returns (stream Pong) {}
}
message Message {
string say = 1;
}
message Request {
string name = 1;
}
message Response {
string msg = 1;
}
message StreamingRequest {
int64 count = 1;
}
message StreamingResponse {
int64 count = 1;
}
message Ping {
int64 stroke = 1;
}
message Pong {
int64 stroke = 1;
}
进入项目目录下,如这里创建的项目为test,进入test目录下,运行 protoc --proto_path=. --go_out=. --micro_out=. proto/test/test.proto,即可自动生成相关代码。
由于默认使用的服务发现为mDNS,故需要修改其方式,代码如下:
package main
import (
"github.com/micro/go-micro/util/log"
"github.com/micro/go-micro"
"test/handler"
"test/subscriber"
test "test/proto/test"
"github.com/micro/go-micro/registry"
"github.com/micro/go-micro/registry/consul"
)
func main() {
// New Service
reg := consul.NewRegistry(func(op *registry.Options) {
op.Addrs = []string{
"127.0.0.1:8500",
}
})
// New Service
service := micro.NewService(
micro.Registry(reg),
micro.Name("go.micro.srv.test"),
micro.Version("latest"),
)
// Initialise service
service.Init()
// Register Handler
test.RegisterTestHandler(service.Server(), new(handler.Test))
// Register Struct as Subscriber
micro.RegisterSubscriber("go.micro.srv.test", service.Server(), new(subscriber.Test))
// Register Function as Subscriber
micro.RegisterSubscriber("go.micro.srv.test", service.Server(), subscriber.Handler)
// Run service
if err := service.Run(); err != nil {
log.Fatal(err)
}
}
go-micro目前默认的服务发现方式是mDNS,想简单入门可以选择consul方式,安装配置好之后可输入下列方式启动:
consul agent -dev -ui -node=consul-dev -client=127.0.0.1
再启动micro api(选择RPC方式):
micro --registry_address=127.0.0.1:8500 --register_interval=5 --register_ttl=10 --registry=consul --api_handler=rpc --api_namespace=go.micro.srv api
此时,运行程序,就可以通过 http://127.0.0.1:8080/test/Call 的方式调用接口,运行结果如下: