美文网首页GoGolang知识分享Golang
微服务系列笔记之API事件订阅模式和元数据模式

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

作者: 陌无崖 | 来源:发表于2019-08-11 20:19 被阅读3次

导语

今天继续总结关于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事件订阅模式和元数据模式

    导语 今天继续总结关于micro api的其它用法。因为每个知识点基本类似,在这篇笔记中了event和meta做对...

  • 微服务系列笔记之Broker模式入门介绍

    导语 API模式笔记告一段了,这篇文章总结了Micro中的消息订阅模式,在之前的系列文章中讲解了RabbitMQ消...

  • 观察者模式和发布订阅模式的区别

    观察者模式和发布订阅模式最大的区别就是发布订阅模式有个事件调度中心。 在观察者模式中,观察者需要直接订阅目标事件;...

  • 异步编程解决方案

    事件发布/订阅模式 事件监听器模式是一种广泛用于异步编程的模式,是回调函数的事件化,又称发布/订阅模式。 事件发布...

  • 【设计模式】观察者模式 和 发布订阅模式

    目录:观察者模式发布-订阅模式观察者模式和发布订阅模式的区别实现vue数据双向绑定 (1)观察者模式 (1)概念 ...

  • 常见设计模式

    问答 写出构造函数模式、混合模式、模块模式、工厂模式、单例模式、发布订阅模式的范例。 使用发布订阅模式写一个事件管...

  • 《微服务架构设计模式》读书笔记---第七章:在微服架构中实现查询

    在微服务中实现查询操作有两种不同的模式:API组合模式和命令查询职责隔离(CQRS)模式 API组合模式 这个模式...

  • 常见设计模式

    写出 构造函数模式、混合模式、模块模式、工厂模式、单例模式、发布订阅模式的范例。 使用发布订阅模式写一个事件管理器...

  • 前端设计模式

    写出 构造函数模式、混合模式、模块模式、工厂模式、单例模式、发布订阅模式的范例。 使用发布订阅模式写一个事件管理器...

  • Web40.设计模式

    构造函数模式 混合模式 模块模式 工厂模式 单例模式 发布订阅模式 使用发布订阅模式写一个事件管理器,可以实现如下...

网友评论

    本文标题:微服务系列笔记之API事件订阅模式和元数据模式

    本文链接:https://www.haomeiwen.com/subject/euisjctx.html