0、前言
- 集成GRPC
1、代码目录
2、api服务
2.1 helloworld.proto
syntax = "proto3";
option java_multiple_files = true;
option java_package = "com.yun.grpc.api";
option java_outer_classname = "HelloWorldProto";
// The greeting service definition.
service Simple {
// Sends a greeting
rpc SayHello (HelloRequest) returns (HelloReply) {
}
}
// The request message containing the user's name.
message HelloRequest {
string name = 1;
}
// The response message containing the greetings
message HelloReply {
string message = 1;
}
2.2 pom.xml
<artifactId>com.yun.grpc.api</artifactId>
<properties>
<grpc.2java.version>1.6.1</grpc.2java.version>
<grpc.version>1.14.0</grpc.version>
<os.plugin.version>1.6.0</os.plugin.version>
<protobuf.plugin.version>0.5.1</protobuf.plugin.version>
<protoc.version>3.3.0</protoc.version>
</properties>
<dependencies>
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-netty</artifactId>
<version>${grpc.version}</version>
</dependency>
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-protobuf</artifactId>
<version>${grpc.version}</version>
</dependency>
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-stub</artifactId>
<version>${grpc.version}</version>
</dependency>
</dependencies>
<build>
<extensions>
<extension>
<groupId>kr.motd.maven</groupId>
<artifactId>os-maven-plugin</artifactId>
<version>${os.plugin.version}</version>
</extension>
</extensions>
<plugins>
<plugin>
<groupId>org.xolstice.maven.plugins</groupId>
<artifactId>protobuf-maven-plugin</artifactId>
<version>${protobuf.plugin.version}</version>
<configuration>
<protocArtifact>com.google.protobuf:protoc:${protoc.version}:exe:${os.detected.classifier}</protocArtifact>
<pluginId>grpc-java</pluginId>
<pluginArtifact>io.grpc:protoc-gen-grpc-java:${grpc.2java.version}:exe:${os.detected.classifier}</pluginArtifact>
</configuration>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>compile-custom</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
2.3 测试
执行mvn package
3、provider
3.1 pom.xml
- 注: spring-boot-starter-web
- 注: commons-collections
<artifactId>com.yun.grpc.provider</artifactId>
<properties>
<grpc.server.version>2.0.1.RELEASE</grpc.server.version>
<brave.instrumentation.grpc>5.1.2</brave.instrumentation.grpc>
</properties>
<dependencies>
<dependency>
<groupId>com.example</groupId>
<artifactId>com.yun.grpc.api</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.example</groupId>
<artifactId>com.yun.common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<!--必需,没有的话无法注册到nacos-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>net.devh</groupId>
<artifactId>grpc-server-spring-boot-starter</artifactId>
<version>${grpc.server.version}</version>
</dependency>
<!--报错-->
<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>3.2.2</version>
</dependency>
</dependencies>
3.2 bootstrap
- 注: grpc.server.post必需
grpc:
server:
port: 50051
spring:
application:
name: service-grpc-provider
cloud:
nacos:
config:
server-addr: 192.168.126.133:8848
file-extension: yaml
enabled: true
3.3 application
- 注: metadata 必需
server:
port: 8011
spring:
cloud:
nacos:
discovery:
server-addr: ${spring.cloud.nacos.config.server-addr}
metadata:
gRPC:
port: ${grpc.server.port} # 不可少。UNAVAILABLE: NameResolver returned an empty list
3.4 服务 GrpcServerService
@GrpcService(SimpleGrpc.class)
public class GrpcServerService extends SimpleGrpc.SimpleImplBase{
@Override
public void sayHello(HelloRequest req, StreamObserver<HelloReply> responseObserver){
HelloReply reply = HelloReply.newBuilder()
.setMessage("Hello ========== " + req.getName())
.build();
responseObserver.onNext(reply);
responseObserver.onCompleted();
}
}
3.5 启动类 GrpcProviderApplication
@SpringBootApplication
public class GrpcProviderApplication {
public static void main(String[] args) {
SpringApplication.run(GrpcProviderApplication.class,args);
}
}
3.6 运行测试
- 先运行nacos
- GrpcProviderApplication
4、consumer
4.1、pom文件
<modelVersion>4.0.0</modelVersion>
<artifactId>com.yun.grpc.consumer</artifactId>
<properties>
<grpc.server.version>2.0.1.RELEASE</grpc.server.version>
<brave.instrumentation.grpc>5.1.2</brave.instrumentation.grpc>
</properties>
<dependencies>
<dependency>
<groupId>com.example</groupId>
<artifactId>com.yun.grpc.api</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.example</groupId>
<artifactId>com.yun.common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<!--必需,没有的话无法注册到nacos-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>net.devh</groupId>
<artifactId>grpc-client-spring-boot-starter</artifactId>
<version>${grpc.server.version}</version>
</dependency>
<!--报错-->
<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>3.2.2</version>
</dependency>
</dependencies>
4.2 bootstrap
spring:
application:
name: service-grpc-consumer
cloud:
nacos:
config:
server-addr: 192.168.126.133:8848
file-extension: yaml
enabled: true
4.3 application.xml
server:
port: 8012
spring:
cloud:
nacos:
discovery:
server-addr: ${spring.cloud.nacos.config.server-addr}
4.4 消费服务
- service-grpc-provider
@Service
public class GrpcClientService {
@GrpcClient("service-grpc-provider")
private Channel serverChannel;
public String sendMessage(String name) {
SimpleGrpc.SimpleBlockingStub stub = SimpleGrpc.newBlockingStub(serverChannel);
HelloReply response = stub.sayHello(HelloRequest.newBuilder().setName(name).build());
return response.getMessage();
}
}
4.5 测试controller
@RestController
public class GrpcClientController {
@Autowired
private GrpcClientService grpcClientService;
@RequestMapping("/")
public String printMessage(@RequestParam(defaultValue = "Spring Cloud") String name){
return grpcClientService.sendMessage(name);
}
}
4.6 CloudGrpcClientApplication
@SpringBootApplication
public class CloudGrpcClientApplication {
public static void main(String[] args) {
SpringApplication.run(CloudGrpcClientApplication.class, args);
}
}
5、测试
- 勿忘启动nacos
- 启动 provider
- 启动consumer
- 访问 http://localhost:8012/