本文代码可在总结处自取。
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 {
@Override
public 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: true
port: 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
的称号空间 -
EchoRequest
、EchoResponse
的称号空间 - 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,有需求的能够自取哈。