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

 更新时间:2024年07月09日 09:56:51   作者:顽石九变  
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中,服务通过.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-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远程服务调用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java BigDecimal正确用法详解

    Java BigDecimal正确用法详解

    Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数,但在实际应用中,可能需要对更大或者更小的数进行运算和处理
    2022-10-10
  • Java中memcached的cache机制

    Java中memcached的cache机制

    这篇文章主要介绍了Java中memcached的cache机制,在Java中使用Memcached的缓存机制需要使用Java的Memcached客户端库。Memcached是一个高性能的分布式内存缓存系统,可以用来缓存常用的数据,需要的朋友可以参考下
    2023-07-07
  • Java中接口和抽象类的区别与相同之处

    Java中接口和抽象类的区别与相同之处

    这篇文章主要介绍了Java中接口和抽象类的区别与相同之处,本文讲解了抽象类的概念、接口的概念、接口和抽象类的区别与联系等内容,需要的朋友可以参考下
    2015-06-06
  • Java的Hibernate框架中的基本映射用法讲解

    Java的Hibernate框架中的基本映射用法讲解

    映射是Hibernate框架操作数据库数据的重要特性之一,这里我们来看一下Java的Hibernate框架中的基本映射用法讲解,包括最基本的单向一对一与多对一映射关系等:
    2016-07-07
  • util.Date与sql.Date的相互转换过程

    util.Date与sql.Date的相互转换过程

    本文介绍了Java中两个常用日期类的区别和相互转换方法,包括java.util.Date和java.sql.Date,并展示了如何使用SimpleDateFormat进行日期格式化
    2026-01-01
  • Java中向文件写入数据的几种常见方式分享

    Java中向文件写入数据的几种常见方式分享

    在日常开发中,肯定离不开要和文件打交道,今天就简单罗列一下平时比较常用的创建文件并向文件中写入数据的几种方式,文中有详细的代码示例供大家参考,具有一定的参考价值,需要的朋友可以参考下
    2023-10-10
  • springboot使用RedisRepository操作数据的实现

    springboot使用RedisRepository操作数据的实现

    本文主要介绍了springboot使用RedisRepository操作数据的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05
  • Java快速入门掌握类与对象及变量的使用

    Java快速入门掌握类与对象及变量的使用

    类和对象是两种以计算机为载体的计算机语言的合称。对象是对客观事物的抽象,类是对对象的抽象。类是一种抽象的数据类型;变量就是可以变化的量,存储在内存中—个可以拥有在某个范围内的可变存储区域
    2022-04-04
  • 微服务Springcloud之Feign的基本使用

    微服务Springcloud之Feign的基本使用

    这篇文章主要介绍了微服务Springcloud之Feign的基本使用,Spring Cloud集成Feign并对其进行了增强,使Feign支持了Spring MVC注解,需要的朋友可以参考下
    2023-03-03
  • Java实现微信支付的签名算法示例

    Java实现微信支付的签名算法示例

    这篇文章主要为大家介绍了Java实现微信支付的签名算法实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12

最新评论