Spring boot使用gRPC 的详细教程

这篇具有很好参考价值的文章主要介绍了Spring boot使用gRPC 的详细教程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本篇文章,我们介绍gRPC并通过例子详细演示使用gRPC的过程。

微信搜索关注《Java学研大本营》,加入读者群,分享更多精彩

springboot grpc,spring boot,后端,java

1 什么是gRPC.

gRPC是一个开源的、高性能的远程过程调用(RPC)框架,由谷歌提供,用于分布式系统之间的高效通信。它使用协议缓冲区(protobuf)进行有效的数据序列化,并支持双向流、请求/响应流和高级传输功能。在构建微服务架构和其他分布式系统中很受欢迎。

springboot grpc,spring boot,后端,java

2 gRPC的优势

2.1高性能:

gRPC使用二进制协议,不是像JSON或XML这样的文本协议,这使它在消息大小和处理速度方面更有效率。Portobuff是一种高效的二进制格式,用于结构化数据,具有数据压缩能力。这允许更快的消息序列化和反序列化,并减少服务之间传输数据所需的带宽。

2.2 与语言和平台无关:

gRPC支持多种编程语言和平台,包括C++、Java、Python、Go和其他许多语言。这使它不管使用的是何种技术栈都很容易与现有的系统和服务集成。

2.3 自动代码生成:

gRPC带有代码生成工具,可以自动生成多种编程语言的客户端和服务器代码。这节省了开发人员的时间和精力,并有助于确保代码的一致性和正确性。

2.4 自动代码生成:

gRPC带有一个代码生成工具,可以自动生成多种编程语言的客户端和服务器代码。这节省了开发人员的时间和精力,并有助于确保代码的一致性和正确性。

2.5 流式支持:

gRPC支持单项和流式请求和响应,这使大量数据能进行有效处理和服务间实现实时通信。

2.6 内置支持负载平衡和服务发现:

gRPC包括对负载平衡和服务发现的内置支持,能轻松地构建可扩展、有弹性的分布式系统。

2.7 互操作性:

gRPC支持多种编程语言,使用不同语言编写的服务之间具有互操作性。这有助于现有系统和服务之间的整合,可以减少对复杂和容易出错的API的需求。

3 开始编码

为了便于设置,我为服务器和客户端都添加了模板代码。

你可以按照下面这些链接尝试:

服务器:https://github.com/DeathkillerAnk/grpc-spring-server 客户:https://github.com/DeathkillerAnk/grpc-spring-client

现在开始分解代码库

我们有两个应用程序,一个是服务器,另一个是客户端。

有两个模块service和common。

  • 普通模块由proto文件组成,它的作用类似于JSON文件,表示结构化数据,但你可以在.proto文件上运行一个编译器,生成可以用你选择的编程语言读写数据的代码。

  • 该服务模块有java和spring boot代码

syntax = "proto3";

package com.deathkiller.grpc;

option java_multiple_files = true;
option java_package = "com.demo.grpc";

service GreetingService {
  rpc greeting(GreetingRequest) returns (GreetingResponse) {
  }
}

message GreetingRequest {
  string message = 1;
}

message GreetingResponse {
  string message = 1;
}

在我们的例子中,使用的是Java。因此,当我们运行 "mvn compile "时,它将生成其Java基类,用于实现或调用写在GreetingService服务中的函数。

在服务器端,我们通过重写方法和提供其实现来给问候函数添加逻辑。

package com.demo.grpcdemo.greetingservice;

import com.demo.grpc.GreetingRequest;
import com.demo.grpc.GreetingResponse;
import com.demo.grpc.GreetingServiceGrpc;
import io.grpc.stub.StreamObserver;
import net.devh.boot.grpc.server.service.GrpcService;

@GrpcService
public class GreetingServiceImpl extends GreetingServiceGrpc.GreetingServiceImplBase {


    @Override
    public void greeting(GreetingRequest request, StreamObserver<GreetingResponse> responseObserver) {
        String message = request.getMessage();
        System.out.println("Received Message: " + message);


        GreetingResponse greetingResponse = GreetingResponse.newBuilder()
                .setMessage("Received your " + message + ". Hello From Server. ")
                .build();

        responseObserver.onNext(greetingResponse);
        responseObserver.onCompleted();
    }
}

由于兼容性问题,gRPC不直接与前端通信。所以它主要用于微服务之间的通信。

我们的客户端将从前端接收请求,客户端将使用gRPC从另一个微服务中获取一些数据,在我们的例子中,它是一个gRPC服务器。

在客户端,我们将为前端暴露一个端点,以使用REST APIs消费我们的服务。

package com.demo.grpcdemo.controller;

import com.demo.grpcdemo.greetingservice.GreetingServiceClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

@RestController
public class GreetingController {
    @Autowired
    GreetingServiceClient greetingServiceClient;

    @GetMapping("/greet/{id}")
    public String getAuthor(@PathVariable String message) {
        return greetingServiceClient.greet(message);
    }


}

因此,每当我们需要与另一个微服务进行数据通信时,我们应该使用gRPC而不是REST APIs,因为gRPC在接收数据时比REST快7倍,在为特定的有效载荷发送数据时比REST快10倍。这主要是因为协议缓冲区的紧密包装(数据压缩)和gRPC对HTTP/2的使用。

注意:这将取决于数据量。而且,在你的本地客户-服务器通信中,你无法看到明显的差异。

我们来调用在服务器中定义的问候服务。

package com.demo.grpcdemo.greetingservice;

import com.demo.grpc.*;
import net.devh.boot.grpc.client.inject.GrpcClient;
import org.springframework.stereotype.Service;

@Service
public class GreetingServiceClient {


    @GrpcClient("greeting")
    private GreetingServiceGrpc.GreetingServiceBlockingStub greetingServiceBlockingStub;

    public String greet(String greetingMessage) {
        GreetingRequest greetingRequest = GreetingRequest.newBuilder().setMessage(greetingMessage).build();
        GreetingResponse greetingResponse = greetingServiceBlockingStub.greeting(greetingRequest);
        return greetingResponse.getMessage();
    }
}

springboot grpc,spring boot,后端,java

这只是一个基本的设置。但当你开始向gRPC全面迁移时,你会遇到多种挑战。我在下面提到了其中的一些挑战和它们的解决方案。

  • 克服最大有效载荷极限。如果你的传入或传出的信息流量比默认大小太大,那么你将面临错误。需要通过以下办法进行修正:

greetingServiceBlockingStub = greetingServiceBlockingStub.withMaxInboundMessageSize(Integer.MAX_VALUE).withMaxOutboundMessageSize(Integer.MAX_VALUE);
  • 使用空值的包装器

syntax = "proto3";
import "google/protobuf/wrappers.proto";

message Foo {
    .google.protobuf.Int32Value bar = 1;
}
  • 要在Windows上构建proto文件,你需要一个不同的配置。

syntax = "proto3";
import "google/protobuf/wrappers.proto";

message Foo {
    .google.protobuf.Int32Value bar = 1;
}
```<build>
        <extensions>
            <extension>
                <groupId>kr.motd.maven</groupId>
                <artifactId>os-maven-plugin</artifactId>
                <version>1.4.1.Final</version>
            </extension>
        </extensions>

        <plugins>
            <plugin>
                <groupId>org.xolstice.maven.plugins</groupId>
                <artifactId>protobuf-maven-plugin</artifactId>
                <version>0.5.0</version>
                <configuration>
                    <protocArtifact>com.google.protobuf:protoc:3.3.0:exe:${os.detected.classifier}</protocArtifact>
                    <pluginId>grpc-java</pluginId>
                    <pluginArtifact>io.grpc:protoc-gen-grpc-java:1.4.0:exe:${os.detected.classifier}</pluginArtifact>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>compile</goal>
                            <goal>compile-custom</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

        </plugins>
    </build>
  • 以正确的方式进行无效检查

foo.getBar == null //这样做,即使bar从未被设置,也会返回true
foo.hasBar //如果bar被分配为null,则返回false。

推荐书单

Java语言程序设计(第3版)

《Java语言程序设计(第3版)》从初学者角度出发,用通俗易懂的语言、丰富多彩的案例讲述了Java语言的理论知识和编程方法,内容覆盖全国计算机等级考试二级Java语言程序设计的大纲要求,同时融入了新版JDK的特色知识。全书分18章,内容分别是Java语言概述,数据类型与表达式,流程控制语句,数组与方法,类与对象,继承与多态,常用数据类型处理类,抽象类、接口与内嵌类,异常处理,Java绘图,图形用户界面编程基础,流式输入/输出与文件处理、Java泛型与收集API,Lambda表达式、Stream与枚举类型,多线程,高级图形界面编程,JDBC技术与数据库应用,Java的网络编程。读者可以跟随本书的讲解,边学边练,设计出功能较强的中小型应用程序。

《Java语言程序设计(第3版)》(丁振凡,范萍)【摘要 书评 试读】- 京东图书京东JD.COM图书频道为您提供《Java语言程序设计(第3版)》在线选购,本书作者:,出版社:清华大学出版社。买图书,到京东。网购图书,享受最低优惠折扣!https://item.jd.com/13512397.html

springboot grpc,spring boot,后端,java

精彩回顾

使用JMH提升Java程序的性能

Java中的继承与多态

Markdown Nice最全功能介绍

FPGA的工作原理是什么?

HuggingGPT:解决处理AI任务的秘密武器

微信搜索关注《Java学研大本营》

访问【IT今日热榜】,发现每日技术热点文章来源地址https://www.toymoban.com/news/detail-814942.html

到了这里,关于Spring boot使用gRPC 的详细教程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spring Boot进阶(55):SpringBoot之集成MongoDB及实战使用 | 超级详细,建议收藏

            随着大数据时代的到来,数据存储和处理变得越来越重要。而MongoDB作为一种非关系型数据库,具有高效的数据存储和处理能力,被越来越多地应用于各种领域。尤其在Web应用开发中,SpringBoot框架已经成为了主流选择之一。在这篇文章中,我们将探讨如何将MongoD

    2024年02月17日
    浏览(32)
  • Spring Boot进阶(48):SpringBoot之集成WebSocket及使用说明 | 超级详细,建议收藏

            WebSocket是一种新型的通信协议,它可以在客户端与服务器端之间实现双向通信,具有低延迟、高效性等特点,适用于实时通信场景。在SpringBoot应用中,集成WebSocket可以方便地实现实时通信功能,如即时聊天、实时数据传输等。         本文将介绍如何在Sprin

    2024年02月16日
    浏览(39)
  • SpringBoot使用GRPC框架(服务端)

    GRPC是什么? 首先我们知道 RPC是远程过程调用。 而GRPC是RPC的一种实现。 那么为什么要用GRPC呢? 因为它支持跨语言的开发,换句话说,大家都用过FeignRPC,尤其在spring cloud中。 然而它只支持java语言,而作为微服务,可能有很多其他的服务不是java开发的。 因此需要满足这个

    2024年02月11日
    浏览(28)
  • SpringBoot + Kotlin 中使用 GRPC 进行服务通信

    示例项目见:kotlin-grpc 一、导入依赖: 二、设置Proto 将 proto 文件放在 src/mian/proto 目录下 执行 ./gradlew clean build build成功则会在 build/generated/source/proto/main 下生成对应的 grpc 、 grpckt 、 java 文件 在程序中可以直接导包引入 三、Server端 写一个 service 在 main 入口引入启动 四、Cl

    2024年02月16日
    浏览(30)
  • golang grpc配置使用实战教程

    RPC是远程过程调用(Remote Procedure Call)的缩写形式, RPC 的主要功能目标是让构建分布式计算(应用)更容易,在提供强大的远程调用能力时不损失本地调用的语义简洁性。通俗地讲, 使用RPC进行通信,调用远程函数就像调用本地函数一样,RPC底层会做好数据的序列化与传输。

    2024年02月03日
    浏览(30)
  • Android中使用GRPC简明教程

    Android作为一个开发平台,本身是使用java进行封装的,因此java可以调用的库,在Android中同样可以进行调用,这样就使得Android设备具有丰富的功能,可以进行各种类型的开发。 这篇文章就介绍如何在Android设备中使用GRPC进行通信。 工欲善其事,必先利其器。首先我们先来进行

    2024年02月06日
    浏览(34)
  • 【SpringBoot】详细介绍Spring Boot中@Component

    在Spring Boot中,`@Component`是一个通用的注解,用于标识一个类是Spring框架中的组件。`@Component`注解是Spring的核心注解之一,它提供了自动扫描和实例化bean的功能。 具体来说, `@Component`注解的作用是将一个普通的Java类转化为Spring的组件。通过`@Component`注解标记的类会被Spring框

    2024年02月11日
    浏览(27)
  • SpringBoot教程(一)|认识Spring Boot

    安得广厦千万间,大庇天下寒士俱欢颜,风雨不动安如山,呜呼,何时眼前突兀见此屋,吾庐独破受冻死亦足! Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需

    2024年01月16日
    浏览(33)
  • Spring Boot进阶(97):从入门到精通:Spring Boot整合Kubernetes详细教程

      随着云计算和容器化技术的发展,Kubernetes已经成为了当今最为流行的容器编排平台之一。而Spring Boot则是Java领域中最为流行的Web应用开发框架之一。将两者结合起来,可以帮助开发者更加高效地构建、部署和管理基于Spring Boot的应用程序。   本文将介绍如何在Spring B

    2024年02月06日
    浏览(43)
  • SpringBoot教程(三) | Spring Boot初体验

    上篇文章我们创建了SpringBoot 项目,并且进行了简单的启动。整个项目了里其实我们就动了两个文件,一个是pom.xml负责管理springboot的相关依赖,一个是springBoot的启动类。 pom文件中通过starter的形式大大简化了配置,不像以前一样需要引入大量的依赖配置,搞不好还得解决冲突

    2024年01月16日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包