grpc php 返回值過大,使用grpc實現php、java、go三方互調

grpc作為經典的rpc協議,雖然略重,但是是有學習的價值的

通過下面的內容可以快速上手這個grpc框架

安裝命令行工具

php需要這個額外的protoc、grpc_php_plugin工具把這個protobuf格式的文件生成php語言里的類

go需要安裝protoc-gen-go工具把protobuf格式的接口定義文件生成go語言里的類定義

java無需手動安裝額外工具,有maven即可,再次體現了java的優越性(

protoc

fb91e3275766c62e665c11eb6a171ac7.png

解壓后,把bin目錄放到PATH里面

編譯grpc_php_plugin

git clone https://github.com/grpc/grpc.git

cd grpc

brew install autoconf automake libtool shtool

LIBTOOL=glibtool LIBTOOLIZE=glibtoolize make -j8

復制代碼

grpc源碼庫較大,可以直接開8核進行編譯 編譯好的grpc_php_plugin在bins/opt/目錄下,把grpc_php_plugin放到PATH里面

2408873ed5e6e3af7193f5bf5b770b35.png

安裝php的grpc擴展

編譯protoc-gen-go

git clone https://github.com/golang/protobuf.git

cd protobuf/protoc-gen-go

go build

復制代碼

操作效果如下

0863284fe1e419cf96c4563b4b33b3dc.png

把這個生成的protoc-gen-go放到PATH

案例設計

go: 提供grpc服務端,提供一個sayHello的接口,參數為代表名字的字符串,返回值為 “Hello"拼接上這個名字 java和php作為客戶端調用這個go的客戶端

grpc依賴

go

"golang.org/x/net/context"

"google.golang.org/grpc"

"google.golang.org/grpc/reflection"

復制代碼

java

io.grpc

grpc-netty

1.0.0

io.grpc

grpc-protobuf

1.0.0

io.grpc

grpc-stub

1.0.0

復制代碼

php

"grpc/grpc": "^v1.9",

"google/protobuf": "^v3.5"

復制代碼

核心代碼

proto文件

syntax = "proto3";

option go_package = "pbf";

package helloworld;

// The greeting service definition.

service Hello {

// Sends a greeting

rpc SayHello (HelloRequest) returns (HelloResponse) {}

}

// The request message containing the user's name.

message HelloRequest {

string name = 1;

}

// The response message containing the greetings

message HelloResponse {

string message = 1;

}

復制代碼

這個protobuf文件定義了兩個數據結構,HelloRequest和HelloResponse,和一個SayHello的接口

使用下面的命令把這個proto文件編譯成對應的php和go的數據結構

#!/bin/bash

for file in ./protos/*.proto; do

echo "生成對應的php類文件: $file"

protoc -I ./protos --php_out=./php/pbf --grpc_out=./php/pbf --plugin=protoc-gen-grpc=$(which grpc_php_plugin) $file

done

protoc -I ./protos --go_out=plugins=grpc:./go/pbf ./protos/*.proto

復制代碼

go服務端核心代碼

// helloServer implements helloworld.HelloServer

type helloServer struct{}

// SayHello implements helloworld.HelloServer

func (s *helloServer) SayHello(ctx context.Context, in *pbf.HelloRequest) (*pbf.HelloResponse, error) {

return &pbf.HelloResponse{Message: "Hello " + in.Name}, nil

}

func main() {

s := grpc.NewServer()

pbf.RegisterHelloServer(s, &helloServer{})

reflection.Register(s)

s.Serve(lis)

}

復制代碼

func (s *helloServer) SayHello(ctx context.Context, in *pbf.HelloRequest) (*pbf.HelloResponse, error)里面就是SayHello這個接口的具體實現了

php客戶端核心代碼

$name = '小明';

$client = new Helloworld\HelloClient('localhost:8488', [

'credentials' => Grpc\ChannelCredentials::createInsecure(),

]);

$request = new Helloworld\HelloRequest();

$request->setName($name);

list($response, $status) = $client->SayHello($request)->wait();

echo '服務端返回狀態碼: ' . $status->code . PHP_EOL;

echo "服務器端回復內容:" . $response->getMessage() . PHP_EOL;

復制代碼

code 0表示正常

java客戶端核心代碼

private final HelloGrpc.HelloBlockingStub blockingStub;

public HelloClient(String host, int port) {

//初始化連接

channel = ManagedChannelBuilder.forAddress(host, port)

.usePlaintext(true)

.build();

//初始化遠程服務Stub

blockingStub = HelloGrpc.newBlockingStub(channel);

}

public String sayHello(String name) {

//構造服務調用參數對象

Helloworld.HelloRequest request = Helloworld.HelloRequest.newBuilder().setName(name).build();

//調用遠程服務方法

Helloworld.HelloResponse response = blockingStub.sayHello(request);

//返回值

return response.getMessage();

}

復制代碼

sayHello()里就是通過grpc調用go的sayHello方法。

查看效果

556785698cdbdac13aecdc9edd6ed597.png

可以看到,這三個程序都ok了

一些注意的點

go、java、php的編譯已經寫到了Makefile中, 使用make即可一鍵編譯

參考鏈接

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/459042.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/459042.shtml
英文地址,請注明出處:http://en.pswp.cn/news/459042.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

SOCKET通信的基本步驟

SOCKET通信的基本步驟 1)建立一個服務器ServerSocket,并同時定義好ServerSocket的監聽端口;2)ServerSocket 調用accept()方法,使之處于阻塞。3)創建一個客戶機Socket,并設置好服務器的IP和端口。4&#xff…

Linux epoll 筆記(高并發事件處理機制)

wiki: Epoll優點; Epoll工作流程; Epoll實現機制: epollevent; Epoll源碼分析; Epoll接口: epoll_create; epoll_ctl; epoll_close; Epoll工作方式: LT(level-triggered); ET(edge-triggered); Epoll應用模式; Epoll優點&#xff…

Django請求響應對象

請求與響應對象 HttpRequest HttpRequest存儲了客戶請求的相關參數和一些查詢方法。 path請求頁面的全路徑,不包括域名—例如, "/hello/"。 methodHttp請求方法,包括GET,POST。 GETQueryDict類實例,包含所有HTTP GET參數的字典對象。 POSTQuer…

matlab 作圖 虛線太長,matlab?極坐標繪圖?在matlab中,用polar畫的圖形,如何使虛線圓多顯示幾個?...

滿意答案iredwood推薦于 2018.12.26采納率:52% 等級:12已幫助:13535人打開polar.m 文件,路徑可通過輸入 which polar 命令得到。其中修改下面這段代碼,可以控制虛線圓的顯示個數。其中rticks 為控制顯示個數的參量。…

《學習opencv》筆記——矩陣和圖像處理——cvAnd、cvAndS、cvAvg and cvAvgSdv

矩陣和圖像的操作 (1)cvAnd函數 其結構 void cvAnd( //將src1和src2按像素點取“位與運算”const CvArr* src1,//第一個矩陣const CvArr* src2,//第二個矩陣CvArr* dst,//結果矩陣const CvArr* mask NULL;//矩陣經行像素點與的“開關” );程序實例#include <cv.h> #inc…

Hibernate之加載策略(延遲加載與即時加載)和抓取策略(fetch)

假設現在有Book和Category兩張表,表的關系為雙向的一對多,表結構如下: 假設現在我想查詢id為2的那本書的書名,使用session.get(...)方法: 1 Session sessionHibernateUtil.getSession(); 2 Book book (Book) session.get(Book.class,2); 3 System.out.println(book.getName());…

指紋圖像方向圖matlab,matlab指紋方向場方向圖程序

function Fangxiangtu zhiwen_fangxiangtu( Zhiwentuxiang )%函數功能計算指紋方向圖%函數參數指紋圖像Zhiwentuxiang%函數返回值指紋方向圖FangxiangtuSizeZhiwentuxiang size( Zhiwentuxiang ) ;Zhiwentuxiang double( Zhiwentuxiang ) ;W 4; % 窗口大小(2W1)*(2W1)W 4;…

怎樣實現一個簡單的jQuery編程

第一步&#xff1a;在head中載入jQuery框架 <script  type"text/javascript" src"jQuery文檔所在的絕對路徑"></script> 注&#xff1a; type——指定腳本的mime類型 src——規定外部腳本文件的URL jQuery是一個javascript庫&#xff0c;相…

php多人點餐可以看到對方點的菜,千萬不要小看你身邊那個會點菜的人,因為

飯局上&#xff0c;你常常是負責點菜的那個人&#xff0c;還是只負責吃&#xff1f;拿起菜單點菜&#xff0c;你是很從容&#xff0c;還是不知道怎么點&#xff1f;事實上&#xff0c;飯局上那個會點菜的人&#xff0c;千萬不能小看。某次隨老板外出開會&#xff0c;跟去的幾個…

gvim for php,轉 : Gvim建立IDE編程環境 (Windows篇)

說明&#xff1a;本文是作者在完全按照著名的《手把手教你把Vim改裝成一個IDE編程環境》一文&#xff0c;在Windows XP上用gvim建立IDE環境時所作的備忘。原作地址&#xff1a;http://blog.csdn.net/wooin/archive/2007/10/31/1858917.aspx。1.安裝gvim7.2。運行gvim72.exe&…

1081. Rational Sum (20) -最大公約數

題目如下&#xff1a; Given N rational numbers in the form "numerator/denominator", you are supposed to calculate their sum. Input Specification: Each input file contains one test case. Each case starts with a positive integer N (<100), followe…

CRC8校驗分析

*************************************************** 更多精彩&#xff0c;歡迎進入&#xff1a;http://shop115376623.taobao.com *************************************************** CRC即循環冗余校驗碼&#xff08;Cyclic Redundancy Check&#xff09;&#xff1a;是…

insert mysql后加where,如何在MySQL Insert語句中添加where子句?

This doesnt work:這不起作用:INSERT INTO users (username, password) VALUES ("Jack","123") WHERE id1;Any ideas how to narrow insertion to a particular row by id?任何想法如何通過id縮小插入到特定行?8 個解決方案#120In an insert statement y…

阿里云使用筆記-Lrzsz上傳下載文件-centos7

2019獨角獸企業重金招聘Python工程師標準>>> 上傳文件時提示&#xff1a; -bash: rz: command not found rz命令沒找到&#xff1f; 執行sz&#xff0c;同樣也沒找到。 原來是要安裝個叫 lrzsz 的東西&#xff0c;一查可以直接yum。 安裝lrzsz&#xff1a;# yum -y …

C#中的DBNull、Null、String.Empty和“”

null可賦值任何變量,將變量置為空 DBNull只用于DataRow對象,表示數據庫中的空值 String.Empty是0長度字串 Convert.IsDBNull判斷是否為DBNull DBNull.Value與Null的區別 Null是.net中無效的對象引用。 DBNull是一個類。DBNull.Value是它唯一的實例。它指數據庫中數據為空(&l…

matlab數值很小出錯,求大神幫忙解決一下,用MATLAB求解動力學數據總是出錯~ - 計算模擬 - 小木蟲 - 學術 科研 互動社區...

CODE:function KineticsEst5 % 動力學ODE方程模型的參數估計%%%% The variables y here are y(1)xB, y(2)xoNB, y(3)xmNB,y(4)xpNB,y(5)xDNB .clear allclck0 [5 5 5 5 5]; % 參數初值lb [0 0 0 0 0]; % 參數下限ub [inf inf inf inf inf]; % 參數上限x0 [0 0 0 0 0 0];Kin…

iOS開發--驗證碼

第一步&#xff0c;拖兩個空間textfiled和button到storyboard上的viewcontroller上。 第二步&#xff0c;拖線&#xff0c;鏈接到.h文件中代碼如下&#xff1a; 1property (weak, nonatomic) IBOutlet UIButton *l_timeButton;第三步&#xff0c;在,m文件中為l_timeButton設置監…

Standard C Episode 8

C語言函數和程序結構 通過函數可以把大的計算任務分解成若干個較小任務&#xff0c;從而使得思路更加清晰&#xff0c;同時函數也大大提高了代碼的復用率&#xff0c;提高了工作效率。要注意的是多函數之間應該盡可能地高聚合低耦合。另一方面&#xff0c;一個程序可以保存在一…

C# Socket 編程詳解

Microsoft.Net Framework為應用程序訪問Internet提供了分層的、可擴展的以及受管轄的網絡服務&#xff0c;其名字空間System.Net和 System.Net.Sockets包含豐富的類可以開發多種網絡應用程序。.Net類采用的分層結構允許應用程序在不同的控制級別上訪問網絡&#xff0c;開發人員…

java 線程池 wait,Java 多線程 之 wait等待 線程實例

package com.wait.notify;/**題目: 人們在火車站的售票窗口排隊買火車票1. 北京西站開門2. 打開售票窗口3. 北京西站有10張去長沙的票4. 打開2個售票窗口,5 假設每個售票窗口每隔1秒鐘買完一張票1. 根據 名詞 找類人們(Person), 火車站(Station),火車票(Ticket) , 售票窗口e 是…