通过micro命令生成的hello微服务项目布局如下:
.
├── main.go
├── generate.go
├── plugin.go
├── proto/hello
│ └── hello.proto
│ └── hello.pb.go
│ └── hello.pb.micro.go
├── handler
│ └── hello.go
├── subscriber
│ └── hello.go
├── Dockerfile
├── go.mod
├── go.sum
├── Makefile
└── README.md
这是项目中的文件列表:
注意:该文件夹proto具有特殊含义。尽管没有技术限制,但按照Micro的约定proto,每个项目的根目录中的文件夹用于存储“接口”文件。这既包括项目需要向外界公开的接口,也包括项目所依赖的其他接口。例如,假设我们需要依赖另一个服务foo来实现业务逻辑。然后,我们将创建一个名为proto/foo的文件夹,并在其中放置三个文件foo.proto,foo.pb.go,foo.pb.micro.go。
看看main.go来了解下程序的启动过程。
package main
//导入依赖关系
import (
"github.com/micro/go-micro/util/log"
"github.com/micro/go-micro"
"hello/handler"
"hello/subscriber"
hello "hello/proto/hello"
)
func main() {
// New Service创建和初始化服务
service := micro.NewService(
micro.Name("com.foo.srv.hello"),
micro.Version("latest"),
)
// Initialise service
service.Init()
// Register Handler注册业务处理程序
hello.RegisterHelloHandler(service.Server(), new(handler.Hello))
// Register Struct as Subscriber
micro.RegisterSubscriber("com.foo.srv.hello", service.Server(), new(subscriber.Hello))
// Register Function as Subscriber
micro.RegisterSubscriber("com.foo.srv.hello", service.Server(), subscriber.Handler)
// Run service运行服务
if err := service.Run(); err != nil {
log.Fatal(err)
}
}
该代码大致分为4部分,分别是导入依赖关系,创建和初始化服务,注册业务处理程序以及运行服务。
micro微服务的25个option
因此,通过指定适当的Option,可以高度定制服务的行为。比如修改TTL为5分钟:
...
// New Service
service := micro.NewService(
micro.Name("foo.bar"),
micro.Version("v1.0"),
// change default TTL value
micro.RegisterTTL(5 * time.Minute),
...
)
...
注意:可以通过多种方法指定上述大多数选项。在源文件中进行硬编码只是其中一种方法。实际上,Micro建议用户通过环境变量指定选项,因为这样可以提供更大的灵活性。以micro.RegisterTTL作为一个例子,我们可以通过将环境变量在运行时指定它$ MICRO_REGISTER_TTL=value或命令行标记 –register_ttl=value(单位是秒)。这些内置选项目前没有文档。运行./hello-srv -h将显示它们的简要说明。如果您想了解完整的细节,请查看newCmd的源代码。
创建后,您可以初始化服务:
// Initialize service
service.Init()
该service.Init方法与micro.NewService一样,可以接受参数。因此,以上25个选项也可以在service.Init中使用。它们具有相同的效果,只是时间点不同。
由于此时已创建了服务,因此我们可以从服务实例中检索信息。例如,您可以读取随机端口:
// Initialize service
service.Init(
// print log after start
micro.AfterStart(func() error {
log.Infof("service listening on %s!",
service.Options().Server.Options().Address,
)
return nil
}),
)
// Register Handler
hello.RegisterHelloHandler(service.Server(), new(handler.Hello))
// Register Struct as Subscriber
micro.RegisterSubscriber("com.foo.srv.hello", service.Server(), new(subscriber.Hello))
// Register Function as Subscriber
micro.RegisterSubscriber("com.foo.srv.hello", service.Server(), subscriber.Handler)
只有在Handler注册后,我们的业务代码才能真正为外界提供服务。以下是三种典型的注册操作:
if err := service.Run(); err != nil {
log.Fatal(err)
}
命令行工具micro可用于在运行时检查和操作服务。
服务启动后,运行micro web:
$ micro web
2020/01/15 18:13:25 : [web] HTTP API Listening on [::]:8082
2020/01/15 18:13:25 : [web] Transport [http] Listening on [::]:59005
2020/01/15 18:13:25 : [web] Broker [http] Connected to [::]:59006
2020/01/15 18:13:25 : [web] Registry [mdns] Registering node: go.micro.web-950a8b2b-003d-47c1-a512-53aedebc9d12
服务器正在监听本地主机的端口8082。 端口8082是默认值,可以通过环境变量或命令行标志进行修改。运行micro web -h以获取详细信息。 然后访问http://localhost:8082查看服务状态。
http://localhost:8082
也可以访问下面这个地址:
http://localhost:8082/service/go.micro.srv.microtry
带着使命来到世上的你,给他人提供价值,才有价值