golang微服务框架go-micro 入门笔记2.1 micro工具之micro api

winlion · · 758 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

# micro api micro 功能非常强大,本文将详细阐述micro api 命令行的功能 重要的事情说3次 + [本文全部代码https://idea.techidea8.com/open/idea.shtml?id=6](https://idea.techidea8.com/open/idea.shtml?id=6) + [本文全部代码https://idea.techidea8.com/open/idea.shtml?id=6](https://idea.techidea8.com/open/idea.shtml?id=6) + [本文全部代码https://idea.techidea8.com/open/idea.shtml?id=6](https://idea.techidea8.com/open/idea.shtml?id=6) ## 主要作用 主要作用是为微服务提供http网关支持。假如后端服务名称为`go.micro.srv.hello`,提供`call`方法,则我们可用通过http协议来调用微服务。 ``` curl http://127.0.0.0:8080/hello/call?name=123 ``` `micro api`指令全部参数如下 ```bash $micro api -h NAME: micro api - Run the api gateway USAGE: micro api [command options] [arguments...] OPTIONS: --address value Set the api address e.g 0.0.0.0:8080 [%MICRO_API_ADDRESS%] --handler value Specify the request handler to be used for mapping HTTP requests to services; {api, event, http, rpc} [%MICRO_API_HANDLER%] --namespace value Set the namespace used by the API e.g. com.example.api [%MICRO_API_NAMESPACE%] --resolver value Set the hostname resolver used by the API {host, path, grpc} [%MICRO_API_RESOLVER%] --enable_rpc Enable call the backend directly via /rpc [%MICRO_API_ENABLE_RPC%] ``` 翻译一下 ```bash --address value 设置网关访问的ip和端口,如设置成0.0.0.0:8080,则可以通过http://127.0.0.1:8080/进行访问,默认为0.0.0.0:8080 --handler value 指定映射具体哪种类型的处理程序,可选择{api, event, http, rpc} ,默认是rpc --namespace value 指定暴露哪些微服务,通过命名空间匹配,如指定value为`go.micro.srv`,则该空间下所有微服务都能被访问 --resolver value 路径和微服务的对应关系,默认是micro,可选项为{host, path, grpc} --enable_rpc 是否支持直接通过rcp接口进行访问,默认false ``` ## apihander 我们通过`--handler=api`类型选项,实现http到`api`类型处理服务之间的映射,代码解读如下 1. 下载`handlerapi.zip`并解压到`%GOPATH%/techidea8.com/microapp/doc/`下,解压后目录如下所示 ```bash E:\winlion\gopath\src\techidea8.com\microapp\doc\handerapi>ls go.mod go.sum handerapi.go proto/ ``` 2. 初始化模块 ```bash #这一步必须做,否则会报错`build command-line-arguments: cannot load techidea8.com/microapp/doc/handerapi/proto:` >go mod init >go: creating new go.mod: module techidea8.com/microapp/doc/handerapi ``` 3. 生成proto文件,请自行替换GOPATH路径. ```bash >protoc --proto_path=E:/winlion/gopath/src --proto_path=. --go_out=. --micro_out=. proto/handerapi.proto #注意网络上很多文档使用--proto_path=import_proto_path:. 这种格式指定path但是在win10这种格式是行不通的 #另外一种可行的格式是 -IE:/winlion/gopath/src -I. 如下也是可行的 >protoc -IE:/winlion/gopath/src -I. --go_out=. --micro_out=. proto/handerapi.proto ``` 4. 运行 ```bash >go run handerapi.go 2019/08/24 20:59:32 Transport [http] Listening on [::]:54208 2019/08/24 20:59:32 Broker [http] Connected to [::]:54209 2019/08/24 20:59:32 Registry [mdns] Registering node: go.micro.api.example-71c8b1fa-f84b-4cf6-957f-617f67a4083c ``` 5. 查看服务状态 ```bash >micro list services go.micro.api go.micro.api.example ``` 6. 测试 ```bash >curl "http://localhost:8080/example/example1/func1?name=winlion" {"msg":"我们已经收到你的请求啦winlion"} ``` ## eventhander 我们通过`--handler=event`选项,来实现发布`event`事件,关键代码解读如下 1. 下载`handlerevent.zip` 并解压到`%GOPATH%/techidea8.com/microapp/doc/`下,解压后目录如下所示 ```bash E:\winlion\gopath\src\techidea8.com\microapp\doc\handlerevent>ls handlerevent.go ``` 核心代码如下 ```golang service := micro.NewService(micro.Name("test1")) service.Init() //订阅go.micro.evt.test事件,注意这个test micro.RegisterSubscriber("go.micro.evt.test", service.Server(), new(TestEvent)) if err := service.Run(); err != nil { log.Fatal(err) } ``` 2. 运行服务 ```bash >go run handlerevent.go 2019/08/24 23:17:18 Transport [http] Listening on [::]:57093 2019/08/24 23:17:18 Broker [http] Connected to [::]:57094 2019/08/24 23:17:19 Registry [mdns] Registering node: test1-7efd3b0a-5455-4456-870d-3b34e80f1354 2019/08/24 23:17:19 Subscribing test1-7efd3b0a-5455-4456-870d-3b34e80f1354 to topic: go.micro.evt.test ``` 3. 查看服务状态 ```bash >micro list services go.micro.api test1 topic:go.micro.evt.test ``` 4. 启动event发布支持 ```bash >micro api --handler=event --namespace=go.micro.evt 2019/08/24 23:06:28 Registering API Event Handler at / 2019/08/24 23:06:28 HTTP API Listening on [::]:8080 2019/08/24 23:06:28 Transport [http] Listening on [::]:56778 2019/08/24 23:06:28 Broker [http] Connected to [::]:56779 2019/08/24 23:06:28 Registry [mdns] Registering node: go.micro.api-c342fe3f-4a06-4955-be3f-79284e580467 ``` 5. 测试 ```bash >curl -d "{\"message\": \"Hello,Winlion\"}" "http://localhost:8080/test/login" -X POST #服务器侧会显示如下数据 >2019/08/24 23:18:54 Process 收到事件 login {"message": "Hello,Winlion"} ``` >注意,在win系统下,通过curl发布json数据,需要采用双引号,并且需要使用转义字符`\` >注意http://localhost:8080/test/login中的test对应go.micro.evt.test中的test ## rpchander 我们通过`--handler=rpc`类型选项,实现http到`rpc`服务之间的映射,rpc类型和api类型比较相似,可以参考apihanlder相关代码,rpchander代码包为`handlerrpc· 1. 下载`handlerrpc.zip`并解压到`%GOPATH%/techidea8.com/microapp/doc/`下,解压后目录如下所示 ```bash E:\winlion\gopath\src\techidea8.com\microapp\doc\handlerrpc>ls handerapi.go proto/ ``` 2. 初始化模块 ```bash #这一步必须做,否则会报错`build command-line-arguments: cannot load techidea8.com/microapp/doc/handerapi/proto:` >go mod init >go: creating new go.mod: module techidea8.com/microapp/doc/handlerrpc ``` 3. 生成proto文件,请自行替换GOPATH路径. ```bash >protoc --proto_path=. --go_out=. --micro_out=. proto/handlerrpc.proto #注意网络上很多文档使用--proto_path=import_proto_path:. 这种格式指定path但是在win10这种格式是行不通的 #另外一种可行的格式是 -IE:/winlion/gopath/src -I. 如下也是可行的 >protoc -IE:/winlion/gopath/src -I. --go_out=. --micro_out=. proto/handerapi.proto ``` 4. 运行 ```bash >go run handlerrpc.go 2019/08/24 20:59:32 Transport [http] Listening on [::]:54208 2019/08/24 20:59:32 Broker [http] Connected to [::]:54209 2019/08/24 20:59:32 Registry [mdns] Registering node: go.micro.api.example-71c8b1fa-f84b-4cf6-957f-617f67a4083c ``` 5. 查看服务状态 ```bash >micro list services go.micro.api go.micro.api.model1 ``` 6. 测试 ```bash >curl -H "Content-Type: application/json" -d "{\"arg\": \"Winlion\"}" "http://localhost:8080/model1/model1/action1" {"data":"接收到数据Winlion"} ``` >rpchandler 和 api handler 的区别在于apihandler 的数据交proto模型在rpc的基础上再次进行了封装. ## httphander 我们通过`--handler=http`类型选项,`http`服务服务映射,核心代码如下 + 新建`handlerweb.go`代码如下 ```golang //handlerweb.go package main import ( "encoding/json" "log" "net/http" "github.com/micro/go-micro/web" ) //hello 处理函数,打印helloworld func hello(w http.ResponseWriter, req *http.Request) { //json支持 w.Header().Add("content-type", "application/json;charset=utf-8") if err := json.NewEncoder(w).Encode(map[string]interface{}{ "code": 0, "message": "hello,world", }); err != nil { //页面报错显示信息 http.Error(w, err.Error(), http.StatusNotFound) } } func main() { //new 一个web服务 service := web.NewService(web.Name("go.micro.web.hello")) //绑定映射方法 service.HandleFunc("/", hello) //初始化 service.Init() //运行 if err := service.Run(); err != nil { log.Fatal(err) } } ``` + 启动应用 ```bash >go run handlerweb.go 2019/08/24 23:58:14 Listening on [::]:57984 ``` + 启动api服务 ```bash >micro api --handler=http --namespace=go.micro.web 2019/08/24 23:58:42 Registering API HTTP Handler at /{service:[a-zA-Z0-9]+} 2019/08/24 23:58:42 HTTP API Listening on [::]:8080 2019/08/24 23:58:42 Transport [http] Listening on [::]:57992 2019/08/24 23:58:42 Broker [http] Connected to [::]:57993 2019/08/24 23:58:42 Registry [mdns] Registering node: go.micro.api-fecb79d6-0175-4d1c-9243-29c1d616b70d ``` + 测试 ```bash >curl http://127.0.0.1:8080/hello/ {"code":0,"message":"hello,world"} #注意其中的hello 对应微服务`go.micro.web.hello`中的hello ``` ## enable_rpc 该作用是开启rpc 直接访问支持,设置enable_rpc=true 可以通过如下接口访问 + 开启rpc支持 ```bash >>micro api --handler=rpc --namespace=go.micro.api --enable_rpc=true ``` + 新建微服务 ```bash >micro new --type=srv techidea8.com/microapp/doc/enablerpc Creating service go.micro.srv.enablerpc in E:\winlion\gopath\src\techidea8.com\microapp\doc\e . ├── main.go ├── plugin.go ├── handler │   └── enablerpc.go ├── subscriber │   └── enablerpc.go ├── proto\enablerpc │   └── enablerpc.proto ├── Dockerfile ├── Makefile ├── README.md └── go.mod 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 enablerpc.proto: cd E:\winlion\gopath\src\techidea8.com\microapp\doc\enablerpc protoc --proto_path=.:$GOPATH/src --go_out=. --micro_out=. proto/enablerpc/enablerpc.proto ``` 注意,由于win下不能识别--proto_path=.:$GOPATH/src,因此我们需要自行处理如下脚本,其中`E:/winlion/gopath`请替换成各自的GOPATH ```bash >cd /d E:\winlion\gopath\src\techidea8.com\microapp\doc\enablerpc >protoc --proto_path=. --proto_path=E:/winlion/gopath/src --go_out=. --micro_out=. proto/enablerpc/enablerpc.proto ``` + 启动服务 ```bash #启动微服务 >go run main.go #启动rpc支持 > micro api --handler=rpc --namespace=go.micro.srv --enable_rpc=true ``` + 测试 ```bash > curl -H "Content-Type: application/json" -d "{\"service\": \"go.micro.srv.enablerpc\",\"method\": \"Enablerpc.Call\", \"request\": {\"name\": \"Winlion\"}}" "http://localhost:8080/rpc" #返回如下数据 {"msg":"Hello Winlion"} ``` ### 阅读本文前你可能需要如下知识储备 + [golang分布式微服务框架go-micro 入门笔记1:搭建go-micro环境,](https://www.techidea8.com/archives/49) ### 推荐阅读 + [扫微信二维码实现网站登陆提供体验地址和源代码](https://www.techidea8.com/archives/46) + [开源项目golang go语言后台管理框架restgo-admin](https://www.techidea8.com/archives/34) + [支持手势触摸,可左右滑动的日历插件](https://www.techidea8.com/archives/22) + [你必须知道的18个互联网业务模型](https://www.techidea8.com/archives/31)

有疑问加站长微信联系(非本文作者))

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

758 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传