一文详解gRPC快速整合SpringCloud

一文详解gRPC快速整合SpringCloud

简介

gRPC作为新一代远程过程调用(RPC)框架,通过Protobuf序列化及二进制传输,可以高效、可扩展、可互操作的连接分布式系统,是分布式领域内受到热捧的技术。

Spring Cloud则是一种基于Spring Boot的分布式架构微服务开发工具套件,提供了服务注册、配置管理、流量控制、负载均衡等分布式开发常用的功能模组,并以组件化的方案简化开发过程,提高开发效率。

在许多场合下,我们需要整合gRPC和Spring Cloud生成新的系统,以应对更加复杂的业务场景。本文将会详细介绍如何在Spring Cloud中整合gRPC,并使用两条示例讲述具体实现流程,帮助读者更好地了解和运用相关技术。

具体实现

下面分别从gRPC Server和gRPC Client两方面进行整合。

gRPC Server整合Spring Cloud

添加依赖

  • spring-cloud-starter-netflix-eureka-client: Eureka服务注册发现
  • spring-cloud-starter-netflix-hystrix: 集成断路器Hystrix
  • spring-boot-starter-data-redis: 缓存管理

编写Service

import java.util.Map;

import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

import com.google.protobuf.ByteString;
import com.test.grpc.Messages.Request;
import com.test.grpc.Messages.Response;
import com.test.grpc.TestGrpc.TestImplBase;

import io.grpc.stub.StreamObserver;

@Service
public class TestService extends TestImplBase {

    @Cacheable(value = "store:cache", keyGenerator = "keyGenerator")
    @Override
    public void httpGet(Request request,
                StreamObserver<Response> responseObserver) {

        Response response = Response.newBuilder()
                    .setMessage(ByteString.copyFromUtf8(request.getUrl() + ": Value From Basic Spring Boot Service"))
                    .build();
        responseObserver.onNext(response);
        responseObserver.onCompleted();
    }

    @Cacheable(value = "store:cache", keyGenerator = "keyGenerator")
    @Override
    public void httpPost(Request request,
  StreamObserver<Response> responseObserver) {   

        Response response = Response.newBuilder()
                    .setMessage(ByteString.copyFromUtf8(request.getUrl() + ": Value From Basic Spring Boot Service"))
                    .build();
        responseObserver.onNext(response);
        responseObserver.onCompleted();
    }
}

gRPC Client整合Spring Cloud

添加依赖

  • spring-cloud-starter-netflix-eureka-client: Eureka服务发现
  • spring-cloud-starter-openfeign: Feign HTTP客户端
  • spring-boot-starter-data-redis: 缓存管理

添加配置文件

创建application.yml文件,在其中编写如下配置:

grpc:
  # x.x.x.x为gRPC Server所在的IP
  host: x.x.x.x
  # gRPC Server的端口号
  port: 6060

eureka:
  client:
    service-url:
      defaultZone: http://eurekaIP:8761/eureka/

feign:
    hystrix:
        enabled: true

完成gRPC Client

在完成上述两步之后,我们就可以通过下面的代码完成gRPC Client的相关操作。

创建Service类
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;

import com.test.grpc.Messages.Request;
import com.test.grpc.Messages.Response;

import io.grpc.stub.StreamObserver;

@FeignClient(name="xxx-service", url="${grpc.host}:${grpc.port}")
public interface TestService {

    @PostMapping("/httpGet")
    void httpGet(Request request, StreamObserver<Response> response);

    @PostMapping("/httpPost")
    void httpPost(Request request, StreamObserver<Response> response);
}
控制器中使用TestService
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.test.grpc.Messages.Request;
import com.test.grpc.Messages.Response;
import com.test.grpc.TestGrpc.TestBlockingStub;
import com.test.grpc.TestGrpc.TestStub;

import io.grpc.Channel;
import io.grpc.ManagedChannelBuilder;

@RestController
public class TestController {

    @Autowired
    private TestService testService;

    @GetMapping("/testHttpGet")
    public String testHttpGet() {
        Request request = Request.newBuilder()
                        .setUrl("http://blog.com/")
                        .build();
        Response response = testService.httpGet(request);
        return response.getMessage().toStringUtf8();
    }
}

示例一:基本gRPC Server整合Spring Cloud

将以上代码导入Eclipse中并执行后,我们可以通过发送HTTP请求,访问到服务器的返回结果。

我们在浏览器中输入http://localhost:8080/testHttpGet,可以看到浏览器返回了http://blog.com/: Value From Basic Spring Boot Service的结果,说明gRPC Service已经成功运行。

示例二:gRPC Server整合Eureka Server

下面的示例演示了gRPC Server如何整合Eureka Server。Eureka Server用于实现gRPC Client服务的自动发现。

gRPC Server依赖及配置的添加

在pom.xml文件中添加如下依赖:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-devtools</artifactId>
  <scope>runtime</scope>
</dependency>
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
  <version>2.2.5.RELEASE</version>
</dependency>

在application.yml文件中添加一下配置:

server:
  port: 6060

eureka:
  client:
    register-with-eureka: false
    fetch-registry: false
    service-url:
      defaultZone: ${eureka.instance.protocol}://${eureka.instance.hostname}:${server.port}/eureka

grpc:
  port: ${server.port}

在启动主程序类上添加@EnableEurekaServer注解。

测试

将以上所有代码导入Eclipse中并执行后,我们可以通过访问Eureka Server的Web界面(默认地址为http://localhost:8761/),可以在服务列表中找到test-service,证明Eureka Server已经成功注册了该服务。

接下来我们在例一的基础上,修改配置文件application.yml,增加Eureka Server的地址:

grpc:
  host: test-service
  port: 6060

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/

发送HTTP请求,可以发现我们可以自动访问到-Eureka Server中的服务。其中关于服务发现的部分的注释已经在代码中体现出来,方便大家理解。

总结

本文详细介绍了如何在Spring Cloud中整合gRPC,包括gRPC Server和gRPC Client的两个方面。通过两个具体的示例,帮助读者更好地了解和运用相关技术。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:一文详解gRPC快速整合SpringCloud - Python技术站

(0)
上一篇 2023年5月15日
下一篇 2023年5月15日

相关文章

  • Unity 使用tiledmap解析地图的详细过程

    下面是Unity使用Tiled Map解析地图的详细过程。 什么是Tiled Map Tiled Map是一个开源的地图编辑器,可以用来创建2D地图,支持多种地图格式,并可以导出为多种数据格式,如XML、JSON等。Unity可以使用Tiled Map导出的地图数据文件解析出游戏世界中的2D地图。 Unity如何使用Tiled Map解析地图 Unity可以…

    C# 2023年5月31日
    00
  • C#操作DataTable的实现步骤

    C#是一种面向对象的编程语言,而DataTable则是用来存储数据的一种数据类型。在C#中,我们可以通过操作DataTable来对数据进行增删改查等操作。下面,我将详细介绍如何在C#中操作DataTable的实现步骤。 DataTable的创建 要使用DataTable,首先需要创建一个DataTable对象。可以通过下面的方式来创建DataTable: D…

    C# 2023年5月15日
    00
  • C# 获取系统DPI缩放比例以及分辨率大小

    一般方法 System.Windows.Forms.Screen类 // 获取当前主屏幕分辨率 int screenWidth = Screen.PrimaryScreen.Bounds.Width; int screenHeight = Screen.PrimaryScreen.Bounds.Height; // 获取指定屏幕分辨率 Screen seco…

    C# 2023年4月27日
    00
  • 深入理解C#中的枚举

    深入理解C#中的枚举 枚举是C#语言中经常使用的一种类型,是一组命名常量的集合。它为常量赋予了名称,提高了代码的可读性和可维护性。在本文中,我们将全面介绍C#中枚举的相关概念、用法和注意事项。 枚举的定义 C#中枚举的定义语法为: enum 枚举名 { 可命名常量1, 可命名常量2, … } 例如,定义一个表示星期的枚举: enum WeekDays {…

    C# 2023年5月15日
    00
  • C#读写INI文件的方法

    下面是C#读写INI文件的方法的完整攻略。 1. 前言 INI文件是一种常见的配置文件格式,其中存储了一些应用程序的配置信息,如用户设置和选项。使用INI文件可以方便地对应用程序进行配置和修改。在C#中,我们可以使用System.IO类库中的一些类来读写INI文件。 2. 读取INI文件 2.1 定义INI文件读取类 在进行INI文件的读取时,我们通常需要定…

    C# 2023年6月1日
    00
  • ASP.NET Core使用EF创建模型(包含属性、排除属性、主键和生成值)

    ASP.NET Core 使用 EF 创建模型是一种常见的操作,可以用于定义应用程序中的数据模型。以下是 ASP.NET Core 使用 EF 创建模型的完整攻略: 步骤一:安装 Entity Framework Core 首先,需要安装 Entity Framework Core。可以使用以下命令在 Visual Studio 中安装 Entity Fra…

    C# 2023年5月17日
    00
  • C# Winform选项卡集成窗体详解

    下面是关于“C# Winform选项卡集成窗体详解”的完整攻略: 1. 确定需求 在实现选项卡集成窗口前,我们需要先确定我们的需求。我们需要考虑以下几个问题: 我们想集成哪些选项卡? 每个选项卡内需要添加哪些控件? 如何处理选项卡之间的切换? 2. 创建WinForm应用程序 首先我们需要在Visual Studio中创建一个WinForm应用程序。创建完成…

    C# 2023年6月1日
    00
  • 带你一文了解C#中的Expression

    带你一文了解C#中的Expression 什么是Expression 在C#中,Expression是一个抽象类,它代表了一个包含单个值、操作符、变量、方法调用或属性访问等逻辑的树形结构。 Expression对象可以被应用于以程序方式表示代码逻辑的情况,通常被用于了解程序上下文、编译代码或构建API。具体来说,Expression很常用于Lambda表达式…

    C# 2023年6月1日
    00
合作推广
合作推广
分享本页
返回顶部