Java gRPC 入门教程

简介

gRPC 是一个高性能、开源的通用 RPC(远程过程调用)框架,由 Google 开发。它基于 HTTP/2 协议,采用 Protocol Buffers 作为接口描述语言。Java gRPC 是 gRPC 在 Java 语言中的实现,旨在帮助开发者在分布式系统中能更高效、安全地进行服务之间的通信。本篇博客将详细介绍 Java gRPC 的基础概念、使用方法、常见实践以及最佳实践。

目录

  1. gRPC 基础概念
  2. Java gRPC 的使用方法
    • 安装与环境准备
    • 定义服务
    • 生成客户端和服务端代码
    • 实现服务端
    • 实现客户端
  3. 常见实践
    • 流式 RPC
    • 错误处理
    • 超时与重试
  4. 最佳实践
    • 安全性
    • 性能优化
  5. 小结
  6. 参考资料

gRPC 基础概念

gRPC 使用 HTTP/2 协议,支持双向流、流控制、头部压缩等特性,使其在传输效率和资源利用上有明显优势。通过 Protocol Buffers,gRPC 能够统一不同语言之间的数据结构定义,确保跨平台、跨语言的接口一致性。这些都是 gRPC 在微服务架构中广受欢迎的原因。

Java gRPC 的使用方法

安装与环境准备

开始使用 Java gRPC 之前,需要在开发环境中准备好以下工具:

  • Java JDK 8 或更高版本
  • Maven 或 Gradle(用于依赖管理)
  • Protocol Buffers 编译器 protoc

定义服务

使用 Protocol Buffers 定义 gRPC 服务和消息类型。在 src/main/proto 目录下创建一个 .proto 文件,例如 hello.proto

syntax = "proto3";option java_package = "com.example.helloworld";
option java_outer_classname = "HelloWorldProto";service Greeter {rpc SayHello (HelloRequest) returns (HelloReply) {}
}message HelloRequest {string name = 1;
}message HelloReply {string message = 1;
}

生成客户端和服务端代码

使用 Protocol Buffers 编译器 protoc 生成 Java 代码:

protoc --java_out=src/main/java --grpc-java_out=src/main/java src/main/proto/hello.proto

或者在 pom.xml 中添加 Maven 插件自动生成代码:

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

实现服务端

实现 GreeterImpl 类,继承自动生成的 GreeterGrpc.GreeterImplBase

import io.grpc.Server;
import io.grpc.ServerBuilder;
import io.grpc.stub.StreamObserver;public class GreeterServer {public static void main(String[] args) throws Exception {Server server = ServerBuilder.forPort(8080).addService(new GreeterImpl()).build().start();System.out.println("Server started");server.awaitTermination();}static class GreeterImpl extends GreeterGrpc.GreeterImplBase {@Overridepublic void sayHello(HelloRequest req, StreamObserver<HelloReply> responseObserver) {HelloReply reply = HelloReply.newBuilder().setMessage("Hello " + req.getName()).build();responseObserver.onNext(reply);responseObserver.onCompleted();}}
}

实现客户端

创建一个简单的客户端调用服务:

import io.grpc.ManagedChannel;
import io.grpc.ManagedChannelBuilder;public class GreeterClient {public static void main(String[] args) {ManagedChannel channel = ManagedChannelBuilder.forAddress("localhost", 8080).usePlaintext() // 不使用 TLS,可根据需求改为生产环境的安全配置.build();GreeterGrpc.GreeterBlockingStub stub = GreeterGrpc.newBlockingStub(channel);HelloReply response = stub.sayHello(HelloRequest.newBuilder().setName("World").build());System.out.println(response.getMessage());channel.shutdown();}
}

常见实践

流式 RPC

gRPC 支持四种通信模式:简单模式(普通 RPC)、服务器流、客户端流、双向流。对于流式 RPC,可以在服务定义中指定多个请求或响应。

错误处理

gRPC 通过状态码来传递错误信息。服务端通过 StatusRuntimeException 传递错误信息,客户端可以通过捕获异常来处理错误。

超时与重试

为 gRPC 调用设置超时,可以在客户端 stub 上配置,例如:

HelloReply response = stub.withDeadlineAfter(5, TimeUnit.SECONDS).sayHello(HelloRequest.newBuilder().setName("World").build());

最佳实践

安全性

在生产环境中,应启用 TLS 以加密传输数据,确保数据的隐私和完整性。

性能优化

  • 使用连接池减少创建连接的开销。
  • 利用 HTTP/2 的多路复用提升请求的吞吐量。

小结

Java gRPC 提供了一个高效、易用的框架来实现分布式系统中的远程过程调用。通过了解其基本用法和一些最佳实践,开发者可以更好地设计和实现系统间的通信机制,保障系统的性能和安全性。

参考资料

  • gRPC 官方文档
  • Protocol Buffers 官方指南
  • Java gRPC GitHub 仓库

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/877898.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Easysearch 集群通过 API 进行用户密码重置

在日常使用 Easysearch 中,难免会遇到集群密码需要重置的情况(如密码遗失、安全审计要求等)。 通过查看 Easysearch 用户接口文档,创建用户使用如下接口: PUT _security/user/<username> {"password": "adminpass","roles": ["m…

Elasticvue:一款轻量级的Elasticsearch可视化管理工具

Elasticvue是一款免费开源的Elasticsearch GUI工具,你可以使用它来管理ES里的数据, Elasticvue具有多种安装形式,我们这里采用最简单的Docker安装方式,其他版本如Winodws、MacOS、Linux和浏览器插件。 Elasticvue相比Kibana的优势主要体现在以下几个方面: 1、 轻量级与易用…

【攻防3.0 】信任攻击

Author: sm0nk@深蓝攻防实验室 上周在一个技术沙龙我分享了一个攻防相关议题——进击的白巨人,在此归档。一、进攻场景思考 无论是端侧产品还是流量侧产品、亦或是原生安全还是外挂式,主模式还是鉴黑和鉴白; 随着防守方强化的安全建设,安全产品越来越强,进攻的难度在增加;…

[2025.2.1 MySQL学习] MVCC

MVCC 基本概念当前读(直接读取数据页最新版本):读取的是记录的最新版本,读取时还要保证其他并发事务不能修改当前记录,会对读取的记录进行加锁。对于一些日常操作,如:select...lock in share mode、select ... for update、update、isnert、delete都是一种当前读快照读:…

母婴app

您好!这是一个非常全面的母婴健康管理APP构想。让我帮您从技术角度分析并提供一个基础的项目结构建议。 技术架构建议 1. 前端技术栈:- iOS: Swift/SwiftUI - Android: Kotlin - 跨平台选项: Flutter/React Native2. 后端技术栈:- 主服务框架: Spring Boot - 数据库: - MySQL …

毕设学习第六天SSM框架之Spring5

虽然目前spring已经出现了6但是现如今大多数应用的还是spring5,因此毕设学习选择Spring5而非6 spring简介Spring 是一个开源的 Java 企业级应用开发框架,旨在简化企业级 Java 应用的开发过程。它通过控制反转(IOC)和面向切面编程(AOP)等核心技术,帮助开发人员构建松耦合…

心态急躁,什么事都做不成

春节这几天,心态有些急躁。也许是突如其来的放松让大脑不适应,最近做事(尤其是打游戏)不顺。 比如体现在炉石酒馆,农,围棋这三者上。这三个是2/1号我从外面回来之后进行的三项娱乐活动。 首先先打了几把炉石,一把速七,两把速八,再加上之前的两把速七速八,让我直接从8…

【风控】风控测试的质效提升之路

# 货拉拉 随着货拉拉业务的迅猛发展,平台每时每刻都面临着黑产的攻击和挑战。为了保障业务安全和稳健地发展,风控作为抗击黑产的前线,负责各项业务的风险识别和阻断工作。同时,各类业务的接入以及风控策略的高强度迭代,也给风控的质量保障和交付效率带来了挑战。如何在保障…

Windows环境变量列表变成老式的横行封号分割PATH路径不方便

前言全局说明win11上环境变量的增、删、改有了专用的列表框,每行一个的环境变量,观察也非常方便。 但有的时候设置完变量,再次打开PATH环境变量,就变成以前win7那样的所有环境变量都在一行,用封号分割了,非常不方便。一、说明 1.1 环境: Windows 11 家庭版 23H2 22631.37…

Spring MVC 初始化

继承关系 DispatcherServlet > FrameworkServlet > HttpServletBean > HttpServlet > GenericServlet > Servlet初始化流程DispatcherServlet 是一个 Servlet,所有的 Servlet 初始化都会执行 init 方法(JAVA EE 的知识,别忘了)HttpServletBean 复写了 init(…

kmp匹配

kmp匹配 代码: #include<bits/stdc++.h> using namespace std; const int N=1e5+6; const int M=1e6+6; char s[M];//长串 char p[N];//模式串 int ne[N];//next指针 ,后退的指针 int main(){int n,m;cin>>n>>p+1>>m>>s+1;//计算ne //ne[1]…

Tokenizer

一、思维导图二、subword(子词)粒度 在很多情况下,既不希望将文本切分成单独的词(太大),也不想将其切分成单个字符(太小),而是希望得到介于词和字符之间的子词单元。这就引入了 subword(子词)粒度的分词方法。本文重点介绍这一部分。 2.1 WordPiece 在BERT时代,Wor…