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

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)。

Springboot集成Brpc

想要建立一个点对点对接的工程,咱们能够直接看这个仓库->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配置

Springboot集成Brpc

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,假如能够呈现如下页面,阐明运用现已没问题了。

Springboot集成Brpc

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

服务端日志

Springboot集成Brpc

客户端日志

Springboot集成Brpc

4、总结

到这儿,整个建立和联调过程就完毕了,还算是比较具体吧。其中对接的数据仅仅十分简略的message,且只有一个。假如是杂乱数据的话,proto文件和Java bean需求规划的十分标准,不然十分容易呈现protostuff反序列化异常问题。这个有机会就下次再说啦。

ps:本文全部代码在 springboot04-brpc,有需求的能够自取哈。