依賴于grpc-web庫通過VUE框架進行使用

準備材料如下

// helloworld.proto 文件 用于前后端定義接口規(guī)范
// 安裝 npm i grpc-web   
//安裝proto解析工具 protoc-gen-grpc-web.exe 插件

protoc-gen-grpc-web下載地址
proto下載地址
安裝完成后诀诊,配置系統(tǒng)環(huán)境變量 path 將 bin文件夾所在目錄配置進去即可
將 .proto protoc.exe protoc-gen-grpc-web.exe 三個文件放置于同一文件夾內(nèi)
執(zhí)行cmd命令

protoc helloworld.proto --js_out=import_style=commonjs:.\ --grpc-web_out=import_style=commonjs,mode=grpcwebtext:.\

可得到如下兩個文件
---helloworld_pb.js
---helloworld_grpc_web_pb.js

Client

vue項目中如何使用這兩個文件搭建client端
1.項目根目錄中新建proto文件夾拷获,并將文件粘貼進去
1.5.npm 安裝 grpc-web
2.在需要引用的頁面內(nèi)引用相關(guān)文件,代碼如下

<a-button type="primary" @click="get1">
import {HelloRequest, RepeatHelloRequest,HelloReply} from "./proto/helloworld_pb";
import { GreeterClient } from "./proto/helloworld_grpc_web_pb";
created(){
      // 創(chuàng)建grpc-web客戶端吭产,填入enovy的地址
      this.client = new GreeterClient('http://localhost:8080',null, null)
  }
get1(){
           // 創(chuàng)建請求參數(shù)并賦值
            var request = new HelloRequest();
            request.setName('World');
            //  調(diào)用客戶端相應的grpc方法闸翅,發(fā)送grpc請求琳拨,并接受后臺發(fā)送回來的返回值
            this.client.sayHello(request, {}, (err, response) => {
              if (err) {
                console.log(`Unexpected error for sayHello: code = ${err.code}` +
                            `, message = "${err.message}"`);
              } else {
                //  打印返回的信息
                console.log(response.getMessage());
              }
            });
       }

即可通過點擊按鈕寸齐,進行g(shù)rpc請求的發(fā)送

server

var PROTO_PATH = __dirname + '/helloworld.proto';

var assert = require('assert');
var async = require('async');
var _ = require('lodash');
var grpc = require('@grpc/grpc-js');
var protoLoader = require('@grpc/proto-loader');
var packageDefinition = protoLoader.loadSync(
    PROTO_PATH,
    {keepCase: true,
     longs: String,
     enums: String,
     defaults: true,
     oneofs: true
    });
var protoDescriptor = grpc.loadPackageDefinition(packageDefinition);
var helloworld = protoDescriptor.helloworld;
// 這里的.helloworld其實是proto內(nèi)的package名字
/**
 * @param {!Object} call
 * @param {function():?} callback
 */
function doSayHello(call, callback) {
  callback(null, {message: 'Hello! '+ call.request.name});
}

/**
 * @param {!Object} call
 */
function doSayRepeatHello(call) {
  var senders = [];
  function sender(name) {
    return (callback) => {
      call.write({
        message: '123Hey! ' + name,
      });
      _.delay(callback, 500); // in ms
    };
  }
  console.log(call.request)
  for (var i = 0; i < call.request.count; i++) {
    senders[i] = sender(call.request.name + i);
  }
  async.series(senders, () => {
    call.end();
  });
}

/**
 * @return {!Object} gRPC server
 */
function getServer() {
  var server = new grpc.Server();
  console.log(helloworld)
  server.addService(helloworld.Greeter.service, {
    sayHello: doSayHello,
    sayRepeatHello: doSayRepeatHello,
  });
  return server;
}
//這里的9090 是因為要通過代理從而訪問
//grpc協(xié)議不同http2等浊,所以需要配置代理才可進行訪問腮郊,詳情可以百度
if (require.main === module) { // 是否為node直接啟動的服務
  var server = getServer(); 
  server.bindAsync(
    '0.0.0.0:9090', grpc.ServerCredentials.createInsecure(), (err, port) => {
      assert.ifError(err);
      server.start();
      console.log("服務器已啟動")
  });
}

exports.getServer = getServer;

代理

代理配置文件 envoy.yaml

admin:
  access_log_path: /tmp/admin_access.log
  address:
    socket_address: { address: 0.0.0.0, port_value: 9901 }
//管理頁面的端口號

static_resources:
  listeners:
  - name: listener_0
    address:
      socket_address: { address: 0.0.0.0, port_value: 8080 }
//這里這個8080和客戶端對應
    filter_chains:
    - filters:
      - name: envoy.filters.network.http_connection_manager
        typed_config:
          "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
          codec_type: auto
          stat_prefix: ingress_http
          route_config:
            name: local_route
            virtual_hosts:
            - name: local_service
              domains: ["*"]
              routes:
              - match: { prefix: "/" }
                route:
                  cluster: greeter_service
                  max_stream_duration:
                    grpc_timeout_header_max: 0s
              cors:
                allow_origin_string_match:
                - prefix: "*"
                allow_methods: GET, PUT, DELETE, POST, OPTIONS
                allow_headers: keep-alive,user-agent,cache-control,content-type,content-transfer-encoding,custom-header-1,x-accept-content-transfer-encoding,x-accept-response-streaming,x-user-agent,x-grpc-web,grpc-timeout
                max_age: "1728000"
                expose_headers: custom-header-1,grpc-status,grpc-message
          http_filters:
          - name: envoy.filters.http.grpc_web
          - name: envoy.filters.http.cors
          - name: envoy.filters.http.router
  clusters:
  - name: greeter_service
    connect_timeout: 0.25s
    type: logical_dns
    http2_protocol_options: {}
    lb_policy: round_robin
    # win/mac hosts: Use address: host.docker.internal instead of address: localhost in the line below
    load_assignment:
      cluster_name: cluster_0
      endpoints:
        - lb_endpoints:
            - endpoint:
                address:
                  socket_address:
                    address:  host.docker.internal
//這個address為doctor啟動代理所采用配置,如果不是請自己百度
                    port_value: 9090
  //這里這個9090和server對應

執(zhí)行doctor命令

docker run --rm -it -v "C:/Users/liujiaji/Downloads/grpc-web-master (1)/grpc-web-master/net/grpc/gateway/examples/helloworld/envoy.yaml:/envoy-custom.yaml"  -p 9901:9901  -p 8080:8080  envoyproxy/envoy-dev:latest  -c /envoy-custom.yaml
//這個 -p9901:9901 -p 8080:8080 為doctor寫法筹燕,其他的自己百度

一個賊坑的注意事項

關(guān)于想在grpc-web中發(fā)送token于header里
需要修改代理文件中的配置轧飞,使其allow-headers中有想加入的值

cors:
                allow_origin_string_match:
                - prefix: "*"
                allow_methods: GET, PUT, DELETE, POST, OPTIONS
                allow_headers: Bearer,token,keep-alive,user-agent,cache-control,content-type,content-transfer-encoding,custom-header-1,x-accept-content-transfer-encoding,x-accept-response-streaming,x-user-agent,x-grpc-web,grpc-timeout
                max_age: "1728000"
                expose_headers: custom-header-1,grpc-status,grpc-message
 allow_headers: Bearer,token
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市撒踪,隨后出現(xiàn)的幾起案子过咬,更是在濱河造成了極大的恐慌,老刑警劉巖制妄,帶你破解...
    沈念sama閱讀 211,348評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件掸绞,死亡現(xiàn)場離奇詭異,居然都是意外死亡耕捞,警方通過查閱死者的電腦和手機衔掸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,122評論 2 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來俺抽,“玉大人敞映,你說我怎么就攤上這事×赘” “怎么了振愿?”我有些...
    開封第一講書人閱讀 156,936評論 0 347
  • 文/不壞的土叔 我叫張陵捷犹,是天一觀的道長。 經(jīng)常有香客問我埃疫,道長伏恐,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,427評論 1 283
  • 正文 為了忘掉前任栓霜,我火速辦了婚禮翠桦,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘胳蛮。我一直安慰自己销凑,他們只是感情好,可當我...
    茶點故事閱讀 65,467評論 6 385
  • 文/花漫 我一把揭開白布仅炊。 她就那樣靜靜地躺著斗幼,像睡著了一般。 火紅的嫁衣襯著肌膚如雪抚垄。 梳的紋絲不亂的頭發(fā)上蜕窿,一...
    開封第一講書人閱讀 49,785評論 1 290
  • 那天,我揣著相機與錄音呆馁,去河邊找鬼桐经。 笑死,一個胖子當著我的面吹牛浙滤,可吹牛的內(nèi)容都是我干的阴挣。 我是一名探鬼主播,決...
    沈念sama閱讀 38,931評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼纺腊,長吁一口氣:“原來是場噩夢啊……” “哼畔咧!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起揖膜,我...
    開封第一講書人閱讀 37,696評論 0 266
  • 序言:老撾萬榮一對情侶失蹤誓沸,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后次氨,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蔽介,經(jīng)...
    沈念sama閱讀 44,141評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,483評論 2 327
  • 正文 我和宋清朗相戀三年煮寡,在試婚紗的時候發(fā)現(xiàn)自己被綠了虹蓄。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,625評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡幸撕,死狀恐怖薇组,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情坐儿,我是刑警寧澤律胀,帶...
    沈念sama閱讀 34,291評論 4 329
  • 正文 年R本政府宣布宋光,位于F島的核電站,受9級特大地震影響炭菌,放射性物質(zhì)發(fā)生泄漏罪佳。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,892評論 3 312
  • 文/蒙蒙 一黑低、第九天 我趴在偏房一處隱蔽的房頂上張望赘艳。 院中可真熱鬧,春花似錦克握、人聲如沸蕾管。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽掰曾。三九已至,卻和暖如春停团,著一層夾襖步出監(jiān)牢的瞬間旷坦,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工佑稠, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留塞蹭,地道東北人。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓讶坯,卻偏偏與公主長得像,于是被迫代替她去往敵國和親岗屏。 傳聞我的和親對象是個殘疾皇子辆琅,可洞房花燭夜當晚...
    茶點故事閱讀 43,492評論 2 348

推薦閱讀更多精彩內(nèi)容