概述
项目结构和实现步骤
- 整个demo分为三个部分:protobuf定义的接口部分、服务端、客户端
- 实现步骤
- 使用protobuf定义接口,即相对应的proto文件
- 使用build方法生成对应的程序代码
- 在服务端重写服务方法,用来监听客户端发送的请求建立连接并返回数据
- 在客户端构造请求方法,向服务端发送请求并获得返回数据
demo实现
- 准备工作
- 首先可以建立一个基本的Springboot项目
- 在项目里面添加对应的三个模块
接口文件部分
- 先在demo-proto接口模块中添加对应的依赖和插件
buildscript {
repositories {
maven { url "https://plugins.gradle.org/m2/" }
}
dependencies {
classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.6'
}
}
plugins {
id 'java'
id 'idea'
}
apply plugin:"com.google.protobuf"
group 'com.example.demo-grpc'
version '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8
repositories {
mavenCentral()
maven {url "https://plugins.gradle.org/m2/"}
}
dependencies {
compile "com.google.protobuf:protobuf-java:3.6.1"
compile "io.grpc:grpc-netty:1.12.1"
compile "io.grpc:grpc-protobuf:1.12.1"
compile "io.grpc:grpc-stub:1.12.1"
}
protobuf {
protoc {
// The artifact spec for the Protobuf Compiler
artifact = 'com.google.protobuf:protoc:3.6.1'
}
plugins {
grpc {
artifact = 'io.grpc:protoc-gen-grpc-java:1.12.1'
}
}
generateProtoTasks {
ofSourceSet('main')*.plugins {
grpc { }
}
}
}
- src目录中添加proto文件夹,添加demo.proto文件
定义简单的包名以及传输信息的格式,名称
syntax = "proto3";
option java_multiple_files = true;
option java_package = "com.demo.grpc";
option java_outer_classname = "DemoProto";
//请求消息
message CommonRequest {
string header = 3;
string body = 4;
}
//响应消息
message CommonResponse {
int32 code = 1;
string note = 2;
}
service Simple{
rpc Hello(CommonRequest) returns(CommonResponse){}
}
- 生成对应的程序代码,双击gradle窗口的build方法,即可自动完成
服务端
- 在demo-server模块中添加对应的依赖并且导入demo-proto模块,build.gradle代码如下
plugins {
id 'java'
id 'org.springframework.boot'
}
apply plugin: 'io.spring.dependency-management'
group 'com.example.demo-grpc'
version '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8
repositories {
mavenCentral()
}
dependencies {
compile project(':demo-proto')
compile 'net.devh:grpc-server-spring-boot-starter:1.4.0.RELEASE'
implementation 'org.springframework.boot:spring-boot-starter-web'
testCompile group: 'junit', name: 'junit', version: '4.12'
}
- 添加服务端方法,并重写定义的方法,添加ServerService类重写hello方法
获取请求发来的参数信息,可以从proto定义的消息格式中知道:有header和body两种,所以在设置的返回信息中我选择把请求的信息再返回给客户端
- 设置服务端启动端口和grpc端口
在application.yml中设置为
server:
port: 8088
grpc:
server:
port: 9876
客户端
- 在demo-client模块中添加对应的依赖并且导入demo-proto模块,build.gradle代码如下
plugins {
id 'java'
id 'org.springframework.boot'
}
apply plugin: 'io.spring.dependency-management'
group 'com.example.demo-grpc'
version '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8
repositories {
mavenCentral()
}
dependencies {
compile project(':demo-proto')
compile 'net.devh:grpc-client-spring-boot-starter:1.4.0.RELEASE'
implementation 'org.springframework.boot:spring-boot-starter-web'
testCompile group: 'junit', name: 'junit', version: '4.12'
}
- 在客户端实现发送请求的方法
- 在客户端添加控制器类,方便调用请求方法
4.设置客户端启动端口,以及grpc服务端端口
在application.yml中设置
grpc:
client:
local-ser:
host: 127.0.0.1
port: 9876
server:
port: 8087
运行结果
最后程序结果如图:
注:demo就不放在git上了,有需要可以联系。