一文详解gRPC快速整合SpringCloud

yizhihongxing

一文详解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日

相关文章

  • 浅谈C#索引器

    浅谈C#索引器 什么是C#索引器 C#索引器是一种特殊的属性,它允许类或结构使用类似于数组访问其实例的元素。在使用索引器时,可以通过索引来访问类或结构中定义的元素。在C#中,索引器是由get和set访问器定义的特殊属性,可以通过类或结构的名称来访问。 索引器语法 以下是C#索引器的基本语法: public datatype this[int index] {…

    C# 2023年6月7日
    00
  • C#中的反射(System.Reflection)

    下面是针对“C#中的反射(System.Reflection)”的完整攻略。 什么是反射 反射是一种在运行时获取类型信息和操作对象的方法。它允许程序在运行时发现和调用在编译时未知的类型、方法和属性。利用反射,您可以: 获取程序集、模块和类型的元数据 创建类型的实例、操作成员、获取在许多情况下是编译时未知的属性和字段值 反射在许多场合被使用,如: 在运行时加载…

    C# 2023年5月15日
    00
  • 在.NET7中使用MQTTnet简单实现MQTT通信

    一、MQTT简介 MQTT(Message Queuing Telemetry Transport)是一种轻量级的消息传输协议,主要用于物联网设备间的通信。MQTT协议采用客户端/服务器架构,支持发布/订阅模式和点对点模式,具有高效、可靠、灵活等优点。 MQTT协议主要由三个要素构成:发布者(publisher)、代理服务器(broker)和订阅者(subs…

    C# 2023年4月18日
    00
  • C#实现绘制面形图表的方法详解

    当需要在C#中实现绘制面形图表时,可以使用以下方法: 步骤1:安装NuGet包 为了使用绘图库,需要在Visual Studio中安装NuGet包,比较常用的有: OxyPlot.Wpf Live-Charts 其中 OxyPlot.Wpf 比较常用。 可以在 Visual Studio 中通过 NuGet 包管理器搜索并安装这些包。 步骤2:引用OxyPl…

    C# 2023年6月7日
    00
  • C#基础知识之字符串和正则表达式

    C#基础知识之字符串和正则表达式 一、字符串 1. 字符串的定义 在 C# 中,字符串是一个不可变的对象,表示文字和其他字符序列。C# 中的字符串对象是 System.String 类型的实例。创建字符串即是创建 String 对象,并使用双引号或 @-引号字符串来表示字符串值。如: string str1 = "Hello world!&quot…

    C# 2023年6月1日
    00
  • .Net Core2.1 WebAPI新增Swagger插件详解

    .Net Core2.1 WebAPI新增Swagger插件详解 Swagger是一种API文档工具,它可以自动生成API文档,并提供一个交互式的UI界面,方便开发人员测试API。在.Net Core2.1中,我们可以使用Swagger插件来自动生成API文档。本攻略将详细介绍如何使用Swagger插件。 安装Swagger插件 我们可以使用以下命令来安装S…

    C# 2023年5月17日
    00
  • Javascript 使用ajax与C#获取文件大小实例详解

    下面我将详细讲解 “Javascript使用ajax与C#获取文件大小实例详解” 的完整攻略。 什么是Ajax? Ajax(Asynchronous JavaScript And XML),指异步的JavaScript和XML。可以在不重新加载整个网页的情况下与服务器交换数据并更新部分网页内容。 通过Ajax获取文件大小的步骤 创建XMLHttpReques…

    C# 2023年5月15日
    00
  • extjs DataReader、JsonReader、XmlReader的构造方法

    ExtJS提供了三种数据读取器(DataReader):JsonReader、XmlReader、ArrayReader。其中JsonReader与XmlReader是最常用的两种,它们可以将Json和Xml数据解析成ExtJS中的数据集合(store). DataReader是一种工具,用于将来自服务器的响应数据解析成更易于在ExtJS中使用的格式。各个类…

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