grpc go源码,golang grpc实践

  grpc go源码,golang grpc实践

  一台胃泌肽中的要点:1.1 grpc是什么?胃泌肽是一个服务器,用于定义服务,指定方法,客户端可以通过他直接调用不同服务器上的方法。轻松创建分布式服务。

  1.2 在代码中有什么用?实现客户端跨语言调用不同服务器服务端的方法

  1.3原型缓冲液是什么?原始缓冲液称为协议缓冲区,用于定义结构化数据,并使用编译器,将数据生成指定语言的接口方法,其中包括客户端和服务器代码,还有其他序列化代码;

  1.4原型缓冲液如何定义和使用?结构化定义(定义方法和参数),参考:协议缓冲区官方文档

  由定义生成去代码,使用命令

  protocol-go _ out=.雪花。样机

  或

  protocol-go _ out=plugins=grpc:雪花。样机

  或

  protoc-I proto-go _ out=plugins=grpc:proto proto/snow flake。样机

  其他语言转化

  protc-proto _ PATH=IMPORT _ PATH-CPP _ out=DST _ DIR-Java _ out=DST _ DIR-python _ out=DST _ DIR PATH/to/file。样机

  2个胃泌肽实战代码:使用胃泌肽完成获得名字接口,从数据持久化到测试。

  2.1 数据库持久化层用于持久化数据库;实现最基础的底层获得名字方法。

  包服务导入(错误 github。com/gitsl iu/go-id-worker imcs/common/config strconv )var worker * id worker .IdWorker//初始化func init() {workerId :=config .getint 64(雪花。worker-id )数据中心id:=config .getint 64(雪花。数据中心id )工人=id工人.IdWorker{}if err :=worker .InitIdWorker(workerId,data centerid);呃!=nil { panic(err)} } func GetName(mess string)(string,error){ replee:= worker test mess return replee,nil} 2.2业务层组合底层方法,实现业务功能。注意:

  计算机网络服务器中的方法必须同下面原始缓冲液中定义的获得名字方法一致。

  包服务器导入( context errors imcs/proto imcs/snow flak/service )//grpc服务器类型SnowflakeGRPCServer struct { } func(s * SnowflakeGRPCServer)GetName(CTX上下文.上下文,请求*原型snowflakerquest)(* proto .SnowflakeResponse,error) {response :=new(proto .如有要求。梅斯。=""{如果回复,错误:=服务. GetName(请求. messs);错误==零{响应Replee=replee} else {return nil,err}} else {return nil,errors .新(计数应该大于0!)}返回响应,零} 2.3原型缓冲区转化层定义客户端接口、服务端接口和代码语言,并完成调用;

  语法= proto3//最新版,支持多种语言转化选项Java _ package= cc。iooc。常见。RPC。雪花。proto ;option Java _ multiple _ files=true;包原型;服务雪花{ //定义服务方法rpc GetName (SnowflakeRequest)返回(SnowflakeResponse) { }}//定义参数消息SnowflakeRequest { int 32 count=1;string messs=2;}消息雪花回复{重复字符串id=1;string replee=2;} 然后,使用不同的原始缓冲液实现接口的语言转化和代码的生成;

  操作:在样机文件同级目录下,使用命令

  protoc-I proto-go _ out=plugins=grpc:proto proto/snow flake。样机

  自动生成代码雪花。pb.go

  2.4 客户接口层动态获取客户,调用转化层的获得名字接口;

  包客户端导入( context Google。戈朗。org/grpc imcs/common/config imcs/common/log imcs/common/RPC imcs/proto )类型snowflakegrpclient struct { Address string } func newsnowflakegrpclient()* snowflakegrpclient { return snowflakegrpclient { Address:config .GetString( grpc。客户。雪花。address )} } func(s * snowflakegrpclient)GetName(mess string)string {//到胃泌肽连接池获取当前客户的胃泌肽连接连接,错误:=rpc .如果出错,获取连接地址!=nil {log .错误f(雪花客户端:%v ,错误)返回 nil}//方法最后,关闭连接推迟rpc .关闭(康涅狄格州美国地址)响应,err :=func(conn *grpc .客户端连接)(接口{},错误){//调用胃泌肽生成的客户端客户端:=proto .NewSnowflakeClient(康涅狄格州)//调用胃泌肽生成的接口及其实现方法//给样机生成的请求对象(雪片请求)的属性(乱七八糟)设置值响应,错误:=客户端. GetName(上下文背景(),原型.雪片任务{Messs: mess})返回响应,呃}(连接)如果呃!=nil {log .错误(呃)返回" nil"}//从生成的相应对象(雪花回应)中获取属性值(回复)作为返回值返回响应。(*原型SnowflakeResponse)。回复} 2.5测试层使用去语言自带的测试类,对客户端获取到的接口进行测试,包括:功能测试、压力测试。注意:

  测试文件的名称和测试方法的名称按规范来,请网上查询。

  包客户端导入( fmt testing )功能测试getname(t * testing .t){ model:=newsnowflakegrpclient()fmt .Println(型号GetName( name test====)} 2.6 .网关层用于微服务之间的调用和拦截。

  这层可以选配

  包服务器导入( context encoding/JSON errors imcs/common/response imcs/proto imcs/snow flake/service )//API服务器类型SnowflakeApiServer struct { } func(s * SnowflakeApiServer)请求(ctx上下文.上下文,请求*原型GatewayRequest) (*proto .GatewayResponse,error) {resp :=new(proto .网关响应)方法:=请求方法params:=map[string]interface { } { } err:=JSON .解组(请求Param,params)if err!=nil {return nil,err}var baseResp *response .BaseResponseswitch方法{案例雪花。 id:baseResp,err=id()case 雪花。 ids:baseResp,err=ids(params)case 雪花 GetName:baseResp,err=GetName(params)默认值:返回零,错误.新(未找到雪花方法)} if err==nil { if respBytes,err :=json .marshal(* base resp);错误==零{响应Result=respBytesreturn resp,nil} else {return nil,err}}return nil,err } func GetName(params map[string]interface { })(r * response .BaseResponse,err error){ count inter:=params[ mess ]if mess,ok :=countInter .(字符串);好的{如果回复,e :=服务. GetName(mess);e!=nil {err=e}否则{r=response .NewBaseResponseOkWithData(replee)} } else { err=errors .新建(雪花回复参数错误)}返回}

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: