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

netcore vue grpc、http grpc

netcore vue grpc、http grpc

vue 前端

一、项目准备

  1. 创建 vue 项目
    $ cd E:\code# 创建 vue 项目
    $ vue create apricot-grpc-> 1、选择 Vue3
    
  2. 安装依赖
    $ npm install grpc-web --save$ npm install google-protobuf --save
    
  3. 安装 proto 转换依赖
    $ npm install -g protoc-gen-js protoc-gen-grpc-web grpc-tools
    

二、Proto 文件转换

  1. 复制 proto 文件

    • 后端 proto
    • Protos 文件夹复制至 src 目录下
  2. 查看全局目录地址

    $ npm config get prefix
    
  3. 找到 protoc.exe

  4. 生成 js 文件

    • 将所有项目需要 .proto 转换成 .js
      # 转到 src 目录
      $ cd .\aproct-grpc\src# 创建 grpc-proto-js 目录(输出js目录)
      $ mkdir grpc-proto-js# 生成 file_grpc_web_pb.js、file_pb.js
      $ D:\nodejs\node_modules\grpc-tools\bin\protoc.exe --proto_path=. --js_out=import_style=commonjs,binary:./grpc-proto-js/ --grpc-web_out=import_style=commonjs,mode=grpcwebtext:./grpc-proto-js/ .\Protos\File\file.proto# 生成  google\protobuf\empty_pb.js
      $ D:\nodejs\node_modules\grpc-tools\bin\protoc.exe --proto_path=. --js_out=import_style=commonjs,binary:./grpc-proto-js/ --grpc-web_out=import_style=commonjs,mode=grpcwebtext:./grpc-proto-js/ .\Protos\google\protobuf\empty.proto# 生成  Params\id_pb.js
      $ D:\nodejs\node_modules\grpc-tools\bin\protoc.exe --proto_path=. --js_out=import_style=commonjs,binary:./grpc-proto-js/ --grpc-web_out=import_style=commonjs,mode=grpcwebtext:./grpc-proto-js/ .\Protos\Params\id.proto   # 生成  Params\query_pb.js
      $ D:\nodejs\node_modules\grpc-tools\bin\protoc.exe --proto_path=. --js_out=import_style=commonjs,binary:./grpc-proto-js/ --grpc-web_out=import_style=commonjs,mode=grpcwebtext:./grpc-proto-js/ .\Protos\Params\query.proto   # 生成  Results\result_pb.js
      $ D:\nodejs\node_modules\grpc-tools\bin\protoc.exe --proto_path=. --js_out=import_style=commonjs,binary:./grpc-proto-js/ --grpc-web_out=import_style=commonjs,mode=grpcwebtext:./grpc-proto-js/ .\Protos\Results\result.proto   
      
    • proto_path:proto 文件地址
    • mode:请求数据类型(Content-Type
    • grpc-proto-js:生成 .js 输出目录
  5. 使用 grpc

    <template><div class="hello"><label for="grpc api">grpc api</label>:<inputname="refulapi"type="button"value="grpc api"v-on:click="onGrpcApi"/></div>
    </template><script>import { Empty } from "../grpc-proto-js/Protos/google/protobuf/empty_pb";import { FileServiceClient } from "../grpc-proto-js/Protos/File/file_grpc_web_pb";export default {name: "HelloWorld",props: {msg: String,},methods: {// eslint-disable-next-lineonGrpcApi(event) {const client = new FileServiceClient("http://localhost:5211", null, null);// eslint-disable-next-lineclient.readFileAsync(new Empty(), {}, (err, response) => {console.log(response);});},},};
    </script>
    
  6. 启动项目

    $ npm run serve
    
    • 可能会出现错误:not found Any_pb.js
    • 附图:
    • 解决:将 grpc-proto-js 下相关引用 Any_pb.js 改成 any_pb.js
  7. 请求跨域

    • 附图:
  8. 待续

三、grpc http

  1. http 请求
    <template><div class="hello"><label for="reful api">grpc http api</label>:<inputname="refulapi"type="button"value="grpc http api"v-on:click="onGrpcHttpApi"/>
    </template><script>import { Empty } from "../grpc-proto-js/Protos/google/protobuf/empty_pb";import { FileServiceClient } from "../grpc-proto-js/Protos/File/file_grpc_web_pb";export default {name: "HelloWorld",props: {msg: String,},methods: {// eslint-disable-next-lineonGrpcHttpApi(event) {var xhr = new XMLHttpRequest();xhr.responseType = "json";xhr.addEventListener("readystatechange", function () {// eslint-disable-next-lineif (this.readyState === 4) {console.log(this.response.data);}});//设置请求xhr.open("get", "http://localhost:5211/v1/electron/getbase64");xhr.setRequestHeader("Content-Type", "application/json");xhr.send();},}};
    </script>
    
  2. 待续

后端

一、grpc proxy

  1. 创建项目
    • 跳过,详细参考 [netcore grpc]
  2. 安装依赖
    > dotnet add package Grpc.AspNetCore --version 2.71.0
    > dotnet add package protobuf-net --version 3.2.56
    > dotnet add package Yarp.ReverseProxy --version 2.3.0
    
  3. 创建 Proto
    • 跳过,参考上文
  4. 创建服务
    /// <summary>
    /// Grcp service
    /// </summary>
    public class FileService : Electron.Grpc.FileService.FileServiceBase
    {public override async Task<GetBufferResponse> ReadFileAsync(Empty request, ServerCallContext context){using var fileStream = System.IO.File.OpenRead("C:\\Users\\Administrator\\Desktop\\2fdda3cc7cd98d1001e9f6a7b36eaf0e7bec54e73a51.jpg");var memeoryStream = new MemoryStream();await fileStream.CopyToAsync(memeoryStream);var buffer = memeoryStream.ToArray();var resp = new GetBufferResponse{Code = 200,Data = Convert.ToBase64String(buffer)};return resp;}
    }
    
  5. 服务配置
    using Apricot.Grpc.Proxy.Services;var builder = WebApplication.CreateBuilder(args);// yarp proxy
    builder.Services.AddReverseProxy();// grpc
    builder.Services.AddGrpc();// cors
    builder.Services.AddCors(options =>
    {options.AddPolicy("AllowAll", policy =>{policy.SetIsOriginAllowed(_ => true).AllowAnyMethod().AllowAnyHeader().AllowCredentials().WithExposedHeaders("Grpc-Status", "Grpc-Message", "Grpc-Encoding", "Grpc-Accept-Encoding", "X-Grpc-Web", "User-Agent");});
    });var app = builder.Build();// route
    app.UseRouting();// grpc web 
    app.UseGrpcWeb();app.UseCors("AllowAll");// grpc service 
    app.MapGrpcService<FileService>().EnableGrpcWeb();// frontend(http://localhost:8081) proxy
    app.MapForwarder("/electron.FileService/{**catch-all}", "http://localhost:8081");app.Run();
  6. Yarp.ReverseProxy 跨域代理
    • 未找到更优方案,有更好方案评论区留言
    • 解决
       using Apricot.Grpc.Proxy.Services;var builder = WebApplication.CreateBuilder(args);// yarp proxybuilder.Services.AddReverseProxy();// corsbuilder.Services.AddCors(options =>{options.AddPolicy("AllowAll", policy =>{policy.SetIsOriginAllowed(_ => true).AllowAnyMethod().AllowAnyHeader().AllowCredentials().WithExposedHeaders("Grpc-Status", "Grpc-Message", "Grpc-Encoding", "Grpc-Accept-Encoding", "X-Grpc-Web", "User-Agent");});});var app = builder.Build();// use corsapp.UseCors("AllowAll");// frontend(http://localhost:8081) proxyapp.MapForwarder("/electron.FileService/{**catch-all}", "http://localhost:8081");app.Run();
      
  7. 处理 Unsupported Media Type
    • 参考
    • 解决
      // route
      app.UseRouting();// grpc web 
      app.UseGrpcWeb();// grpc service (EnableGrpcWeb)
      app.MapGrpcService<FileService>().EnableGrpcWeb();
      
  8. 待续

二、grpc http

  1. 安装依赖 [官网]
    > dotnet add package  Microsoft.AspNetCore.Grpc.JsonTranscoding --version 8.0.21
    
  2. 更改 proto 协议
    syntax = "proto3";
    option csharp_namespace = "Apricot.Electron.Grpc";package electron;// google protos
    import "google/protobuf/empty.proto";
    import "google/protobuf/Any.proto";
    import "google/api/annotations.proto";// results protos
    import "Protos/Results/result.proto";
    import "Protos/File/buffer.proto";// services
    service FileService{rpc ReadFileAsync(google.protobuf.Empty) returns(GetBufferResponse);rpc GetBase64Async(google.protobuf.Empty) returns(GetBufferResponse){option (google.api.http) = {get: "/v1/electron/getbase64"};}
    }
    
  3. 添加服务
  4. 服务配置
    using Apricot.Grpc.Proxy.Services;var builder = WebApplication.CreateBuilder(args);
    // grpc
    builder.Services.AddGrpc().AddJsonTranscoding();// cors
    builder.Services.AddCors(options =>
    {options.AddPolicy("AllowAll", policy =>{policy.SetIsOriginAllowed(_ => true).AllowAnyMethod().AllowAnyHeader().AllowCredentials().WithExposedHeaders("Grpc-Status", "Grpc-Message", "Grpc-Encoding", "Grpc-Accept-Encoding", "X-Grpc-Web", "User-Agent");});
    });var app = builder.Build();// route
    app.UseRouting();// cors
    app.UseCors("AllowAll");// grpc service
    app.MapGrpcService<FileService>();app.Run();
    
  5. 待续
http://www.hskmm.com/?act=detail&tid=38740

相关文章:

  • 墨尔本迎来第六届PancakesCon网络安全大会
  • 实验三
  • 2025年河北中医理疗针灸培训学校权威推荐榜单:中医针灸技术培训/中医推拿针灸培训/针灸正骨培训学校精选
  • 2025年工业冷水机厂家权威推荐榜:专业制冷技术与高效节能解决方案深度解析
  • 兼职帮农业公司搭建外贸出海网站(赚了900元)
  • 2025 年防冻液源头厂家最新推荐口碑排行榜:严检合格技术为先,实力企业权威甄选食品级/空气能专用/长效防冻液公司推荐
  • 2025年南京机械钻井工程服务权威推荐榜单:打井工程/打桩工程/环保检测井工程源头公司精选
  • 深入解析:使用 PyTorch 实现 CIFAR-10 图像分类:从数据加载到模型训练全流程
  • 2025 年冷藏车厂家最新推荐排行榜:结合协会测评权威数据,详解优质品牌特点与选购指南 9.6 米 / 解放 / 4.2 米 / 福田 / 小型冷藏车公司推荐
  • 2025 年铣边机源头厂家最新推荐排行榜:含钢板 / 平板 / 板材 / 自走式 / 全自动铣边机机型,结合协会测评数据甄选实力企业
  • 2025 年载冷剂厂家推荐排行榜:无醇/安全型/SH-4/SH-5A/多元醇/高低温/超低温/乙二醇/冷库专用/食品级载冷剂公司推荐
  • 2025年盐趣科研教育深度解析:从录取数据到成果落地的全链路拆解
  • 2025年盐趣科研教育深度解析:从“科研背景”维度拆解留学突围路径
  • 2025 年房屋改造公司最新推荐榜,聚焦企业服务能力与市场口碑深度解析老房 / 旧房 / 局部 / 小户型 / 出租房房屋改造推荐
  • 2025 年桥梁防撞护栏优质厂家最新推荐榜:涵盖锌钢 / ZF01/Q235/Q355B / 景观 / 灯光 / 河道 / 公路 / 喷塑等类型,全方位解析实力企业
  • kali wsl桌面使用
  • 2025年1月暖风机口碑榜:五款主流机型对比与选购避坑
  • 2025 年最新推荐 WMS 服务商综合实力排行榜:涵盖智能仓储管理系统品牌核心技术优势及协会权威测评结果
  • 告别“求推荐”的迷茫,如何挑选一家真正专业的直播源码定制开发公司?
  • 2025 年防腐木厂家最新推荐排行榜:实力品牌品质测评,凉亭 / 地板 / 木屋厂家优选指南
  • 2025 年离散制造领域 MES 厂商最新推荐榜单:结合中国智能制造产业协会测评权威数据,全面揭晓优质服务商实力
  • 跨多端前端框架对比
  • 2025年10月中国办公家具定制公司市场报告:知名厂商列表与评价
  • 2025 年独立游戏公司AI 美术设计平台最新推荐榜,技术实力与服务体验双重维度深度测评
  • 2025年10月中国办公家具定制公司推荐:市场报告与选择指南
  • 如何构建高效 AI 智能体 - 详解
  • 数字人公司:技术引领的数字人产业革新典范
  • 数字人公司:透视数字人企业生态格局
  • AI|国内GEO优化公司全链路优化
  • 数字人公司|数字人服务商生态全景