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

时间:2021-09-24 07:36:08

micro api

micro 功能非常强大,本文将详细阐述micro api 命令行的功能

重要的事情说3次

主要作用

主要作用是为微服务提供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个互联网业务模型

golang微服务框架go-micro 入门笔记2.1 micro工具之micro api的更多相关文章

  1. golang微服务框架go-micro 入门笔记2.3 micro工具之消息接收和发布

    本章节阐述micro消息订阅和发布相关内容 阅读本文前你可能需要进行如下知识储备 golang分布式微服务框架go-micro 入门笔记1:搭建go-micro环境, golang微服务框架go-mi ...

  2. golang微服务框架go-micro 入门笔记2.2 micro工具之微应用利器micro web

    micro web micro 功能非常强大,本文将详细阐述micro web 命令行的功能 阅读本文前你可能需要进行如下知识储备 golang分布式微服务框架go-micro 入门笔记1:搭建go- ...

  3. golang微服务框架go-micro 入门笔记2.4 go-micro service解读

    本章节阐述go-micro 服务发现原理 go-micro架构 下图来自go-micro官方 阅读本文前你可能需要进行如下知识储备 golang分布式微服务框架go-micro 入门笔记1:搭建go- ...

  4. 【GoLang】golang 微服务框架 go-kit

    golang-Microservice Go kit - A toolkit for microservices kubernetes go-kit_百度搜索 Peter Bourgon谈使用Go和& ...

  5. [goa]golang微服务框架学习--安装使用

      当项目逐渐变大之后,服务增多,开发人员增加,单纯的使用go来写服务会遇到风格不统一,开发效率上的问题. 之前研究go的微服务架构go-kit最让人头疼的就是定义服务之后,还要写很多重复的框架代码, ...

  6. golang微服务框架go-micro 入门笔记1.搭建 go-micro环境

    微服务的本质是让专业的人做专业的事情,做出更好的东西. golang具备高并发,静态编译等特性,在性能.安全等方面具备非常大的优势.go-micro是基于golang的微服务编程框架,go-micro ...

  7. 【GoLang】golang 微服务框架 介绍

    原文如下: rpcx是一个类似阿里巴巴 Dubbo 和微博 Motan 的分布式的RPC服务框架,基于Golang net/rpc实现. 谈起分布式的RPC框架,比较出名的是阿里巴巴的dubbo,包括 ...

  8. [goa]golang微服务框架学习(二)-- 代码自动生成

    之前用过go语言的反射来做一些代码生成,参考这篇. 但是这种方式,入侵太强,需要执行对应的申明调用, 所以对GOA框架的自动生成非常感兴趣,于是仔细研究了一下,发现用的比较巧妙, 这里先卖个关子,先看 ...

  9. [goa]golang微服务框架学习(三)-- 使用swagger-ui展示API

    既然goa框架自动生成啦swagger-json文件,那么如何用swagger-ui展示出来呢? 这里分三步: 1.下载swagger-ui的web代码 2.添加swagger.json 和 swag ...

随机推荐

  1. [模拟电路] 2、Passive Band Pass Filter

    note: Some articles are very good in http://www.electronics-tutorials.ws/,I share them in the Cnblog ...

  2. C# 开源压缩组件比较

    SevenZipSharp check()为检查压缩包,有BUG,360创建的zip压缩包有无密码,密码错对都返回true DotNetZip 提供的函数比较人性化,缺点是只支持zip SharpCo ...

  3. javascript实现优先队列

    1.概念 一般情况下从队列中删除元素,都是率先入队的元素.但是有些使用队列的情况不遵循先进先出的原则,这就是插队,这需要使用优选队列的数据结构来进行描述. 从优先队列中删除元素的时候,需要考虑优先级的 ...

  4. Windows10 如何删掉内置的 skype ?

    打开开始菜单,输入“PowerShell”并回车: 运行“Get-AppxPackage -User username”命令( username 请替换成当前实际用户名),此时会显示所有已安装的应用程 ...

  5. 迁移SQL SERVER 数据库实例

    由于某些原因,需要将2个数据库实例合并为1个,也就是说要把其中的一台迁移到另外一台上面. 背景介绍 :下面的B,C代表2个实例,要把B中相关东西迁移到C实例上面.其中B上面有一部分的同步是从另外一台服 ...

  6. Valid Number @python

    Valid Number Validate if a given string is numeric. Some examples:"0" => true" 0.1 ...

  7. nginx错误汇总

    一.Nginx出现413 Request Entity Too Large错误解决方法 Nginx出现的413 Request Entity Too Large错误,这个错误一般在上传文件的时候出现, ...

  8. ssh(Struts2+hibernate+spring)简单分页

    实体类+实体映射+entity(pagebean)+dao层+service层+action层

  9. 【Android接口实现】PhotoView——单点支持/多图像缩放,实现了触摸

    转载请注明出处:http://blog.csdn.net/zhaokaiqiang1992 今天给大家介绍的开源项目,是来自Github的PhotoView项目,这个项目的主要功能是实现普通的Imag ...

  10. Jenkins redeploy artifacts

    jenkins redeploy artifacts 按钮 - 开源中国https://www.oschina.net/question/3045293_2247829 Jenkins 构建失败后通过 ...