gRPC springBoot 项目搭建

源码地址

github.com/Fotile/foti...

client包

因为client包一般都需要给多个工程共享,所以最好独立一个项目/工程。这采用的是独立一个工程。

同时在pom.xml文件里 的 build设置参数上需要注意使用:

xml 复制代码
<configuration>
    <classifier>proto</classifier>  <!-- point:mark as proto source package -->
    <includes>
        <include>**/*.proto</include>  <!-- only include proto files -->
    </includes>
    <!-- exclude other files ,like java class files -->
    <excludes>
        <exclude>**/*.class</exclude>
        <exclude>META-INF/maven/**</exclude>
    </excludes>
</configuration>

完成后,使用命令打包并放到本地maven仓库 mvn clean install

server 部分

server端,如果需要引用client,需要注意client需要声明classifier为proto 如图:

完整pom依赖:

xml 复制代码
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>
    <dependency>
        <groupId>net.devh</groupId>
        <artifactId>grpc-server-spring-boot-starter</artifactId>
    </dependency>

    <!-- Protobuf 核心依赖 -->
    <dependency>
        <groupId>com.google.protobuf</groupId>
        <artifactId>protobuf-java</artifactId>
    </dependency>
    <!-- gRPC 依赖 -->
    <dependency>
        <groupId>io.grpc</groupId>
        <artifactId>grpc-stub</artifactId>
    </dependency>
    <dependency>
        <groupId>io.grpc</groupId>
        <artifactId>grpc-protobuf</artifactId>
    </dependency>

    <!-- 共享 proto 依赖 -->
    <dependency>
        <groupId>com.fotile.grpc</groupId>
        <artifactId>fotile-grpc-client</artifactId>
        <classifier>proto</classifier>
        <scope>provided</scope>
    </dependency>
</dependencies>

在构建模块时,需要注意,通过jar引入的共享proto,需要通过下列插件先解压

xml 复制代码
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>

然后对解压的内容进行编译

xml 复制代码
<plugin>
    <groupId>org.xolstice.maven.plugins</groupId>
    <artifactId>protobuf-maven-plugin</artifactId>
</plugin>   

最后把编译后的java代码加入到编译的路径里

xml 复制代码
<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>build-helper-maven-plugin</artifactId>
</plugin>    

关于具体对于解压的proto文件怎么配置编译的,我们后面单独讲解。

具体server的具体java代码,其实就是一个普通的springboot应用,对于client实现,只需要在这个service类上注解@GrpcService,同时继承 *Grpc.*ImplBase ,如下面代码

scala 复制代码
@GrpcService
public class GreeterServiceGrpcImpl extends GreeterServiceGrpc.GreeterServiceImplBase {
}

一般来说,.proto 文件都是在 src/main/proto文件夹下, 参考我们的java文件都是在 src/main/java目录下。

最后需要注意的是需要配置下grpc服务端口:

yaml 复制代码
grpc:
  server:
    port: 9092

这个端口和一般的java应用端口(server.port)不一样

invoker 调用gRPC

因为这里为了测试gRPC的调用,暴露了Http接口,所以引用了

xml 复制代码
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

如果要自动装配gRPC client,直接引用

xml 复制代码
<dependency>
    <groupId>net.devh</groupId>
    <artifactId>grpc-client-spring-boot-starter</artifactId>
</dependency>

我们需要使用的业务client

xml 复制代码
<dependency>
    <groupId>com.fotile.grpc</groupId>
    <artifactId>fotile-grpc-client</artifactId>
    <classifier>proto</classifier>
    <scope>provided</scope>
</dependency>

然后build部分,因为要解压和把.proto文件编译成java代码,和server部分是类似的,只是没有自己的proto文件部分,所以少一些,完整代码可以拉取github里的代码工程。 需要注意,yml配置文件里需要配置client对应的server信息

yaml 复制代码
grpc.client:
  grpc-server:
    address: static://localhost:9092
    enableKeepAlive: true
    keepAliveWithoutCalls: true
    # 因为gRPC默认是走的https,所以这里为了能支持不用TLS,加上这个配置
    negotiationType: plaintext

这里的 grpc-server需要与代码里的

kotlin 复制代码
@GrpcClient("grpc-server")

注解里的value值对应上,不然会有问题。 注意,注入的client其实都是 *Grpc.*BlockingStub 这样的形式,剩下的就是正常的类方法调用。

总结

本文主要提供了一个gRPC的server和invoker应用的基本调用示范,并演示如何利用公用jar里包含.proto文件来实现公用gRPC接口的定义。

后续会有专门章节来讲述关于maven打包,编译、实际业务代码,源码等细节。

相关推荐
IT_陈寒6 分钟前
🔥3分钟掌握JavaScript性能优化:从V8引擎原理到5个实战提速技巧
前端·人工智能·后端
程序员清风41 分钟前
贝壳一面:年轻代回收频率太高,如何定位?
java·后端·面试
考虑考虑1 小时前
Java实现字节转bcd编码
java·后端·java ee
AAA修煤气灶刘哥1 小时前
ES 聚合爽到飞起!从分桶到 Java 实操,再也不用翻烂文档
后端·elasticsearch·面试
爱读源码的大都督2 小时前
Java已死?别慌,看我如何用Java手写一个Qwen Code Agent,拯救Java
java·人工智能·后端
星辰大海的精灵2 小时前
SpringBoot与Quartz整合,实现订单自动取消功能
java·后端·算法
天天摸鱼的java工程师2 小时前
RestTemplate 如何优化连接池?—— 八年 Java 开发的踩坑与优化指南
java·后端
一乐小哥2 小时前
一口气同步10年豆瓣记录———豆瓣书影音同步 Notion分享 🚀
后端·python
LSTM972 小时前
如何使用C#实现Excel和CSV互转:基于Spire.XLS for .NET的专业指南
后端
三十_2 小时前
【NestJS】构建可复用的数据存储模块 - 动态模块
前端·后端·nestjs