开发第一个gPRC的开发

🌷🍁 博主猫头虎 带您 Go to New World.✨🍁
🦄 博客首页——猫头虎的博客🎐
🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺
🌊 《IDEA开发秘籍专栏》学会IDEA常用操作,工作效率翻倍~💐
🌊 《100天精通Golang(基础入门篇)》学会Golang语言,畅玩云原生,走遍大小厂~💐

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

文章目录

  • 第一个gPRC的开发
    • 1. 项目结构
    • 2. api模块
    • 3. xxxx-server 服务端模块的开发
    • 4. xxx-client 模块
    • 5. 注意事项
    • **总结**:
    • **参考资料**:
  • 原创声明

在这里插入图片描述

第一个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. 提供返回值*/@Overridepublic 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 获得代理对象 stubtry {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技术核心学习团队。一起探索科技的未来,共同成长。

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

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

相关文章

网络综合布线实训室方案(2023版)

综合布线实训室概述 随着智慧城市的蓬勃发展,人工智能、物联网、云计算、大数据等新兴行业也随之崛起,网络布线系统作为现代智慧城市、智慧社区、智能建筑、智能家居、智能工厂和现代服务业的基础设施和神经网络,发挥着重要作用。实践表明,网络系统故障的70%发生在布线系统,直接…

苹果手机桌面APP带云图标有个箭头,过一段时间经常要下载才能使用APP

环境&#xff1a; IPhone 11 IOS13.0 问题描述&#xff1a; 苹果手机桌面APP带云图标有个箭头&#xff0c;过一段时间经常要下载才能使用APP 解决方案&#xff1a; 1.打开设置&#xff0c;往下找到iTunes Store与App Store 2.找到下面卸载未使用的APP 关闭按钮

最优的家电设备交互方式是什么?详解家电设备交互的演进之旅

家电&#xff0c;在人们的日常生活中扮演着不可或缺的角色&#xff0c;也是提升人们幸福感的重要组成部分&#xff0c;那你了解家电的发展史吗&#xff1f; 70年代 结婚流行“四大件”&#xff1a;手表、自行车、缝纫机&#xff0c;收音机&#xff0c;合成“三转一响”。 80年…

问题描述:在Windows下没有预装ImageMagick工具

问题描述:在Windows下没有预装ImageMagick工具 # WInR输入cmd回车进入命令行,执行以下命令查看版本信息 magick --version没有预装ImageMagick工具 解决方案&#xff1a;下载安装ImageMagick 官网下载:ImageMagick-7.1.1-15-Q16-x64-dll.exe 下载之后&#xff0c;一路下一步…

MySQL表的约束

MySQL表的约束 约束的概念空属性默认值列描述zerofill主键自增长唯一键外键 约束的概念 在正式谈MySQL表的约束之前&#xff0c;我们先来简单理解一下约束这个概念; 约束&#xff1a;意思是指带有束缚、限制、管束等意思&#xff1b; 大白话就是说:规定了那些事情你不能干&…

如何大幅提高遥感影像分辨率(Python+MATLAB)

前言&#xff1a; 算法&#xff1a;NSCT算法&#xff08;非下采样变换&#xff09; 数据&#xff1a;Landsat8 OLI 遥感图像数据 编程平台&#xff1a;MATLABPython 论文参考&#xff1a;毛克.一种快速的全色和多光谱图像融合算法[J].测绘科学,2016,41(01):151-15398.DOI:10.1…

k8s deployment创建pod流程图

参考 k8s 创建pod和deployment的流程 - SoulChild随笔记

TCP的可靠性之道:确认重传和流量控制

TCP 全称为 Transmission Control Protocol&#xff08;传输控制协议&#xff09;&#xff0c;是一种面向连接的、可靠的、基于字节流的传输层通信协议&#xff0c;其中可靠性是相对于其他传输协议的优势点。TCP 为了确保数据传输的可靠性主要做了以下几点&#xff1a; 发送确…

【vue3+ts项目】配置husky+配置commitlint

上一篇文章中配置了eslint校验代码工具 【vue3ts项目】配置eslint校验代码工具&#xff0c;eslintprettierstylelint 1、配置husky 每次手动执行命令才能格式化代码&#xff0c;如果有人没有格式化就提交到远程仓库&#xff0c;这个规范就起不到作用了&#xff0c;所有需要强…

Java日志框架概览

SLF4J 提供统一的日志门面API&#xff0c;即图中紫色部分&#xff0c;实现中立的日志记录API 桥接功能&#xff0c;蓝色部分&#xff0c;把各种日志框架API&#xff08;绿色部分&#xff09;桥接到SLF4J API。这样即便你的程序中使用各种日志API记录日志&#xff0c;最终都可桥…

带你了解SpringBoot---开启Durid 监控

文章目录 数据库操作--开启Durid 监控整合Druid 到Spring-Boot官方文档基本介绍Durid 基本使用代码实现 Durid 监控功能-SQL 监控需求:SQL 监控数据SQL 监控数据-测试页面 Durid 监控功能-Web 关联监控需求:Web 关联监控配置-Web 应用、URI 监控重启项目 Durid 监控功能-SQL 防…

进程调度和进程切换——《王道考研》

一、王道书咋说 二、chatgpt咋说 进程调度和进程切换是多道程序操作系统中两个关键的概念&#xff0c;它们在处理多个进程时起着不同的作用。 2.1进程调度是指&#xff1a; 操作系统根据一定的调度算法&#xff0c;从就绪态的进程队列中选择一个进程来占用CPU资源&#xff0…

最新消息:谷歌将在Chromebook上运用UWB技术,无线通信更上一层

超宽带&#xff08;UWB&#xff09;技术是一种创新的短距离无线通信技术&#xff0c;具有高速数据传输和精确定位物体位置的优势。尽管该技术已经存在一段时间&#xff0c;但最近开始广泛应用于各种设备中。据最新报道&#xff0c;Pixel Watch 2可能会搭载UWB模块&#xff0c;这…

商城-学习整理-高级-性能压测缓存问题(十一)

目录 一、基本介绍1、性能指标2、JMeter1、JMeter 安装2、JMeter 压测示例1、添加线程组2、添加 HTTP 请求3、添加监听器4、启动压测&查看分析结果 3、JMeter Address Already in use 错误解决 二、性能监控1、jvm 内存模型2、堆3、jconsole 与 jvisualvm1、jvisualvm 能干…

20230822 Windows上使用find_package引入OpenCV报错

报错信息 打开Cmake项目时&#xff0c;find_package 报错&#xff1a; Found OpenCV Windows Pack but it has no binaries compatible with yourconfiguration.You should manually point CMake variable OpenCV_DIR to your build of OpenCVlibrary.原因 大概率原项目是在 …

发布完体验版以后,出现接口调用失败,但是在本地开发环境中可以正常访问的情况,解决办法

1.一般解决办法 通过打开微信小程序调试模式 进行调用&#xff0c;但这会有些许问题&#xff0c;出现vConsole按钮**&#xff0c;影响美观** 如图所示&#xff1a; 1.1.进入小程序 点击右上角的3个点儿 1.2.点击开发调试 1.3.点击打开调试 1.4.显示出vconsole按钮&#xf…

Fastadmin框架 聚合数字生活抵扣卡系统v2.8.6

【2.8.6更新公告】 1.【优化】优化已知问题。 2.【新增 】新增区县影院。

Docker入门

1. 什么是docker docker的英文意思是 码头工人&#xff0c;意思就是搬运东西的意思&#xff0c;其实这和docker的特点是一样的&#xff0c;docker提供的就是一种容器化搬运东西&#xff08;我们的软件、程序&#xff09;的过程。docker自己本来是运行在操作系统上一个程序软件…

软考高级系统架构设计师(二)计算机操作系统

【原文链接】软考高级系统架构设计师&#xff08;二&#xff09;计算机操作系统 2.1 进程管理 2.1.1 操作系统的三个重要作用 管理计算机中运行的程序和分配各种软硬件资源为用户提供友善的人机界面为应用程序的开发和运行提供一个高效的平台 2.1.2 操作系统的四个特征 并…

jmeter HTTP请求默认值

首先&#xff0c;打开JMeter并创建一个新的测试计划。 右键单击测试计划&#xff0c;选择"添加" > “配置元件” > “HTTP请求默认值”。 在HTTP请求默认值中&#xff0c;您可以设置全局的HTTP请求属性&#xff0c;例如&#xff1a; 服务器地址&#xff1a…