gRPC-Go源码解读三 服务端处理流程分析

news2024/11/20 11:45:02

        相较于Client端的复杂处理流程,Server端相对来说简单了很多,核心就是创建个TCP套接字并监听,收到客户端连接请求则起个go协程处理,子协程根据请求中的服务名和方法名调用对应的服务方法处理,处理完成之后则返回响应。整个过程不涉及服务发现和负载均衡,因此代码相对简洁。

        下面以gRPC-Go 1.54.0-dev版本中 examples/helloworld为例,先看看pb的服务定义:

package helloworld;

// The greeting service definition.
service Greeter {
  // Sends a greeting
  rpc SayHello (HelloRequest) returns (HelloReply) {}
}

// The request message containing the user's name.
message HelloRequest {
  string name = 1;
}

// The response message containing the greetings
message HelloReply {
  string message = 1;
}

该文件定义了Greeter服务,只包含一个Unary方法SayHello,请求响应参数都只包含一个字符串。

下面看下服务端的代码部分:


var (
	port = flag.Int("port", 50051, "The server port")
)

// server 用来实现helloworld.GreeterServer,默认继承了UnimplementedGreeterServer
type server struct {
	pb.UnimplementedGreeterServer
}

// SayHello 具体实现,就是将请求中的字符串加个Hello 返回回去
func (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) {
	log.Printf("Received: %v", in.GetName())
	return &pb.HelloReply{Message: "Hello " + in.GetName()}, nil
}

func main() {
    // 启动参数解析
	flag.Parse()

    // 创建TCP套接字
	lis, err := net.Listen("tcp", fmt.Sprintf(":%d", *port))
	if err != nil {
		log.Fatalf("failed to listen: %v", err)
	}

	// 创建grpcServer
	s := grpc.NewServer()

	// 将server注册到grpcServer里
	pb.RegisterGreeterServer(s, &server{})

	log.Printf("server listening at %v", lis.Addr())
	// 开始监听客户端请求并服务
	if err := s.Serve(lis); err != nil {
		log.Fatalf("failed to serve: %v", err)
	}
}

        主函数代码不多,就是创建套接字和grpcServer实例,然后注册实际的业务实现,之后就可以接收客户端请求开始服务了。 

        下面以流程图的方式展示整个调用链路过程,相对于粘贴代码,流程图看起来更直观、简洁。

        

图1 Server端处理流程

         如图所示,红色部分表示主函数,绿色部分表示处理Client链接的子协程。Server每收到一个TCP连接请求则分配一个协程处理。子协程主要工作就是处理HTTP2 Frame,当收到Header Frame后则根据Header头中携带的path域找到对应Client请求的服务名和方法名,然后从grpcServer中查找程序启动时注册的服务,找到则处理,找不到则返回一个错误消息是"unknown service" 或者"unknown method" Header Frame,关于传输层其它部分的处理(如http2初始化、流量控制、数据读写等)可以参考前面几篇博文。

        下面看下请求的抓包例子:

图2 Client请求HeaderFrame

         图2显示了Client的请求头,可以看到path域携带了所请求的服务名和方法名。当子协程据此查找注册的服务方法来处理。

           gRPC Server 和Client在传输层复用了大部分代码,比如loopy,看了之前对Client请求的分析,再来看本篇就会发现简单许多。

        

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/444411.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

叫板IT部门和专业软件公司,低代码成为企业数字化的新选择

从2017年政府将“数字经济”写入工作报告,到今年两会将企业数字化转型列为重点议题,数字化的口号已喊了6年。政策对于数字化的支持越来越坚定,令人欣喜的是,越来越多具有远见卓识的企业已将数字化建设作为工作重心。 然而&#xf…

【LeetCode】剑指 Offer 60. n个骰子的点数 p294 -- Java Version

题目链接:https://leetcode.cn/problems/nge-tou-zi-de-dian-shu-lcof/ 1. 题目介绍(60. n个骰子的点数) 把n个骰子扔在地上,所有骰子朝上一面的点数之和为 s。输入 n,打印出 s 的所有可能的值出现的概率。 你需要用一…

Vue.js条件渲染指令v-if及v-show

目录 一、v-if 二、v-show 三、v-if与v-show的选择 一、v-if v-if是Vue.js的条件语句,v-if指令用于条件性地渲染一块内容,这块内容只会在指令的表达式返回true的时候被渲染。需要特别注意的是,v-if所关联的是Vue.js的动态变量。 v-if的使用…

如何计算连续变量的熵

背景 做特征选择时,有时候会用到计算特征的信息熵,可是离散的好计算,但连续的呢?按照把连续变量离散的方法设置阈值点吗?好像比较麻烦,需要排序, 计算阈值。没有能自动的方法吗? 找…

动物养殖虚拟仿真之生猪屠宰VR教学系统

生猪屠宰是一个复杂而危险的工作,需要有严格的操作规程和丰富的经验。但是传统的生猪屠宰培训存在一些问题,例如成本高、难以模拟真实场景等。 为了解决这些问题,VR技术被应用到生猪屠宰培训中,广州华锐互动由此开发了生猪屠宰VR…

BOM(1)

BOM:浏览器对象模型,它提供了独立于内容而与浏览器窗口进行交换的对象,其核心对象是window,由一系列相关对象构成,并且每个对象都提供了很多方法和属性BOM的构成:BOM比DOM更大,它包含DOM。 …

Docker中安装redmine(亲自安装有效)

第一步: 官方的一键安装方式: curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun (我用的它) 国内 daocloud一键安装命令: curl -sSL https://get.daocloud.io/docker | sh ############################可能遇见问题##…

机器学习 day07(特征缩放)

特征缩放的作用 特征缩放可以让梯度下降算法运行的更快特征:X    对应的参数:W当一个特征的可能值范围很大时,一个好的模型会选择一个相对较小的对应参数值,因为W₁的一个非常小的变化会给估计价格产生非常大的影响&#xff0…

View系列

掌握View核心知识体系,两大方向:View事件分发,自定义View。 文章目录 一,基础知识1.1 页面创建1.2 页面管理 二,View事件分发2.1 基本概念2.2 分发流程2.3 面试题 三,View绘制3.1 measure(测量&…

C#+asp.net基于web的大学社团管理信息系统

本系统的模块是分为用户模块和管理员模块,管理员负责学生管理模块、社团管理模块、公告管理模块、留言管理模块、加入社团管理模块、活动管理模块、管理员管理模块。社团管理员则负责预约管理模块、活动报名的审核等。。 系统具有三类系统用户分别是:系统…

linux网络

查看网络接口信息 ifconfig mtu 最大传输单元 mtu和mss区别 hostname命令 永久修改 hostnamectl set-hostname 切换shell环境生效 或者vi hostname 编辑完重启生效 查看路由表条目route route查看或设置主机中路由表信息 route -n将路由记录中的地址信息显示为数字形式 …

MTU 网卡bond 简介

MTU 最大传输单元MTU(Maximum Transmission Unit,MTU),是指网络能够传输的最大数据包大小,以字节为单位。MTU的大小决定了发送端一次能够发送报文的最大字节数。如果MTU超过了接收端所能够承受的最大值,或者…

App Inventor 2 开发问答App

应用介绍 一个最基本的问答App开发,问答数据源来自csv文件格式,方便后续拓展成网络版的问答App。 事先出好题目、ABCD选择项及正确答案,先存在列表中,然后按顺序出题,答对则继续下一题,答错则Game over。 …

人工智能的前沿信息获取之使用谷歌学术搜索

谷歌学术是谷歌公司开发的一款专门针对学术搜索的在线搜索引擎[4],谷歌学术的网址为https://scholar.google.com,界面如图 6‑1所示。使用谷歌学术搜索可以检索会议或者期刊论文。只需要在检索框中输入关键字,然后点搜索按钮即可,…

了解Transformer架构的前奏_什么是预训练_理解预训练---人工智能工作笔记0034

我们会先来说预训练有什么用,其实 之前说的机器学习,其实都是跟数学相关性很大的,比如,支持向量机,回归算法, 1.最早的时候,做机器学习,就是偏数学的,比如用的决策树,支持向量机,线性回归,逻辑回归等算法. 这种是偏向数学的,偏向统计的. 然后这个深度学习,其实就是偏大数据的…

奥艺大会 | “OLYMP‘ARTS中国设计奖”在2023米兰设计周发布

由国际奥艺委员会、北京国际设计周和中国科学院大学魏桥国科联合实验室共同发起的“OLYMPARTS中国设计奖”(OlympArts China Design Awards)于当地时间2023年4月19日,在2023米兰设计周“中国日”活动中举行宣传推介活动。 (由左至…

缺失msvcp140.dll怎么办?msvcp140.dll下载

缺失msvcp140.dll怎么办?msvcp140.dll下载,作为Windows操作系统中必备的组件之一,msvcp140.dll是一款Microsoft Visual C Runtime的动态链接库文件,旨在提供必要的C运行环境支持,以让软件应用程序得以在Windows平台上可…

道可维斯|益企行动,点亮星空数字化转型峰会

2023年,“烟火气”回归,但企业挑战仍在继续。找寻企业增长转型的内生动力,仍是中小企业不变的探索话题。如何寻找穿越周期的高成长机会?4月21日,佛山金蝶软件科技有限公司主办的主题为“益企行动,点亮星空”…

MFC转QT踩坑记录

1、中文乱码 QT msvc编译器版本默认编译的是字符串编码是ANSI, 而QTCreator默认创建的cpp字符串编码是UTF-8,然后msvc还是按ANSI去解析字符串常量,所以导致了中文乱码 解决方案: 使用notepad把cpp编码从UTF-8转成 UTF-8带BOM…

ChatGPT 之父承认 GPT-5 并不存在,为什么 OpenAI 总是这么实诚?|万字详述

ChatGPT 诞生前传 来源: 爱范儿 微信号:ifanr 最近,OpenAI 的 CEO Sam Altman 在一场公开会议上为 GPT-5 辟谣。 他声称 OpenAI 并没有在训练 GPT-5,而是一直基于 GPT-4 做别的工作。 OpenAI 是一家非常有趣的机构,和微软、Go…