微服务通信:用gRPC + Protobuf 构建高效API
引言
1. 什么是gRPC和Protobuf?
1.1 gRPC简介
1.2 Protobuf简介
2. 为什么选择gRPC + Protobuf?
2.1 高性能
2.2 强类型和代码生成
2.3 跨语言支持
3. 使用Golang实现gRPC + Protobuf
3.1 环境准备
- Go (1.16+)
- Protocol Buffers编译器 (protoc)
- Go的Protobuf插件和gRPC插件
# 安装protoc:打开下面的官网链接选择对应系统的安装包下载安装
https://github.com/protocolbuffers/protobuf/releases# 安装Go的Protobuf插件和gRPC插件
go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest
3.2 定义Protobuf文件
syntax = "proto3";package user;option go_package = "grpc_demo/proto";service UserService {rpc GetUser (GetUserRequest) returns (GetUserResponse);
}message GetUserRequest {string user_id = 1;
}message GetUserResponse {string user_id = 1;string name = 2;string email = 3;
}
3.3 生成Go代码
protoc --go_out=. --go-grpc_out=. proto/user.proto
3.4 实现gRPC服务器
package mainimport ("context""log""net""google.golang.org/grpc"pb "grpc_demo/proto"
)type userServiceServer struct {pb.UnimplementedUserServiceServer
}func (s *userServiceServer) GetUser(ctx context.Context, req *pb.GetUserRequest) (*pb.GetUserResponse, error) {// 模拟从数据库获取用户信息user := &pb.GetUserResponse{UserId: req.UserId,Name: "Minton",Email: "minton@example.com",}return user, nil
}func main() {lis, err := net.Listen("tcp", ":50051")if err != nil {log.Fatalf("failed to listen: %v", err)}grpcServer := grpc.NewServer()pb.RegisterUserServiceServer(grpcServer, &userServiceServer{})log.Println("Server is running on port 50051...")if err := grpcServer.Serve(lis); err != nil {log.Fatalf("failed to serve: %v", err)}
}
3.5 实现gRPC客户端
package mainimport ("context""log""time""google.golang.org/grpc"pb "grpc_demo/proto"
)func main() {conn, err := grpc.Dial("localhost:50051", grpc.WithInsecure(), grpc.WithBlock())if err != nil {log.Fatalf("did not connect: %v", err)}defer conn.Close()client := pb.NewUserServiceClient(conn)ctx, cancel := context.WithTimeout(context.Background(), time.Second)defer cancel()req := &pb.GetUserRequest{UserId: "123"}res, err := client.GetUser(ctx, req)if err != nil {log.Fatalf("could not get user: %v", err)}log.Printf("User: %v", res)
}
3.6 运行示例
go run server.go
go run client.go
User: user_id:"123" name:"Minton" email:"minton@example.com"
4. 总结
相关文章:
微服务通信:用gRPC + Protobuf 构建高效API
引言 在微服务架构中,服务之间的通信是系统设计的核心问题之一。传统的RESTful API虽然简单易用,但在性能、类型安全和代码生成等方面存在一定的局限性。gRPC作为一种高性能、跨语言的RPC框架,结合Protobuf(Protocol Buffers&…...
Spring Boot 整合 JMS-ActiveMQ,并安装 ActiveMQ
1. 安装 ActiveMQ 1.1 下载 ActiveMQ 访问 ActiveMQ 官方下载页面,根据你的操作系统选择合适的版本进行下载。这里以 Linux 系统,Java环境1.8版本为例,下载 apache-activemq-5.16.7-bin.tar.gz。 1.2 解压文件 将下载的压缩包解压到指定目…...
容器 /dev/shm 泄漏学习
容器 /dev/shm 泄漏的介绍 在容器环境中,/dev/shm 是一个基于 tmpfs 的共享内存文件系统,通常用于进程间通信(IPC)和临时数据存储。由于其内存特性,/dev/shm 的大小是有限的,默认情况下 Docker 容器的 /de…...
Spring Boot 3.x 基于 Redis 实现邮箱验证码认证
文章目录 依赖配置开启 QQ 邮箱 SMTP 服务配置文件代码实现验证码服务邮件服务接口实现执行流程 依赖配置 <dependencies> <!-- Spring Boot Starter Web --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spr…...
车载测试:智能座舱测试中多屏联动与语音交互的挑战
智能座舱作为汽车智能化发展的核心,集成了多屏联动和语音交互功能,为驾驶员和乘客提供更便捷的体验。然而,这些功能的测试面临诸多挑战,包括多屏同步性、噪声干扰和复杂场景的处理。本文将详细分析这些挑战,探讨测试方…...
C/C++输入输出(1)
1.getchar和putchar 1.1getchar() 函数原型: 1 int getchar(void); getchar()函数返回用户从键盘输入的字符,使用时不带有任何参数。 程序运行到这个命令就会暂停,等待用户从键盘输入,等同于使用cin或scanf()方法读取一个字符…...
前端面试场景题葵花宝典之四
87.场景面试之大数运算:超过js中number最大值的数怎么处理 在 JavaScript 中,Number.MAX_SAFE_INTEGER(即 2^53 - 1,即 9007199254740991)是能被安全表示的最大整数。超过此值时,普通的 Number 类型会出现…...
探索Elasticsearch:索引的CRUD
在企业环境中,Elasticsearch的索引CRUD(创建Create、读取Read、更新Update、删除Delete)操作是非常基础且频繁使用的功能。这些操作对于管理和维护数据至关重要,尤其是在处理大规模数据集和需要实时搜索与分析的应用场景中。 目录…...
Java数据结构第十六期:走进二叉树的奇妙世界(五)
专栏:Java数据结构秘籍 个人主页:手握风云 目录 一、非递归实现遍历二叉树 1.1. 二叉树的前序遍历 1.2. 二叉树的中序遍历 1.3. 二叉树的后序遍历 一、非递归实现遍历二叉树 1.1. 二叉树的前序遍历 我们这里要使用栈来进行实现。我们反向思考一下为…...
【开源免费】基于SpringBoot+Vue.JS疫情管理系统(JAVA毕业设计)
本文项目编号 T 227 ,文末自助获取源码 \color{red}{T227,文末自助获取源码} T227,文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…...
有关Java中的集合(1):List<T>和Set<T>
学习目标 核心掌握List集合了解Set集合 1.List<T> ● java.util.List。有序列表。 ● List集合元素的特点:有序表示存取有序(因为有索引)而且可以重复 ● List常用实现类: ArrayList、LinkedList、Vector等 1.1 常用方法…...
使用 Spring Boot 实现前后端分离的海康威视 SDK 视频监控
使用 Spring Boot 实现前后端分离的海康威视 SDK 视频监控系统,可以分为以下几个步骤: 1. 系统架构设计 前端:使用 Vue.js、React 或 Angular 等前端框架实现用户界面。后端:使用 Spring Boot 提供 RESTful API,负责与…...
在 Apache Tomcat 中,部署和删除项目
在 Apache Tomcat 中,部署和删除 WAR 文件是常见的操作。以下是详细步骤: 1. 删除 WAR 文件 (1) 停止应用 进入 Tomcat 的管理界面(默认地址:http://localhost:8080/manager/html)。 找到需要删除的应用,…...
宇树科技G1人形机器人:从炫技到实用,AI驱动下的进化跃迁
宇树科技的G1人形机器人近期凭借“720度回旋踢”“走梅花桩”等高难度动作频频出圈,成为人形机器人领域的现象级产品。 G1人形机器人看似炫技的表演背后,实则暗含了技术突破的深意。G1的每一次技能升级,都是对机器人运动控制、平衡算法和A…...
给定计算预算下的最佳LLM模型尺寸与预训练数据量分配
给定计算预算下的最佳LLM模型尺寸与预训练数据量分配 FesianXu 20250304 at Wechat Search Team 前言 如果给定了计算预算 C C C,如何分配LLM的模型尺寸 N N N和训练的数据量 D D D,才能使得模型的效果 L L L最好呢?笔者在此介绍一篇经典的文…...
H5DS编辑器是如何让企业快速构建动态页面
H5DS编辑器核心亮点: 1.拖拽式操作,小白友好:无需设计与代码基础!通过简单拖拽元素、调整文字和动画,即可生成交互式H5页面。内置海量模板和素材库,支持自定义设计风格,轻松适配企业品牌需求。…...
面试题汇总(一)
熙牛医疗面经 1.平衡二叉树的概念 平衡二叉树是一种二叉搜索树,他的左右两个字数的高度差绝对值不超过1,并且左右两个子树都是一颗平衡二叉树,通过左旋,右旋,左右双旋,右左双旋,来保持平衡&…...
论坛系统测试报告
目录 一、项目背景二、论坛系统测试用例思维导图三、论坛系统测试3.1界面测试3.2登陆测试3.3主页测试3.4个人中心测试 四、自动化测试脚本4.1配置驱动4.2创建浏览器类4.3功能测试4.3.1登陆测试4.3.2注册测试4.3.3主页测试4.3.4帖子编辑4.3.5运行主代码 五、BUG分析六、测试总结…...
算法比赛中处理输入和输出
在算法比赛中,不推荐使用 Scanner 和 System.out.println()。Scanner 线程安全,有大量同步操作,读取输入时每次都要解析数据类型,处理大数据量时性能开销大、效率低,易使程序超时间限制。System.out.println() 每次调用…...
llama.cpp: GGUF格式及模型量化参数介绍
GGUF格式介绍 GGUF(GPT-Generated Unified Format)是推理框架llama.cpp 中使用的一种专为大语言模型设计的二进制文件格式,旨在实现模型的快速加载和保存,同时易于读取。GGUF格式的特点: 单文件部署:模型…...
突破常规认知的编辑器革命:TinyEditor轻量级代码编辑器深度解析
突破常规认知的编辑器革命:TinyEditor轻量级代码编辑器深度解析 【免费下载链接】TinyEditor A functional HTML/CSS/JS editor in less than 400 bytes 项目地址: https://gitcode.com/gh_mirrors/ti/TinyEditor 当开发者在移动设备上调试代码,或…...
打破邮件营销壁垒:免费响应式HTML模板的实战指南
打破邮件营销壁垒:免费响应式HTML模板的实战指南 【免费下载链接】email-templates Free HTML email templates for Mailchimp and other emails services 项目地址: https://gitcode.com/gh_mirrors/ema/email-templates 一、邮件营销的隐形痛点与解决方案 …...
告别手动画图?聊聊Autoware高精地图那些事:开源工具、格式转换与未来展望
自动驾驶高精地图技术全景:从Autoware工具链到行业实践 当我们在谈论自动驾驶时,"高精地图"始终是绕不开的核心技术支柱。与普通导航地图不同,高精地图需要厘米级精度、丰富的语义信息以及实时更新能力。作为自动驾驶开源生态中的重…...
Ostrakon-VL-8B实战:基于Transformer架构的视觉问答效果展示
Ostrakon-VL-8B实战:基于Transformer架构的视觉问答效果展示 最近在测试各种多模态模型时,我遇到了一个挺有意思的家伙——Ostrakon-VL-8B。这名字听起来有点拗口,但简单来说,它是一个拥有80亿参数的视觉语言模型,专门…...
如何从碎片化信息中构建系统性科研认知?
在科研工作中,我们常常面临这样一种困境:每天通过各种渠道接触到海量的学术信息,这些信息如同散落的拼图碎片,虽然珍贵,却难以自动拼凑成一幅完整的画面。对于许多科研人员而言,难以形成系统认知是一个巨大…...
3个步骤打造全方位网络电台体验:foobox-cn配置指南
3个步骤打造全方位网络电台体验:foobox-cn配置指南 【免费下载链接】foobox-cn DUI 配置 for foobar2000 项目地址: https://gitcode.com/GitHub_Trending/fo/foobox-cn 在数字音乐时代,如何高效管理和收听网络电台成为音乐爱好者的核心诉求。网络…...
Shell脚本实战指南:从零基础到自动化高手
1. Shell脚本入门:从Hello World到实战 第一次接触Shell脚本时,我和大多数人一样,被那些神秘的符号和命令搞得一头雾水。直到我意识到,Shell脚本其实就是把平时在终端里手动输入的命令,写进一个文件里自动执行。举个例…...
OpenClaw与Qwen3-VL:30B:高效个人AI办公助手实战
OpenClaw与Qwen3-VL:30B:高效个人AI办公助手实战 1. 为什么选择OpenClawQwen3-VL组合 去年冬天,当我第5次因为会议记录整理到凌晨两点时,终于决定寻找自动化解决方案。在尝试了市面上各种RPA工具后,偶然发现了OpenClaw这个开源框…...
STK 实战:多类型传感器(Sensor)协同探测与可见性分析
1. STK与多传感器协同探测基础 STK(Systems Tool Kit)是航天领域广泛使用的仿真分析软件,它能够对复杂系统中的传感器进行高精度建模。在实际应用中,单个传感器往往难以满足全方位监测需求,这时就需要多传感器协同工作…...
告别乱码!5分钟搞懂串口通信中的帧结构与CRC校验(附协议.h/.c文件)
串口通信实战:从帧结构设计到CRC校验的完整实现指南 当你第一次尝试用串口发送"Hello World"时,数据像流水般顺畅。但当你开始传输传感器读数或控制指令时,突然发现接收端时不时出现乱码或数据错位——这就像试图在嘈杂的酒吧里进行…...
