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

NodeJS 利用代码生成工具编写GRPC

生成的 gRPC 代码优点

  1. 自动化和效率

    • 减少手动编码:生成代码自动处理了消息的序列化和反序列化、服务接口的定义等,减少了手动编码的工作量。
    • 一致性:生成的代码确保了客户端和服务器之间的一致性,避免了手动编码可能带来的错误。
  2. 跨语言支持

    • 多语言兼容:gRPC 支持多种编程语言,通过生成的代码,不同语言的客户端和服务器可以无缝地进行通信。
    • 简化集成:你可以使用相同的 .proto 文件为不同语言生成代码,简化了跨语言系统的集成。
  3. 高效的序列化

    • 性能优化:Protocol Buffers 提供了高效的二进制序列化格式,比 JSON 或 XML 更加紧凑和高效。
    • 自动处理:生成的代码自动处理消息的序列化和反序列化,提高了性能和开发效率。
  4. 内置功能

    • 负载均衡和重试机制:gRPC 提供了内置的负载均衡和重试机制,生成的代码会自动包含这些功能,帮助你构建更加健壮和可靠的分布式系统。

1. 定义 .proto 文件

首先,创建一个 .proto 文件,定义服务和消息:

syntax = "proto3";package helloworld;service Greeter {rpc SayHello (HelloRequest) returns (HelloReply) {}rpc SayHelloAgain (HelloRequest) returns (HelloReply) {}
}message HelloRequest {string name = 1;
}message HelloReply {string message = 1;
}

2. 生成 gRPC 代码

2.1 安装依赖

首先,确保你已经安装了 grpc-toolsgrpc_tools_node_protoc_ts

npm install grpc-tools grpc_tools_node_protoc_ts --save-dev使用 `protoc` 编译器生成 gRPC 代码:```sh
npx grpc_tools_node_protoc --js_out=import_style=commonjs,binary:. --grpc_out=grpc_js:. --proto_path=. helloworld.proto

这将生成两个文件:helloworld_pb.jshelloworld_grpc_pb.js

2.2 protoc 指令说明
基本指令结构

npx grpc_tools_node_protoc 基本指令结构如下:

npx grpc_tools_node_protoc [OPTIONS] PROTO_FILES
选项解释
  1. --proto_path

    • 指定 .proto 文件的搜索路径。如果你的 .proto 文件在当前目录,可以使用 --proto_path=.
    • 例如:--proto_path=.
  2. --js_out

    • 指定生成 JavaScript 代码的输出目录和样式。
    • import_style=commonjs,binary 表示生成 CommonJS 模块格式的代码,并使用二进制序列化。
    • 例如:--js_out=import_style=commonjs,binary:./generated
  3. --grpc_out

    • 指定生成 gRPC 代码的输出目录。
    • grpc_js 表示生成 gRPC 的 JavaScript 代码。
    • 例如:--grpc_out=grpc_js:./generated
示例指令

假设你有两个 .proto 文件:service_a.protoservice_b.proto,并且希望将生成的代码放在 ./generated 目录中,可以使用以下指令:

npx grpc_tools_node_protoc --proto_path=. --js_out=import_style=commonjs,binary:./generated --grpc_out=grpc_js:./generated service_a.proto
npx grpc_tools_node_protoc --proto_path=. --js_out=import_style=commonjs,binary:./generated --grpc_out=grpc_js:./generated service_b.proto
生成文件解释

运行上述指令后,将在 ./generated 目录中生成以下文件:

  1. service_a_pb.jsservice_b_pb.js

    • 包含 Protocol Buffers 消息的定义和序列化/反序列化逻辑。
    • 定义了 .proto 文件中声明的消息类型,并提供了相应的 getter 和 setter 方法。
  2. service_a_grpc_pb.jsservice_b_grpc_pb.js

    • 包含 gRPC 服务的客户端和服务器端的接口定义。
    • 定义了服务的方法,并提供了用于调用这些方法的客户端和服务器端的代码。

使用生成的文件

在你的服务器和客户端代码中,你需要导入这些生成的文件。例如:

相关文章:

NodeJS 利用代码生成工具编写GRPC

生成的 gRPC 代码优点 自动化和效率: 减少手动编码:生成代码自动处理了消息的序列化和反序列化、服务接口的定义等,减少了手动编码的工作量。一致性:生成的代码确保了客户端和服务器之间的一致性,避免了手动编码可能带来的错误。跨语言支持: 多语言兼容:gRPC 支持多种编…...

uni-app基础语法(一)

我们今天的学习目标 基础语法1. 创建新页面2.pages配置页面3.tabbar配置4.condition 启动模式配置 基础语法 1. 创建新页面 2.pages配置页面 属性类型默认值描述pathString配置页面路径styleObject配置页面窗口表现,配置项参考pageStyle 我们来通过style修改页面的…...

Linux:进程控制(三)——进程程序替换

目录 一、概念 二、使用 1.单进程程序替换 2.多进程程序替换 3.exec接口 4.execle 一、概念 背景 当前进程在运行的时候,所执行的代码来自于自己的源文件。使用fork创建子进程后,子进程执行的程序中代码内容和父进程是相同的,如果子进…...

LeetCode279:完全平方数

题目链接&#xff1a;279. 完全平方数 - 力扣&#xff08;LeetCode&#xff09; 代码如下 class Solution { public:int numSquares(int n) {vector<int> dp(n 1, INT_MAX);dp[0] 0;for(int i 1; i * i < n; i){for(int j i * i; j < n; j){dp[j] min(dp[j …...

python爬虫--某动漫信息采集

python爬虫--tx动漫 一、采集主页信息二、采集详情页信息三、代码供参考一、采集主页信息 略。 二、采集详情页信息 如上图所示,使用xpath提取详情页的标题、作者、评分、人气、评论人数等数据。 三、代码供参考 import csv import time import random import requests fr…...

使用Rollup.js快速开始构建一个前端项目

Rollup 是一个用于 JavaScript 项目的模块打包器&#xff0c;它将小块代码编译成更大、更复杂的代码&#xff0c;例如库或应用程序。Rollup 对代码模块使用 ES6 模块标准&#xff0c;它支持 Tree-shaking&#xff08;摇树优化&#xff09;&#xff0c;可以剔除那些实际上没有被…...

10.15学习

1.程序开发的步骤 定义程序的目标→设计程序→编写代码&#xff08;需要选择语言&#xff0c;一种语言对应一种编译器&#xff09;→编译→运行程序→测试和调试程序→维护和修改程序 2.ANSI/ISO C标准 1989年ANSI批准通过&#xff0c;1990年ISO批准通过&#xff0c;因此被称…...

mongodb-7.0.14分片副本集超详细部署

mongodb介绍&#xff1a; 是最常用的nosql数据库&#xff0c;在数据库排名中已经上升到了前六。这篇文章介绍如何搭建高可用的mongodb&#xff08;分片副本&#xff09;集群。 环境准备 系统系统 BC 21.10 三台服务器&#xff1a;192.168.123.247/248/249 安装包&#xff1a…...

C++运算出现整型溢出

考虑如下代码&#xff1a; int aINT_MAX; int b 1; long c ab; 这段代码没有编过&#xff01; 原因是a和b都是int型&#xff0c;相加之后会溢出。 请记住&#xff0c;c语言没有赋值&#xff0c;只有表达式&#xff0c;右侧会存在一个暂存的int保存ab的值&#xff0c;而明…...

LeetCode岛屿数量

题目描述 给你一个由 1&#xff08;陆地&#xff09;和 0&#xff08;水&#xff09;组成的的二维网格&#xff0c;请你计算网格中岛屿的数量。 岛屿总是被水包围&#xff0c;并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。 此外&#xff0c;你可以假设该网…...

Karmada核心概念

以下内容为翻译&#xff0c;原文地址 Karmada 是什么&#xff1f; | karmada 一、Karmada核心概念 一&#xff09;什么是Karmada 1、Karmada&#xff1a;开放&#xff0c;多云&#xff0c;多集群Kubernetes业务流程 Karmada (Kubernetes Armada)是一个Kubernetes管理系统&…...

Rust 与生成式 AI:从语言选择到开发工具的演进

在现代软件开发领域&#xff0c;Rust 语言正在逐步崭露头角&#xff0c;尤其是在高性能和可靠性要求较高的应用场景。与此同时&#xff0c;生成式 AI 的崛起正在重新塑造开发者的工作方式&#xff0c;从代码生成到智能调试&#xff0c;生成式 AI 的应用正成为提升开发效率和质量…...

Python爬虫高效数据爬取方法

大家好!今天我们来聊聊Python爬虫中那些既简洁又高效的数据爬取方法。作为一名爬虫工程师,我们总是希望用最少的代码完成最多的工作。下面我ll分享一些在使用requests库进行网络爬虫时常用且高效的函数和方法。 1. requests.get() - 简单而强大 requests.get()是我们最常用的…...

C语言之扫雷小游戏(完整代码版)

说起扫雷游戏&#xff0c;这应该是很多人童年的回忆吧&#xff0c;中小学电脑课最常玩的必有扫雷游戏&#xff0c;那么大家知道它是如何开发出来的吗&#xff0c;扫雷游戏背后的原理是什么呢&#xff1f;今天就让我们一探究竟&#xff01; 扫雷游戏介绍 如下图&#xff0c;简…...

Spring WebFlux 响应式概述(1)

1、响应式编程概述 1.1、响应式编程介绍 1.1.1、为什么需要响应式 传统的命令式编程在面对当前的需求时的一些限制。在应用负载较高时&#xff0c;要求应用需要有更高的可用性&#xff0c;并提供低的延迟时间。 1、Thread per Request 模型 比如使用Servlet开发的单体应用&a…...

Unity游戏通用框架——事件的订阅和发布(观察者模式)

在游戏开发的基本思想中&#xff0c;逻辑与表现的分离极为重要&#xff0c;相互之间并不关心具体实现&#xff0c;只注册对应的事件&#xff0c;有事件发生时才调用相应的函数 事件管理器 using System.Collections; using System.Collections.Generic;public class event_ma…...

将 Ubuntu 系统中的 **swap** 空间从 2GB 扩展到 16GB

要将 Ubuntu 系统中的 swap 空间从 2GB 扩展到 16GB&#xff0c;可以按照以下步骤操作&#xff1a; 1. 关闭现有 Swap 文件 首先需要禁用当前的 swap 文件&#xff0c;以便重新调整其大小。 sudo swapoff -a2. 删除旧的 Swap 文件 假设当前的 swap 文件位于 /swapfile&…...

流程图 LogicFlow

流程图 LogicFlow 官方文档&#xff1a;https://site.logic-flow.cn/tutorial/get-started <script setup> import { onMounted, ref } from vue import { forEach, map, has } from lodash-es import LogicFlow, { ElementState, LogicFlowUtil } from logicflow/core …...

Mac通过键盘选取内容

问题&#xff1a; 我们在使用键盘的时候经常懒得动手去拿鼠标了&#xff0c;并且熟练使用键盘可以提高我们的工作效率&#xff0c;比如在我们需要复制内容的时候&#xff0c;可以仅仅通过键盘来选取想要的内容&#xff1b; 解决&#xff1a; 将鼠标光标移动到想要选取的内容…...

如何通过OpenCV实现图像融合拼接?

图像拼接的意义 2024年了&#xff0c;谈论图像拼接&#xff0c;不算新事物&#xff0c;我们这里探讨图像拼接&#xff0c;主要探讨图像拼接的意义、难点和大概的实现思路。图像拼接可以突破设备视野限制&#xff0c;通过拼接低分辨率图像获得高分辨率图像。 扩展视野&#xff…...

UniApp项目实战:用UTS插件实现安卓后台保活(附完整Service配置与权限处理)

UniApp安卓后台保活实战&#xff1a;UTS插件与Service优化全解析 在移动应用开发中&#xff0c;后台任务保活一直是开发者面临的棘手问题。想象一下&#xff1a;你的UniApp应用需要持续获取用户位置、实时推送消息或播放音乐&#xff0c;却频繁被系统清理&#xff0c;用户体验直…...

在Aspen Plus中用Linde - Hampson工艺液化CO₂:从燃煤电厂捕获气体的模拟探索

在 Aspen Plus 中使用 Linde-Hampson 工艺液化CO2该模拟使用 Aspen Plus 对从燃煤电厂捕获的富含二氧化碳的气体进行液化。在应对气候变化的征程中&#xff0c;二氧化碳捕获与封存&#xff08;CCS&#xff09;技术愈发关键。从燃煤电厂捕获富含二氧化碳的气体并将其液化&#x…...

UI自动化测试--02(Xpath与CSS定位全攻略)

1.Xpath定位xpath和css定位可以利用以下元素的信息来完成定位&#xff1a; 层级结构 元素自身的所有信息 什么是Xpath&#xff1a; 是一种专门在xml文档中找元素的公式&#xff08;表达式&#xff09;&#xff0c;而HTML刚好和XML结构很类似&#xff0c;所以XPATH的表达 式也可…...

FireRedASR Pro应用案例:会议录音转文字,提升工作效率实测

FireRedASR Pro应用案例&#xff1a;会议录音转文字&#xff0c;提升工作效率实测 1. 会议记录痛点与解决方案 1.1 传统会议记录的效率瓶颈 在职场工作中&#xff0c;会议记录是一项耗时且容易出错的任务。根据调研数据显示&#xff1a; 普通员工平均每周花费4-6小时在会议…...

别再用requests了!用Python 3.11+的httpx和BeautifulSoup4爬取豆瓣电影Top250(附完整代码)

用Python 3.11的httpx和BeautifulSoup4高效爬取豆瓣电影Top250 在Python爬虫领域&#xff0c;技术栈的迭代速度令人目不暇接。十年前流行的urllib2如今已被更现代、更高效的库所取代。本文将带你使用Python 3.11的最新特性&#xff0c;结合httpx和BeautifulSoup4这两个强力工具…...

Mujoco 仿真 PPO 强化学习机械臂末端路径规划:从奖励函数设计到收敛优化实战

1. 为什么奖励函数是机械臂路径规划的灵魂 第一次用PPO训练机械臂时&#xff0c;我盯着末端执行器在原地打转的场景整整发呆了半小时。明明代码逻辑没问题&#xff0c;网络结构也够深&#xff0c;为什么机械臂就是不肯往目标点移动&#xff1f;直到我把奖励函数里的距离惩罚从线…...

搞懂 SAPUI5 Application Index:为什么你的 Fiori 应用改完了,系统却像没看见一样

在 SAP Fiori 项目里,开发团队最容易忽略的一件事,不是 OData 服务,也不是 Component.js,而是 SAPUI5 Application Index。很多人会遇到这样一种场景:应用代码已经传输完成,BSP 资源也在系统里了,manifest.json 也改过了,可是 Fiori Launchpad 仍然表现得像什么都没发生…...

网盘直链获取工具:高效解析与实用指南

网盘直链获取工具&#xff1a;高效解析与实用指南 【免费下载链接】Online-disk-direct-link-download-assistant 可以获取网盘文件真实下载地址。基于【网盘直链下载助手】修改&#xff08;改自6.1.4版本&#xff09; &#xff0c;自用&#xff0c;去推广&#xff0c;无需输入…...

可视化是对比原始数据和填补数据的强大工具。你可以使用箱线图、密度图或散点图来可视化原始数据和填补后的数据

下面的内容摘录自《用R探索医药数据科学》专栏文章的部分内容&#xff08;原文5665字&#xff09;。 2篇2章6节&#xff1a;R的多重填补法中随机回归填补法的应用&#xff0c;MICE包的实际应用和统计与可视化评估-CSDN博客 在数据分析中&#xff0c;缺失数据是常见且具有挑战性…...

DAMOYOLO-S与数据库联动:检测结果实时入库与查询

DAMOYOLO-S与数据库联动&#xff1a;检测结果实时入库与查询 你有没有想过&#xff0c;当AI模型在摄像头前“看到”一个人、一辆车时&#xff0c;这些信息除了在屏幕上显示一下&#xff0c;还能做什么&#xff1f;如果这些“看见”的瞬间——谁、在哪儿、什么时候、有多确定—…...