微服务架构是把应用解耦成逻辑上的相对隔离的服务,API网关则是提供单一的入口把服务的API统一起来。通过服务发现,Micro APIhttp方式,将请求动态路由到具体的后台服务接口。

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 handlerAPI 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)
}

参考文章

  1. Go API

Micro API使用相关推荐

  1. micro api入门

    上一节学习了go-micro的入门. 这一节我们来熟悉micro的工具集里的api用法. micro api网关 Micro的api就是api网关 API参考了API网关模式为服务提供了一个单一的公共 ...

  2. go-micro V2 从零开始(四)集成micro api网关

    本文相关代码:gitee 文章目录 前言 具体步骤 一.启动服务 二.micro api 网关 2.1 启动网关 2.2 service not found 异常处理 2.3 接口调用 三.编写api ...

  3. 牌类游戏使用微服务重构笔记(四): micro框架使用经验

    项目依赖 推荐使用go module, 我选择go module的最主要原因是足够简单,可以脱离gopath,就跟写nodejs一样,随便在一个地方新建一个文件夹就可以撸代码了,clone下来的源码也 ...

  4. f12控制台如何查看consul_基于 Consul 的 Go Micro 客户端服务发现是如何实现的

    基于 Consul 的 Go Micro 客户端服务发现是如何实现的 由 学院君 创建于1年前, 最后更新于 1年前 版本号 #1 上篇分享我们介绍了基于 Consul 作为注册中心的 Go Micr ...

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

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

  6. 【转】Go Micro(2)——微服务工具箱

    微服务工具箱 现在你也许听到了这个新现象:微服务.如果你对此不熟悉也有兴趣学习,欢迎参考上一篇文章. 这篇文章我们将讨论 Micro - 一个开源的微服务工具箱,Micro 提供了核心的必须工具来构建 ...

  7. 找不到服务器micro,Go Micro服务发现

    服务发现,就是通过什么办法可以找到需要调用的服务的地址(ip和端口),因为只有拿到服务的地址,我们才可以连接服务,发送接口调用请求. 上一个章节,我们没说明两个服务直接是如何找到对方的,只是使用服务名 ...

  8. 微服务系列笔记之Mico Api详解

    导语 上一篇文章中有了入门案例,现在是不是有了很好的理解,不过有个前提是你需要了解grpc技术,简单的来说grpc是一个通信框架,micro是类似的一个通信框架,只不过这个框架应用于微服务中.因此如果 ...

  9. MICRO和GO-MICRO

    createdtime 20211124 updatedtime 20211126 author venki.chen 一.是什么 1. 定义,是做什么用的? go micro是什么? go-micr ...

最新文章

  1. 如何修改系统时间显示格式
  2. 3、Excel各种类型数据的输入(数据类型、快速填充数据、修改数据)
  3. 【GAN优化】解决模式崩溃的两条思路:改进优化和网络架构
  4. JDBC实例--JDBC连接池技术解密,连接池对我们不再陌生
  5. socket的阻塞模式和非阻塞模式(send和recv函数在阻塞和非阻塞模式下的表现)
  6. oracle form执行后左上角没出现oracle标记,Oracle FORM 开发技巧(1)
  7. 微软开源深度学习优化库 DeepSpeed 连登 GitHub 趋势榜!
  8. UITableViewCell不重用代码
  9. [POJ2406]字符串的幂
  10. Some Important Data Structures
  11. python代码螺旋线怎么写_python实现画五角星和螺旋线的示例
  12. 剖析微商到微伤的全过程
  13. 免费内网穿透端口映射工具-网络通
  14. 12306 APP 同一乘客、同列火车候补订单与硬座的处理规则!
  15. c程序设计语言布莱恩克尼汉,《C程序设计语言(第2版新版)典藏版》 —1.5.4 单词计数...
  16. 互动式广告是怎么样的一种广告形式?
  17. [转]数据挖掘在金融行业十大应用
  18. 投资常识-基金-场内场外
  19. 合天CTF-签到般的包含
  20. Houdini pdg arnold渲染报错

热门文章

  1. DICOM:由fo-dicom库解析DICOM文件引申出来的……
  2. 1064 例题5-1-5 连续自然数求和
  3. mysql经典46_50个经典SQL语句
  4. Mac os 创建自己的证书并且找到自己的证书 I
  5. 读real time localization and 3D reconstruction笔记
  6. linux硬件级虚拟机系统 电脑安桌游戏多开完全去除vm标识去虚拟化
  7. AMD将坚持x86架构,不会投身ARM架构怀抱
  8. Java基础(顺序结构)学习笔记
  9. 2016年8月1日 星期一 --出埃及记 Exodus 16:1
  10. 的确恶搞:教你调戏QQ好友