分享
  1. 首页
  2. 文章

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

陌无崖 · · 1270 次点击 · · 开始浏览
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

导语

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

Event模式

服务端

首先实现我们的方法,这里需要注意的是,由于我们这使用的是事件订阅方法,因此实现的所有的共有方法都会被访问依次,私有方法将不会被访问,在Go张默认函数名首字母小写为私有方法,所以下面的process函数将不会被访问。

type Event struct {
}
func (e *Event) Process(ctx context.Context, event *proto.Event) error {
 log.Log("公有方法Process 收到事件,", event.Name)
 log.Log("公有方法Process 数据", event.Data)
 return nil
}
func (e *Event) Process2(ctx context.Context, event *proto.Event) error {
 log.Log("公有方法Process2 收到事件,", event.Name)
 log.Log("公有方法Process2 数据", event.Data)
 return nil
}
func (e *Event) process(ctx context.Context, event *proto.Event) error {
 log.Log("私有方法process,收到事件,", event.Name)
 log.Log("私有方法process,数据", event.Data)
 return nil
}

现在我们启动测试一下

image

image

访问localhost:8080/user/login
image

meta*元数据配置

使用meta*我们可以在服务端配置我们的请求信息,不再借助proto文件中的Resquet,现在让我们重新定义我们的api.proto文件

syntax = "proto3";
service Example {
 rpc Call(CallRequest) returns(CallResponse) {};
}
service Foo {
 rpc Bar(EmptyRequest) returns(EmptyResponse) {};
}
message CallRequest {
 string name = 1;
}
message CallResponse {
 string message = 2;
}
message EmptyRequest {
}
message EmptyResponse {
}

使用protoc命令生成代码

protoc --go_out=. --micro_out=. proto/api.proto

编写我们的服务端,服务端和之前的例子相比没有什么需要改变的写法。

func (e *Example) Call(ctx context.Context, req *proto.CallRequest, rsp *proto.CallResponse) error {
 log.Print("Meta Example.Call接口收到请求")
 if len(req.Name) == 0 {
 return errors.BadRequest("go.micro.api.example", "no content")
 }
 rsp.Message = "Meta已经收到你的请求," + req.Name
 return nil
}
func (f *Foo) Bar(ctx context.Context, req *proto.EmptyRequest, rsp *proto.EmptyResponse) error {
 log.Print("Meta Foo.Bar接口收到请求")
 // noop
 return nil
}

main函数中注册的逻辑发生了改变,如下我们可以看到,在注册的时候我们规定了相关的路由和请求,这里需要注意的是,rapi是导入的提供handler的一个包rapi "github.com/micro/go-micro/api/handler/api"

proto.RegisterExampleHandler(service.Server(), new(Example), api.WithEndpoint(&api.Endpoint{
 // 接口方法,一定要在proto接口中存在,不能是类的自有方法
 Name: "Example.Call",
 // http请求路由,支持POSIX风格
 Path: []string{"/example/call"},
 // 支持的方法类型
 Method: []string{"POST"},
 Handler: rapi.Handler,
 }))
 // 注册Foo接口处理器
 proto.RegisterFooHandler(service.Server(), new(Foo), api.WithEndpoint(&api.Endpoint{
 Name: "Foo.Bar",
 Path: []string{"/foo/bar"},
 Method: []string{"POST"},
 Handler: rapi.Handler,
 }))

现在让我们启动一下


image

image

image

image

我们需要注意的请求foo/bar是我们没有携带任何body值,是因为被调用的方法参数里没有任何属性,如果你带上body,会产生下面的错误


image

推荐阅读


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


打开微信扫一扫,关注微信公众号

有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:陌无崖

查看原文:微服务系列笔记之API事件订阅模式和元数据模式

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

关注微信
1270 次点击
暂无回复
添加一条新回复 (您需要 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏