代码先锋网 代码片段及技术文章聚合

Go gRPC 发布订阅

技术标签: Go  golang

pubsub/pubsub.proto

// protoc --go_out=plugins=grpc:. pubsub.proto

syntax = "proto3";

package proto;

message String {
    string value = 1;
}

service PubsubService {
    rpc Publish (String) returns (String);
    rpc SubscribeTopic (String) returns (stream String);
    rpc Subscribe (String) returns (stream String);
}

server/server.go

package main

import (
	"context"
	"log"
	"net"
	"strings"
	"time"

	proto "../pubsub"
	"github.com/docker/docker/pkg/pubsub"
	"google.golang.org/grpc"
)

type PubsubService struct {
	pub *pubsub.Publisher
}

func (p *PubsubService) Publish(ctx context.Context, arg *proto.String) (*proto.String, error) {
	p.pub.Publish(arg.GetValue())
	return &proto.String{}, nil
}

func (p *PubsubService) SubscribeTopic(arg *proto.String, stream proto.PubsubService_SubscribeTopicServer) error {
	ch := p.pub.SubscribeTopic(func(v interface{}) bool {
		if key, ok := v.(string); ok {
			if strings.HasPrefix(key, arg.GetValue()) {
				return true
			}
		}
		return false
	})

	for v := range ch {
		if err := stream.Send(&proto.String{Value: v.(string)}); nil != err {
			return err
		}
	}
	return nil
}

func (p *PubsubService) Subscribe(arg *proto.String, stream proto.PubsubService_SubscribeServer) error {
	ch := p.pub.Subscribe()

	for v := range ch {
		if err := stream.Send(&proto.String{Value: v.(string)}); nil != err {
			return err
		}
	}
	return nil
}

func NewPubsubService() *PubsubService {
	return &PubsubService{pub: pubsub.NewPublisher(100*time.Millisecond, 10)}
}

func main() {
	grpcServer := grpc.NewServer()
	proto.RegisterPubsubServiceServer(grpcServer, NewPubsubService())

	lis, err := net.Listen("tcp4", ":1234")
	if nil != err {
		log.Fatal(err)
	}
	grpcServer.Serve(lis)
}

 

client1/client1.go 用来发布信息的客户端

package main

import (
	"context"
	"log"

	proto "../pubsub"
	"google.golang.org/grpc"
)

func main() {
	conn, err := grpc.Dial("localhost:1234", grpc.WithInsecure())
	if err != nil {
		log.Fatal(err)
	}

	defer conn.Close()

	client := proto.NewPubsubServiceClient(conn)

	_, err = client.Publish(
		context.Background(), &proto.String{Value: "golang: hello Go"},
	)
	if err != nil {
		log.Fatal(err)
	}

	_, err = client.Publish(
		context.Background(), &proto.String{Value: "docker: hello Docker"},
	)
	if nil != err {
		log.Fatal(err)
	}
}

client2/client2.go 用来订阅信息的客户端

package main

import (
	"context"
	"fmt"
	"io"
	"log"

	proto "../pubsub"
	"google.golang.org/grpc"
)

func main() {
	conn, err := grpc.Dial("localhost:1234", grpc.WithInsecure())
	if nil != err {
		log.Fatal(err)
	}
	defer conn.Close()

	client := proto.NewPubsubServiceClient(conn)
	stream, err := client.Subscribe(
		context.Background(), &proto.String{Value: "golang:"},
	)
	if nil != err {
		log.Fatal(err)
	}

	go func() {
		for {
			reply, err := stream.Recv()
			if nil != err {
				if io.EOF == err {
					break
				}
				log.Fatal(err)
			}
			fmt.Println("sub1: ", reply.GetValue())
		}
	}()

	streamTopic, err := client.SubscribeTopic(
		context.Background(), &proto.String{Value: "golang:"},
	)
	if nil != err {
		log.Fatal(err)
	}

	go func() {
		for {
			reply, err := streamTopic.Recv()
			if nil != err {
				if io.EOF == err {
					break
				}
				log.Fatal(err)
			}
			fmt.Println("subTopic: ", reply.GetValue())
		}
	}()

	<-make(chan bool)
}

 

 

 

 

 

版权声明:本文为ndzjx原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/ndzjx/article/details/109777315

智能推荐

go之grpc

1、安装 install grpc install protocol buffer v3 PS:本文基于Window64安装,下载地址:https://github.com/protocolbuffers/protobuf/releases 将解压后的protoc.exe路径加入PATH环境变量中 install the protoc plugin for Go 2、.protoc生成与编译 2....

grpc的go使用

安装 获取 goprotobuf 提供的 Protobuf 编译器插件 protoc-gen-go 一般安装在$GOBIN Build the example gRPC服务在.proto文件中定义,该文件用于生成相应的.pb.go文件。 .pb.go文件是通过使用协议编译器编译.proto文件生成的:protoc。...

go语言 grpc入门

what grpc gRPC is a modern open source high performance RPC framework that can run in any environment. It can efficiently connect services in and across data centers with pluggable support for load ba...

go安装gRPC

安装Protobuf 下载protobuf安装程序。 装protoc.exe放入 $GOROOT/bin 目录下。 安装grpc相关功能 由于被墙执行如下命令后出错,可以使用手动方法安装比较麻烦哦。 在$GOPATH/src目录创建 golang.org/x 、google.golang.org 目录 1. gRPC 重命名为grpc,放在$GOPATH/src/google.golang.org...

go使用GRPC

GRPC grpc是由google主导开发的一个基于HTTP/2,并应用Protobuf进行通信的RPC通信框架。 grpc支持不同语言之间的通信,使用简单方便。 本次介绍go语言使用grpc与Java进行通信。 go安装grpc和protobuf 对于go语言的安装这里不进行说明,安装方法很简单。 go安装之后,要在环境变量中设置GOROOT和GOPATH。其中GOPATH是你go项目的工作目录...

猜你喜欢

go-grpc 安装

 官方go get -u 命令几乎用不了,挂vpn也不行...

grpc和go module

RPC就是要像调用本地的函数一样去调远程函数。 但是在调用远程函数的时候会出现一些问题: Call ID映射。在本地调用中,函数体是直接通过函数指针来指定的,我们调用函数时,编译器就自动帮我们调用它相应的函数指针。但是在远程调用中,函数指针是不行的,因为两个进程的地址空间是完全不一样的。所以,在RPC中,所有的函数都必须有自己的一个ID。这个ID在所有进程中都是唯一确定的。客户端在做远程过程调用时...

go grpc支持http

步骤介绍 通过openssl生成**公钥 服务端代码,客户端代码 通过gomod拉取代码所用的库 编译proto文件,分为两步->go_out 运行服务端代码 通过http(post)访问,通过grpc client访问 目录结构 makefile文件 这里特别指定googleapis所在位置 gateway.proto server/main.go client/main.go 一个简单d...

go版本gRPC入门

本文通过一个简单的示例,了解如何在Go中使用gRPC。 1、前期准备 前提 运行 $ go version查看go语言版本,gRPC要求go 语言最低版本为1.5 安装gRPC 使用命令行安装 * 使用以下命令安装gRPC: $ go get google.golang.org/grpc 安装proto3 1)安装用于生成gRPC服务代码的protoc编译器。最简单的方法是从这里下载protoc-...