micro是一个工具集,用来帮助开发者创建和管理微服务。它包括两部分:
另外go-plugins作为一组插件,在开发过程中也是必要的。通过插件,我们在服务发现、异步消息和传输协议等方面有了更多的选择。
go-micro的设计目标是简化微服务的开发和分布式系统的创建。
在golang 1.14以后需要使用如下命令进行micro的安装:
export GO111MODULE=on
go get github.com/micro/micro/v2
在安装结束后,如下命令可以确认安装是否正确完成:
micro --version
如果显示如下信息,则可确认micro已经正确安装:
在成功安装了micro后,我们就可以进行微服务的开发了。
作为开发的第一步,我们可以使用如下命令创建一个项目:
micro new helloworld --namespace=com.pera --gopath=false
在我们执行完项目创建命令后,micro会给我们生成如下结构的项目文件:
在成功创建项目后,需要使用如下命令,安装项目需要的依赖:
go get -u github.com/golang/protobuf/{proto,protoc-gen-go}
export GO111MODULE=on
go get -u github.com/micro/protoc-gen-micro/v2
go get github.com/micro/go-micro/[email protected]
在使用micro创建的项目中会有一个Makefile文件,在此文件中包括了一些常用的任务,我们可以使用make命令来编译和运行项目:
make build && ./helloworld-service
一个服务的具体启动过程可以参考main.go文件:
package main
import (
log "github.com/micro/go-micro/v2/logger"
"github.com/micro/go-micro/v2"
"helloworld/handler"
"helloworld/subscriber"
helloworld "helloworld/proto/helloworld"
)
func main() {
// New Service
service := micro.NewService(
micro.Name("go.micro.service.helloworld"),
micro.Version("latest"),
)
// Initialise service
service.Init()
// Register Handler
helloworld.RegisterHelloworldHandler(service.Server(), new(handler.Helloworld))
// Register Struct as Subscriber
micro.RegisterSubscriber("go.micro.service.helloworld", service.Server(), new(subscriber.Helloworld))
// Run service
if err := service.Run(); err != nil {
log.Fatal(err)
}
}
从main.go文件可以清楚的看到,一个服务的启动包括了如下三个过程:
// New Service
service := micro.NewService(
micro.Name("go.micro.service.helloworld"),
micro.Version("latest"),
)
我们使用NewService(opts …Option) Service方法来创建一个服务。这个方法可以接收多个Option作为参数,然后返回一个service实例。
通过Option我们可以控制service的行为。
在我们创建完服务实例后,就可以通过如下代码对服务进行初始化:
// Initialise service
service.Init()
服务的Init()方法可以接收和NewService()同样的参数。
在这个阶段实际上服务的实例已经创建完成,所以我们可以通过如下方式,获取实例的基本信息。如获取服务器的元数据信息:
// Initialise service
service.Init(micro.AfterStart(func() error {
log.Infof("server's meta: %v\n", service.Options().Server.Options().Metadata)
return nil
}))
// Register Handler
helloworld.RegisterHelloworldHandler(service.Server(), new(handler.Helloworld))
// Register Struct as Subscriber
micro.RegisterSubscriber("go.micro.service.helloworld", service.Server(), new(subscriber.Helloworld))
只有在注册完业务逻辑处理器后,我们的服务才能真正的对外提供业务能力。
通常有两种典型的操作:
if err := service.Run(); err != nil {
log.Fatal(err)
}
到这里,服务就真正的运行起来了。
在我们启动项目后,在命令行中我们可以看到http的监听端口是62674,我们可以通过这个端口访问我们的服务了。
在我们启动了一个服务后,我们可以通过micro命令行工具监控和操作这些服务。
我们可以执行micro web命令,显示如下信息:
从上面的信息,我们可以看到我们有个服务运行在本地,并监听8082接口。
这样我们可以访问http://localhost:8082/service/go.micro.service.helloworld,显示如下页面:
在这个web看板里,我们可以看到服务的不同信息:
通过micro web我们可以很容易的查看服务的相关信息。这些服务信息的获取是依赖于服务发现的。
在缺省情况下,micro的服务发现是基于mDNS的,所以只要在同一个局域网内,服务都是可发现和注册的。
注意
8082是一个缺省值,我们可以通过环境变量或命令行参数修改需要监听的端口值。