【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中,服务通过.proto文件进行定义。这些文件包含了服务的接口描述、消息类型等信息。开发人员可以使用Protocol Buffers(简称Protobuf)来定义这些结构化的消息。
  • 代码生成:基于.proto文件,gRPC提供了protoc编译器来生成支持多种编程语言的客户端和服务端代码。这使得开发人员可以轻松地实现跨语言的RPC调用。
  • 通信过程:在客户端和服务端之间,gRPC通过HTTP/2协议进行通信。客户端发送请求到服务端,服务端处理请求并返回响应。整个通信过程都是基于二进制格式的,从而提高了性能和效率。

应用场景

  • 微服务架构:在微服务架构中,gRPC可以有效地连接多语言服务,实现服务间的快速通信。
  • 分布式计算:gRPC适用于分布式计算的最后一英里,将设备、移动应用程序和浏览器连接到后端服务。
  • API设计:与REST API相比,gRPC提供了一种更加高效和灵活的API设计风格,适用于需要高性能和低延迟的应用场景。

二、简单使用步骤

首先,你需要定义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-pluginprotobuf-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代码,不需要通过外包指令了。

参考

  • 14
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Spring Boot 是一个用于构建基于Java的微服务的开发框架。它提供了一种快速开发、简化配置的方式,使得开发者能够更容易地构建和部署应用程序。 Spring Boot MVC 是 Spring Boot 中用于构建Web应用程序的一部分。它基于 Spring MVC 框架,提供了简化的配置和开发方式,使得开发者能够更高效地构建和维护Web应用。 gRPC是一种高性能、开源的远程过程调用(RPC)框架,由Google开发并开源。它使用Protocol Buffers作为接口定义语言(IDL),可以跨语言地进行通信。与传统的HTTP+JSON通信相比,gRPC提供了更快、更轻量级、更高效的跨网络通信方式。 Spring Boot可以集成gRPC实现基于gRPC远程过程调用。集成gRPC的步骤如下: 1. 在Spring Boot项目中添加gRPC的依赖,例如在pom.xml中添加相关依赖。 2. 使用Protocol Buffers编写接口定义文件(.proto文件),定义服务和消息格式。 3. 使用gRPC编译器生成相应的Java代码。 4. 编写服务实现类,实现生成的接口。 5. 在Spring Boot中配置gRPC服务端和客户端的相关信息。 6. 启动Spring Boot应用程序。 通过上述步骤,就可以在Spring Boot中实现基于gRPC远程过程调用。通过gRPC服务端和客户端可以直接调用对方提供的方法,以实现跨网络的通信。gRPC使用Protocol Buffers进行序列化和反序列化,提供了高效的通信方式。同时,通过Spring Boot的集成,开发者可以更方便地进行开发和部署。总之,Spring Boot MVC gRPC实现可以为开发者提供快速、高效地构建基于gRPC的微服务应用的能力。 ### 回答2: Spring Boot是一个用于构建独立的、生产级别的Spring应用程序的框架。它简化了Spring应用程序的配置和部署过程,并提供了大量的开箱即用的功能。而MVC(Model-View-Controller)是一种常用的软件设计模式,用于将应用程序的业务逻辑、数据和呈现逻辑分离。 gRPC是一种高性能、开源的远程过程调用(RPC)框架,它使用Protocol Buffers作为接口定义语言。gRPC支持多种语言,包括Java和Spring Boot。使用gRPC,可以定义消息类型和服务接口,并生成用于客户端和服务器之间通信的代码。 在Spring Boot中使用gRPC实现通常需要以下步骤: 1.定义gRPC服务接口:使用Protocol Buffers定义服务接口和消息类型,并生成相应的代码。 2.实现gRPC服务接口:在Spring Boot应用程序中实现gRPC服务接口中定义的方法。 3.配置gRPC服务器:在Spring Boot应用程序中配置gRPC服务器,指定端口和服务实现类。 4.编写客户端代码:编写客户端代码以使用gRPC调用服务器端提供的服务。 使用gRPC的好处包括高性能、跨语言支持、自动化的代码生成等。在Spring Boot中使用gRPC可以方便地将gRPC集成到现有的Spring应用程序中,并利用Spring Boot提供的便利功能,如自动配置和部署。 总结:Spring Boot MVC和gRPC是两种不同的技术,分别用于构建Web应用程序和实现远程过程调用。在Spring Boot应用程序中使用gRPC实现时,需要通过定义gRPC服务接口、实现服务接口方法、配置和启动gRPC服务器等步骤来集成gRPC。这样可以在Spring Boot应用程序中使用gRPC高性能的远程过程调用功能。 ### 回答3: Spring Boot是一个基于Spring框架的快速开发框架,它简化了Spring的配置和部署过程。而MVC是Spring框架中的一种设计模式,通过它可以将应用程序的不同部分进行解耦,使得每个部分可以独立开发、测试和部署。 gRPC是一个高性能、开源的远程过程调用(RPC)框架,它使用Google Protocol Buffers作为接口定义语言,并支持多种编程语言。通过gRPC,我们可以轻松地定义RPC服务,然后使用自动生成的客户端和服务端代码进行通信。 在Spring Boot中集成MVC和gRPC可以实现两者的优势互补。我们可以使用Spring MVC来处理HTTP请求,同时使用gRPC来处理RPC请求。这样一来,我们就可以使用Spring Boot的自动配置和注解来简化开发,同时利用gRPC的高效性能和跨语言能力。 首先,我们需要在Spring Boot项目中引入gRPC的依赖。然后,我们可以定义gRPC服务接口和实现类,就像定义普通的Java接口和实现类一样。接着,我们可以使用gRPC的注解来定义服务的类型、方法、输入参数和返回值。同时,我们也可以在服务实现类中编写具体的逻辑代码。 在Spring MVC中,我们可以使用@RestController注解来定义HTTP接口,通过调用gRPC服务来处理请求。这样,我们就可以将HTTP请求转发到gRPC服务,从而实现在一个应用中同时支持HTTP和RPC两种协议。 总之,通过Spring Boot集成MVC和gRPC,我们可以在一个应用中同时支持HTTP和RPC协议,并可以充分利用两者的优势。这样,我们就可以更加方便地开发和部署分布式系统,提高系统的性能和可维护性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

顽石九变

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值