导语

上一篇文章中有了入门案例,现在是不是有了很好的理解,不过有个前提是你需要了解grpc技术,简单的来说grpc是一个通信框架,micro是类似的一个通信框架,只不过这个框架应用于微服务中。因此如果你还未了解grpc技术,仍然建议你学习grpc基础,便于更好的理解本篇文章。

准备工作

## 安装go-micro
go get github.com/micro/go-micro
## 安装micro
go get github.com/micro/micro
## 安装grpc
go get -u google.golang.org/grpc
## 安装grpc插件
go get -u github.com/golang/protobuf/protoc-gen-go
## 安装micro插件
go get github.com/micro/protoc-gen-micro
# 设置环境变量,便于命令行操作
export PATH=$PATH:$GOPATH/bin

Micro API

如果你做过web开发,Http请求是无法避免的,服务端需要接受请求并返回相应的结果,但是这种情况下,如何才能在Go Micro中实现呢?其实在Micro中官方为我们提供了API网关micro api。对API的请求将有HTTP提供,并通过服务发现我们的路由。简单来说使用API​​网关模式为你的服务提供单个公共入口点。micro api服务于HTTP并使用服务发现动态路由。由于micro api基于go-micro开发,因此它同时具备了服务发现,负载均衡等能力。是可插拔的一个微服务。

如何使用

启动

micro api [command options] [arguments...]

options选项

–address:用来设置api地址,例如:0.0.0.0:8080
–handler:用来指定用于将HTTP请求映射到服务的请求处理程序,值有四个:api,event,http,rpc。
–namespace:设置api的命名空间,例如:go.micro.api,使用这个之后,http请求之后,才会解析api所在的路由
–resolver:设置api使用的主机名解析程序,值有三个:host,path,grpc。

小试牛刀

服务端

定义api.proto,这里需要注意的是我们定义了两个服务分别是Example 和 Foo,下面模拟Http请求结构体,其实Go-micro直接为我们封装了这部分如图

这里我们只是贴上源码,方便大家理解。

syntax = "proto3";package go.micro.api.example;service Example {rpc Call(Request) returns(Response);
}service Foo {rpc Bar(Request) returns(Response);
}message Pair {string key = 1;repeated string values = 2;
}
// 一个Http请求
message Request {string method = 1;string path = 2;map<string, Pair> header = 3;map<string, Pair> get = 4;map<string, Pair> post = 5;string body = 6;string url = 7;
}
// 一个Http响应
message Response {int32 statusCode = 1;map<string, Pair> header = 2;string body = 3;
}
// 一个Http事件
message Event {// e.g loginstring name = 1;// uuidstring id = 2;// unix timestamp of eventint64 timestamp = 3;// event headersmap<string, Pair> header = 4;// the event datastring data = 5;
}

编写我们的服务端代码

type Example struct{}type Foo struct{}// Example.Call 通过API向外暴露为/example/call,接收http请求
func (e *Example) Call(ctx context.Context, req *api.Request, rsp *api.Response) error {log.Log("Example.Call接口收到请求")//获取参数 map[string]*api.Pair数据类型name, ok := req.Get["name"]// 判断 values数组是否存在值if !ok || len(name.Values) == 0 {return errors.BadRequest("go.micro.api.example", "参数不正确")}// 打印请求头for k, v := range req.Header {log.Log("请求头信息,", k, " : ", v)}rsp.StatusCode = 200b, _ := json.Marshal(map[string]string{"message": "我们已经收到你的请求," + strings.Join(name.Values, " "),})// 设置返回值rsp.Body = string(b)return nil
}
//
func (f *Foo) Bar(ctx context.Context, req *api.Request, rsp *api.Response) error {log.Logf("Foo.Bar接口收到请求")//判断请求方法是否是POSTif req.Method != "POST" {return errors.BadRequest("go.micro.api.example", "require post")}//获得请求头ct, ok := req.Header["Content-Type"]if !ok || len(ct.Values) == 0 {return errors.BadRequest("go.micro.api.example", "need content-type")}fmt.Println(ct.Values[0])if ct.Values[0] != "application/json" {return errors.BadRequest("go.micro.api.example", "expect application/json")}var body map[string]interface{}json.Unmarshal([]byte(req.Body), &body)// 设置返回值rsp.Body = "收到消息:" + string([]byte(req.Body))return nil
}

注册我们的服务,这里和之前方法类似,不再强调。

service := micro.NewService(micro.Name("go.micro.api.example"),micro.Version("latest"),)service.Init()// 注册 example handlerapi.RegisterExampleHandler(service.Server(), new(Example))// 注册 foo handlerapi.RegisterFooHandler(service.Server(), new(Foo))if err := service.Run(); err != nil {log.Fatal(err)}

测试

首先启动我们的api

micro api --handler=api --namespace=go.micro.api

启动我们的服务端

go run api.go

我们这里用postman进行测试如下
测试bar


测试example

查看我们的控制台,同样产生了信息

结语

掌握本篇知识,总体来说不是很难,阅读时,请耐心思考,自己多加实践,才能更好的掌握。

本篇文章参考Go-Mico官方博客和系列案例
进行总结分享。

推荐阅读

  • 开发环境搭建(持续更新中)
  • RabbitMQ系列笔记介绍篇
  • Golang中Modle包的使用
  • goriila context深入学习笔记
  • Go Context深入学习笔记
  • 基于Nginx和Consul构建高可用及自动发现的Docker服务架构
  • 关于log日志的深入学习笔记

本文欢迎转载,转载请联系作者,谢谢!

  • 公众号【常更新】:无崖子天下无敌
  • GitHub:https://github.com/yuwe1
  • 博客地址【定期更新】:https://mowuya.cn/

微服务系列笔记之Mico Api详解相关推荐

  1. 微服务系列笔记之API事件订阅模式和元数据模式

    导语 今天继续总结关于micro api的其它用法.因为每个知识点基本类似,在这篇笔记中了event和meta做对比.本系列的笔记全部参考Go Micro官方源码及博客,比较多,有兴趣的可以去研究. ...

  2. 微服务系列笔记之什么是微服务

    导语 微服务(Microservice Architecture)是近几年流行的一种架构思想,它的概念没有很明确的指出.ThoughtWorks 公司的首席科学家 Martin Fowler曾经解释过 ...

  3. 微服务系列笔记之Go-Micro

    导语 在上一篇博客中我们主要介绍了什么是微服务,读者可以用这篇文章进行简单的入门,当然仅仅阅读这一篇仍然是不够的,还需要广泛浏览相关概念,逐渐加深印象,可以更好的理解,在本篇文章中,主要分享了微服务框 ...

  4. 什么是微服务_微服务系列笔记:什么是微服务?

    作者 | 莫无崖 导语 微服务(Microservice Architecture)是近几年流行的一种架构思想,它的概念没有很明确的指出.ThoughtWorks 公司的首席科学家 Martin Fo ...

  5. 微服务系列笔记之Go-Micro入门案例

    导语 了解了Micro的基本框架之后,我们做一个简单的例子来实现客户端与服务端的通信,在了解本篇文章之前,需要你对rpc.grpc通信技术有所了解. 准备工作 ## 安装go-micro go get ...

  6. 微服务网关spring cloud gateway入门详解

    1.API网关 API 网关是一个处于应用程序或服务( REST API 接口服务)之前的系统,用来管理授权.访问控制和流量限制等,这样 REST API 接口服务就被 API 网关保护起来,对所有的 ...

  7. 六, 跨语言微服务框架 - Istio Ingress和Egress详解(解决Istio无法外网访问问题)

    在微服务中另外一个重点就是网关,网关理论包含入口网关和出口网关,传统意义上的网关很难做到出口网络控制,但是对于Istio是一件非常轻松的事情(因为所有的出口流量都会经过Istio),入口网关控制解析路 ...

  8. 微服务注册中心 Nacos 实现原理详解!

    Nacos 架构 Provider APP:服务提供者 Consumer APP:服务消费者 Name Server:通过VIP(Virtual IP)或DNS的方式实现Nacos高可用集群的服务路由 ...

  9. turbine java_微服务搭建集成Spring Cloud Turbine详解

    1.概述 本文中,我将向你介绍Spring Cloud Netflix Turbine.它将多个Hystrix Metrics Streams 聚合为一个,以便显示在一个仪表板视图中. 简要介绍Hys ...

最新文章

  1. python下requests的安装、测试、入门资料、官方资料
  2. C++的简单文本IO
  3. 【软件安装】sublime安装方法
  4. 对Python参数类型详解以及学习中遇到的坑
  5. .NET Core 微信小程序退款——(统一退款)
  6. Bootstrap3 缩写词样式
  7. posix thread条件变量
  8. IOPS和Throughput
  9. excel 文件导入数据库(java)
  10. 《遗传算法原理及应用》笔记—基本遗传算法
  11. Hybird Astar算法原理
  12. Qt编写的知名的开源软件汇总
  13. 当小米MIX 2遇到iPhone X 你会怎么选?
  14. C语言水洼数算法,水洼的数量算法 代码(C)
  15. 解决IE8/IE9无法加载Activex控件问题
  16. android canvas画图gc,自定义控件绘图(Canvas,Paint,Region等)篇一
  17. python—基础练习2
  18. 二级计算机等级证水平高吗,全国计算机水平一级高还是二级高
  19. 【云原生之Docker实战】使用Docker部署Alist网盘直链程序
  20. [C和指针] ch12. 使用结构和指针

热门文章

  1. win2d CanvasCommandList 使用方法
  2. 【Niagara 04】Tridium N4使用——生成报警信息
  3. python之字符编码、存取文件乱码问题、python2字符串乱码问题
  4. 关于BN层的一点理解
  5. Oracle表数据转换为XML格式数据
  6. 介绍一款最受欢迎的.NET 开源UI库
  7. 怎样提高团队管理能力3
  8. 提交按钮在form之外的提交方式,提交按钮提交页面任意表单
  9. Linux下配置DNS服务
  10. 基于esky实现python应用的自动升级