上一篇文章中,我们把编写以及运行微服务所需的环境都准备完毕了,那么接下来我们正式开始使用go-micro来创建一个项目。
正式开始之前,我们需要了解的一些知识:
创建项目
在自己习惯的工作目录(任意目录均可,因为咱有go mod,前提是设置了环境变量“GO111MODULE”为on或者auto)创建项目目录:
#创建项目目录
mkdir /home/gcc/projects/micro-demo
cd /home/gcc/projects/micro-demo
#通过micro创建一个微服务项目结构
micro new --namespace=go.micro --type=srv --alias=order --gopath=false order-srv
关于micro new 命令更多参数用法请参阅文档:
上述命令执行后,micro会为你自动生成如下的一个项目结构:
├── main.go
├── plugin.go
├── handler
│ └── order.go
├── subscriber
│ └── order.go
├── proto/order
│ └── order.proto
├── Dockerfile
├── Makefile
├── README.md
└── go.mod
编辑go.mod文件:
vim /home/gcc/projects/micro-demo/order-srv/go.mod #将文件第一行的 module order-srv 修改为 module micro-demo/order-srv #解释下为何这么做:以微服务形式开发项目,那么一个微服务就是一个可以独立部署的模块。对于开发过程中也可以看做是一个相对独立的项目。而两个不同的微服务之间的关联应该就剩下相互之间的 RPC 调用,RPC调用需要知道对方RPC服务的入参和出参的规范,这个规范就是在proto文件中定义好了,所以在开发过程中需要import别的微服务的接口、 结构体 等定义的包。这里修改module名称就是为了后面开发过程中能方便的导入别的微服务的包。可能解释的有点晦涩,没关系,继续往下看,等用到了就会明白。
编辑proto文件:
vim /home/gcc/projects/micro-demo/order-srv/proto/order/order.proto
你会发现micro已经为我们预先写好了一些protobuf的定义,但在实际项目开发中这些代码其实没什么用,你应该完全清空后,按照自己的实际业务重新写。此处,因为只是给大家演示如何使用micro开发微服务,所以便直接使用micro给我生成好的proto文件了(请允许我偷个懒哈(*≧▽≦*))。
根据proto文件生成相应的go代码:
cd /home/gcc/projects/micro-demo/order-srv protoc --proto_path=. --go_out=. --micro_out=. proto/order/order.proto
上述命令执行后,会在/home/gcc/projects/micro-demo/order-srv/proto/order目录下多出order.micro.go 和order.pb.go这两个文件,这两个文件其实就是根据你的proto文件自动帮你定义了一些接口、结构体和方法,我们无需对这两个文件做任何修改,直接使用即可。
打开main.go文件,发现缺少很多依赖包:
没关系,不慌,我们有go mod,一个命令直接搞定。
cd /home/gcc/projects/micro-demo/order-srv go mod tidy
运行微服务:
cd /home/gcc/projects/micro-demo/order-srv go run main.go
服务启动成功后会在控制台看到如下输出:
2019-10-26 10:26:14.409113 I | Transport [http] Listening on [::]:41927
2019-10-26 10:26:14.409167 I | Broker [http] Connected to [::]:35483
2019-10-26 10:26:14.409408 I | Registry [mdns] Registering node: go.micro.srv.order-37ec23a1-ac7d-4b11-94cf-477c2983c927
2019-10-26 10:26:14.410944 I | Subscribing go.micro.srv.order-37ec23a1-ac7d-4b11-94cf-477c2983c927 to topic: go.micro.srv.order
2019-10-26 10:26:14.412214 I | Subscribing go.micro.srv.order-37ec23a1-ac7d-4b11-94cf-477c2983c927 to topic: go.micro.srv.order
好了,至此一个基于go-micro的微服务就成功运行起来了,接下来我们要如何访问到这个微服务呢?不慌,接着往下看。
go-micro是一个相对比较完备的微服务框架,一些常用的组件都已经准备好了,基本上是开箱即用的。
我们需要通过一个API网关来访问到我们刚刚创建的微服务。
API-Gateway可以以多种模式运行,这里我们先演示一种比较简单的,更多运行方式请参见文档:
启动API-Gateway:
#这里的命名空间 --api_namespace=go.micro.srv参数 #必须和main.go中注册的微服务name前缀要一致,否则无法访问 micro --api_namespace=go.micro.srv api --handler=rpc
访问微服务:
curl -H 'Content-Type: application/json' -d '{"name": "john"}' ""
成功看到下面的输出内容即表示访问成功:
{“msg”: “Hello john”}
到这里我们已经成功创建了一个微服务,启动并且已经能够成功访问了。当然肯定还有很多读者对go-micro一头雾水,很多概念也都不清楚。不慌,我们后续系列文章会对整个micro进行一些概念上的介绍,然后逐步深入,但然最好还是自己多研究官方文档,有问题可以去github上发issue,也可以加入他们的 slack 一起讨论。
尝试着写一些面向初级开发者的基础教程,之前没有任何写作方面的经验,所以写的不好的地方请大家轻喷,谢谢。