java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > SpringBoot3 gRpc远程服务调用

SpringBoot3结合gRpc实现远程服务调用的流程步骤

作者:顽石九变

gRPC是一个现代开源高性能远程过程调用(RPC)框架,可以在任何环境中运行,它由Google开发,旨在帮助开发人员更轻松地构建分布式应用,特别是当代码可能在不同地方运行的时候,本文介绍了SpringBoot3结合gRpc实现远程服务调用的流程步骤,需要的朋友可以参考下

一、gRPC概念介绍

gRPC(Google Remote Procedure Call,Google远程过程调用)是一个现代开源高性能远程过程调用(RPC)框架,可以在任何环境中运行。它由Google开发,旨在帮助开发人员更轻松地构建分布式应用,特别是当代码可能在不同地方运行的时候。

gRPC是一个高性能、开源和通用的RPC框架,它基于HTTP/2设计,并支持多种编程语言和平台。

随着其开源和广泛应用,gRPC已成为云原生计算基金会(CNCF)的一个孵化项目,被大量组织和企业采用。

核心特点

  1. 高性能:gRPC使用HTTP/2作为传输协议,支持二进制组帧、多路复用、双向全双工通信和流式处理等功能,从而显著提高性能。与JSON相比,gRPC的消息序列化速度更快,消息体积更小。
  2. 跨平台与跨语言:gRPC支持多种编程语言和平台,如C++、Java、Python、Go等,使得开发人员可以在不同的环境中使用统一的RPC框架。
  3. 灵活性与可扩展性:gRPC提供了丰富的功能,如负载平衡、跟踪、健康检查和身份验证等,这些功能都是可插拔的,可以根据需要进行配置和扩展。
  4. 安全性:gRPC支持TLS加密,确保数据在传输过程中的安全性。同时,它还支持多种认证机制,如JWT(JSON Web Tokens)等,以确保服务的访问安全。

工作原理

应用场景

二、简单使用步骤

首先,你需要定义gRPC服务。这里我们使用一个简单的helloworld.proto文件。

1. helloworld.proto

syntax = "proto3";

option java_multiple_files = true;
option java_package = "com.example.grpc";
option java_outer_classname = "HelloWorldProto";

package helloworld;

service HelloWorldService {
  rpc SayHello (HelloRequest) returns (HelloReply) {}
}

message HelloRequest {
  string name = 1;
}

message HelloReply {
  string message = 1;
}

2. 生成Java代码

使用protoc编译器和gRPC插件生成Java代码。

protoc --java_out=./src/main/java --grpc-java_out=./src/main/java --plugin=protoc-gen-grpc-java=/path/to/protoc-gen-grpc-java-1.x.x-linux-x86_64.exe helloworld.proto

确保将/path/to/protoc-gen-grpc-java-1.x.x-linux-x86_64.exe替换为你的protoc-gen-grpc-java插件的实际路径。

3. 服务端实现

在Spring Boot应用中,你可以创建一个组件来实现gRPC服务。

package com.example.grpc;

import io.grpc.stub.StreamObserver;
import net.devh.boot.grpc.server.service.GrpcService;

@GrpcService
public class HelloWorldServiceImpl extends HelloWorldServiceGrpc.HelloWorldServiceImplBase {

    @Override
    public void sayHello(HelloRequest req, StreamObserver<HelloReply> responseObserver) {
        String message = "Hello, " + req.getName() + "!";
        HelloReply reply = HelloReply.newBuilder().setMessage(message).build();
        responseObserver.onNext(reply);
        responseObserver.onCompleted();
    }
}

4. 客户端调用

在Spring Boot应用中,你可以创建一个服务来调用gRPC服务。这里使用JUnit单元测试

import com.example.grpc.HelloReply;
import com.example.grpc.HelloRequest;
import com.example.grpc.HelloWorldServiceGrpc;
import io.grpc.ManagedChannel;
import io.grpc.ManagedChannelBuilder;
import org.junit.jupiter.api.Test;

public class HelloWorldClientServiceTest {

    @Test
    public void sayHello() {
        ManagedChannel channel = ManagedChannelBuilder.forTarget("localhost:9091").usePlaintext().build();
        HelloWorldServiceGrpc.HelloWorldServiceBlockingStub stub = HelloWorldServiceGrpc.newBlockingStub(channel);
        HelloReply response = stub.sayHello(HelloRequest.newBuilder().setName("Lisa").build());
        System.out.println("response = " + response);
        channel.shutdown();
    }
}

5. 构建和运行

确保你的pom.xml中包含了必要的gRPC和Spring Boot依赖。

然后执行maven compile 指令生成java代码

mvn compile 

启动SpringBoot服务端,然后运行测试用例,得到如下结果:

response = message: "Hello, Lisa!"

三、添加gRPC相关依赖包

参考 grpc-spring

在Spring Boot项目中使用gRPC,你需要在项目的pom.xml 中添加相关的gRPC依赖。

以下是在Maven项目中添加gRPC依赖的示例。

<dependencies>
    <dependency>
        <groupId>com.salesforce.servicelibs</groupId>
        <artifactId>jprotoc</artifactId>
        <version>1.2.2</version>
    </dependency>
    <dependency>
        <groupId>net.devh</groupId>
        <artifactId>grpc-spring-boot-starter</artifactId>
        <version>${grpc-spring-boot-starter.version}</version>
    </dependency>
</dependencies>

<properties>
    <protobuf-maven-plugin.version>0.6.1</protobuf-maven-plugin.version>
    <protoc.version>3.25.1</protoc.version>
    <grpc-java.version>1.64.0</grpc-java.version>
    <os-maven-plugin.version>1.7.1</os-maven-plugin.version>
</properties>

请注意,你需要将${grpc-java.version}、${grpc-spring-boot-starter.version}替换为你想要使用的具体版本号。

这些依赖项包括了gRPC的基础库、与Protobuf的集成、以及Spring Boot对gRPC的支持。确保你使用的版本是兼容的,并根据你的项目需求进行调整。如果你还需要使用到其他的gRPC功能(如安全认证、健康检查等),你可能需要添加更多的依赖项。

四、使用Maven插件自动生成proto对应代码

参考 os-maven-plugin 和 protobuf-maven-plugin

如果你希望通过maven编译时自动生成proto对应的java代码,则需要添加Maven插件和相关依赖

<properties>
    <protobuf-maven-plugin.version>0.6.1</protobuf-maven-plugin.version>
    <protoc.version>3.25.1</protoc.version>
    <grpc-java.version>1.64.0</grpc-java.version>
    <os-maven-plugin.version>1.7.1</os-maven-plugin.version>
    <grpc-spring-boot-starter.version>3.1.0.RELEASE</grpc-spring-boot-starter.version>
</properties>
//...//
<dependencies>
    <dependency>
        <groupId>com.salesforce.servicelibs</groupId>
        <artifactId>jprotoc</artifactId>
        <version>1.2.2</version>
    </dependency>
    <!-- gRPC Server + Client -->
    <dependency>
        <groupId>net.devh</groupId>
        <artifactId>grpc-spring-boot-starter</artifactId>
        <version>${grpc-spring-boot-starter.version}</version>
    </dependency>
</dependencies>
// ... //

<build>
    <extensions>
        <extension>
            <groupId>kr.motd.maven</groupId>
            <artifactId>os-maven-plugin</artifactId>
            <version>${os-maven-plugin.version}</version>
        </extension>
    </extensions>
    <pluginManagement>
        <plugins>
            <!-- protobuf-maven-plugin -->
            <plugin>
                <groupId>org.xolstice.maven.plugins</groupId>
                <artifactId>protobuf-maven-plugin</artifactId>
                <version>${protobuf-maven-plugin.version}</version>
                <extensions>true</extensions>
                <executions>
                    <execution>
                        <id>protoc-compile</id>
                        <phase>generate-sources</phase>
                        <goals>
                            <goal>compile</goal>
                            <goal>compile-custom</goal>
                        </goals>
                    </execution>
                    <execution>
                        <id>protoc-test-compile</id>
                        <phase>generate-test-sources</phase>
                        <goals>
                            <goal>test-compile</goal>
                            <goal>test-compile-custom</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <protocArtifact>
                        com.google.protobuf:protoc:${protoc.version}:exe:${os.detected.classifier}
                    </protocArtifact>
                    <attachProtoSources>true</attachProtoSources>
                    <useArgumentFile>true</useArgumentFile>
                    <writeDescriptorSet>false</writeDescriptorSet>
                    <attachDescriptorSet>false</attachDescriptorSet>
                    <includeDependenciesInDescriptorSet>false</includeDependenciesInDescriptorSet>
                    <checkStaleness>true</checkStaleness>
                    <pluginId>grpc-java</pluginId>
                    <pluginArtifact>
                        io.grpc:protoc-gen-grpc-java:${grpc.version}:exe:${os.detected.classifier}
                    </pluginArtifact>
                    <protocPlugins>
                    </protocPlugins>
                </configuration>
            </plugin>
        </plugins>
    </pluginManagement>
    <plugins>
        <plugin>
            <groupId>org.xolstice.maven.plugins</groupId>
            <artifactId>protobuf-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

通过上面配置后,你就可以在项目中通过指令mvn compile生成proto对应的java代码,不需要通过外包指令了。

到此这篇关于SpringBoot3结合gRpc实现远程服务调用的流程步骤的文章就介绍到这了,更多相关SpringBoot3 gRpc远程服务调用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文