Micro API使用
微服务架构是把应用解耦成逻辑上的相对隔离的服务,API网关则是提供单一的入口把服务的API统一起来。通过服务发现,Micro API
以http
方式,将请求动态路由到具体的后台服务接口。
Micro API
是基于go-micro
开发,所以它天然具备服务发现、负载均衡、编码及RPC通信的能力。因此,Micro API
也是go-micro
体系中的一个微服务,它自身也是可插拔的。
安装
通过命令go get -u github/micro/micro
进行安装,如果安装成功,那么在命令行输入micro --version
就可以看到它的版本信息。
使用
Micro API
使用带分隔符的命名空间来在逻辑上区分后台服务及公开的服务,命名空间及HTTP请求路径会用于解析服务名与方法,比如GET /foo HTTP/1.1
会被路由到go.micro.api.foo
服务上。
Micro API
默认的命名空间是go.micro.api
,这个可以修改。例如:MICRO_NAMESPACE=com.example.api
。micro api命令用法:micro [global options] command [command options] [arguments...]
。
示例
下面是一个三层服务架构:
micro api
:(localhost:8080)-http访问入口api service
:(go.micro.api.book)-对外暴露的API服务backend service
:(go.micro.srv.book)-内网的后台服务
代码附在文后,分别启动这三层服务。
- 启动
micro api
,使用命令micro api
。 - 运行服务,
go run srv/main.go
- 运行api,
go run api/api.go
micro api
会运行api网关,用法:micro api [command options] [arguments...]
OPTIONS
允许的选项有:
--address
,用来设置api地址,例如:0.0.0.0:8080--handler
,用来指定用于将HTTP请求映射到服务的请求处理程序,值有四个:api,event,http,rpc。--namespace
,设置api的命名空间,例如:com.example.api--resolver
,设置api使用的主机名解析程序,micro使用命名空间与HTTP请求路径来动态路由到具体的服务。API命名的空间是go.micro.api
,可以通过指令--namespace
或者环境变量MICRO_NAMESPACE=设置命名空间
。--resolver
的值有三个:host,path,grpc
。
启动服务后,我们就可以发送请求curl "http://localhost:8080/book/register?name=john"
。
Http请求的路径/book/register
会被路由到服务go.micro.api/book
的方法Book.Register
上。
注意: 如果通过micro api
命令启动api服务时,缺少参数--handler
,那么在访问上面的地址时,会出现下面的响应结果。
{"id": "go.micro.api","code": 500,"detail": "error during request: unknown field \"name\" in go_micro_api.Request","status": "Internal Server Error"
}
成功后的响应结果为
{"message": "john, welcome to California hotel!"
}
上面是通过api服务进行后端服务访问,我们也可以直接通过rpc调用。
curl -H 'Content-Type: application/json' \-d '{"service": "go.micro.srv.greeter", "method": "Say.Hello", "request": {"name": "John"}}' \http://localhost:8080/rpc
micro api
micro api
提供下面类型的http api
接口
/[service]/[method]
HTTP路径式的会被动态的定位到服务上/rpc
显示使用后台服务与方法名直接调用
在启动的时候可以看到,micro api
注册了RPC handler
和API handler
。
第一种类型:handler
是负责持有并管理HTTP
请求路由,默认的handler
使用从注册中心获取的端口元数据来决定指向服务的路由,如果路由不匹配,就会回退到使用rpc handler
。在注册时,可以通过go-api
来配置路由。
API有如下方法可以配置请求handler
,
api
:接收任何的HTTP请求,并且向前转发指定格式的RPC请求。
content-type
支持任何类型,body支持任何格式。configure
配置,在启动时指定--handler=api
或在启动命令前指定环境变量MICRO_API_HANDLER=api
。rpc
:处理json及protobuf格式的POST请求,并转向RPC。proxy
:处理http请求并转向反向代理event
:处理任意的http请求,并向消息总线分发消息web
:包含web socket
的http反向代理。
目前版本无法支持多个handler
并存运行,也即同时只能使用一个handler
。
第二种类型:/rpc
端点允许绕过主handler
,然后与任何服务直接会话。请求参数:
service
:指定服务名method
:指定方法名request
:请求body体address
:可选,指定特定的目标主机地址。
内部机制
下面看micro内部是怎么工作的,在micro/main.go
文件,程序的主入口,只有一个函数cmd.Init()
。
func Init(options ...micro.Option) {// cmd.App()首先会返回一个新的App,这个App中某些标识有默认值// 例如:client_request_timeout值为5s,client_reties值为1,// client_pool_size为1,client_pool_ttl值为1m// server_name服务名字为go.micro.srv.example// server_version版本号为1.1.0// server_address,绑定地址到服务上,默认是127.0.0.1:8080// server_advertise,使用服务发现时使用这个,也是绑定地址到服务上,默认是127.0.0.1:8080Setup(cmd.App(), options...)cmd.Init(cmd.Name(name),cmd.Description(description),cmd.Version(version),)
}
// 上面的Setup会设置cli.App
func Setup(app **ccli.App, options ...micro.Option) {app.Commands = append(app.Commands, api.Commands(options...)...)app.Commands = append(app.Commands, bot.Commands()...)app.Commands = append(app.Commands, cli.Commands()...)app.Commands = append(app.Commands, proxy.Commands(options...)...)app.Commands = append(app.Commands, service.Commands(options...)...)app.Commands = append(app.Commands, new.Commands()...)app.Commands = append(app.Commands, web.Commands(options...)...)app.Action = func(context *ccli.Context) { ccli.ShowAppHelp(context)}// setup会解析命令行的参数,然后将标识参数添加到app.Flags中,将环境变量中的参数添加到app.Commandssetup(app)
}
参考文章
- Go API
Micro API使用相关推荐
- micro api入门
上一节学习了go-micro的入门. 这一节我们来熟悉micro的工具集里的api用法. micro api网关 Micro的api就是api网关 API参考了API网关模式为服务提供了一个单一的公共 ...
- go-micro V2 从零开始(四)集成micro api网关
本文相关代码:gitee 文章目录 前言 具体步骤 一.启动服务 二.micro api 网关 2.1 启动网关 2.2 service not found 异常处理 2.3 接口调用 三.编写api ...
- 牌类游戏使用微服务重构笔记(四): micro框架使用经验
项目依赖 推荐使用go module, 我选择go module的最主要原因是足够简单,可以脱离gopath,就跟写nodejs一样,随便在一个地方新建一个文件夹就可以撸代码了,clone下来的源码也 ...
- f12控制台如何查看consul_基于 Consul 的 Go Micro 客户端服务发现是如何实现的
基于 Consul 的 Go Micro 客户端服务发现是如何实现的 由 学院君 创建于1年前, 最后更新于 1年前 版本号 #1 上篇分享我们介绍了基于 Consul 作为注册中心的 Go Micr ...
- go web框架_golang微服务框架go-micro 入门笔记2.2 micro工具之微应用利器micro web
micro web micro 功能非常强大,本文将详细阐述micro web 命令行的功能 阅读本文前你可能需要进行如下知识储备 golang分布式微服务框架go-micro 入门笔记1:搭建go- ...
- 【转】Go Micro(2)——微服务工具箱
微服务工具箱 现在你也许听到了这个新现象:微服务.如果你对此不熟悉也有兴趣学习,欢迎参考上一篇文章. 这篇文章我们将讨论 Micro - 一个开源的微服务工具箱,Micro 提供了核心的必须工具来构建 ...
- 找不到服务器micro,Go Micro服务发现
服务发现,就是通过什么办法可以找到需要调用的服务的地址(ip和端口),因为只有拿到服务的地址,我们才可以连接服务,发送接口调用请求. 上一个章节,我们没说明两个服务直接是如何找到对方的,只是使用服务名 ...
- 微服务系列笔记之Mico Api详解
导语 上一篇文章中有了入门案例,现在是不是有了很好的理解,不过有个前提是你需要了解grpc技术,简单的来说grpc是一个通信框架,micro是类似的一个通信框架,只不过这个框架应用于微服务中.因此如果 ...
- MICRO和GO-MICRO
createdtime 20211124 updatedtime 20211126 author venki.chen 一.是什么 1. 定义,是做什么用的? go micro是什么? go-micr ...
最新文章
- 如何修改系统时间显示格式
- 3、Excel各种类型数据的输入(数据类型、快速填充数据、修改数据)
- 【GAN优化】解决模式崩溃的两条思路:改进优化和网络架构
- JDBC实例--JDBC连接池技术解密,连接池对我们不再陌生
- socket的阻塞模式和非阻塞模式(send和recv函数在阻塞和非阻塞模式下的表现)
- oracle form执行后左上角没出现oracle标记,Oracle FORM 开发技巧(1)
- 微软开源深度学习优化库 DeepSpeed 连登 GitHub 趋势榜!
- UITableViewCell不重用代码
- [POJ2406]字符串的幂
- Some Important Data Structures
- python代码螺旋线怎么写_python实现画五角星和螺旋线的示例
- 剖析微商到微伤的全过程
- 免费内网穿透端口映射工具-网络通
- 12306 APP 同一乘客、同列火车候补订单与硬座的处理规则!
- c程序设计语言布莱恩克尼汉,《C程序设计语言(第2版新版)典藏版》 —1.5.4 单词计数...
- 互动式广告是怎么样的一种广告形式?
- [转]数据挖掘在金融行业十大应用
- 投资常识-基金-场内场外
- 合天CTF-签到般的包含
- Houdini pdg arnold渲染报错