开发第一个gPRC的开发

简介: 开发第一个gPRC的开发

🌷🍁 博主猫头虎 带您 Go to New World.✨🍁

🦄 博客首页——猫头虎的博客🎐

🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺

🌊 《IDEA开发秘籍专栏》学会IDEA常用操作,工作效率翻倍~💐

🌊 《100天精通Golang(基础入门篇)》学会Golang语言,畅玩云原生,走遍大小厂~💐

🪁🍁 希望本文能够给您带来一定的帮助🌸文章粗浅,敬请批评指正!🍁🐥



第一个gPRC的开发

在本篇博客中,我们将探讨如何使用gRPC进行开发。gRPC是一个高性能、开源和通用的RPC框架,Google开发。我们将通过以下几个部分来详细了解其开发流程:

摘要

本文详细介绍了使用gRPC进行开发的全过程,从项目结构的设计、API模块的创建、服务端和客户端模块的开发,到注意事项的总结,为读者提供了一个全面的gRPC开发指南。

导语

随着微服务架构的流行,远程过程调用(RPC)技术如gRPC越来越受到开发者的青睐。本文将为您展示如何从零开始,一步步开发一个gRPC应用。

引言

在分布式系统的世界中,服务之间的通信是至关重要的。gRPC,作为一个高性能、开源和通用的RPC框架,为此提供了强大的支持。那么,如何使用gRPC进行开发呢?让我们一探究竟。

1. 项目结构

  • xxxx-api 模块
  1. 定义 protobuf idl语言
  2. 并且通过命令创建对应的代码
  3. service
  • xxxx-server模块
  1. 实现api模块中定义的服务接口
  2. 发布gRPC服务 (创建服务端程序)
  • xxxx-client模块
  1. 创建服务端stub(代理)
  2. 基于代理(stub) RPC调用。

2. api模块

  • .proto文件 书写protobuf的IDL
  • [了解]protoc命令 把proto文件中的IDL 转换成编程语言
protoc --java_out=/xxx/xxx  /xxx/xxx/xx.proto
  • [实战] maven插件 进行protobuf IDL文件的编译,并把他放置IDEA具体位置。

pom.xml中,我们需要添加以下依赖和插件:

pom.xml
 <dependencies>
        <dependency>
            <groupId>io.grpc</groupId>
            <artifactId>grpc-netty-shaded</artifactId>
            <version>1.52.1</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>io.grpc</groupId>
            <artifactId>grpc-protobuf</artifactId>
            <version>1.52.1</version>
        </dependency>
        <dependency>
            <groupId>io.grpc</groupId>
            <artifactId>grpc-stub</artifactId>
            <version>1.52.1</version>
        </dependency>
        <dependency> <!-- necessary for Java 9+ -->
            <groupId>org.apache.tomcat</groupId>
            <artifactId>annotations-api</artifactId>
            <version>6.0.53</version>
            <scope>provided</scope>
        </dependency>
 </dependencies>
<build>
        <extensions>
            <extension>
                <groupId>kr.motd.maven</groupId>
                <artifactId>os-maven-plugin</artifactId>
                <version>1.7.1</version>
            </extension>
        </extensions>
        <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.21.7:exe:${os.detected.classifier}</protocArtifact>
                    <pluginId>grpc-java</pluginId>
                    <pluginArtifact>io.grpc:protoc-gen-grpc-java:1.52.1:exe:${os.detected.classifier}</pluginArtifact>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>compile</goal>
                            <goal>compile-custom</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

此外,我们还有一个示意图,但由于这是文本格式,无法直接展示。请参考您的资源路径查看:./RPC-Day1/image-20230308132952661.png

3. xxxx-server 服务端模块的开发

在服务端,我们首先需要实现业务接口,并添加具体的功能。以下是一个简单的Java示例:

1. 实现业务接口 添加具体的功能 (MyBatis+MySQL)
   public class HelloServiceImpl extends HelloServiceGrpc.HelloServiceImplBase {
    /*
      1. 接受client提交的参数  request.getParameter()
      2. 业务处理 service+dao 调用对应的业务功能。
      3. 提供返回值
     */
    @Override
    public void hello(HelloProto.HelloRequest request, StreamObserver<HelloProto.HelloResponse> responseObserver) {
        //1.接受client的请求参数
        String name = request.getName();
        //2.业务处理
        System.out.println("name parameter "+name);
        //3.封装响应
        //3.1 创建相应对象的构造者
        HelloProto.HelloResponse.Builder builder = HelloProto.HelloResponse.newBuilder();
        //3.2 填充数据
        builder.setResult("hello method invoke ok");
        //3.3 封装响应
        HelloProto.HelloResponse helloResponse = builder.build();
        responseObserver.onNext(helloResponse);
        responseObserver.onCompleted();;
    }
}
2. 创建服务端 (Netty)
public class GprcServer1 {
    public static void main(String[] args) throws IOException, InterruptedException {
        //1. 绑定端口 
        ServerBuilder serverBuilder = ServerBuilder.forPort(9000);
        //2. 发布服务
        serverBuilder.addService(new HelloServiceImpl());
        //serverBuilder.addService(new UserServiceImpl());
        //3. 创建服务对象
        Server server = serverBuilder.build();
        server.start();
        server.awaitTermination();;
    }
}

4. xxx-client 模块

客户端通过代理对象完成远端对象的调用。以下是一个简单的Java示例:

1. client通过代理对象完成远端对象的调用
public class GprcClient1 {
    public static void main(String[] args) {
        //1 创建通信的管道
        ManagedChannel managedChannel = ManagedChannelBuilder.forAddress("localhost", 9000).usePlaintext().build();
        //2 获得代理对象 stub
        try {
            HelloServiceGrpc.HelloServiceBlockingStub helloService = HelloServiceGrpc.newBlockingStub(managedChannel);
            //3. 完成RPC调用
            //3.1 准备参数
            HelloProto.HelloRequest.Builder builder = HelloProto.HelloRequest.newBuilder();
            builder.setName("sunshuai");
            HelloProto.HelloRequest helloRequest = builder.build();
            //3.1 进行功能rpc调用,获取相应的内容
            HelloProto.HelloResponse helloResponse = helloService.hello(helloRequest);
            String result = helloResponse.getResult();
            System.out.println("result = " + result);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }finally {
            managedChannel.shutdown();
        }
    }
}

5. 注意事项

在gRPC中,处理返回值是非常重要的。以下是一些关键的注意事项:

服务端 处理返回值时
responseObserver.onNext(helloResponse1);  //通过这个方法 把响应的消息 回传client
responseObserver.onCompleted();           //通知client 整个服务结束。底层返回标记 
                                          // client就会监听标记 【grpc做的】
requestObserver.onNext(helloRequest1);
requestObserver.onCompleted();

总之,gRPC提供了一个强大的框架,使得跨语言和跨平台的通信变得简单和高效。希望这篇博客能帮助您入门gRPC的开发!

总结

gRPC不仅提供了一种高效的跨语言通信方式,还有丰富的生态系统和工具支持。通过本文的指导,我们了解了gRPC开发的各个环节,从项目结构的搭建到具体的代码实现。希望这些内容能帮助您更加轻松地入门gRPC,为您的分布式应用带来更多的可能性。

参考资料

  1. gRPC官方文档: https://grpc.io/docs/
  2. Protocol Buffers官方文档: https://developers.google.com/protocol-buffers
  3. Maven中央仓库: https://search.maven.org/
  4. gRPC Java GitHub仓库: https://github.com/grpc/grpc-java

原创声明

======= ·

  • 原创作者: 猫头虎

作者wx: [ libin9iOak ]

学习 复习

本文为原创文章,版权归作者所有。未经许可,禁止转载、复制或引用。

作者保证信息真实可靠,但不对准确性和完整性承担责任

未经许可,禁止商业用途。

如有疑问或建议,请联系作者。

感谢您的支持与尊重。

点击下方名片,加入IT技术核心学习团队。一起探索科技的未来,共同成长。


目录
相关文章
|
2月前
|
IDE Java 开发工具
深入探索安卓应用开发:从环境搭建到第一个"Hello, World!"应用
本文将引导读者完成安卓应用开发的初步入门,包括安装必要的开发工具、配置开发环境、创建第一个简单的安卓项目,以及解释其背后的一些基本概念。通过一步步的指导和解释,本文旨在为安卓开发新手提供一个清晰、易懂的起点,帮助读者顺利地迈出安卓开发的第一步。
216 65
|
2月前
|
存储 Java Android开发
探索安卓应用开发:构建你的第一个"Hello World"应用
【9月更文挑战第24天】在本文中,我们将踏上一段激动人心的旅程,深入安卓应用开发的奥秘。通过一个简单而经典的“Hello World”项目,我们将解锁安卓应用开发的基础概念和步骤。无论你是编程新手还是希望扩展技能的老手,这篇文章都将为你提供一次实操体验。从搭建开发环境到运行你的应用,每一步都清晰易懂,确保你能顺利地迈出安卓开发的第一步。让我们开始吧,探索如何将一行简单的代码转变为一个功能齐全的安卓应用!
|
2月前
|
存储 Oracle Java
深入探索安卓应用开发:从环境搭建到第一个"Hello, World!"
本文旨在为安卓开发初学者提供一个清晰、简洁的入门指南。我们将一步步引导您完成安卓开发环境的搭建,并详细介绍如何创建您的第一个安卓应用程序。通过这篇文章,您不仅能够理解安卓应用开发的基本流程,还能掌握一些实用的技巧和方法,为进一步深入学习打下坚实的基础。
|
5天前
|
自然语言处理 关系型数据库 MySQL
PHP编程入门:构建你的第一个网页应用
【10月更文挑战第29天】本文旨在引导初学者步入PHP编程的世界,通过深入浅出的方式介绍PHP的基础知识,并指导读者如何动手实践,搭建一个简单的网页应用。文章不仅涉及PHP代码的编写,还包括了环境配置、项目结构设计以及前后端交互的基本概念。适合对Web开发感兴趣且希望快速入门的朋友阅读。
13 0
|
3月前
|
数据采集 存储 JavaScript
构建你的第一个Python爬虫
【8月更文挑战第31天】 本文是一篇入门级教程,旨在帮助初学者了解和实现一个简单的网络爬虫。我们将使用Python编程语言,因为它简单易学且功能强大。通过这篇文章,你将学会如何使用Python的requests库获取网页内容,以及BeautifulSoup库解析HTML。最后,我们将展示如何存储爬取的数据。无论你是编程新手还是想扩展你的技术栈,这篇文章都会为你打开网络数据抓取的大门。
|
6月前
|
存储 自然语言处理 Linux
非常高兴地宣布,我们发布了RunFlow的第一个版本,这是一款全新且强大的效率工具
RunFlow v1 发布!这是一个跨平台的效率工具,类似 Wox、PowerToys、Alfred 和 Raycast。特色包括:跨平台支持(暂不包括Linux)、多语言(默认英/中文,可扩展)、自定义样式与主题、关键字驱动功能、后置匹配技术、实时刷新结果、上下文菜单、工具栏、固定关键字、可交互界面、独立窗口、热点事件、专注模式和数据安全同步。支持插件扩展,开发插件语言无限制,基于JetBrains Compose Multiplatform。
59 1
非常高兴地宣布,我们发布了RunFlow的第一个版本,这是一款全新且强大的效率工具
|
11月前
|
vr&ar 开发工具 iOS开发
visionOS空间计算实战开发教程Day 1:环境安装和编写第一个程序
截至目前visionOS还未在Xcode稳定版中开放,所以需要下载Xcode Beta版。比如我们可以下载Xcode 15.1 beta 2,注意Xcode 15要求系统的版本是macOS Ventura 13.5或更新,也就是说2017年的MacBook Pro基本可以勉强一战,基本上还是推荐使用M系列芯片的电脑进行开发。
153 0
|
前端开发
第一个网页总结暨前端基础知识补充
一,css基本引入 二,字体引入样式 三,类名约定 四,文字相关 五,相关技巧 分竖线 六,案例遇到问题及解决方法 七,文本格式化标签 八,meta标签 九,表格 十,input表单 十 一,dl标签 十二,css相关补充 背景, 透明图像,opacity![](https://img-blog.csdnimg.cn/e6756a58e45c4b94aac154aeb76148c6.png) 在搜索框内添加图标 css3 边框-阴影,圆角 文本溢出显示,换行 css3 2D转换 transition过渡 Bootstrap4 颜色引用 Bootstrap4 进度条
89 0
第一个网页总结暨前端基础知识补充
|
JavaScript 前端开发 安全
如何开始第一个开源项目?
根据Sayan Chowdhury的说法,以下是人们开始开源之旅时提出的常见问题: 如何开始开源之旅? 我知道x、y、z语言,我应该参与哪个项目? 如何筛选出符合我技能水平的项目?
202 0
如何开始第一个开源项目?
|
前端开发
【前端】工具的下载使用+第一个简单的程序
【前端】工具的下载使用+第一个简单的程序