天天看點

c++用戶端 grpc_google grpc 架構的編譯 及 誇語言調用(c++服務端, java 用戶端)-Go語言中文社群...

1. 如何擷取grpc架構源碼

源碼可以去github擷取:https://github.com/grpc/grpc

2. 如何編譯

2.1 環境

Golang編譯工具,源代碼編譯(非必須)

下載下傳位址:https://www.golangtc.com/download

Perl編譯工具,源代碼編譯(非必須)

下載下傳位址:http://www.perl.org/get.html

VS2015 源代碼編譯,也就是工程建構後,用vs2015打開解決方案,然後進行編譯

CMake,用于工程配置, 這個很重要,用來建構工程的,必須的。

下載下傳位址:https://cmake.org/download/

2.2  編譯

2.2.1  由于下載下傳grpc源碼後,一些子產品源碼是缺少的,需要單獨下載下傳,具體可以參考檔案.gitmodules, 截圖如下:

c++用戶端 grpc_google grpc 架構的編譯 及 誇語言調用(c++服務端, java 用戶端)-Go語言中文社群...

一般來說主要下載下傳子產品有:zlib,protobuf, gflags, boringssl, benchmark,c-ares , 如下圖:

c++用戶端 grpc_google grpc 架構的編譯 及 誇語言調用(c++服務端, java 用戶端)-Go語言中文社群...

2.2.2  項目配置和生成vs2015項目

c++用戶端 grpc_google grpc 架構的編譯 及 誇語言調用(c++服務端, java 用戶端)-Go語言中文社群...

注意:如果有錯誤産生,需要看下具體原因,逐個排除即可。

最終生成的vs2015解決方案及若幹項目,如下圖:

c++用戶端 grpc_google grpc 架構的編譯 及 誇語言調用(c++服務端, java 用戶端)-Go語言中文社群...

此後:我們可以生成我們需要的項目子產品目标檔案即可。

3. 誇語言調用

grpc 可以跨語言調用,例如:c++,java,go等等,服務端的開發語言和用戶端可有不一樣,但是需要定義好協定,一般來說,我們定義一個proto檔案,裡面描述了大體的資料結構。

3.1 定義proto協定

c++用戶端 grpc_google grpc 架構的編譯 及 誇語言調用(c++服務端, java 用戶端)-Go語言中文社群...

說明:本協定其實就是求2個數的和,接口為Add

3.2 c++ 服務端

生成相關c++檔案,截圖如下:

protoc --cpp_out=. calculator.proto

protoc.exe --grpc_out=. --plugin=protoc-gen-grpc=grpc_cpp_plugin.exe calculator.proto

c++用戶端 grpc_google grpc 架構的編譯 及 誇語言調用(c++服務端, java 用戶端)-Go語言中文社群...

需要拷貝生成的檔案到服務端工程目錄下:

c++用戶端 grpc_google grpc 架構的編譯 及 誇語言調用(c++服務端, java 用戶端)-Go語言中文社群...
c++用戶端 grpc_google grpc 架構的編譯 及 誇語言調用(c++服務端, java 用戶端)-Go語言中文社群...
c++用戶端 grpc_google grpc 架構的編譯 及 誇語言調用(c++服務端, java 用戶端)-Go語言中文社群...
c++用戶端 grpc_google grpc 架構的編譯 及 誇語言調用(c++服務端, java 用戶端)-Go語言中文社群...

需要導入相關lib庫:

address_sorting.lib;cares.lib;crypto.lib;gpr.lib;grpc.lib;grpc++.lib;libprotobufd.lib;ssl.lib;zlibd.lib;zlibstaticd.lib;Ws2_32.lib;upb.lib;

相關服務端代碼:

#include "stdafx.h"

#include "calculator.grpc.pb.h"

#include "grpc++/grpc++.h"

class CalcualtorService : public calc::Caltulator::Service

{

// 構造、析構

public:

// 接口實作

public:

virtual ::grpc::Status Add(::grpc::ServerContext* context,

const ::calc::Request* request, ::calc::Response* response) override

{

response->set_sum(request->a() + request->b());

return grpc::Status::OK;

}

};

int main()

{

std::string server_address("0.0.0.0:50051");

CalcualtorService service;

grpc::ServerBuilder builder;

builder.AddListeningPort(server_address, grpc::InsecureServerCredentials());

builder.RegisterService(&service);

std::unique_ptr<:server> server(builder.BuildAndStart());

std::cout << "Server listening on " << server_address << std::endl;

server->Wait();

return 0;

}

3.3 java 用戶端

3.1需要相關的jar包

c++用戶端 grpc_google grpc 架構的編譯 及 誇語言調用(c++服務端, java 用戶端)-Go語言中文社群...

3.2  利用工具根據proto檔案生成java代碼:

c++用戶端 grpc_google grpc 架構的編譯 及 誇語言調用(c++服務端, java 用戶端)-Go語言中文社群...
c++用戶端 grpc_google grpc 架構的編譯 及 誇語言調用(c++服務端, java 用戶端)-Go語言中文社群...

3.3  代碼如下:

3.31. 定義CalculateService 類

package sample;

import io.grpc.ManagedChannel;

import io.grpc.ManagedChannelBuilder;

import java.util.concurrent.TimeUnit;

import io.grpc.StatusRuntimeException;

import io.grpc.netty.NegotiationType;

import io.grpc.netty.NettyChannelBuilder;

import java.util.logging.Level;

import java.util.logging.Logger;

public class CalculateService {

private ManagedChannel channel;

private calc.CaltulatorGrpc.CaltulatorBlockingStub blockingStub = null;

private CalculateService(ManagedChannel channel) {

this.channel = channel;

blockingStub = calc.CaltulatorGrpc.newBlockingStub(channel);

}

public CalculateService(String host, int port) {

//this(ManagedChannelBuilder.forAddress(host, port)

//      .usePlaintext()

//      .build());

channel = NettyChannelBuilder.forAddress(host, port).negotiationType(NegotiationType.PLAINTEXT).build();

}

public void shutdown() throws InterruptedException {

channel.shutdown().awaitTermination(5, TimeUnit.SECONDS);

}

public int operate(int num1, int num2) {

calc.Calculator.Request request= calc.Calculator.Request.newBuilder().setA(num1).setB(num2).build();

calc.Calculator.Response response= blockingStub.add(request);

return (int) response.getSum();

}

}

3.3.2  調用代碼如下:

CalculateService service= new CalculateService("localhost", 50051);System.out.println(service.operate(100, 1));

結束語: 如果需要相關代碼及編譯調試遇到問題,可以聯系我們, [email protected]