Springboot集成Brpc

article/2025/8/29 19:54:14

本文代码可在总结处自取。

1、为什么要写这篇文章

最近自己做的业务在和C++团队对接,双方需要指定接口与传输协议。原本是直接使用http协议传输json数据,对双方来说都比较简单可接受。但是json数据传输效率实在令人堪忧,导致我们不得不另寻其道。因此,商量过后决定使用Brpc协议传输protobuf数据。

这对对方来说轻而易举,分分钟就搞定了。咱们搞Java的如果是第一次接触的话,还是需要一些时间调研的。

最开始想的是能有一篇手把手搭建Springboot集成Brpc的文章,但是浏览了一堆就没一个靠谱的`( >﹏< )′。于是自己只能不断查阅github兄弟上的wiki、遇到问题找StackOverflow大哥,最终才成功搭建起来基于Brpc协议的C++客户端与Java服务端。

想着自己踩坑不少,有必要记录一下整个搭建过程,不仅方便日后自己查阅,也能帮助兄弟们少走弯路。

2、Java服务端搭建

由于现在Java已经差不多和Spring/SpringBoot划上等号了(bushi),因此本小节仅介绍SpringBoot集成Brpc的工程搭建。

Baidu已经为我们开源了brpc-java的项目,chrome上输入关键词brpc java,第一个搜索词条便是baidu/starlight(感谢Google)。

在这里插入图片描述
想要搭建一个点对点对接的工程,我们可以直接看这个仓库->wiki->快速开始->2. SpringBoot场景(类似Spring MVC)这个锚点的内容。

2.1、Springboot工程搭建

这个相信大家都轻车熟路了,我就不再费太多口舌了。不过要注意的是,springboot的版本要在2.x,我们原先的工程就是1.x的Springboot,导致容器每次都启动失败。具体原因当时没有深入研究,后续有机会再给补上(主要原因还是打工人想早点干完活🤣)。

2.2、添加starlight依赖

截止写这篇文章的时候,mvnrepository仅有下面一个版本的仓库,所以可以不用去找了,就用下面的吧。

<dependency><groupId>com.baidu.cloud</groupId><artifactId>spring-cloud-starter-baidu-starlight</artifactId><version>2022.2.0</version>
</dependency>

记得还要添加一个httpclient依赖,这里就添加apache httpclient了。

<dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.3</version>
</dependency>

2.3、工程代码

因为是搭建启动demo,代码量非常少,这里就一起说完了。

整个工程的组织结构如下所示:

  • Application:Springboot启动类,没啥好说的
  • domain包:这个包下的类主要是brpc服务的请求和响应,设计这些请求和响应是为了C++侧更好的设计proto数据。
  • service包:暴露出去的服务接口和服务实现。
  • application.yaml:starlight配置

在这里插入图片描述

domain包下的类:

@Data
@NoArgsConstructor
@AllArgsConstructor
public class EchoRequest {private String message;
}@Data
@NoArgsConstructor
@AllArgsConstructor
public class EchoResponse {private String message;
}

service包下的类:

public interface EchoService {EchoResponse echo(EchoRequest request);
}// @RpcService注解指定了该service以brpc协议暴露出去,starlight支持一个接口同时暴露brpc和http协议,具体可以参考wiki
@RpcService
public class EchoServiceImpl implements EchoService {@Overridepublic EchoResponse echo(EchoRequest request) {System.out.println(request.getMessage());return new EchoResponse("Success");}
}

Application类:

@SpringBootApplication
@StarlightScan // 扫描@RpcService注解暴露的服务
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}

application.yaml:brpc服务将被暴露再8777端口

starlight:server:enable: trueport: 8777

启动Application,如果没有问题就表示Java服务端已经搭建完成了。

3、C++客户端搭建

其实这一小节没有太大必要,我们搭建好了服务后直接让C++侧的同学对接你的服务进行测试就行了。

但想着为了搭建一个可靠的服务,咱们可以现在本地搭建一个C++ brpc client进行测试下,确保咱们的服务端没问题后再和C++客户端侧对接,这样不显得你更加靠谱么。

3.1、安装、编译brpc

在安装brpc之前需要安装依赖的环境:

  • 安装git、g++、make、libssl-dev。(还是喜欢一个一个安装,在安装失败的时候就不用到处找日志了)
sudo apt-get install git 
sudo apt-get install g++ 
sudo apt-get install make 
sudo apt-get install libssl-dev
  • 安装gflags、protobuf、leveldb
sudo apt-get install realpath 
sudo apt-get install libgflags-dev 
sudo apt-get install libprotobuf-dev 
sudo apt-get install libprotoc-dev 
sudo apt-get install protobuf-compiler 
sudo apt-get install libleveldb-dev
  • 下载brpc源码
git clone https://github.com/brpc/brpc.git
  • 使用config_brpc.sh编译brpc
cd brpc
sh config_brpc.sh --headers=/usr/include --libs=/usr/lib
make
  • 测试是否编译成功
cd example/echo_c++
make
./echo_server & ./echo_client
  • 访问localhost:8080,如果能够出现如下页面,说明使用已经没问题了。

在这里插入图片描述

3.2、与Java服务端联调测试

为了简单起见,我们直接使用EchoClient进行测试。

首先我们需要修改echo.proto文件,我们需要把C++客户端的数据协议与Java服务端对齐,修改后的文件如下所示,主要有两点修改:

  • package,包改成了EchoService所在包名路径
  • EchoService.echo,方法首字母改成小写,与Java端对齐。当然也可以改成大写,让Java端与C++端对齐。
syntax="proto2";
package org.chubxu.brpc.service;option cc_generic_services = true;message EchoRequest {required string message = 1;
};message EchoResponse {required string message = 1;
};service EchoService {rpc echo(EchoRequest) returns (EchoResponse);
};

改完后需要重新编译proto文件。

protoc --cpp_out=./ echo.proto

因为proto文件改变,客户端源码也必须做出相应改变,有以下几点需要改变

  • EchoService_Stub的名称空间
  • EchoRequestEchoResponse的名称空间
  • stub的方法名

其实改变的地方就是对应proto文件改变的地方。

org::chubxu::brpc::service::EchoService_Stub stub(&channel);
org::chubxu::brpc::service::EchoRequest request;
org::chubxu::brpc::service::EchoResponse response;
stub.echo(&cntl, &request, &response, NULL);

改完后重新编译一下。

make

之后就可以发起请求了,观察client.cpp源码,可知客户端使用gflag接收了几个命令行参数,其中就有server参数指定brpc服务端的ip和port,因此我们执行下面的命令就可以成功发起请求了。

./echo_client --server=host:8777

服务端日志

在这里插入图片描述

客户端日志

在这里插入图片描述

4、总结

到这里,整个搭建和联调过程就结束了,还算是比较详细吧。其中对接的数据只是非常简单的message,且只有一个。如果是复杂数据的话,proto文件和Java bean需要设计的非常规范,否则非常容易出现protostuff反序列化异常问题。这个有机会就下次再说啦。

ps:本文全部代码在 👉 springboot04-brpc,有需要的可以自取哈。


http://chatgpt.dhexx.cn/article/ov1Gugu3.shtml

相关文章

brpc源码学习(六)- brpc server 端整体流程

brpc的使用比较容易上手&#xff0c;以官方demo为例&#xff0c;因为brpc的数据序列化依赖protobuf&#xff0c;所以首先需要定义个proto 然后继承EchoService并实现Echo方法 然后是整体流程 启动还是比较简单的&#xff0c;定义server&#xff0c;AddService&#xff0c;然后S…

brpc源码解析(一)—— rpc服务添加以及服务器启动主要过程

目录 1.往Server里添加Service&#xff08;业务代码&#xff09;2.设置服务器参数3.启动服务器 平时的工作用到了baidu-rpc搭建rpc服务&#xff0c;作为戈君大神的大作&#xff0c;在没有开源的时候&#xff0c;这个c 的rpc框架在厂内就已经好评颇多&#xff0c;无论是性能、文…

brpc初步学习

一.BRPC介绍 BRPC百度开源的一个rpc框架&#xff0c;它具有以下特性&#xff1a; 基于protobuf接口的RPC框架&#xff0c;也提供json等其他数据格式的支持囊括baidu内部所有RPC协议&#xff0c;支持多种第三方协议模块化设计&#xff0c;层次清晰&#xff0c;很容易添加自定义…

brpc介绍、编译与使用

brpc又称为baidu-rpc&#xff0c;是百度开发一款“远程过程调用”网络框架。目前该项目已在github上开源——https://github.com/brpc/brpc。&#xff08;转载请指明出于breaksoftware的csdn博客&#xff09; 据目前公开的资料&#xff0c;我们发现百度内部从2010年开始&#x…

NB-IOT与物联网

1. 物联网的技术格局 短距离(智能家居/穿戴等) --- zigbee, wifi, BLE 长距离 (LPWA 低功耗广域) --- LORA, NB-IOT 关于LORA大致了解了一下情况 . Lora 其实已经是一个很成熟的技术方案. 国外已经大范围使用,国内也有不少公司在基于LORA运营物联网系统. LORA的系统结构…

lora和nbiot的相同点,它们之间有何区别和联系?

在物联网无线数据传输中&#xff0c;有诸多方式可以选择&#xff0c;包括蓝牙、WIFI、FSK、ASK/OOK、Lora、Zigbee、NB-iot、Z-Wave.等&#xff0c; 其中lora 和NBIot 是自2016年来比较热门的两个无线通讯方式。 我们今天就和大家简单的聊聊Lora 和NBiot。 我是在2016年接触…

NB-IOT开发|nbiot开发教程《三》AT指令类模组驱动-STM32实现AT指令状态机

嵌入式开发中我们要时刻保持代码的高效与整洁看之前&#xff0c;先点赞 好习惯&#xff0c;要养成 一、前言 嵌入式开发中我们要时刻保持代码的高效与整洁。在第一节中“NB-IOT开发|nbiot开发教程《一》AT指令类模组驱动解析”我们说到AT指令模组最好的驱动-状态机。本节我们就…

基于华为云IOT平台实现多节点温度采集(STM32+NBIOT)

一、前言 当前的场景是,在高速公路上部署温度采集设备,在高速路地表安装温度检测传感器,检测当前路段的路面实际温度。一段高速路上有多个地点需要采集温度数据。 采集温度数据需要上传到云平台进行数据存储,并且通过可视化界面展示温度变化曲线,支持查询最近几天的温度信…

NB-IoT的优势是什么?

NB-IoT的优势 &#xff1a; • 强链接&#xff1a;在同一基站的情况下&#xff0c;NB-IoT可以比现有无线技术提供50-100倍的接入数。一个扇区能够支持10万个连接&#xff0c;支持低延时敏感度、超低的设备成本、低设备功耗和优化的网络架构。举例来说&#xff0c;受限于带宽&a…

MN316_OPEN(NBIOT)物联网模块环境搭建

因为项目的需要,这里要使用NBIOT,踩了一些坑,这里总结一下! 编译 官方给的SDK如下: 按照说明,在该目录下直接运行如下指令:".\build.bat dlvs_h0 demo"即可成功编译,但是我编译的时候不成功,报错如下: 最后发现是因为我的目录太深的原因造成的,把"MN316_Op…

stm32毕业设计 NBIOT远程通信系统

文章目录 1 简介2 NBIOT 简介2.1 NBIOT 的特点2.2 NBIOT 的优点2.3 NBIOT能做什么 NBIOT 模块使用4 实现效果5 STM32 驱动NBIOT模块6 最后 1 简介 Hi&#xff0c;大家好&#xff0c;NBIOT是近几年不比较火的远程通信模块&#xff0c;是物联网的重要技术&#xff0c;今天学长向…

NB-IoT技术实战开发 ----- NB-IoT介绍

一.1------初识NB-IoT 1、NB-IoT介绍2、 物联网技术发展2.1有线物联网2.2 无线网络网 3、为什么需要NB-IOT4、NB-IOT优势5、NB-IOT解决方案亮点和价值5.1 广覆盖5.2 低功耗5.3低成本5.4 大连接 6、NB-IOT的应用1.智能抄表2.智能停车3.宠物跟踪4.else 1、NB-IoT介绍 NB-----Na…

【物联网】LoRa vs NBIoT

LoRa &#xff08;Long Range&#xff09; VS NB-IoT&#xff08;Narrow Band Internet of Things&#xff09; LoRa和NB&#xff0d;IoT是什么 通常物联网设备分为三类&#xff1a; 无需移动性&#xff0c;大数据量&#xff0c;需较宽频段&#xff1b;移动性强&#xff0…

物联网协议之NBIOT

什么是NBIOT 在物联网行业目前常用的网络通信技术主要有以下这些&#xff1a; nbiot属于一种LTE网络&#xff0c;LTE网络是目前主流的通信网络&#xff0c;覆盖完整、技术成熟&#xff0c;未来大量物联网设备都需要在LTE网络中实现通讯功能。Cat.X这个值是用来衡量用户终端设…

浅谈NBIOT

一、什么是NBIOT&#xff1f; 1、概念 窄带物联网&#xff08;Narrow Band Internet of Things, NB-IoT&#xff09;&#xff0c;NB-IoT构建于蜂窝网络&#xff0c;只消耗大约180KHz的带宽&#xff0c;使用License频段&#xff0c;可采取带内、保护带或独立载波等三种部署方式…

【物联网毕设基础】NBIOT 窄带物联网

文章目录 1 简介2 NBIOT简介3NB的型号介绍3.1 BC95:3.2 BC35&#xff1a;3.3 BC28&#xff1a;3.4 BC26&#xff1a;3.5 BC20&#xff1a;3.6 BC30&#xff1a; 4 NB物联网卡5 OpenCPU6 BC260模块详解6.1 基本性能6.2 引脚介绍6.3 模块供电 7 其他注意点8 最后 1 简介 Hi&…

NB-IoT学习笔记 —— NB-IoT介绍

一、简介 NB-IoT 是指窄带物联网&#xff08;Narrow Band Internet of Things&#xff09;技术&#xff0c;是一种低功耗广域&#xff08;LPWA&#xff09;网络技术标准&#xff0c;基于蜂窝技术&#xff0c;用于连接使用无线蜂窝网络的各种智能传感器和设备&#xff0c;聚焦于…

淘宝客解析url优惠链接获取商品ID

淘宝客解析商品链接获取PID 优惠链接都有一个e参数&#xff0c;提取e参数&#xff0c;直接解析e参数就可以获取推广链接的商品ID&#xff1b; 这是一个优惠推广链接:https://uland.taobao.com/coupon/edetail?ed4tkoUeRofIN%2BoQUE6FNzDiOaI9VHkxMoEVLjjyR2S%2Bki3b8ti%2Bp7j…

ANSI/CAN/UL 1973:2022 固定和运动辅助电源用电池安规要求-最新的英文2022完整版{135页}

ANSI/CAN/UL 1973:2022 Batteries for Use in Stationary andMotive Auxiliary Power Applications 固定和运动辅助电源用电池 UL1973-2022&#xff08;February25,2022&#xff09;.pdf-其它文档类资源-CSDN下载UL1973-2022&#xff08;February25,2022&#xff09;.pdf更多下…

java测试示例-生成ULID

ULID全称Universally Unique Lexicographically Sortable Identifier&#xff0c;直译就是通用唯一按字典排序的标识符&#xff0c;原始仓库是https://github.com/ulid/javascript&#xff0c;由前端开发者alizain发起&#xff0c;基于JavaScript语言。从项目中的commit历史来看…