grpc的封装_c++ grpc 自己封装_weixin_45661658的博客-程序员秘密

技术标签: 微服务  c++  微服务架构  系统架构  grpc  

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)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_45661658/article/details/115766304

智能推荐

MT6737/MT6737T/MT6737M处理器功能介绍,MT6737芯片资料_mt 6737m可以玩什么_wangubuntu的博客-程序员秘密

MT6737芯片尾缀介绍:MT6737TMT6737MMT6737和MT6737TMT6737M比较,究竟哪个处理器更强劲,更胜一筹呢?就往下看,你就知道了!MT6737和MT6737TMT6737M处理器参数比较:分析:从CPU上看,都是4核A53架构,主频率上,MT6737T强于其余两款处理器,高达1.45GHz。内存支持上看,都是支持双通道,但MT...

Struts2讲解_FourAu的博客-程序员秘密

struts2目录:mvc框架ActionResult常用配置文件OGNL &amp; ValueStackTagsinterceptor框架java框架就是一些类和接口的集合,通过这些类和接口协调来完成一系列的程序实现。JAVA框架可以分为三层:表示层,业务层和物理层。框架又叫做开发中的半成品,它不能提供整个WEB应用程序的所有东西,但是有了框架,我们就可以集中精力进行业务逻辑的开发而不用去关心它的技术实现以及一些辅助的业务逻辑使用框架的目的:提高开发效率和代码统一性,降低后期维护成

vue 监听页面刷新或关闭-程序员秘密

参考:https://blog.csdn.net/weixin_43915587/article/details/93628935发现 beforeDestroy 只能监听到页面间的跳转,无法监听到页面刷新和关闭标签页。所以还是要借助 onbeforeunload 事件。顺便复习了一下 JavaScript 中的一些加载,卸载事件:页面加载时只执行 onload 事件。页面关闭时,先 onbeforeunload 事件,再 onunload 事件。页面刷新时先执行 onbeforeunload事件

计算机专业本专科生一样么,读专科报这3个专业,就业率比本科生还高,月薪过万完全有可能..._碍事的尾巴的博客-程序员秘密

原标题:读专科报这3个专业,就业率比本科生还高,月薪过万完全有可能如果说你的分数只够读专科,不要灰心,只要专业选得好,一样会有大好前程等着你的。2021年如果你的成绩没考好,自己不想复读,又不想这么年轻就走向社会,这个时候考生就只能选择读专科了。不要以为读专科就觉得没有了希望,千万不要妄自菲薄。有的时候,机会都是自己创造出来的,未来如何发展,与自己的选择是密切相关的。 现在,不管是什么学历的毕业生...

C++时间戳获取及转换_ff_tt的博客-程序员秘密

C++时间戳获取及转换时间戳的获取time_t tCurrentTime = time(NULL); //秒时间戳转换,格式化string StampToTime (time_t tCurrentTime){ struct tm tm; char strTimeType[11]; tm = *localtime(&amp;tCurrentTime); strftime(strTimeType,sizeof(strTimeType),"%Y%m%d%H",&amp;tm); str

写程序必备工具----IDE_CC创客论IT的博客-程序员秘密

写程序必备工具----IDE我们写过各种语言的代码,比如c/c++或python。如果没有一个好的编程工具,怎能写好程序?今天我来教大家下载一些编程工具----IDE。(本文以python为例)首先,我们在Microsoft edge中打开 jetbrains.com/PyCharm/ ,点击download,即可下载程序。下载好setup程序后,双击运行,注意:安装好之后,关联一下p...

随便推点

金融银行前置系统简述_ss123465的博客-程序员秘密

应用于小型银行的核心体系,主要由前台和后台以及若干小前置组成,前台发起交易给后台,后台处理后返回,如果需要外联,后台联动请求给小前置出去。这种架构对于不大于市级规模的银行使用已经足够了,一旦小型银行规模成长为在全国拥有多家分行,比如拥有跨地域开设分行的城市商业银行,各地的业务差异性复杂性给系统架构升级带来了必要性。                适用于第二类规模的核心架构为“前台(以及AT

拥塞控制算法之Verus (2015 Sigcomm)_verus tcp_Bordery的博客-程序员秘密

这两天重读了一下2015 Sigcomm的一篇拥塞控制文章: Verus。整理如下:MOTIVATION:Veurs想要解决的问题:在复杂多变的无线网络环境下的拥塞控制。蜂窝无线网络具有难以预测的特性[3][4][5],并且传统的TCP在其中表现并不好[1][2],会造成bufferbloat现象[6][7]。文中指出,对于无线信道的不可预测性,主要由三大特点决定:第一个,

图像分类经典卷积神经网络—SENet论文翻译(纯中文版)—Squeeze-and-Excitation Networks(挤压和激励网络)_神经网络excitaton_bigcindy的博客-程序员秘密

图像分类经典论文翻译汇总:[翻译汇总]翻译pdf文件下载:[下载地址]此版为中英文对照版,纯中文版请稳步:[SENet中英文对照版] Squeeze-and-Excitation Networks 挤压和激励网络 Jie Hu* Momenta [email protected] Li Shen* University of Oxford [email protected] Gang S

SIFT特征和SURF特征比较_sift surf_Blateyang的博客-程序员秘密

SIFT特征和SURF特征都是优秀的尺度不变特征,常用来进行物体辨识和图像匹配。所谓的尺度不变特征是指每个检测到的特征点都伴随着对应的尺寸因子(特征点的局部尺寸参数与特征的尺度成正比),下面就这两种著名的尺度不变特征进行简要的介绍和比较。(PS:由于两种特征提取算法的细节较多,本篇文章只简单介绍它们的原理、主要步骤和简单应用,主要关注两者的比较)

WEB页面定时刷新实现Session永不超时_DavidLee9的博客-程序员秘密

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 众所周知,当用户登录网站后较长一段时间没有与服务器进行交互,将会导致服务器上的用户会话数据(即session)被销毁。此时,当用户再次操作网页时,如果服务器进行了session校验,那么浏览器将会提醒用户session超时,导致这个问题的关键词有两个:一个是「长时间」,一个是「未操作」。&amp;...

sklearn.metrics.f1_score 使用方法_壮壮不太胖^QwQ的博客-程序员秘密

原网站:sklearn官网使用sklearn计算 F1 scoresklearn.metrics.f1_score(y_true, y_pred, labels=None, pos_label=1, average='binary', sample_weight=None, zero_division='warn')计算F1分数,也称为平衡F分数或F测度F1分数可...

推荐文章

热门文章

相关标签