Fabric 1.0源代码分析(13)events(事件服务)

# Fabric 1.0源代码笔记 之 events(事件服务)

## 1、events概述

events代码分布在events/producer和events/consumer目录下,目录结构如下:

* events/producer目录:生产者,提供事件服务器。
     * producer.go,EventsServer结构体及方法。
     * events.go,eventProcessor结构体及方法,handlerList接口及实现。
     * handler.go,handler结构体及方法。
* events/consumer目录:消费者,获取事件。

## 2、producer(生产者)

### 2.1、EventsServer结构体及方法

EventsServer结构体定义:(空)

```go
type EventsServer struct {
}

//全局事件服务器globalEventsServer
var globalEventsServer *EventsServer
//代码在events/producer/producer.go
```

涉及方法如下:

```go
//globalEventsServer创建并初始化
func NewEventsServer(bufferSize uint, timeout time.Duration) *EventsServer
//接收消息并处理
func (p *EventsServer) Chat(stream pb.Events_ChatServer) error
//代码在events/producer/producer.go
```

### 2.2、eventProcessor结构体及方法(事件处理器)

eventProcessor结构体定义:

```go
type eventProcessor struct {
    sync.RWMutex
    eventConsumers map[pb.EventType]handlerList
    eventChannel chan *pb.Event
    timeout time.Duration //生产者发送事件的超时时间
}

//全局事件处理器gEventProcessor
var gEventProcessor *eventProcessor
//代码在events/producer/events.go
```

涉及方法如下:

```go
func (ep *eventProcessor) start() //启动并处理事件,从ep.eventChannel通道接收消息并处理
//初始化gEventProcessor,并添加消息类型,并发启动start()
func initializeEvents(bufferSize uint, tout time.Duration)
//添加消息类型至gEventProcessor.eventConsumers,并初始化handlerList
func AddEventType(eventType pb.EventType) error
//绑定Interest和handler
func registerHandler(ie *pb.Interest, h *handler) error
//取消绑定Interest和handler
func deRegisterHandler(ie *pb.Interest, h *handler) error
func Send(e *pb.Event) error //Event发送至gEventProcessor.eventChannel
//代码在events/producer/events.go
```

### 2.3、handlerList接口及实现

#### 2.3.1、handlerList接口定义(handler列表)

```go
type handlerList interface {
    add(ie *pb.Interest, h *handler) ( bool, error) //添加
    del(ie *pb.Interest, h *handler) ( bool, error) //删除
    foreach(ie *pb.Event, action func(h *handler)) //遍历
}
//代码在events/producer/events.go
```

#### 2.3.2、handlerList接口实现

```go
type genericHandlerList struct {
    sync.RWMutex
    handlers map[*handler] bool
}

type chaincodeHandlerList struct {
    sync.RWMutex
    handlers map[ string] map[ string] map[*handler] bool
}
//代码在events/producer/events.go
```

### 2.4、handler结构体及方法

handler结构体定义:

```go
type handler struct {
    ChatStream pb.Events_ChatServer
    interestedEvents map[ string]*pb.Interest
}
//代码在events/producer/handler.go
```

补充pb.Events_ChatServer和pb.Interest(关注)定义:

```go
type Events_ChatServer interface {
    Send(*Event) error
    Recv() (*SignedEvent, error)
    grpc.ServerStream //type ServerStream interface
}

Interest struct {
    EventType EventType //type EventType int32
    RegInfo isInterest_RegInfo //type isInterest_RegInfo interface
    ChainID string
}

type EventType int32

const (
    EventType_REGISTER EventType = 0
    EventType_BLOCK EventType = 1
    EventType_CHAINCODE EventType = 2
    EventType_REJECTION EventType = 3
)
//代码在protos/peer/events.pb.go
```

handler结构体方法如下:

```go
func newEventHandler(stream pb.Events_ChatServer) (*handler, error) //构造handler
func (d *handler) Stop() error //停止handler,取消所有handler注册
func getInterestKey(interest pb.Interest) string //获取interest.EventType
func (d *handler) register(iMsg []*pb.Interest) error //逐一绑定Interest和handler
func (d *handler) deregister(iMsg []*pb.Interest) error //逐一取消绑定Interest和handler
func (d *handler) deregisterAll() //取消所有handler绑定
func (d *handler) HandleMessage(msg *pb.SignedEvent) error //处理消息
func (d *handler) SendMessage(msg *pb.Event) error //通过流向远程PEER发送消息
func validateEventMessage(signedEvt *pb.SignedEvent) (*pb.Event, error) //验证事件消息
//代码在events/producer/handler.go
```

补充pb.Event和pb.SignedEvent:

```go
type Event struct {
    Event isEvent_Event //type isEvent_Event interface
    Creator [] byte //事件创建者
}

SignedEvent struct {
    Signature [] byte //在事件字节上的签名
    EventBytes [] byte //事件对象序列化,即type Event struct
}
//代码在protos/peer/events.pb.go
```

## 3、consumer(消费者)

待补充。






网址:http://www.qukuailianxueyuan.io/



欲领取造币技术与全套虚拟机资料

区块链技术交流QQ群:756146052  备注:CSDN

尹成学院微信:备注:CSDN




网址:http://www.qukuailianxueyuan.io/



欲领取造币技术与全套虚拟机资料

区块链技术交流QQ群:756146052  备注:CSDN

尹成学院微信:备注:CSDN

猜你喜欢

转载自blog.csdn.net/yincheng01/article/details/80384314