1.什么是Micro?
Micro是云原生开发框架, 解决了构建云原生服务的主要需求点。利用microservices架构模式Micro解决了分布式系统的复杂性,并提供了更简单的可编程抽象作为基础。并提供了一组服务,作为平台的构建模块。
技术是不断发展的,基础设施栈也在一直变化。Micro是一个可插拔的基础和可在其上构建的严格定义的api来解决这些问题的平台。可在任何堆栈或云环境下插拔使用。
2. 主要组成
Micro的关键组件如下:
Server:分布式系统runtime由构建模块服务组成,这些服务对基础结构进行抽象并提供可编程的抽象层。
Clients:多个入口点,通过这些入口点可以访问您的服务。编写服务一次,并通过您已经知道的所有方法对其进行访问。HTTP api,gRPC代理或者命令行界面
Library:Go库使编写服务变得简单,而不必拼凑一行行代码。默认情况下自动配置和初始化,只需导入即可快速上手。
Plugins:Micro是与运行时和基础架构无关的。每个基础构建块服务都使用Go Micro标准库来提供可插入的基础。我们通过预先初始化本地使用和云计算来简化使用。
Service:
auth:身份验证和授权是任何生产就绪平台的核心需求。Micro内置了一个身份验证服务,用于管理服务到服务和用户到服务的身份验证。
broker:允许异步消息传递的消息代理。微服务是事件驱动的体系结构,应该作为第一类公民提供消息传递。将事件通知其他服务,而无需担心响应。
config: 在一个集中的位置管理动态配置,以便您的服务访问。能够从多个源加载配置,使您能够更新配置而无需重新启动服务。
debug:内置用于调试的统计信息、日志和跟踪信息的聚合。调试服务提取所有服务的信息,以帮助从一个位置了解系统的总体范围。
network: 服务到服务联网解决方案的下降。将服务发现、负载平衡和容错的负载分配给网络。微网络根据本地注册表动态地构建一个基于延迟的路由表。它包括对多云网络的支持。
registry: 注册中心提供服务发现以定位其他服务,存储功能丰富的元数据和端点信息。它是一个服务浏览器,可以让你在运行时集中和动态地存储这些信息。
runtime: 服务运行时,它管理服务的生命周期,从服务开始运行。运行时服务可以本地运行,也可以在kubernetes上运行,提供了跨两者的无缝抽象。
store: 状态是任何系统的基本要求。我们提供了键值存储来提供状态的简单存储,这些状态可以在服务之间共享,或者长期卸载以保持微服务的无状态和水平可伸缩。
要编写运行在Micro上的应用程序,你可以使用Go Micro框架。
go-micro: 利用强大的Go微框架轻松快速地开发微服务。Go Micro消除了分布式系统的复杂性,并提供了更简单的抽象来构建高度可扩展的微服务。
3.快速开始
安装
使用go:goinstallgithub.com/micro/micro/v3或者下载二进制文件#MacOScurl-fsSLhttps://raw.githubusercontent.com/micro/micro/master/scripts/install.sh|/bin/bash#Linuxwget-qhttps://raw.githubusercontent.com/micro/micro/master/scripts/install.sh-O-|/bin/bash#Windowspowershell-Command"iwr-usebhttps://raw.githubusercontent.com/micro/micro/master/scripts/install.ps1|iex"
当然了,想在docker
中使用micro也是可以的
dockerpullmicro/micro
会使用最新版本的micro
运行一个服务
#1.第一步我们需要启动我们的servermicroserver#1.在docker环境下我们可以运行下面的命令
dockerrunmicro/microserver#此时可以看到运行该命令输出的日志2020-09-2308:49:21file=user/user.go:54level=infoSettingupconfigkeyto/root/.micro/config_secret_key2020-09-2308:49:21file=user/user.go:45level=infoLoadingconfigkeyfrom/root/.micro/config_secret_key2020-09-2308:49:21file=user/user.go:80level=infoLoadingkeys/root/.micro/id_rsaand/root/.micro/id_rsa.pub2020-09-2308:49:21file=user/user.go:99level=infoSettingupkeysforJWTat/root/.micro/id_rsaand/root/.micro/id_rsa.pub2020-09-2308:49:24file=server/server.go:110level=infoStartingserver2020-09-2308:49:24file=server/server.go:121level=infoRegisteringnetwork2020-09-2308:49:24file=server/server.go:121level=infoRegisteringruntime2020-09-2308:49:24file=server/server.go:121level=infoRegisteringregistry2020-09-2308:49:24file=server/server.go:121level=infoRegisteringconfig2020-09-2308:49:24file=server/server.go:121level=infoRegisteringstore2020-09-2308:49:24file=server/server.go:121level=infoRegisteringbroker2020-09-2308:49:24file=server/server.go:121level=infoRegisteringevents2020-09-2308:49:24file=server/server.go:121level=infoRegisteringauth2020-09-2308:49:24file=server/server.go:121level=infoRegisteringproxy2020-09-2308:49:24file=server/server.go:121level=infoRegisteringapi2020-09-2308:49:24file=server/server.go:186level=infoStartingserverruntime2020-09-2308:49:25file=service/service.go:195level=infoStarting[service]server2020-09-2308:49:25file=grpc/grpc.go:902level=infoServer[grpc]Listeningon[::]:100012020-09-2308:49:25file=grpc/grpc.go:732level=infoRegistry[mdns]Registeringnode:server-b4a865a4-cab0-4d1d-93f5-83ea83ea10dc
在另外的命令行终端下
##使用默认的账号登录micro#用户名:admin密码:micromicrologin#2.在docker环境下我们可以运行下面的命令dockerexec-it7184a69ac6cc(此值为容器id)/micrologin#现在就可以跑我们的hellworld服务了microrungithub.com/micro/services/helloworld#3.在docker环境下我们可以运行下面的命令dockerexec-it7184a69ac6cc/microrungithub.com/micro/services/helloworld
我们可以通过如下命令来查看服务运行的输出日志
micrologshelloworld#在docker环境下我们可以运行下面的命令dockerexec-it7184a69ac6cc/micrologshelloworld.0-20200526211855-cb27e3aa2013go:findinggithub.com/micro/micro/v3v3.0.0-beta.4.0.20200921154750-68282c70c194go:findinggithub.com/micro/go-micro/v3v3.0.0-beta.2.0.20200921154545-9dbd75f2cc13go:findinggithub.com/google/uuidv1.1.2go:findinggoogle.golang.org/protobufv1.25.0go:findinggithub.com/oxtoacart/bpoolv0.0.0-20190530202638-03653db5a59cgo:findinggithub.com/miekg/dnsv1.1.27go:findinggolang.org/x/cryptov0.0.0-20200709230013-948cd5f35899go:findinggolang.org/x/netv0.0.0-20200707034311-ab3426394381go:findinggolang.org/x/sysv0.0.0-20200625212154-ddb9806d33aego:findinggolang.org/x/textv0.3.3go:findinggithub.com/stretchr/testifyv1.6.1go:findinggithub.com/davecgh/go-spewv1.1.1go:findinggithub.com/pmezard/go-difflibv1.0.0go:findinggopkg.in/yaml.v3v3.0.0-20200313102051-9f266ea9e77cgo:findinggithub.com/blang/semverv3.5.1+incompatiblego:findinggithub.com/hashicorp/go-versionv1.2.1go:findinggithub.com/bitly/go-simplejsonv0.5.0go:findinggithub.com/juju/fslockv0.0.0-20160525022230-4d5c94c67b4bgo:findinggithub.com/urfave/cli/v2v2.2.0go:findinggithub.com/cpuguy83/go-md2man/v2v2.0.0go:findinggithub.com/russross/blackfriday/v2v2.0.1go:findinggithub.com/shurcooL/sanitized_anchor_namev1.0.0go:findinggithub.com/dgrijalva/jwt-gov3.2.0+incompatiblego:findinggoogle.golang.org/grpcv1.26.0go:findinggoogle.golang.org/genprotov0.0.0-20200526211855-cb27e3aa2013go:findinggithub.com/patrickmn/go-cachev2.1.0+incompatiblego:findinggithub.com/pkg/errorsv0.9.1go:findinggithub.com/hpcloud/tailv1.0.0go:findinggopkg.in/fsnotify.v1v1.4.7go:findinggopkg.in/tomb.v1v1.0.0-20141024135613-dd632973f1e7go:findinggithub.com/teris-io/shortidv0.0.0-20171029131806-771a37caa5cfgo:findinggithub.com/xanzy/go-gitlabv0.35.1go:findinggithub.com/google/go-querystringv1.0.0go:findinggithub.com/hashicorp/go-cleanhttpv0.5.1go:findinggithub.com/hashicorp/go-retryablehttpv0.6.4go:findinggolang.org/x/oauth2v0.0.0-20190604053449-0f29369cfe45go:findinggolang.org/x/timev0.0.0-20191024005414-555d28b269f0go:findinggo.etcd.io/bboltv1.3.5go:findinggithub.com/micro/go-microv1.18.0go:findinggithub.com/rhysd/go-github-selfupdatev1.2.2go:findinggithub.com/google/go-github/v30v30.1.0go:findinggithub.com/inconshreveable/go-updatev0.0.0-20160112193335-8152e7eb6ccfgo:findinggithub.com/tcnksm/go-gitconfigv0.1.2go:findinggithub.com/ulikunitz/xzv0.5.52020-09-2310:12:53file=service/service.go:195level=infoStarting[service]helloworld2020-09-2310:12:53file=grpc/grpc.go:902level=infoServer[grpc]Listeningon[::]:372272020-09-2310:12:53file=grpc/grpc.go:732level=infoRegistry[service]Registeringnode:helloworld-e7fc841c-53fe-41e5-a7e8-10efe56bc9352020-09-2310:13:17file=handler/helloworld.go:14level=infoReceivedHelloworld.Callrequest2020-09-2310:13:25file=handler/helloworld.go:14level=infoReceivedHelloworld.Callrequest
通过如下命令,可以查看服务的状态以及元数据
microstatus#在docker环境下我们可以运行下面的命令dockerexec-it7184a69ac6cc/microstatusNAMEVERSIONSOURCESTATUSBUILDUPDATEDMETADATAhelloworldlatestgithub.com/micro/services/helloworldrunningn/a21m48sagoowner=admin,group=micro
通过如下命令,可以调用相关的服务
microcallhelloworldHelloworld.Call'{"name":"Jane"}'#在docker环境下我们可以运行下面的命令dockerexec-it7184a69ac6cc/microcallhelloworldHelloworld.Call'{"name":"Jane"}'{"msg":"HelloJane"}
通过如下命令,可以查询服务的列表
microservices#在docker环境下我们可以运行下面的命令dockerexec-it7184a69ac6cc/microservicesapiauthbrokerconfigeventshelloworldnetworkproxyregistryruntimeserverstore
通过如下命令,可以新实现一个服务
micronewfoobarCreatingservicego.micro.service.foobarinfoobar.├──main.go├──generate.go├──plugin.go├──handler│└──foobar.go├──subscriber│└──foobar.go├──proto/foobar│└──foobar.proto├──Dockerfile├──Makefile├──README.md├──.gitignore└──go.moddownloadprotobufformicro:brewinstallprotobufgoget-ugithub.com/golang/protobuf/protogoget-ugithub.com/golang/protobuf/protoc-gen-gogogetgithub.com/micro/micro/v2/cmd/protoc-gen-micro@mastercompiletheprotofilefoobar.proto:cdfoobarprotoc--proto_path=.:$GOPATH/src--go_out=.--micro_out=.proto/foobar/foobar.proto
正如你看到的一样,在构建第一个服务之前,一下工具必须要安装
protoc
protobuf/proto
protoc-gen-micro
将proto
文件转化为Go代码,都需要他们。proto
文件的存在是为了提供一种语言无关的方式来描述服务端点、它们的输入和输出类型,并提供一种有效的序列化格式。
因此,一旦安装了所有的工具,在服务根目录内,我们可以发出以下命令来从原文件生成Go代码
dockerpullmicro/micro0
生成的代码必须提交给源代码控制,以使其他服务在进行服务调用时能够导入原型
至此,我们知道了如何编写服务,运行该服务以及如何调用其他服务。我们的一切触手可及,但是仍然缺少一些编写应用程序的片段。存储接口就是其中之一,即使没有数据库也可以帮助持久存储数据。
除其他许多有用的内置服务外,Micro还包括用于存储数据的持久性存储服务。
为了保持一个值,我们可以使用如下命令
dockerpullmicro/micro1
然后使用如下命令来读取该值
dockerpullmicro/micro2
现在,由于示例服务正在运行,现在我们不能使用micro run
,但是可以使用micro update
来重新部署它。
我们可以简单地发出update命令(记住首先要切换回示例服务的根目录)
dockerpullmicro/micro3
此时,可以通过micro status
可以查看该服务已经更新了
如果事情因为某些原因失控了,我们可以尝试久经考验的“关闭然后再打开”的解决方案:
dockerpullmicro/micro4
4.常见问题FAQ
micro 和go-kit有什么区别?
Go-kit将自己描述为microservices的标准库。与Go一样,go-kit为您提供了可用于构建应用程序的单独软件包。Go-kit非常适合希望完全控制定义服务方式的地方。
Go Micro也是microservices的标准库,因此如果您想为工作选择最好的抽象,请查看它。另外,Micro是microservices的框架,封装了后端和API开发的所有要求。把它想象成一个平台。
性能怎么样?
Micro利用了gRPC,所以它的性能也差不多。Micro还可以在多个服务实例之间实现负载平衡,并可以在需要扩展时将负载分配给分布式系统基础设施。
什么是local和platform?
Micro支持将环境作为一个概念。env
是在本地或其他地方托管的微型服务器。它定义为映射到指向微型代理(gRPC代理)的host:port
的名称。我们引入了两种环境,即“local”和“platform”。
dockerpullmicro/micro5
Local
是由micro server启动的本地服务器,代理位于端口:8081
上。platform
是我们作为付费产品托管在云中的环境,理想情况下,如果您需要托管,则可以在其中运行代码。
5.附录1.命令行工具库cli
在 micro
代码中,比较多的使用到了命令行工具库,这块内容可以说在理解micro
的道路上还是比较重要的,下面一起来看一下这个工具的详情;
5.1.cli
cli是一个简易,快速,有趣的软件包用于构建命令行程序。目标是让开发人员以富有表现力的方式编写快速且可分发的命令行应用程序。
5.1.1 安装
dockerpullmicro/micro6
5.1.2 简单使用
cli背后的哲学之一是API应该是有趣的并且充满发现。因此,cli应用程序中的代码可以少到一行
dockerpullmicro/micro7
该应用程序将运行并显示帮助文本,但不是很有用。
dockerpullmicro/micro8
让我们执行一个动作并提供一些帮助文档:
dockerpullmicro/micro9
在运行程序时,app.Run会做出Action
指定的动作。
#1.第一步我们需要启动我们的servermicroserver#1.在docker环境下我们可以运行下面的命令0
您可以通过调用cli.Context
上的Args
函数来查找参数,例如:
#1.第一步我们需要启动我们的servermicroserver#1.在docker环境下我们可以运行下面的命令1
#1.第一步我们需要启动我们的servermicroserver#1.在docker环境下我们可以运行下面的命令2
设置和查询标志很简单。
#1.第一步我们需要启动我们的servermicroserver#1.在docker环境下我们可以运行下面的命令3
#1.第一步我们需要启动我们的servermicroserver#1.在docker环境下我们可以运行下面的命令4
有时在使用方法字符串中指定flag的值是有用的。这种占位符用反引号表示。
#1.第一步我们需要启动我们的servermicroserver#1.在docker环境下我们可以运行下面的命令5
#1.第一步我们需要启动我们的servermicroserver#1.在docker环境下我们可以运行下面的命令6
请注意,仅使用第一个占位符。随后的反引号将保留原样。
您可以通过提供名称的逗号分隔列表来设置flag的备用(或简称)名称
#1.第一步我们需要启动我们的servermicroserver#1.在docker环境下我们可以运行下面的命令7
这样,flag就可以设置为--lang spanish
或者 -l spanish
.注意,在同一个命令调用中给出相同标志的两种不同形式是错误的。
应用程序和命令的标志按定义顺序显示。但是,可以从这个库之外对它们进行排序通过使用FlagsByName
或者CommandByName
结合sort
#1.第一步我们需要启动我们的servermicroserver#1.在docker环境下我们可以运行下面的命令8
输出顺序就会按照排序的顺序输出
#1.第一步我们需要启动我们的servermicroserver#1.在docker环境下我们可以运行下面的命令9
通过将required字段设置为true,可以创建required标志。如果用户没有提供必需的标志,则会显示一条错误消息。
dockerrunmicro/microserver#此时可以看到运行该命令输出的日志2020-09-2308:49:21file=user/user.go:54level=infoSettingupconfigkeyto/root/.micro/config_secret_key2020-09-2308:49:21file=user/user.go:45level=infoLoadingconfigkeyfrom/root/.micro/config_secret_key2020-09-2308:49:21file=user/user.go:80level=infoLoadingkeys/root/.micro/id_rsaand/root/.micro/id_rsa.pub2020-09-2308:49:21file=user/user.go:99level=infoSettingupkeysforJWTat/root/.micro/id_rsaand/root/.micro/id_rsa.pub2020-09-2308:49:24file=server/server.go:110level=infoStartingserver2020-09-2308:49:24file=server/server.go:121level=infoRegisteringnetwork2020-09-2308:49:24file=server/server.go:121level=infoRegisteringruntime2020-09-2308:49:24file=server/server.go:121level=infoRegisteringregistry2020-09-2308:49:24file=server/server.go:121level=infoRegisteringconfig2020-09-2308:49:24file=server/server.go:121level=infoRegisteringstore2020-09-2308:49:24file=server/server.go:121level=infoRegisteringbroker2020-09-2308:49:24file=server/server.go:121level=infoRegisteringevents2020-09-2308:49:24file=server/server.go:121level=infoRegisteringauth2020-09-2308:49:24file=server/server.go:121level=infoRegisteringproxy2020-09-2308:49:24file=server/server.go:121level=infoRegisteringapi2020-09-2308:49:24file=server/server.go:186level=infoStartingserverruntime2020-09-2308:49:25file=service/service.go:195level=infoStarting[service]server2020-09-2308:49:25file=grpc/grpc.go:902level=infoServer[grpc]Listeningon[::]:100012020-09-2308:49:25file=grpc/grpc.go:732level=infoRegistry[mdns]Registeringnode:server-b4a865a4-cab0-4d1d-93f5-83ea83ea10dc0
有时在标志声明中指定flag的默认值很有用。如果标记的默认值是计算值,则这很有用。可以通过DefaultText结构字段设置默认值。
dockerrunmicro/microserver#此时可以看到运行该命令输出的日志2020-09-2308:49:21file=user/user.go:54level=infoSettingupconfigkeyto/root/.micro/config_secret_key2020-09-2308:49:21file=user/user.go:45level=infoLoadingconfigkeyfrom/root/.micro/config_secret_key2020-09-2308:49:21file=user/user.go:80level=infoLoadingkeys/root/.micro/id_rsaand/root/.micro/id_rsa.pub2020-09-2308:49:21file=user/user.go:99level=infoSettingupkeysforJWTat/root/.micro/id_rsaand/root/.micro/id_rsa.pub2020-09-2308:49:24file=server/server.go:110level=infoStartingserver2020-09-2308:49:24file=server/server.go:121level=infoRegisteringnetwork2020-09-2308:49:24file=server/server.go:121level=infoRegisteringruntime2020-09-2308:49:24file=server/server.go:121level=infoRegisteringregistry2020-09-2308:49:24file=server/server.go:121level=infoRegisteringconfig2020-09-2308:49:24file=server/server.go:121level=infoRegisteringstore2020-09-2308:49:24file=server/server.go:121level=infoRegisteringbroker2020-09-2308:49:24file=server/server.go:121level=infoRegisteringevents2020-09-2308:49:24file=server/server.go:121level=infoRegisteringauth2020-09-2308:49:24file=server/server.go:121level=infoRegisteringproxy2020-09-2308:49:24file=server/server.go:121level=infoRegisteringapi2020-09-2308:49:24file=server/server.go:186level=infoStartingserverruntime2020-09-2308:49:25file=service/service.go:195level=infoStarting[service]server2020-09-2308:49:25file=grpc/grpc.go:902level=infoServer[grpc]Listeningon[::]:100012020-09-2308:49:25file=grpc/grpc.go:732level=infoRegistry[mdns]Registeringnode:server-b4a865a4-cab0-4d1d-93f5-83ea83ea10dc1
输出文本中将包含,默认值信息
dockerrunmicro/microserver#此时可以看到运行该命令输出的日志2020-09-2308:49:21file=user/user.go:54level=infoSettingupconfigkeyto/root/.micro/config_secret_key2020-09-2308:49:21file=user/user.go:45level=infoLoadingconfigkeyfrom/root/.micro/config_secret_key2020-09-2308:49:21file=user/user.go:80level=infoLoadingkeys/root/.micro/id_rsaand/root/.micro/id_rsa.pub2020-09-2308:49:21file=user/user.go:99level=infoSettingupkeysforJWTat/root/.micro/id_rsaand/root/.micro/id_rsa.pub2020-09-2308:49:24file=server/server.go:110level=infoStartingserver2020-09-2308:49:24file=server/server.go:121level=infoRegisteringnetwork2020-09-2308:49:24file=server/server.go:121level=infoRegisteringruntime2020-09-2308:49:24file=server/server.go:121level=infoRegisteringregistry2020-09-2308:49:24file=server/server.go:121level=infoRegisteringconfig2020-09-2308:49:24file=server/server.go:121level=infoRegisteringstore2020-09-2308:49:24file=server/server.go:121level=infoRegisteringbroker2020-09-2308:49:24file=server/server.go:121level=infoRegisteringevents2020-09-2308:49:24file=server/server.go:121level=infoRegisteringauth2020-09-2308:49:24file=server/server.go:121level=infoRegisteringproxy2020-09-2308:49:24file=server/server.go:121level=infoRegisteringapi2020-09-2308:49:24file=server/server.go:186level=infoStartingserverruntime2020-09-2308:49:25file=service/service.go:195level=infoStarting[service]server2020-09-2308:49:25file=grpc/grpc.go:902level=infoServer[grpc]Listeningon[::]:100012020-09-2308:49:25file=grpc/grpc.go:732level=infoRegistry[mdns]Registeringnode:server-b4a865a4-cab0-4d1d-93f5-83ea83ea10dc2
标志值不同源的优先级如下(从高到低):
用户指定的命令行flag值
环境变量(如果指定的话)
配置文件(如果指定的话)
定义的默认值
子命令:可以为更类似git的命令行应用程序定义子命令。
dockerrunmicro/microserver#此时可以看到运行该命令输出的日志2020-09-2308:49:21file=user/user.go:54level=infoSettingupconfigkeyto/root/.micro/config_secret_key2020-09-2308:49:21file=user/user.go:45level=infoLoadingconfigkeyfrom/root/.micro/config_secret_key2020-09-2308:49:21file=user/user.go:80level=infoLoadingkeys/root/.micro/id_rsaand/root/.micro/id_rsa.pub2020-09-2308:49:21file=user/user.go:99level=infoSettingupkeysforJWTat/root/.micro/id_rsaand/root/.micro/id_rsa.pub2020-09-2308:49:24file=server/server.go:110level=infoStartingserver2020-09-2308:49:24file=server/server.go:121level=infoRegisteringnetwork2020-09-2308:49:24file=server/server.go:121level=infoRegisteringruntime2020-09-2308:49:24file=server/server.go:121level=infoRegisteringregistry2020-09-2308:49:24file=server/server.go:121level=infoRegisteringconfig2020-09-2308:49:24file=server/server.go:121level=infoRegisteringstore2020-09-2308:49:24file=server/server.go:121level=infoRegisteringbroker2020-09-2308:49:24file=server/server.go:121level=infoRegisteringevents2020-09-2308:49:24file=server/server.go:121level=infoRegisteringauth2020-09-2308:49:24file=server/server.go:121level=infoRegisteringproxy2020-09-2308:49:24file=server/server.go:121level=infoRegisteringapi2020-09-2308:49:24file=server/server.go:186level=infoStartingserverruntime2020-09-2308:49:25file=service/service.go:195level=infoStarting[service]server2020-09-2308:49:25file=grpc/grpc.go:902level=infoServer[grpc]Listeningon[::]:100012020-09-2308:49:25file=grpc/grpc.go:732level=infoRegistry[mdns]Registeringnode:server-b4a865a4-cab0-4d1d-93f5-83ea83ea10dc3
dockerrunmicro/microserver#此时可以看到运行该命令输出的日志2020-09-2308:49:21file=user/user.go:54level=infoSettingupconfigkeyto/root/.micro/config_secret_key2020-09-2308:49:21file=user/user.go:45level=infoLoadingconfigkeyfrom/root/.micro/config_secret_key2020-09-2308:49:21file=user/user.go:80level=infoLoadingkeys/root/.micro/id_rsaand/root/.micro/id_rsa.pub2020-09-2308:49:21file=user/user.go:99level=infoSettingupkeysforJWTat/root/.micro/id_rsaand/root/.micro/id_rsa.pub2020-09-2308:49:24file=server/server.go:110level=infoStartingserver2020-09-2308:49:24file=server/server.go:121level=infoRegisteringnetwork2020-09-2308:49:24file=server/server.go:121level=infoRegisteringruntime2020-09-2308:49:24file=server/server.go:121level=infoRegisteringregistry2020-09-2308:49:24file=server/server.go:121level=infoRegisteringconfig2020-09-2308:49:24file=server/server.go:121level=infoRegisteringstore2020-09-2308:49:24file=server/server.go:121level=infoRegisteringbroker2020-09-2308:49:24file=server/server.go:121level=infoRegisteringevents2020-09-2308:49:24file=server/server.go:121level=infoRegisteringauth2020-09-2308:49:24file=server/server.go:121level=infoRegisteringproxy2020-09-2308:49:24file=server/server.go:121level=infoRegisteringapi2020-09-2308:49:24file=server/server.go:186level=infoStartingserverruntime2020-09-2308:49:25file=service/service.go:195level=infoStarting[service]server2020-09-2308:49:25file=grpc/grpc.go:902level=infoServer[grpc]Listeningon[::]:100012020-09-2308:49:25file=grpc/grpc.go:732level=infoRegistry[mdns]Registeringnode:server-b4a865a4-cab0-4d1d-93f5-83ea83ea10dc4
对于有许多子命令的应用程序中的其他组织,您可以为每个命令关联一个类别,以便在帮助输出中将它们分组在一起
dockerrunmicro/microserver#此时可以看到运行该命令输出的日志2020-09-2308:49:21file=user/user.go:54level=infoSettingupconfigkeyto/root/.micro/config_secret_key2020-09-2308:49:21file=user/user.go:45level=infoLoadingconfigkeyfrom/root/.micro/config_secret_key2020-09-2308:49:21file=user/user.go:80level=infoLoadingkeys/root/.micro/id_rsaand/root/.micro/id_rsa.pub2020-09-2308:49:21file=user/user.go:99level=infoSettingupkeysforJWTat/root/.micro/id_rsaand/root/.micro/id_rsa.pub2020-09-2308:49:24file=server/server.go:110level=infoStartingserver2020-09-2308:49:24file=server/server.go:121level=infoRegisteringnetwork2020-09-2308:49:24file=server/server.go:121level=infoRegisteringruntime2020-09-2308:49:24file=server/server.go:121level=infoRegisteringregistry2020-09-2308:49:24file=server/server.go:121level=infoRegisteringconfig2020-09-2308:49:24file=server/server.go:121level=infoRegisteringstore2020-09-2308:49:24file=server/server.go:121level=infoRegisteringbroker2020-09-2308:49:24file=server/server.go:121level=infoRegisteringevents2020-09-2308:49:24file=server/server.go:121level=infoRegisteringauth2020-09-2308:49:24file=server/server.go:121level=infoRegisteringproxy2020-09-2308:49:24file=server/server.go:121level=infoRegisteringapi2020-09-2308:49:24file=server/server.go:186level=infoStartingserverruntime2020-09-2308:49:25file=service/service.go:195level=infoStarting[service]server2020-09-2308:49:25file=grpc/grpc.go:902level=infoServer[grpc]Listeningon[::]:100012020-09-2308:49:25file=grpc/grpc.go:732level=infoRegistry[mdns]Registeringnode:server-b4a865a4-cab0-4d1d-93f5-83ea83ea10dc5
dockerrunmicro/microserver#此时可以看到运行该命令输出的日志2020-09-2308:49:21file=user/user.go:54level=infoSettingupconfigkeyto/root/.micro/config_secret_key2020-09-2308:49:21file=user/user.go:45level=infoLoadingconfigkeyfrom/root/.micro/config_secret_key2020-09-2308:49:21file=user/user.go:80level=infoLoadingkeys/root/.micro/id_rsaand/root/.micro/id_rsa.pub2020-09-2308:49:21file=user/user.go:99level=infoSettingupkeysforJWTat/root/.micro/id_rsaand/root/.micro/id_rsa.pub2020-09-2308:49:24file=server/server.go:110level=infoStartingserver2020-09-2308:49:24file=server/server.go:121level=infoRegisteringnetwork2020-09-2308:49:24file=server/server.go:121level=infoRegisteringruntime2020-09-2308:49:24file=server/server.go:121level=infoRegisteringregistry2020-09-2308:49:24file=server/server.go:121level=infoRegisteringconfig2020-09-2308:49:24file=server/server.go:121level=infoRegisteringstore2020-09-2308:49:24file=server/server.go:121level=infoRegisteringbroker2020-09-2308:49:24file=server/server.go:121level=infoRegisteringevents2020-09-2308:49:24file=server/server.go:121level=infoRegisteringauth2020-09-2308:49:24file=server/server.go:121level=infoRegisteringproxy2020-09-2308:49:24file=server/server.go:121level=infoRegisteringapi2020-09-2308:49:24file=server/server.go:186level=infoStartingserverruntime2020-09-2308:49:25file=service/service.go:195level=infoStarting[service]server2020-09-2308:49:25file=grpc/grpc.go:902level=infoServer[grpc]Listeningon[::]:100012020-09-2308:49:25file=grpc/grpc.go:732level=infoRegistry[mdns]Registeringnode:server-b4a865a4-cab0-4d1d-93f5-83ea83ea10dc6
dockerrunmicro/microserver#此时可以看到运行该命令输出的日志2020-09-2308:49:21file=user/user.go:54level=infoSettingupconfigkeyto/root/.micro/config_secret_key2020-09-2308:49:21file=user/user.go:45level=infoLoadingconfigkeyfrom/root/.micro/config_secret_key2020-09-2308:49:21file=user/user.go:80level=infoLoadingkeys/root/.micro/id_rsaand/root/.micro/id_rsa.pub2020-09-2308:49:21file=user/user.go:99level=infoSettingupkeysforJWTat/root/.micro/id_rsaand/root/.micro/id_rsa.pub2020-09-2308:49:24file=server/server.go:110level=infoStartingserver2020-09-2308:49:24file=server/server.go:121level=infoRegisteringnetwork2020-09-2308:49:24file=server/server.go:121level=infoRegisteringruntime2020-09-2308:49:24file=server/server.go:121level=infoRegisteringregistry2020-09-2308:49:24file=server/server.go:121level=infoRegisteringconfig2020-09-2308:49:24file=server/server.go:121level=infoRegisteringstore2020-09-2308:49:24file=server/server.go:121level=infoRegisteringbroker2020-09-2308:49:24file=server/server.go:121level=infoRegisteringevents2020-09-2308:49:24file=server/server.go:121level=infoRegisteringauth2020-09-2308:49:24file=server/server.go:121level=infoRegisteringproxy2020-09-2308:49:24file=server/server.go:121level=infoRegisteringapi2020-09-2308:49:24file=server/server.go:186level=infoStartingserverruntime2020-09-2308:49:25file=service/service.go:195level=infoStarting[service]server2020-09-2308:49:25file=grpc/grpc.go:902level=infoServer[grpc]Listeningon[::]:100012020-09-2308:49:25file=grpc/grpc.go:732level=infoRegistry[mdns]Registeringnode:server-b4a865a4-cab0-4d1d-93f5-83ea83ea10dc7
dockerrunmicro/microserver#此时可以看到运行该命令输出的日志2020-09-2308:49:21file=user/user.go:54level=infoSettingupconfigkeyto/root/.micro/config_secret_key2020-09-2308:49:21file=user/user.go:45level=infoLoadingconfigkeyfrom/root/.micro/config_secret_key2020-09-2308:49:21file=user/user.go:80level=infoLoadingkeys/root/.micro/id_rsaand/root/.micro/id_rsa.pub2020-09-2308:49:21file=user/user.go:99level=infoSettingupkeysforJWTat/root/.micro/id_rsaand/root/.micro/id_rsa.pub2020-09-2308:49:24file=server/server.go:110level=infoStartingserver2020-09-2308:49:24file=server/server.go:121level=infoRegisteringnetwork2020-09-2308:49:24file=server/server.go:121level=infoRegisteringruntime2020-09-2308:49:24file=server/server.go:121level=infoRegisteringregistry2020-09-2308:49:24file=server/server.go:121level=infoRegisteringconfig2020-09-2308:49:24file=server/server.go:121level=infoRegisteringstore2020-09-2308:49:24file=server/server.go:121level=infoRegisteringbroker2020-09-2308:49:24file=server/server.go:121level=infoRegisteringevents2020-09-2308:49:24file=server/server.go:121level=infoRegisteringauth2020-09-2308:49:24file=server/server.go:121level=infoRegisteringproxy2020-09-2308:49:24file=server/server.go:121level=infoRegisteringapi2020-09-2308:49:24file=server/server.go:186level=infoStartingserverruntime2020-09-2308:49:25file=service/service.go:195level=infoStarting[service]server2020-09-2308:49:25file=grpc/grpc.go:902level=infoServer[grpc]Listeningon[::]:100012020-09-2308:49:25file=grpc/grpc.go:732level=infoRegistry[mdns]Registeringnode:server-b4a865a4-cab0-4d1d-93f5-83ea83ea10dc8
调用App.Run
不会自动调用os.Exit
,这也就意味着默认情况下,退出代码将“掉线”为0。可以通过返回满足cli.ExitCoder
的非nil错误来设置显式退出代码,或者cli.MultiError
包含满足cli.ExitCoder
的错误。
dockerrunmicro/microserver#此时可以看到运行该命令输出的日志2020-09-2308:49:21file=user/user.go:54level=infoSettingupconfigkeyto/root/.micro/config_secret_key2020-09-2308:49:21file=user/user.go:45level=infoLoadingconfigkeyfrom/root/.micro/config_secret_key2020-09-2308:49:21file=user/user.go:80level=infoLoadingkeys/root/.micro/id_rsaand/root/.micro/id_rsa.pub2020-09-2308:49:21file=user/user.go:99level=infoSettingupkeysforJWTat/root/.micro/id_rsaand/root/.micro/id_rsa.pub2020-09-2308:49:24file=server/server.go:110level=infoStartingserver2020-09-2308:49:24file=server/server.go:121level=infoRegisteringnetwork2020-09-2308:49:24file=server/server.go:121level=infoRegisteringruntime2020-09-2308:49:24file=server/server.go:121level=infoRegisteringregistry2020-09-2308:49:24file=server/server.go:121level=infoRegisteringconfig2020-09-2308:49:24file=server/server.go:121level=infoRegisteringstore2020-09-2308:49:24file=server/server.go:121level=infoRegisteringbroker2020-09-2308:49:24file=server/server.go:121level=infoRegisteringevents2020-09-2308:49:24file=server/server.go:121level=infoRegisteringauth2020-09-2308:49:24file=server/server.go:121level=infoRegisteringproxy2020-09-2308:49:24file=server/server.go:121level=infoRegisteringapi2020-09-2308:49:24file=server/server.go:186level=infoStartingserverruntime2020-09-2308:49:25file=service/service.go:195level=infoStarting[service]server2020-09-2308:49:25file=grpc/grpc.go:902level=infoServer[grpc]Listeningon[::]:100012020-09-2308:49:25file=grpc/grpc.go:732level=infoRegistry[mdns]Registeringnode:server-b4a865a4-cab0-4d1d-93f5-83ea83ea10dc9
##使用默认的账号登录micro#用户名:admin密码:micromicrologin#2.在docker环境下我们可以运行下面的命令dockerexec-it7184a69ac6cc(此值为容器id)/micrologin#现在就可以跑我们的hellworld服务了microrungithub.com/micro/services/helloworld#3.在docker环境下我们可以运行下面的命令dockerexec-it7184a69ac6cc/microrungithub.com/micro/services/helloworld0
结合短选项:使用选项的短名称的传统用法如下所示:
##使用默认的账号登录micro#用户名:admin密码:micromicrologin#2.在docker环境下我们可以运行下面的命令dockerexec-it7184a69ac6cc(此值为容器id)/micrologin#现在就可以跑我们的hellworld服务了microrungithub.com/micro/services/helloworld#3.在docker环境下我们可以运行下面的命令dockerexec-it7184a69ac6cc/microrungithub.com/micro/services/helloworld1
假设您希望用户能够将选项与其短名称结合在一起。可以在应用程序配置中使用UseShortOptionHandling bool来完成此操作,或将单个命令附加到命令配置中。
##使用默认的账号登录micro#用户名:admin密码:micromicrologin#2.在docker环境下我们可以运行下面的命令dockerexec-it7184a69ac6cc(此值为容器id)/micrologin#现在就可以跑我们的hellworld服务了microrungithub.com/micro/services/helloworld#3.在docker环境下我们可以运行下面的命令dockerexec-it7184a69ac6cc/microrungithub.com/micro/services/helloworld2
##使用默认的账号登录micro#用户名:admin密码:micromicrologin#2.在docker环境下我们可以运行下面的命令dockerexec-it7184a69ac6cc(此值为容器id)/micrologin#现在就可以跑我们的hellworld服务了microrungithub.com/micro/services/helloworld#3.在docker环境下我们可以运行下面的命令dockerexec-it7184a69ac6cc/microrungithub.com/micro/services/helloworld3
##使用默认的账号登录micro#用户名:admin密码:micromicrologin#2.在docker环境下我们可以运行下面的命令dockerexec-it7184a69ac6cc(此值为容器id)/micrologin#现在就可以跑我们的hellworld服务了microrungithub.com/micro/services/helloworld#3.在docker环境下我们可以运行下面的命令dockerexec-it7184a69ac6cc/microrungithub.com/micro/services/helloworld4
您可以启用命令完成通过设置EnableBashCompletion
标志
##使用默认的账号登录micro#用户名:admin密码:micromicrologin#2.在docker环境下我们可以运行下面的命令dockerexec-it7184a69ac6cc(此值为容器id)/micrologin#现在就可以跑我们的hellworld服务了microrungithub.com/micro/services/helloworld#3.在docker环境下我们可以运行下面的命令dockerexec-it7184a69ac6cc/microrungithub.com/micro/services/helloworld5