grpc的c++封裝方法:
grpc是什么?
要了解grpc之前,先需要了解微服務架構,微服務架構簡單來說是一種系統架構方法,本來是用于大型服務器的,作用是什么呢?簡單來說:當服務器的某個部分掛掉的時候,其他的部分依然可以運行;這個架構用在軟體開發中的時候,就變成了一個系統中,不同的模塊,每個模塊或者幾個模塊,分別包裝成微服務器;好處是:某個模塊需要改動的時候只需要進行內部改動,和與此相關的某些模塊的協議需要改動,完全不會影響到其他模塊;
一般的系統架構圖:

微服務架構圖:

grpc是什么?
grpc是微服務架構的系統中,用于rpc的庫;
rpc是什么?
rpc的含義是遠程程式呼叫;
舉例來說:A是服務器,要提供服務;而B是客戶端,需要遠程請求服務;這時候A和B之間就需要通訊協議,而一般的tcp協議的話,只是進行資料傳輸的,rpc卻可以做到進行介面呼叫,也就是說B可以直接呼叫A中的介面;
那么,微服務架構中,如何設計一個模塊呢?或者說模塊的關注點是什么?
除了模塊內部的結構體和處理邏輯之外,還需要關注的就是:client端和server端;一個模塊可以被看成一個盲盒:client端是輸入資訊,server端是提供呼叫服務(輸出);
以下一一個訂單管理模塊的結構圖舉例:
一般的模塊結構圖:

grpc封裝之后的結構圖:

最后是實作的部分:
步驟1:假設原有的模塊已經實作完成了;
步驟2:安裝grpc:請去官網按照步驟安裝;然后用example檢查是否安裝成功,并可以進行編譯和使用;
步驟3:寫proto,proto就相當于是一般的server和client之間的通訊協議一樣的寫法,只是需要按照proto的語法來寫;假設這是模塊A為模塊B提供的service的proto檔案;(這里插入一下:service劃分的方法:一個模塊A為所有模塊B,C,D的rpc全部放在一個service中,一個是為B的是一個proto,為C的是一個;選擇后者比較好:修改比較簡單,不然本來只是修改A為B的service,反而要修改所有模塊的相關檔案;);所以一個proto = A’service For B;
步驟4:用proto生成四個proto相關的檔案(這里請參照grpc提供的example中的helloworld的cmake檔案):XXX.pb.h,XXX.pb.cc,XXX.grpc.pb.h,XXX.grpc.pb.cc
步驟5:把這四個檔案拷貝到A和B中;
步驟6:按照官方的檔案寫A的server和service,B的client;(建議先用最簡單的實作方法,不要使用asyn方法,之后深入理解之后,再用);
步驟7:把ClassA修改成單例模式:server中需要使用到ClassA的介面的時候,就直接呼叫;ClassB包含client,在需要rpc的時候,直接使用client進行rpc;
步驟8:在main中測驗一下:server的開啟需要用多執行緒:
例子中是模塊DBManagement為OrderManagement提供的service;
DBManagement_OrderManagement_Server* mongodb_server = new DBManagement_OrderManagement_Server();
std::thread t_mongodb_server(&DBManagement_OrderManagement_Server::Init, mongodb_server);
t_mongodb_server.detach();
使用rpc:
OrderManagement::GetInstance()->insert_into_DB(data);
這里insert內部是這樣的:
dbclient_->Insert_Data(data);
最后,附上兩個cmake模板:
1 步驟4中生成四個檔案的cmake模板:
分為兩個部分:
官方的不可缺的部分:
cmake_minimum_required(VERSION 3.5.1)
project(generate)
if(NOT MSVC)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
else()
add_definitions(-D_WIN32_WINNT=0x600)
endif()
find_package(Threads REQUIRED)
# This branch assumes that gRPC and all its dependencies are already installed
# on this system, so they can be located by find_package().
# Find Protobuf installation
# Looks for protobuf-config.cmake file installed by Protobuf's cmake installation.
set(protobuf_MODULE_COMPATIBLE TRUE)
find_package(Protobuf CONFIG REQUIRED)
message(STATUS "Using protobuf ${Protobuf_VERSION}")
set(_PROTOBUF_LIBPROTOBUF protobuf::libprotobuf)
set(_REFLECTION gRPC::grpc++_reflection)
if(CMAKE_CROSSCOMPILING)
find_program(_PROTOBUF_PROTOC protoc)
else()
set(_PROTOBUF_PROTOC $<TARGET_FILE:protobuf::protoc>)
endif()
# Find gRPC installation
# Looks for gRPCConfig.cmake file installed by gRPC's cmake installation.
find_package(gRPC CONFIG REQUIRED)
message(STATUS "Using gRPC ${gRPC_VERSION}")
set(_GRPC_GRPCPP gRPC::grpc++)
if(CMAKE_CROSSCOMPILING)
find_program(_GRPC_CPP_PLUGIN_EXECUTABLE grpc_cpp_plugin)
else()
set(_GRPC_CPP_PLUGIN_EXECUTABLE $<TARGET_FILE:gRPC::grpc_cpp_plugin>)
endif()
通過自己寫的proto生成檔案的部分:請按照自己的proto名字和想要的service名字進行修改
#dbmanagement service for ordermanagement
# Proto file
get_filename_component(db_order_proto "${CMAKE_CURRENT_BINARY_DIR}/dbmanagement_ordermanagement.proto" ABSOLUTE)
get_filename_component(db_order_proto_path "${db_order_proto}" PATH)
# Generated sources
set(db_order_proto_srcs "${CMAKE_CURRENT_BINARY_DIR}/dbmanagement_ordermanagement.pb.cc")
set(db_order_proto_hdrs "${CMAKE_CURRENT_BINARY_DIR}/dbmanagement_ordermanagement.pb.h")
set(db_order_grpc_srcs "${CMAKE_CURRENT_BINARY_DIR}/dbmanagement_ordermanagement.grpc.pb.cc")
set(db_order_grpc_hdrs "${CMAKE_CURRENT_BINARY_DIR}/dbmanagement_ordermanagement.grpc.pb.h")
add_custom_command(
OUTPUT "${db_order_proto_srcs}" "${db_order_proto_hdrs}" "${db_order_grpc_srcs}" "${db_order_grpc_hdrs}"
COMMAND ${_PROTOBUF_PROTOC}
ARGS --grpc_out "${CMAKE_CURRENT_BINARY_DIR}"
--cpp_out "${CMAKE_CURRENT_BINARY_DIR}"
-I "${db_order_proto_path}"
--plugin=protoc-gen-grpc="${_GRPC_CPP_PLUGIN_EXECUTABLE}"
"${db_order_proto}"
DEPENDS "${db_order_proto}")
# Include generated *.pb.h files
include_directories("${CMAKE_CURRENT_BINARY_DIR}")
# db_grpc_proto
add_library(db_order_proto
${db_order_proto_srcs}
${db_order_proto_hdrs}
${db_order_grpc_srcs}
${db_order_grpc_hdrs})
target_link_libraries(db_order_proto
${_REFLECTION}
${_GRPC_GRPCPP}
${_PROTOBUF_LIBPROTOBUF})
# Targets
foreach(_target )
add_executable(${_target} "${_target}.cc")
target_link_libraries(${_target}
db_order_proto
${_REFLECTION}
${_GRPC_GRPCPP}
${_PROTOBUF_LIBPROTOBUF})
endforeach()
2步驟5中,拷貝四個檔案到相應模塊,該模塊的cmake需要新增的內容:
find_package(Protobuf CONFIG REQUIRED)
find_package(gRPC REQUIRED)
include_directories("/usr/local/include/grpc")
include_directories("/usr/local/include/grpc++")
include_directories("/usr/local/include/grpcpp")
target_link_libraries(mongodbmanager protobuf::libprotobuf gRPC::grpc++ gRPC::grpc++_reflection)
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/277006.html
標籤:其他
