美文网首页
gRPC开发基础示例

gRPC开发基础示例

作者: engineer_tang | 来源:发表于2021-06-10 07:11 被阅读0次

1. 引入依赖

1.1 引入包

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <protobuf.version>3.16.0</protobuf.version>
    </properties>

<dependency>
            <groupId>io.grpc</groupId>
            <artifactId>grpc-netty-shaded</artifactId>
            <version>1.38.0</version>
        </dependency>
        <dependency>
            <groupId>io.grpc</groupId>
            <artifactId>grpc-protobuf</artifactId>
            <version>1.38.0</version>
        </dependency>
        <dependency>
            <groupId>io.grpc</groupId>
            <artifactId>grpc-stub</artifactId>
            <version>1.38.0</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>

        <dependency>
            <groupId>com.google.protobuf</groupId>
            <artifactId>protobuf-java-util</artifactId>
            <version>${protobuf.version}</version>
        </dependency>

1.2. 引入插件

<build>
        <extensions>
            <extension>
                <groupId>kr.motd.maven</groupId>
                <artifactId>os-maven-plugin</artifactId>
                <version>1.6.2</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.12.0:exe:${os.detected.classifier}</protocArtifact>
                    <pluginId>grpc-java</pluginId>
                    <pluginArtifact>io.grpc:protoc-gen-grpc-java:1.38.0:exe:${os.detected.classifier}</pluginArtifact>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>compile</goal>
                            <goal>compile-custom</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

2. 定义proto文件

2.1 安装插件

image.png

2.2 创建proto文件

在main下创建proto文件夹,用于存放proto文件,然后创建user_infomation.proto文件,内容如下:

syntax = "proto3";

option java_multiple_files = true;
option java_package = "com.mrtang.demo";
option java_outer_classname = "UserInfomationProto";
option objc_class_prefix = "RTG";

package userinformation;

service UserInfomation {
    rpc getUser(UserParam) returns (User) {};
}

message User {

    int32 user_id = 5;

    string user_name = 1;

    int32 age = 2;

    string email = 3;

    string phone_no = 4;
}

message UserParam {
    int32 user_id = 1;
}

编辑完成后,进行编译会生成相关类


image.png
image.png

3. 创建服务器端

package com.mrtang.demo;

import io.grpc.Server;
import io.grpc.ServerBuilder;
import io.grpc.examples.routeguide.RouteGuideGrpc;
import io.grpc.stub.StreamObserver;

import java.io.IOException;
import java.util.Objects;
import java.util.concurrent.TimeUnit;
import java.util.logging.Level;
import java.util.logging.Logger;

public class UserVisitServer {

    private static final Logger logger = Logger.getLogger(UserVisitServer.class.getName());

    private int port;

    private final Server server;

    public UserVisitServer(int port) {
        this.port = port;
        ServerBuilder<?> serverBuilder = ServerBuilder.forPort(port);
        server = serverBuilder.addService(new UserInfomationService())
                .build();

    }

    public void start() throws IOException {
        server.start();
        logger.info("Server started, listening on " + port);
        Runtime.getRuntime().addShutdownHook(new Thread() {

            @Override
            public void run() {
                System.err.println("*** gRPC server 关闭中 ... ");
                try {
                    UserVisitServer.this.stop();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.err.println("服务器已关闭 ...");
            }
        });
    }

    public void stop() throws InterruptedException {
        server.shutdown().awaitTermination(60, TimeUnit.SECONDS);
    }

    private void blockUntilShutdown() throws InterruptedException {
        if (server != null) {
            server.awaitTermination();
        }
    }



    public static void main(String[] args) throws IOException, InterruptedException {
        UserVisitServer userServer = new UserVisitServer(8005);
        userServer.start();
        userServer.blockUntilShutdown();
    }

    private static class UserInfomationService extends UserInfomationGrpc.UserInfomationImplBase {

        @Override
        public void getUser(UserParam request, StreamObserver<User> responseObserver) {
            responseObserver.onNext(selectUserById(request.getUserId()));
            responseObserver.onCompleted();
        }

        private User selectUserById(Integer userId) {
            if (Objects.equals(userId, 1)) {
                return User.newBuilder().setUserId(1).setUserName("李白").setAge(38).setEmail("cecjoe@111.com").build();
            } else if (Objects.equals(userId, 2)) {
                return User.newBuilder().setUserId(2).setUserName("杜甫").setAge(52).setEmail("86wanganshi@111.com").build();
            }
            return null;
        }
    }
}

4. 创建客户端

package com.mrtang.demo;

import io.grpc.Channel;
import io.grpc.ManagedChannel;
import io.grpc.ManagedChannelBuilder;
import java.util.logging.Level;
import java.util.logging.Logger;

public class UserVisitClient {

    private static final Logger logger = Logger.getLogger(UserVisitServer.class.getName());

    private final UserInfomationGrpc.UserInfomationBlockingStub blockingStub;
    private final UserInfomationGrpc.UserInfomationStub asyncStub;

    public UserVisitClient(Channel channel) {
        blockingStub = UserInfomationGrpc.newBlockingStub(channel);
        asyncStub = UserInfomationGrpc.newStub(channel);
    }

    public void getUser(int userId) {
        UserParam userParam = UserParam.newBuilder().setUserId(userId).build();
        User user = blockingStub.getUser(userParam);
        info("user: name: {0}, age: {1}, email: {2}", user.getUserName(), user.getAge(), user.getEmail());
    }

    private void info(String msg, Object... params) {
        logger.log(Level.INFO, msg, params);
    }

    public static void main(String[] args) {
        String target = "localhost:8005";
        ManagedChannel channel = ManagedChannelBuilder.forTarget(target).usePlaintext().build();
        UserVisitClient client = new UserVisitClient(channel);
        client.getUser(2);
    }
}

5. 运行程序

image.png
image.png

本示例搞定了。

相关文章

  • gRPC开发基础示例

    1. 引入依赖 1.1 引入包 1.2. 引入插件 2. 定义proto文件 2.1 安装插件 2.2 创建pro...

  • grpc和consul结合实现分布式rpc调用

    # GRPC > 主要介绍了grpc在使用示例和原理,以及如何与consul结合 ## gRPC 是什么? > g...

  • grpc示例

    准备工作 目录结构 协议 服务器端 服务器端Makefile 客户端 客户端Makefile Makefile 编译运行

  • gRPC学习笔记2 - 示例

    0. 背景 编写一个 gRPC 的示例。 1. gRPC 简介 gRPC 是谷歌开源的轻量级 RPC 通信框架,...

  • Spring Boot AOP

    本文介绍 Spring Boot AOP 使用方法示例。 目录 开发环境 基础示例 备注 开发环境 Oracle ...

  • 运行grpc示例

    下载源码 执行git clone -b v1.18.0 https://github.com/grpc/grpc-...

  • gRPC

    基础:GRPC的产生动机和设计原则grpc| python 实战 grpcPython版gRPC入门实验 - 知乎...

  • gRPC Node.js快速开始

    本文翻译自gRPC官网的Node.js示例,链接地址为:https://www.grpc.io/docs/lang...

  • go语言gRPC简单例子

    一个简单的用go语言开发gRPC程序例子。 安装gRPC gRPC的安装需要3块内容 1. 安装gRPC环境 这个...

  • Spring Boot JPA @ManyToOne 单向映射

    本文介绍 Spring Boot JPA @ManyToOne 的使用方法。 目录 开发环境 基础示例 总结 开发...

网友评论

      本文标题:gRPC开发基础示例

      本文链接:https://www.haomeiwen.com/subject/hoxueltx.html