网站制作学习网JS脚本→正文: react调用 grpc python Server
字体:

react调用 grpc python Server

JS脚本 2023/10/25 21:12:16  点击:不统计

原载于:原文章%77w%77%2Ef%6F%72%61%73%70%2E%63n
  react 通过前端grpc 调用 python server 服务,下面是react 代码以及相关配置。JavaScript 前端调用grpc 已经停止支持了。 都是通过vue 或者react 使用grpc 服务。

 python 服务代码 请看 python 调用 grpc 包括后端服务

1. 配置npm环境
安装npm 相关grpc 的服务组件,react使用
npm install google-protobuf 
npm install grpc-web
 
系统安装shell 需要安装protobuf 用于生成js 相关代码
snap install protobuf  
或者下面命令
apt  install protobuf-compiler  #
安装docker.
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun  #  shell阿里云直接安装
或者
 curl -fsSL https://test.docker.com -o test-docker.sh 官方安装docker 
 
mac 安装docker  
brew install --cask --appdir=/Applications docker
 
说明的是:gRPC-Web 的底层实际上是基于 HTTP/2 的,而不是 WebSocket。HTTP/2 提供了许多 WebSocket 所具有的功能,如双向通信和服务器推送,但同时还提供了更多的功能,如头部压缩、多路复用和流量控制。然而,由于浏览器的安全策略和兼容性问题,gRPC-Web 客户端不能直接发送 HTTP/2 请求。因此,gRPC-Web 客户端实际上发送的是 HTTP/1.1 的请求,然后由一个代理(如 Envoy)将这些请求转换为 HTTP/2 的请求并发送给 gRPC 服务器。
 
2. 写 proto 协议文件,包含 类,方法,定义名称为Forasp.proto 代码如下
 
syntax = "proto3";
// 生成代码 python -m grpc_tools.protoc -I. --python_out=. --grpc_python_out=. Forasp.proto
// 包名称 与文件名一致
package Forasp;
service Rpc_server_name {
rpc Rpc_fun(reqArg) returns (retArg) {} // 双向非流 大写字母会在协议自动转为小写字母
}
// 定义请求reqArg 消息参数,
// 定义格式 类型 名称 = number;
// number 标示第几个参数
//任何参数操作,如果有下划线 _ 在生成协议时会变成驼峰
message reqArg {
string site_domain = 1;
int32 site_year = 2;
}
// 定义 返回retArg 中参数,return_str
message retArg {
string return_str = 1;
}
3. 生成js 扩展文件 客户端shell生成代码命令如下:
protoc -I=. Forasp.proto  --js_out=import_style=commonjs:.  --grpc-web_out=import_style=commonjs,mode=grpcwebtext:.
行中最后参数 就是 Forasp.proto。 
 
生成后文件如下:
Forasp_grpc_web_pb.js
Forasp_pb2.py
 
4. 服务端 我们直接用python rpc 服务,参考上面的  python ,方法名称更换了。
 
5. react 客户端 代码

import React, { useEffect, useState } from 'react';
import logo from './logo.svg';
import './App.css';
import { Rpc_server_nameClient } from './Forasp_grpc_web_pb';
import { reqArg } from './Forasp_pb';


const App =()=> {

const [message, setMessage] = useState([]);
const onClick=()=>{
// 生成远程调用client, new proto类名+Client
const client = new Rpc_server_nameClient('http://192.168.5.126:8080', null, null);
const request = new reqArg(); // 这里新建请求参数对象,用于 请求参数赋值
request.setSiteDomain('www.forasp.cn'); // 前面定义的名称如果有下滑线自动回更换为驼峰
request.setSiteYear(18);
// 方法名称如果有大写字母会自动转为小写
client.rpc_fun(request, {}, (err, response) => {
if (err) {
console.error(err);
return;
}
// 获取返回值 为 getReturnStr() ReturnStr 是proto 协议中是return_str 自动转为驼峰
setMessage((message) => [...message, response.getReturnStr()]);
});
}
return (
<div className="App">
<header className="App-header">
<img src={logo} className="App-logo" alt="logo"/>
<p onClick={onClick}>
点击这里看www.forasp.cn信息 web grpc 调用python server
</p >
{message.map((item, index) => {
return <p key={index}>{index}----{item}</p >;
})}
</header>
</div>
);
}

export default App;
 
6. 代理服务 ,代理文件 envoy.yaml  文件见下面附件
 
注意配置文件 代理监听0.0.0.0端口 8080 
代理upstream 到后段 pytho grpc 服务是192.168.1.122:5001 (与python服务保持一致,如果是服务器需要写服务器实际IP) 
docker 运行代理服务,命令行 
sudo docker run -d -p 8080:8080 -v $(pwd)/envoy.yaml:/etc/envoy/envoy.yaml envoyproxy/envoy:v1.14.1
sudo docker run -d -p 8080:8080 -v $(pwd)/envoy.yaml:/etc/envoy/envoy.yaml envoyproxy/envoy   # 这个是不指定版本,会自己下载
如果下载不下来
docker pull envoyproxy/envoy:latest
#mac 笔记本上会运行后有界面显示
 
9. 测试运行服务
python server.py #命令行保持运行
 运行react 代码
npm start 
启动代理服务 如果有客户端的可以通过客户端,没有客户端用命令行
 
10. 点击  网页文字,显示web 调用 python  grpc 接口结果,如下图
 
react 调用grpc





整体服务代码下载: react调用 grpc  python Server 代码下载

·上一篇:react 打包env变量输出html >>    ·下一篇:网站制作学习网
推荐文章
最新文章