首页 > 其他分享 >Grpc之metadata

Grpc之metadata

时间:2024-09-11 14:49:35浏览次数:8  
标签:err Grpc fmt server grpc Printf metadata

hello.proto

syntax="proto3";
package pb;
option go_package = "./pb";
service Greeter {
  rpc SayHello(HelloRequest) returns(HelloReply){}
}

message HelloRequest {
  string name = 1;
}

message HelloReply {
  string message = 1;
}

protoc -I . --go_out=. --go-grpc_out=. ./hello.proto

server

package main

import (
	"context"
	"flag"
	"fmt"
	"demo/protos"
	"google.golang.org/grpc"
	"google.golang.org/grpc/metadata"
	"log"
	"net"
)

var host = "127.0.0.1"

var (
	ServiceName = flag.String("ServiceName", "hello_service", "service name")
	Port        = flag.Int("Port", 50001, "listening port")
)

type server struct {
}

func main() {
	flag.Parse()

	lis, err := net.Listen("tcp", fmt.Sprintf("127.0.0.1:%d", *Port))
	if err != nil {
		log.Fatalf("failed to listen:%s", err)
	} else {
		fmt.Printf("listen at :%d\n", *Port)
	}

	defer lis.Close()

	s := grpc.NewServer()
	defer s.GracefulStop()

	protos.RegisterGreeterServer(s, &server{})
	addr := fmt.Sprintf("%s:%d", host, *Port)
	fmt.Printf("server add:%s\n", addr)

	if err := s.Serve(lis); err != nil {
		fmt.Printf("failed to server: %s", err)
	}
}

func (s *server) SayHello(ctx context.Context, in *protos.HelloRequest) (*protos.HelloReply, error) {
	md, ok := metadata.FromIncomingContext(ctx)
	if !ok {
		fmt.Printf("get metadata error")
    }else{
        fmt.Println("get metadata success: ",md)
    }
	if t, ok := md["timestamp"]; ok {
		fmt.Printf("timestamp from metadata:\n")
		for i, e := range t {
			fmt.Printf(" %d. %s\n", i, e)
		}
	}
	if t1, ok1 := md["key1"]; ok1 {
		fmt.Printf("key1 from metadata:\n")
		for i, e := range t1 {
			fmt.Printf(" %d . %s\n", i, e)
		}
	}
	if len(md) > 0 {
		for k, v := range md {
			fmt.Printf("%v:%v\n", k, v)
		}
	}
	return &protos.HelloReply{Message: "server: " + in.Name}, nil
}

client

package main

import (
	"context"
	"fmt"
	"demo/protos"
	"google.golang.org/grpc"
	"google.golang.org/grpc/metadata"
	"time"
)

const (
	timestampFormat = time.StampNano
)

func main() {
	conn, err := grpc.Dial("127.0.0.1:50001", grpc.WithInsecure())
	if err != nil {
		panic(err)
	}

	client := protos.NewGreeterClient(conn)
	md := metadata.Pairs("timestamp", time.Now().Format(timestampFormat))
	md = metadata.New(map[string]string{"key1": "val1", "key2": "val2"})
	ctx := metadata.NewOutgoingContext(context.Background(), md)
	resp, err := client.SayHello(ctx, &protos.HelloRequest{Name: "Hello"})
	if err == nil {
		fmt.Printf("Reply is : %s\n", resp.Message)
	} else {
		fmt.Printf("call server error:%s\n", err)
	}
}

运行

go run server.go
listen at :50001
server add:127.0.0.1:50001
get metadata success:  map[:authority:[127.0.0.1:50001] content-type:[application/grpc] key1:[val1] key2:[val2] user-agent:[grpc-go/1.53.0]]
key1 from metadata:
 0 . val1
:authority:[127.0.0.1:50001]
content-type:[application/grpc]
user-agent:[grpc-go/1.53.0]
key2:[val2]
key1:[val1]
#########################
 go run client.go
Reply is : server: Hello

标签:err,Grpc,fmt,server,grpc,Printf,metadata
From: https://www.cnblogs.com/qcy-blog/p/18408215

相关文章

  • Java服务端开发中的请求优化:从HTTP/1.1到HTTP/2与gRPC的升级
    Java服务端开发中的请求优化:从HTTP/1.1到HTTP/2与gRPC的升级大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在现代Java服务端开发中,提升请求性能是至关重要的。随着HTTP/2和gRPC的引入,优化请求性能变得更加有针对性和高效。本文将探讨如何从HTTP/1.1......
  • go 使用grpc和grpcurl
    安装依赖和工具#ubuntu安装protobufaptinstalllibprotobuf-devprotobuf-compilerprotoc-gen-goprotoc-gen-go-grpc-y#查看protobuf版本protoc--version#安装grpcurlwgethttps://github.com/fullstorydev/grpcurl/releases/download/v1.8.7/grpcurl_1.8.7_linux_......
  • 【YashanDB知识库】修改字段长度后,jdbc驱动接口报YAS-04007 Message:result set metada
    问题现象yashandb修改表的字段长度后,客户的业务接口报YAS-04007异常,截图如下:问题的风险及影响客户的业务在访问yashandb时异常出错,影响使用问题影响的版本所有的yashandb版本问题发生原因使用jdbc接口获取PreparedStatement以后,修改表的字段长度,再用前面获取的PreparedStatement继......
  • OpenTelemetry 实战:gRPC 监控的实现原理
    前言最近在给opentelemetry-java-instrumentation提交了一个PR,是关于给gRPC新增四个metrics:rpc.client.request.size:客户端请求包大小rpc.client.response.size:客户端收到的响应包大小rpc.server.request.size:服务端收到的请求包大小rpc.server.response.size:服务......
  • Java的GRPC
    环境配置<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://m......
  • Java后端分布式系统的服务调用协议:gRPC与RESTful
    Java后端分布式系统的服务调用协议:gRPC与RESTful大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在分布式系统中,服务之间的通信是构建微服务架构的关键。服务调用协议的选择直接影响到系统的性能、可维护性和开发效率。gRPC和RESTful是两种流行的服务......
  • 基于springboot的grpc服务端demo
    1.Javamaven配置点击查看代码<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="h......
  • GO中GRPC
    什么是GRPCgRPC是一款语言中立、平台中立、开源的远程过程调用系统,gRPC客户端和服务端可以在多种环境中运行和交互,例如用java写一个服务端,可以用go语言写客户端调用。数据在进行网络传输的时候,需要进行序列化,序列化协议有很多种,比如xml,json,protobuf等gRPC默认使用protocolbu......
  • Go 使用gRPC协议操作RocketMQ 5.3
    docker-compose安装RocketMQdocker-compose.ymlversion:'3.8'services:namesrv:image:apache/rocketmq:5.3.0container_name:rmqnamesrvports:-9876:9876networks:-rocketmqcommand:shmqnamesrvbroker:i......
  • gRPC协议详解及其在Go语言中的使用指南
    说明gRPC是基于HTTP/2协议传输,使用ProtocolBuffers作为接口描述语言,并提供认证(authentication)、双向流(bidirectionalstreaming)和流量控制、阻塞或非阻塞绑定以及取消和超时(Deadlines)等功能的跨平台开源的高性能RPC框架。使用场景低延迟、高度可扩展的分布式系统。开发......