前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >开发第一个gPRC的开发

开发第一个gPRC的开发

作者头像
猫头虎
发布2024-04-09 08:42:06
1010
发布2024-04-09 08:42:06
举报
文章被收录于专栏:猫头虎博客专区

🌷🍁 博主猫头虎 带您 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 转换成编程语言

代码语言:javascript
复制
protoc --java_out=/xxx/xxx  /xxx/xxx/xx.proto

[实战] maven插件 进行protobuf IDL文件的编译,并把他放置IDEA具体位置。

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

代码语言:javascript
复制
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示例:

代码语言:javascript
复制
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示例:

代码语言:javascript
复制
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中,处理返回值是非常重要的。以下是一些关键的注意事项:

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

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

总结

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

原创声明

======= ·

  • 原创作者: 猫头虎
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-08-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 第一个gPRC的开发
    • 1. 项目结构
      • 2. api模块
        • 3. xxxx-server 服务端模块的开发
          • 4. xxx-client 模块
            • 5. 注意事项
              • 总结:
              • 原创声明
              相关产品与服务
              云数据库 MySQL
              腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档