Micro中有micro new命令可以快速生成Micro风格的服务模板。本目录没有代码,主要是想让大家手动生成亲眼看一下效果。
使用micro new很简单,我们先看一下它的使用方法
$ micro new -h
NAME:
micro new - Create a service template
USAGE:
micro new [command options] [arguments...]
OPTIONS:
--namespace value Namespace for the service e.g com.example (default: "go.micro")
--type value Type of service e.g api, fnc, srv, web (default: "srv")
--fqdn value FQDN of service e.g com.example.srv.service (defaults to namespace.type.alias)
--alias value Alias is the short name used as part of combined name if specified
--plugin value Specify plugins e.g --plugin=registry=etcd:broker=nats or use flag multiple times
--gopath Create the service in the gopath. Defaults to true.
当我们创建新服务时,有两点我们要确认
| 配置指令 | 作用 | 默认值 | 说明 |
|---|---|---|---|
| --namespace | 服务命令空间 | go.micro | |
| --type | 服务类型 | srv | 目前支持4种服务类型,分别是api、fnc(function)、srv(service)、web。 |
其它选项都是可配可不配,一般使用默认即可
| 配置指令 | 作用 | 默认值 | 说明 |
|---|---|---|---|
| --fqdn | 服务定义域,API需要通过该域找到服务 | 默认是使用服务的命令空间加上类型再加上别名 | |
| --alias | 指定别名 | 声明则必填 | 使用单词,不要带任何标点符号,名称对Micro路由机制影响很大 |
| --plugin | 使用哪些插件 | 声明则必填 | 需要自选插件时使用 |
| --gopath | 是否使用GOPATH作为代码路径 | true |
micro new github.com/micro-in-cn/tutorials/examples/middle-practices/micro-new/example可以看到指令参数只有生成服务代码的路径,路径最后一个单词就是服务项目名,所以,最后一个单词一定不要加任何符号!:
Creating service go.micro.srv.example in /Users/me/workspace/go/src/github.com/micro-in-cn/tutorials/examples/middle-practices/micro-new/example
.
├── main.go
├── plugin.go
├── handler
│ └── example.go
├── subscriber
│ └── example.go
├── proto/example
│ └── example.proto
├── Dockerfile
├── Makefile
└── README.md
## 下面是提示要安装protobuf和使用protobuf指令生成类文件,已经安装有了protobuf可以忽略,直接切到项目目录,再执行protoc指令
download protobuf for micro:
brew install protobuf
go get -u github.com/golang/protobuf/{proto,protoc-gen-go}
go get -u github.com/micro/protoc-gen-micro
compile the proto file example.proto:
## 切目录,生成文件
cd /Users/me/workspace/go/src/github.com/micro-in-cn/tutorials/examples/middle-practices/micro-new/example
protoc --proto_path=. --go_out=. --micro_out=. proto/example/example.proto
如果是ubuntu系统生成的protoc命令为: protoc --proto_path=.:$GOPATH/src --go_out=. --micro_out=. proto/example/example.proto
- *需要有个说明的地方,当前实例micro的版本是1.13.0,如果安装的是之前的版本生成的项目模板或许会有些许差异。
生成的代码中,命令空间前缀为默认的go.micro,默认的服务类型为srv,服务别名(alias)为example
package main
// ...
func main() {
// New Service
service := micro.NewService(
micro.Name("go.micro.srv.example"),
micro.Version("latest"),
)
// ...
}现在我们演示使用--namespaceflag指定自己的命名空间,大家可以根据自己的域名定义合适的空间前缀,我们用micro官网的域名mu.micro代替
micro new --namespace=mu.micro github.com/micro-in-cn/tutorials/examples/middle-practices/micro-new/namespace生成成功的消息与上面一样,不赘述,我们重点看下服务main方法内容:
package main
// ...
func main() {
// New Service
service := micro.NewService(
micro.Name("mu.micro.srv.namespace"),
micro.Version("latest"),
)
// ...
micro.RegisterSubscriber("mu.micro.srv.namespace", service.Server(), new(subscriber.Namespace))
// Register Function as Subscriber
micro.RegisterSubscriber("mu.micro.srv.namespace", service.Server(), subscriber.Handler)
// ...
}可以看到服务前缀由默认的go.micro改成了mu.micro,其它结构内容一致
上面两个例子生成的都是默认的服务类型srv,现在我们演示指定为api类型。
micro new --type=api github.com/micro-in-cn/tutorials/examples/middle-practices/micro-new/apiTypepackage main
// ...
func main() {
// New Service
service := micro.NewService(
micro.Name("go.micro.api.apiType"),
micro.Version("latest"),
)
// Initialise service
service.Init(
// create wrap for the ApiType srv client
micro.WrapHandler(client.ApiTypeWrapper(service)),
)
// Register Handler
apiType.RegisterApiTypeHandler(service.Server(), new(handler.ApiType))
// Run service
if err := service.Run(); err != nil {
log.Fatal(err)
}
}如生成的代码所示,服务名中的类型部分变成了api。
需要注意的是Handler目录下的接口类,它的接口文件目录需要我们手动生成后复制进来
import (
// ...
apiType "path/to/service/proto/apiType"
)安装grpc工具链及protoc,参考
生成接口文件
protoc --proto_path=.:$GOPATH/src --go_out=. --micro_out=. proto/apiType/apiType.proto然后我们就可以看到在proto/apiType/ 目录下生成了我们需要的接口文件:
└── proto
└── apiType
├── apiType.micro.go
├── apiType.pb.go
└── apiType.proto
现在可以复制proto/apiType的相对GOPATH目录,然后把path/to/service/proto/apiType换成github.com/micro-in-cn/tutorials/examples/middle-practices/micro-new/apiType/proto/apiType。
如果服务类型是srv则Handler目录下的接口类的引入路径则无需要做此修改。
有些时候我们想要个性化的定义域,那么我们就可以指定--fqdn参数来声明。所谓定义域,默认情况下,服务全名就是命名空间+服务类型+服务名的组合,一旦设定--fqdn,它的值会替换默认值的组合。
下面我们把服务命名改为mu.micro.fqdn.more
micro new --fqdn=mu.micro.fqdn.more github.com/micro-in-cn/tutorials/examples/middle-practices/micro-new/fqdnpackage main
// ...
func main() {
// New Service
service := micro.NewService(
micro.Name("mu.micro.fqdn.more"),
micro.Version("latest"),
)
// ..
// Register Struct as Subscriber
micro.RegisterSubscriber("mu.micro.fqdn.more", service.Server(), new(subscriber.Fqdn))
// Register Function as Subscriber
micro.RegisterSubscriber("mu.micro.fqdn.more", service.Server(), subscriber.Handler)
// ...
}或许有朋友会问,那--namespace和--fqdn起使用会怎么样,有兴趣的同学可以试试,这属于比较偏门且不正经的情况,我们不考虑。
前面有提到路径最后一个单词就是服务项目名,或叫服务名。有时候我们不想让目录这个单词变成我们的服务名,比如下面的micro,我们想换成orcim,那我们就可以传入--alias指令。
micro new --alias=orcim github.com/micro-in-cn/tutorials/examples/middle-practices/micro-new/micropackage main
// ...
func main() {
// New Service
service := micro.NewService(
micro.Name("go.micro.srv.orcim"),
micro.Version("latest"),
)
// ...
// Register Struct as Subscriber
micro.RegisterSubscriber("go.micro.srv.orcim", service.Server(), new(subscriber.Orcim))
// Register Function as Subscriber
micro.RegisterSubscriber("go.micro.srv.orcim", service.Server(), subscriber.Handler)
// ...
}生成的代码中,服务名已经由micro变成我们设置的orcim。
我们演示使用etcd插件和kafka插件
micro new --plugin=registry=etcd:broker=kafka github.com/micro-in-cn/tutorials/examples/middle-practices/micro-new/pluginpackage main
import (
_ "github.com/micro/go-plugins/registry/etcd"
_ "github.com/micro/go-plugins/broker/kafka"
)在刚才的指令中我们声明注册中心使用etcd、broker消息代理使用kafka,然后new模板就会生成plugin.go文件,里面包含上面的代码。
Micro new目前不支持自定义module目录,且Golang 1.11版本的modules现在还不100%成熟,大家就先默默使用GOPATH。