近一年来一直在用公司内wiki进行技术调研以及记录,后期有时间将逐步迁移至博客园。
参考资料:
https://github.com/grpc/grpc-java
https://www.cnblogs.com/gutousu/p/9951956.html
它可以一次性的在一个 .proto 文件中定义服务并使用任何支持它的语言去实现客户端和服务器,反过来,它们可以在各种环境中,从Google的服务器到你自己的平板电脑- gRPC 帮你解决复杂的不同语言间通信以及不同使用环境的问题。 protocol buffers 还能获得其他好处,包括高效的序列号,简单的 IDL 以及容易进行接口更新,且无注册中心。
依赖包
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
</dependency>
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java-util</artifactId>
</dependency>
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-all</artifactId>
</dependency>
build
<build>
<extensions>
<extension>
<!-- provides os.detected.classifier (i.e. linux-x86_64, osx-x86_64) property -->
<groupId>kr.motd.maven</groupId>
<artifactId>os-maven-plugin</artifactId>
<version>1.6.1</version>
</extension>
</extensions>
<plugins>
<plugin>
<groupId>org.xolstice.maven.plugins</groupId>
<artifactId>protobuf-maven-plugin</artifactId>
<configuration>
<protocArtifact>com.google.protobuf:protoc:${protobuf.version}:exe:${os.detected.classifier}
</protocArtifact>
<pluginId>grpc-java</pluginId>
<pluginArtifact>io.grpc:protoc-gen-grpc-java:${grpc.version}:exe:${os.detected.classifier}
</pluginArtifact>
<!-- proto文件目录 -->
<protoSourceRoot>${project.basedir}/src/main/proto</protoSourceRoot>
</configuration>
<executions>
<execution>
<id>bean</id>
<goals>
<goal>compile</goal>
<goal>test-compile</goal>
</goals>
<configuration>
<!-- 生成的Java文件目录 -->
<outputDirectory>${project.build.directory}/generated-sources/protobuf/java</outputDirectory>
</configuration>
</execution>
<execution>
<id>grpc</id>
<goals>
<goal>compile-custom</goal>
<goal>test-compile-custom</goal>
</goals>
<configuration>
<!-- 生成的grpc-Java文件目录 -->
<outputDirectory>${project.build.directory}/generated-sources/protobuf/grpc-java
</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
proto-demo
syntax = "proto2";
package java_test;
service TestService {
rpc method (Request) returns (Result) {
}
}
message Request {
optional string request1 = 1;
optional string request2 = 2;
}
message Result {
optional string result1 = 1;
optional string result2 = 2;
}
编译项目,生成bean文件和通信文件
server端demo
package com.baidu.traffic.sc.test;
import io.grpc.ServerBuilder;
import io.grpc.stub.StreamObserver;
import java_test.TestGrpc;
import java_test.TestServiceGrpc;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.stereotype.Component;
import java.io.IOException;
/**
* Created by liushouyun on 2019-12-20 12:36.
*/
@Component
public class JavaGrpcServer extends TestServiceGrpc.TestServiceImplBase implements InitializingBean {
@Override
public void method(TestGrpc.Request request, StreamObserver<TestGrpc.Result> responseObserver) {
TestGrpc.Result result = TestGrpc.Result.newBuilder().setResult1("结果1").setResult2("结果2不想给你").build();
responseObserver.onNext(result);
responseObserver.onCompleted();
// super.method(request, responseObserver);
}
@Override
public void afterPropertiesSet() throws IOException {
ServerBuilder.forPort(8582)
.addService(new JavaGrpcServer())
.build().start();
}
}
client端demo
package com.baidu.traffic.signal.test;
import io.grpc.Channel;
import io.grpc.ManagedChannelBuilder;
import io.swagger.annotations.Api;
import java_test.TestGrpc;
import java_test.TestServiceGrpc;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* Created by liushouyun on 2019-12-20 12:36.
*/
@Api(tags = "grpc-test")
@RestController
@RequestMapping(value = "/test/grpc")
@Slf4j
public class JavaGrpcClient {
private Channel channel = channel();
@GetMapping("/run")
public TestResult run() {
TestServiceGrpc.TestServiceBlockingStub testServiceBlockingStub = TestServiceGrpc.newBlockingStub(channel);
TestGrpc.Request request = TestGrpc.Request.newBuilder().setRequest1("ha?").setRequest2("en?").build();
TestGrpc.Result result = testServiceBlockingStub.method(request);
return new TestResult(result.getResult1(), result.getResult2());
}
@Data
@AllArgsConstructor
@NoArgsConstructor
private class TestResult {
private String result1;
private String result2;
}
private Channel channel() {
return ManagedChannelBuilder
.forAddress("127.0.0.1", 8582)
.usePlaintext()
.build();
}
}