springboot-models
com.hu
1.0-SNAPSHOT
4.0.0
springboot-rpc
UTF-8
UTF-8
1.8
2.3.2
1.6.0
0.5.1
jcenter
https://jcenter.bintray.com/
org.lognet
grpc-spring-boot-starter
${grpc-spring-boot-starter.version}
kr.motd.maven
os-maven-plugin
${os-maven-plugin.version}
org.springframework.boot
spring-boot-maven-plugin
org.xolstice.maven.plugins
protobuf-maven-plugin
${protobuf-maven-plugin.version}
com.google.protobuf:protoc:3.5.1-1:exe:${os.detected.classifier}
grpc-java
io.grpc:protoc-gen-grpc-java:1.11.0:exe:${os.detected.classifier}
${project.build.sourceDirectory}
false
compile
compile-custom
syntax = "proto3";
option java_multiple_files = true;
// 编译生成的文件路径
package com.hu.grpc.compileFile;
// 定义入参类型
message Person {
// first_name 作为第一个参数
string first_name = 1;
// last_name 作为第二个参数
string last_name = 2;
}
// 定义返回值类型
message Greeting {
// 返回结果
string message = 1;
}
// 服务名字
service HelloWorldService {
// 方法 sayHello
// 入参 Person
// 返回值 Greeting
rpc sayHello (Person) returns (Greeting);
}
@Slf4j
@GRpcService
public class HelloWorldServiceImpl extends HelloWorldServiceGrpc.HelloWorldServiceImplBase {
/**
* @param request
* @param responseObserver
*/
@Override
public void sayHello(Person request, StreamObserver responseObserver) {
// super.sayHello(request, responseObserver);
log.info("服务端收到信息: server received {}", request);
String message = "Hello " + request.getFirstName() + " "
+ request.getLastName() + "!";
Greeting greeting =
Greeting.newBuilder().setMessage(message).build();
log.info("服务端返回信息: server responded {}", greeting);
// 返回数据 onNext 方法一个一个的处理客户端连续发送的消息,对应着客户端的一次onNext 调用
responseObserver.onNext(greeting);
// 结束方法 onCompleted方法表示 客户端发送消息结束,对应着客户端的一次onCompleted 调用
responseObserver.onCompleted();
}
}
5.编写对应的客户端代码,用于调用对应的service:初始化信道和存根: 信道,用于存放RPC通信的服务端ip和端口号; 存根,调用服务端提供的对应方法,并将返回值反序列化给到客户端
@Component
@Slf4j
public class HelloWorldClient {
private HelloWorldServiceGrpc.HelloWorldServiceBlockingStub helloWorldServiceBlockingStub;
@PostConstruct
// 初始化信道和存根: 信道,用于RPC通信的ip和端口号; 存根,存放的客户端提供的对应方法
private void init() {
// 对应的服务器地址
ManagedChannel managedChannel = ManagedChannelBuilder
.forAddress("localhost", 6565).usePlaintext().build();
// 客户端存根,调用方法就是对应的服务器提供的相应方法
helloWorldServiceBlockingStub =
HelloWorldServiceGrpc.newBlockingStub(managedChannel);
}
public String sayHello(String firstName, String lastName) {
// 根据参数创建入参
Person person = Person.newBuilder().setFirstName(firstName)
.setLastName(lastName).build();
log.info("客户端发送信息: client sending {}", person);
// 客户端调用对应的方法,并获得对应的返回值
Greeting greeting =
helloWorldServiceBlockingStub.sayHello(person);
log.info("客户端收到信息: client received {}", greeting);
return greeting.getMessage();
}
}
@SpringBootTest
public class TestDemo {
@Autowired
private HelloWorldClient helloWorldClient;
@Test
public void testSayHello() {
helloWorldClient.sayHello("John", "Doe");
}
}
整个项目代码结构如下: