Spring Cloud 六《Spring Cloud+gRPC+Nacos》

0、前言

  • 集成GRPC

1、代码目录

Spring Cloud 六《Spring Cloud+gRPC+Nacos》

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
Spring Cloud 六《Spring Cloud+gRPC+Nacos》

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、测试

上一篇:GRPC: 如何实现分布式日志跟踪?


下一篇:Ubuntu18.04安装gRPC-Go的详细步骤(2021/10)