使用gRPC代替SpringCloud微服务项目中的RPC框架OpenFeign

这是目录哦

  • 一. 前言
  • 二. 代码仓库
  • 三. 关于gRPC和OpenFeign
  • 四. 使用gRPC替代OpenFeign
    • 1. 原OpenFeign客户端
    • 2. proto接口定义
    • 3. gRPC服务端
    • 4. gRPC客户端
    • 5. 服务测试
  • 五. 总结

一. 前言

前段时间一直在忙着另一门课程的SpringCloud微服务项目,其中各个微服务之间使用的是OpenFeign进行服务之间的接口调用。这时候刚好在网络程序设计的课程中学习到了gRPC这个RPC框架,便想着在项目中使用gRPC替代部分的OpenFeign客户端,于是便有了这篇文章。

二. 代码仓库

github地址:CampusForum项目

三. 关于gRPC和OpenFeign

在介绍两者之前先来看看RPC。

RPC(Remote Procedure Call)是远程过程调用协议,是一种通过网络从远程计算机上请求服务,而不需要了解底层网络技术的协议。它使得开发者可以像调用本地方法一样调用远程的过程,从而简化了分布式系统的开发过程。

gRPC和OpenFeign都是RPC框架,它们实现RPC的具体工具或者库,它提供了一种透明调用机制,让使用者不必显式的区分本地调用和远程调用。然而,它们在实现细节和使用场景上有所不同:

gRPC

  • gRPC是Google开发的一个高性能、开源的RPC框架,其协议设计在HTTP/2上实现,可以提供更好的性能。
  • gRPC支持多种语言,包括Java、C++、Python等,这使得gRPC可以在多种语言环境中使用。
  • gRPC使用Protocol Buffers作为接口定义语言,这不仅可以用于定义服务接口,还可以用于定义服务接口的消息格式。

OpenFeign

  • OpenFeign是Spring Cloud中的一个子项目,用于简化HTTP API的开发。
  • OpenFeign主要用于微服务架构中,它可以使HTTP请求像本地方法调用一样简单。
  • OpenFeign的一个重要特性是其声明式的编程风格,开发者只需要定义一个接口并在接口上添加注解,就可以完成一个HTTP API的开发。

接下来介绍在SpringCloud微服务项目使用gRPC替代OpenFeign的具体过程。

四. 使用gRPC替代OpenFeign

1. 原OpenFeign客户端

在项目目录的resource-service\resource-client\src\main\java\com\ustc\resource\client下,具体代码如下,其中的uploadAvatarImagegetUniversityName这两个接口将会由user-service中的user-server微服务进行调用。后面将会由gRPC来实现这两个接口的远程调用。

@FeignClient(value = "resource-server", fallback = ResourceClientFuse.class, contextId = "ResourceClient")
public interface ResourceClient {
   

    /**
     * 上传图片接口
     *
     * @param file 图片
     * @return 图片链接
     */
    @PostMapping(value = "/private/resource/image", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    RestResult<String> uploadBlogImage(@RequestPart("file") MultipartFile file);

    /**
     * 上传头像接口
     *
     * @param file 头像图片文件
     * @param name 图片命名
     * @return 访问链接
     */
    @PostMapping(value = "/private/resource/avatar", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    RestResult<String> uploadAvatarImage(@RequestPart("file") MultipartFile file, @RequestParam("name") String name);

    /**
     * 通过院校代码获取名称
     *
     * @param schoolCode 院校代码
     * @return 高校名称
     */
    @GetMapping("/resource/university/name")
    RestResult<String> getUniversityName(@RequestParam("schoolCode") Integer schoolCode);

}

2. proto接口定义

对于gRPC,首先需要进行proto接口的定义。在本项目中,我把接口放在了common\common-grpc模块,该模块需要在pom文件中添加如下的依赖。

<properties>
        <maven.compiler.source>8maven.compiler.source>
        <maven.compiler.target>8maven.compiler.target>
        <project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
        <protobuf.version>3.21.7protobuf.version>
        <protobuf-plugin.version>0.6.1protobuf-plugin.version>
        <grpc.version>1.52.1grpc.version>
properties>

<dependencies>
     <dependency>
          <groupId>io.grpcgroupId>
          <<

你可能感兴趣的:(spring,cloud,微服务,rpc,java)