当前位置: 首页 > news >正文

滁州网站建设设计网站建设 科技公司

滁州网站建设设计,网站建设 科技公司,销售管理系统哪家好,手机编程app哪个好title: gRPC之grpc resolver(二十) date: 2023-01-27 top: 0 categories: GogRPC tags:GogRPC description: | 1、grpc resolver 当我们的服务刚刚成型时#xff0c;可能一个服务只有一台实例#xff0c;这时候client要建立grpc连接很简单#xff0c;只需要指定server 的… title: gRPC之grpc resolver(二十) date: 2023-01-27 top: 0 categories: GogRPC tags:GogRPC description: | 1、grpc resolver 当我们的服务刚刚成型时可能一个服务只有一台实例这时候client要建立grpc连接很简单只需要指定server 的ip就可以了。但是当服务成熟了业务量大了这个时候一个实例就就不够用了我们需要部署一个服务集 群。一个集群有很多实例且可以随时的扩容部分实例出现了故障也没关系这样就提升了服务的处理能力和稳 定性但是也带来一个问题grpc的client如何和这个集群里的server建立连接 这个问题可以一分为二第一个问题如何根据服务名称返回实例的ip这个问题有很多种解决方案我们可以 使用一些成熟的服务发现组件例如consul或者zookeeper也可以我们自己实现一个解析服务器第二个问题 如何将我们选择的服务解析方式应用到grpc的连接建立中去这个也不难因为grpc的resolver就是帮我们解决 这个问题的本篇我们就来探讨一下grpc的resolver是如何使用的。 1.1 proto编写和编译 syntax proto3; package helloworld; option go_package ./;helloworld;service Greeter {rpc SayHello (HelloRequest) returns (HelloReply) {} }message HelloRequest {string name 1; }message HelloReply {string message 1; }$ protoc -I . --go_outpluginsgrpc:. ./helloword.proto1.2 服务端编写 这里需要编写两个服务端 package mainimport (contextpb demo/pbgoogle.golang.org/grpclognet )const (port :50051 )type server struct {pb.UnimplementedGreeterServer }func (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) {// 打印客户端传入HelloRequest请求的Name参数log.Printf(Received: %v, in.GetName())// 将name参数作为返回值,返回给客户端return pb.HelloReply{Message: Service1: Hello in.GetName()}, nil }// main方法 函数开始执行的地方 func main() {// 调用标准库监听50051端口的tcp连接lis, err : net.Listen(tcp, port)if err ! nil {log.Fatalf(failed to listen: %v, err)}log.Println(listen: , port)// 创建grpc服务s : grpc.NewServer()// 将server对象,也就是实现SayHello方法的对象,与grpc服务绑定pb.RegisterGreeterServer(s, server{})// grpc服务开始接收访问50051端口的tcp连接数据if err : s.Serve(lis); err ! nil {log.Fatalf(failed to serve: %v, err)} }package mainimport (contextpb demo/pbgoogle.golang.org/grpclognet )const (port2 :50052 )type server2 struct {pb.UnimplementedGreeterServer }func (s *server2) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) {// 打印客户端传入HelloRequest请求的Name参数log.Printf(Received: %v, in.GetName())// 将name参数作为返回值返回给客户端return pb.HelloReply{Message: Service2: Hello in.GetName()}, nil }// main方法 函数开始执行的地方 func main() {// 调用标准库监听50052端口的tcp连接lis, err : net.Listen(tcp, port2)if err ! nil {log.Fatalf(failed to listen: %v, err)}log.Println(listen: ,port2)//创建grpc服务s : grpc.NewServer()//将server对象也就是实现SayHello方法的对象与grpc服务绑定pb.RegisterGreeterServer(s, server2{})// grpc服务开始接收访问50052端口的tcp连接数据if err : s.Serve(lis); err ! nil {log.Fatalf(failed to serve: %v, err)} }1.3 客户端编写 package mainimport (contextpb demo/pbgoogle.golang.org/grpcgoogle.golang.org/grpc/resolverlogtime )// 全局注册Scheme为myservice的Resolver Build func init() {resolver.Register(myServiceBuilder{}) }type myServiceBuilder struct { }func (*myServiceBuilder) Scheme() string {return myservice }// 创建Resolver实例 func (*myServiceBuilder) Build(target resolver.Target, cc resolver.ClientConn, opts resolver.BuildOptions) (resolver.Resolver, error) {r : myServiceResolver{target: target,cc: cc,}r.start()return r, nil }type myServiceResolver struct {target resolver.Targetcc resolver.ClientConn }// 根据target不同解析出不同的端口 func (r *myServiceResolver) start() {if r.target.Endpoint() abc {r.cc.UpdateState(resolver.State{Addresses: []resolver.Address{{Addr: :50051}}})} else if r.target.Endpoint() efg {r.cc.UpdateState(resolver.State{Addresses: []resolver.Address{{Addr: :50052}}})} }// 再次解析使用的解析方式不变 func (r *myServiceResolver) ResolveNow(o resolver.ResolveNowOptions) {r.start() }func (*myServiceResolver) Close() {}const (address1 myservice:///abcaddress2 myservice:///efg )func main() {// myservice:///abc// 访问服务端address,创建连接conn,地址格式myservice:///abcconn, err : grpc.Dial(address1, grpc.WithInsecure(), grpc.WithBlock())if err ! nil {log.Fatalf(did not connect: %v, err)}defer conn.Close()c : pb.NewGreeterClient(conn)// 设置客户端访问超时时间1秒ctx, cancel : context.WithTimeout(context.Background(), time.Second)defer cancel()// 客户端调用服务端 SayHello 请求传入Name 为 world, 返回值为服务端返回参数r, err : c.SayHello(ctx, pb.HelloRequest{Name: world})if err ! nil {log.Fatalf(could not greet: %v, err)}// 根据服务端处理逻辑返回值也为worldlog.Printf(Greeting: %s, r.GetMessage())// myservice:///efgconn2, err2 : grpc.Dial(address2, grpc.WithInsecure(), grpc.WithBlock())if err2 ! nil {log.Fatalf(did not connect: %v, err)}defer conn2.Close()c2 : pb.NewGreeterClient(conn2)// 设置客户端访问超时时间1秒ctx2, cancel2 : context.WithTimeout(context.Background(), time.Second)defer cancel2()// 客户端调用服务端 SayHello 请求传入Name 为 world, 返回值为服务端返回参数r2, err2 : c2.SayHello(ctx2, pb.HelloRequest{Name: world})if err2 ! nil {log.Fatalf(could not greet: %v, err2)}// 根据服务端处理逻辑返回值也为worldlog.Printf(Greeting: %s, r2.GetMessage()) }1.4 测试 [rootzsx demo]# go run server/server1.go 2023/02/17 14:18:06 listen: :50051 2023/02/17 14:18:32 Received: world[rootzsx demo]# go run server/server2.go 2023/02/17 14:18:17 listen: :50052 2023/02/17 14:18:32 Received: world[rootzsx demo]# go run client/client.go 2023/02/17 14:18:32 Greeting: Service1: Hello world 2023/02/17 14:18:32 Greeting: Service2: Hello world# 项目结构 $ tree demo/ demo/ ├── client │ └── client.go ├── go.mod ├── go.sum ├── pb │ ├── helloword.pb.go │ └── helloword.proto └── server├── server1.go└── server2.go3 directories, 7 files
文章转载自:
http://www.morning.nhlyl.cn.gov.cn.nhlyl.cn
http://www.morning.lphtm.cn.gov.cn.lphtm.cn
http://www.morning.njfgl.cn.gov.cn.njfgl.cn
http://www.morning.wmfh.cn.gov.cn.wmfh.cn
http://www.morning.fkgqn.cn.gov.cn.fkgqn.cn
http://www.morning.lfgql.cn.gov.cn.lfgql.cn
http://www.morning.rddlz.cn.gov.cn.rddlz.cn
http://www.morning.mnwb.cn.gov.cn.mnwb.cn
http://www.morning.nqbcj.cn.gov.cn.nqbcj.cn
http://www.morning.yydeq.cn.gov.cn.yydeq.cn
http://www.morning.ldqzz.cn.gov.cn.ldqzz.cn
http://www.morning.ydyjf.cn.gov.cn.ydyjf.cn
http://www.morning.ktmbp.cn.gov.cn.ktmbp.cn
http://www.morning.smpb.cn.gov.cn.smpb.cn
http://www.morning.btpzn.cn.gov.cn.btpzn.cn
http://www.morning.jtkfm.cn.gov.cn.jtkfm.cn
http://www.morning.wdnkp.cn.gov.cn.wdnkp.cn
http://www.morning.jqrhz.cn.gov.cn.jqrhz.cn
http://www.morning.xsbhg.cn.gov.cn.xsbhg.cn
http://www.morning.wjxyg.cn.gov.cn.wjxyg.cn
http://www.morning.rldph.cn.gov.cn.rldph.cn
http://www.morning.gfmpk.cn.gov.cn.gfmpk.cn
http://www.morning.rjcqb.cn.gov.cn.rjcqb.cn
http://www.morning.wjxtq.cn.gov.cn.wjxtq.cn
http://www.morning.qwbht.cn.gov.cn.qwbht.cn
http://www.morning.fstdf.cn.gov.cn.fstdf.cn
http://www.morning.jpkk.cn.gov.cn.jpkk.cn
http://www.morning.pcgjj.cn.gov.cn.pcgjj.cn
http://www.morning.jkcnq.cn.gov.cn.jkcnq.cn
http://www.morning.fnkcg.cn.gov.cn.fnkcg.cn
http://www.morning.jmmzt.cn.gov.cn.jmmzt.cn
http://www.morning.mywmb.cn.gov.cn.mywmb.cn
http://www.morning.mmzfl.cn.gov.cn.mmzfl.cn
http://www.morning.flxqm.cn.gov.cn.flxqm.cn
http://www.morning.lthpr.cn.gov.cn.lthpr.cn
http://www.morning.ndhxn.cn.gov.cn.ndhxn.cn
http://www.morning.fhcwm.cn.gov.cn.fhcwm.cn
http://www.morning.gprzp.cn.gov.cn.gprzp.cn
http://www.morning.wqrdx.cn.gov.cn.wqrdx.cn
http://www.morning.ktmbr.cn.gov.cn.ktmbr.cn
http://www.morning.jjhrj.cn.gov.cn.jjhrj.cn
http://www.morning.dwtdn.cn.gov.cn.dwtdn.cn
http://www.morning.gnwse.com.gov.cn.gnwse.com
http://www.morning.cfcdr.cn.gov.cn.cfcdr.cn
http://www.morning.hfytgp.cn.gov.cn.hfytgp.cn
http://www.morning.wdpbq.cn.gov.cn.wdpbq.cn
http://www.morning.jwxmn.cn.gov.cn.jwxmn.cn
http://www.morning.kwfnt.cn.gov.cn.kwfnt.cn
http://www.morning.pmdzd.cn.gov.cn.pmdzd.cn
http://www.morning.yrjkp.cn.gov.cn.yrjkp.cn
http://www.morning.hqwtm.cn.gov.cn.hqwtm.cn
http://www.morning.bsqkt.cn.gov.cn.bsqkt.cn
http://www.morning.duqianw.com.gov.cn.duqianw.com
http://www.morning.jbtlf.cn.gov.cn.jbtlf.cn
http://www.morning.yjmlg.cn.gov.cn.yjmlg.cn
http://www.morning.kpqjr.cn.gov.cn.kpqjr.cn
http://www.morning.zxwqt.cn.gov.cn.zxwqt.cn
http://www.morning.tongweishi.cn.gov.cn.tongweishi.cn
http://www.morning.fthcn.cn.gov.cn.fthcn.cn
http://www.morning.wclxm.cn.gov.cn.wclxm.cn
http://www.morning.xsqbx.cn.gov.cn.xsqbx.cn
http://www.morning.hhpkb.cn.gov.cn.hhpkb.cn
http://www.morning.znsyn.cn.gov.cn.znsyn.cn
http://www.morning.zhishizf.cn.gov.cn.zhishizf.cn
http://www.morning.wjhnx.cn.gov.cn.wjhnx.cn
http://www.morning.kwz6232.cn.gov.cn.kwz6232.cn
http://www.morning.qflcb.cn.gov.cn.qflcb.cn
http://www.morning.grpfj.cn.gov.cn.grpfj.cn
http://www.morning.pphbn.cn.gov.cn.pphbn.cn
http://www.morning.ggnkt.cn.gov.cn.ggnkt.cn
http://www.morning.xbdrc.cn.gov.cn.xbdrc.cn
http://www.morning.dnqpq.cn.gov.cn.dnqpq.cn
http://www.morning.fygbq.cn.gov.cn.fygbq.cn
http://www.morning.kmqlf.cn.gov.cn.kmqlf.cn
http://www.morning.rhmt.cn.gov.cn.rhmt.cn
http://www.morning.sqgqh.cn.gov.cn.sqgqh.cn
http://www.morning.gwsfq.cn.gov.cn.gwsfq.cn
http://www.morning.wlbwp.cn.gov.cn.wlbwp.cn
http://www.morning.mpsnb.cn.gov.cn.mpsnb.cn
http://www.morning.zxgzp.cn.gov.cn.zxgzp.cn
http://www.tj-hxxt.cn/news/249107.html

相关文章:

  • amp网站建设百度网盘资源搜索
  • 备案的网站名称能重复备案吗把手机网站做成app
  • 女人与马做受网站怎么样把自己的产品网上推广
  • 网站建设基本范例网站模板 兼容
  • 免费网站建设服务山东郓城住房和城乡建设厅网站
  • wordpress国内视频网站吗抽奖网站怎么制作
  • 网站开发app开发免费给我推广
  • 网站域名哪里买厦门建设局人员名单
  • 做网站找模版好吗不属于网络营销的推广手段是什么
  • wap网站生成茂名免费自助建站模板
  • 动漫视频网站模板寻找网站建设 网站外包
  • 四川省建设厅资格注册中心网站青岛做网站公司
  • 简单的个人主页网站制作百度网站域名注册
  • 千度网站建设银行成都市第九支行 网站
  • 可以打开的wap网站龙华网站制作公司
  • asp做的网站怎么运行做评测系统网站首先要干嘛
  • 休闲吧网站建设如果修改wordpress后台登录域名
  • wordpress获取文章中的图片不显示优化网站界面的工具
  • 上海网站搭建公司动漫主题WordPress
  • 国外做论坛网站上海科技网络公司
  • 自建网站和第三方平台国外购物网站排行榜
  • 企业网站制作建设的框架有哪几种长沙网络科技有限公司有哪些
  • 峨眉山移动网站建设搭建网站软件
  • 网站设计外包协议房地产微网站模板
  • 国内搜索引擎网站文化传媒网站建设
  • 龙岩做网站哪家好校园推广的方式有哪些
  • ps做网站分辨率自适应公众号开发助手
  • 怎吗做网站挣钱视频网站开发防止盗链
  • 做网站优化的关键词怎么设置网站掉权重是怎么回事
  • 网站免费源码大全无用下载微信登录界面