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

10次阅读

共计 8981 个字符,预计需要花费 23 分钟才能阅读完成。

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

主要作用

主要作用是为微服务提供 http 网关支持。假如后端服务名称为 go.micro.srv.hello, 提供call 方法,则我们可用通过 http 协议来调用微服务。

curl http://127.0.0.0:8080/hello/call?name=123

micro api指令全部参数如下

$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%]

翻译一下

   --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/ 下, 解压后目录如下所示
E:\winlion\gopath\src\techidea8.com\microapp\doc\handerapi>ls
go.mod  go.sum  handerapi.go  proto/
  1. 初始化模块
# 这一步必须做, 否则会报错 `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
  1. 生成 proto 文件, 请自行替换 GOPATH 路径.
>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
  1. 运行
>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
  1. 查看服务状态
>micro list services
go.micro.api
go.micro.api.example
  1. 测试
>curl  "http://localhost:8080/example/example1/func1?name=winlion"
{"msg":"我们已经收到你的请求啦 winlion"}

eventhander

我们通过 --handler=event 选项, 来实现发布 event 事件, 关键代码解读如下

  1. 下载 handlerevent.zip 并解压到%GOPATH%/techidea8.com/microapp/doc/ 下, 解压后目录如下所示
E:\winlion\gopath\src\techidea8.com\microapp\doc\handlerevent>ls
handlerevent.go

核心代码如下

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)
}
  1. 运行服务
>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
  1. 查看服务状态
>micro list services
go.micro.api
test1
topic:go.micro.evt.test
  1. 启动 event 发布支持
>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
  1. 测试
>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

eventhander

我们通过 --handler=event 选项, 来实现发布 event 事件, 关键代码解读如下

  1. 下载 handlerevent.zip 并解压到%GOPATH%/techidea8.com/microapp/doc/ 下, 解压后目录如下所示
E:\winlion\gopath\src\techidea8.com\microapp\doc\handlerevent>ls
handlerevent.go

核心代码如下

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)
}
  1. 运行服务
>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
  1. 查看服务状态
>micro list services
go.micro.api
test1
topic:go.micro.evt.test
  1. 启动 event 发布支持
>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
  1. 测试
>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/ 下, 解压后目录如下所示
E:\winlion\gopath\src\techidea8.com\microapp\doc\handlerrpc>ls
handerapi.go  proto/
  1. 初始化模块
# 这一步必须做, 否则会报错 `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
  1. 生成 proto 文件, 请自行替换 GOPATH 路径.
>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
  1. 运行
>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
  1. 查看服务状态
>micro list services
go.micro.api
go.micro.api.model1
  1. 测试
>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 代码如下
//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)
    }
}
  • 启动应用
>go run handlerweb.go
2019/08/24 23:58:14 Listening on [::]:57984
  • 启动 api 服务
>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
  • 测试
>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 支持
>>micro api --handler=rpc --namespace=go.micro.api --enable_rpc=true
  • 新建微服务
>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

>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
  • 启动服务
# 启动微服务
>go run main.go
#启动 rpc 支持
> micro api --handler=rpc --namespace=go.micro.srv --enable_rpc=true
  • 测试
> 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:1 分钟快速搭建 go-micro 环境

推荐阅读
扫微信二维码实现网站登陆提供体验地址和源代码
开源项目 golang go 语言后台管理框架 restgo-admin
支持手势触摸, 可左右滑动的日历插件
你必须知道的 18 个互联网业务模型

正文完
 0