mac 本地实现java grpc demo

一、 安装protobuf插件

  1. IntelliJ IDEA 上操作


    image.png

    image.png
  2. 我的已经安装,所以出现在了Installed tab下

二、代码相关

  1. 创建maven项目grpc3
  2. 修改pom文件如下
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

    <modelVersion>4.0.0</modelVersion>

    <groupId>com.qf</groupId>
    <artifactId>grpc3</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
    <!-- https://mvnrepository.com/artifact/io.grpc/grpc-stub -->
    <dependency>
        <groupId>io.grpc</groupId>
        <artifactId>grpc-all</artifactId>
        <version>1.20.0</version>
    </dependency>
    </dependencies>
    <build>
        <extensions>
            <extension>
                <groupId>kr.motd.maven</groupId>
                <artifactId>os-maven-plugin</artifactId>
                <version>1.4.1.Final</version>
            </extension>
        </extensions>
        <plugins>

            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>

            <plugin>
                <groupId>org.xolstice.maven.plugins</groupId>
                <artifactId>protobuf-maven-plugin</artifactId>
                <!--<version>0.5.1</version>-->
                <configuration>
                    <protocArtifact>com.google.protobuf:protoc:3.0.0:exe:${os.detected.classifier}</protocArtifact>
                    <pluginId>grpc-java</pluginId>
                    <pluginArtifact>io.grpc:protoc-gen-grpc-java:0.15.0:exe:${os.detected.classifier}</pluginArtifact>
                    <!--<protocExecutable>/Users/sgf/Documents/yang/MyWork/protoc-3.7.1-osx-x86_64/bin/protoc</protocExecutable>-->
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>compile</goal>
                            <goal>compile-custom</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

        </plugins>
    </build>
</project>
  1. 创建proto文件
    目录:src/main/proto
    文件名:helloworld.proto
syntax = "proto3";

option java_multiple_files = true;

option java_package = "io.grpc.examples.helloworld";

option java_outer_classname = "HelloWorldProto";

option objc_class_prefix = "HLW";

package helloworld;


// The greeting service definition.

service Greeter {

    // Sends a greeting

    rpc SayHello (HelloRequest) returns (HelloReply) {}

}

// The request message containing the user's name.

message HelloRequest {

    string name = 1;

}

// The response message containing the greetings

message HelloReply {

    string message = 1;

}
  1. 编写client和server
    目录:src/main/java/io/grpc/examples/helloworld
    client: src/main/java/io/grpc/examples/helloworld/HelloWorldClient.java
    server: src/main/java/io/grpc/examples/helloworld/HelloWorldServer.java
// HelloWorldClient.java
/*

 * Copyright 2015 The gRPC Authors

 *

 * Licensed under the Apache License, Version 2.0 (the "License");

 * you may not use this file except in compliance with the License.

 * You may obtain a copy of the License at

 *

 *     http://www.apache.org/licenses/LICENSE-2.0

 *

 * Unless required by applicable law or agreed to in writing, software

 * distributed under the License is distributed on an "AS IS" BASIS,

 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

 * See the License for the specific language governing permissions and

 * limitations under the License.

 */



package io.grpc.examples.helloworld;



import io.grpc.ManagedChannel;

import io.grpc.ManagedChannelBuilder;

import io.grpc.StatusRuntimeException;

import java.util.concurrent.TimeUnit;

import java.util.logging.Level;

import java.util.logging.Logger;



/**

 * A simple client that requests a greeting from the {@link HelloWorldServer}.

 */

public class HelloWorldClient {

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



    private final ManagedChannel channel;

    private final io.grpc.examples.helloworld.GreeterGrpc.GreeterBlockingStub blockingStub;



    /** Construct client connecting to HelloWorld server at {@code host:port}. */

    public HelloWorldClient(String host, int port) {

        this(ManagedChannelBuilder.forAddress(host, port)

                // Channels are secure by default (via SSL/TLS). For the example we disable TLS to avoid

                // needing certificates.

                .usePlaintext()

                .build());

    }



    /** Construct client for accessing RouteGuide server using the existing channel. */

    HelloWorldClient(ManagedChannel channel) {

        this.channel = channel;

        blockingStub = io.grpc.examples.helloworld.GreeterGrpc.newBlockingStub(channel);

    }



    public void shutdown() throws InterruptedException {

        channel.shutdown().awaitTermination(5, TimeUnit.SECONDS);

    }



    /** Say hello to server. */

    public void greet(String name) {

        logger.info("Will try to greet " + name + " ...");

        io.grpc.examples.helloworld.HelloRequest request = io.grpc.examples.helloworld.HelloRequest.newBuilder().setName(name).build();

        io.grpc.examples.helloworld.HelloReply response;

        try {

            response = blockingStub.sayHello(request);

        } catch (StatusRuntimeException e) {

            logger.log(Level.WARNING, "RPC failed: {0}", e.getStatus());

            return;

        }

        logger.info("Greeting: " + response.getMessage());

    }



    /**

     * Greet server. If provided, the first element of {@code args} is the name to use in the

     * greeting.

     */

    public static void main(String[] args) throws Exception {

        HelloWorldClient client = new HelloWorldClient("localhost", 50051);

        try {

            /* Access a service running on the local machine on port 50051 */

            String user = "world";

            if (args.length > 0) {

                user = args[0]; /* Use the arg as the name to greet if provided */

            }

            client.greet(user);

        } finally {

            client.shutdown();

        }

    }

}
// HelloWorldServer

/*

 * Copyright 2015 The gRPC Authors

 *

 * Licensed under the Apache License, Version 2.0 (the "License");

 * you may not use this file except in compliance with the License.

 * You may obtain a copy of the License at

 *

 *     http://www.apache.org/licenses/LICENSE-2.0

 *

 * Unless required by applicable law or agreed to in writing, software

 * distributed under the License is distributed on an "AS IS" BASIS,

 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

 * See the License for the specific language governing permissions and

 * limitations under the License.

 */



package io.grpc.examples.helloworld;



import io.grpc.BindableService;
import io.grpc.Server;

import io.grpc.ServerBuilder;

import io.grpc.stub.StreamObserver;

import java.io.IOException;

import java.util.logging.Logger;



/**

 * Server that manages startup/shutdown of a {@code Greeter} server.

 */

public class HelloWorldServer {

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



    private Server server;



    private void start() throws IOException {

        /* The port on which the server should run */

        int port = 50051;

        server = ServerBuilder.forPort(port)

                .addService((BindableService) new GreeterImpl())

                .build()

                .start();

        logger.info("Server started, listening on " + port);

        Runtime.getRuntime().addShutdownHook(new Thread() {

            @Override

            public void run() {

                // Use stderr here since the logger may have been reset by its JVM shutdown hook.

                System.err.println("*** shutting down gRPC server since JVM is shutting down");

                HelloWorldServer.this.stop();

                System.err.println("*** server shut down");

            }

        });

    }



    private void stop() {

        if (server != null) {

            server.shutdown();

        }

    }



    /**

     * Await termination on the main thread since the grpc library uses daemon threads.

     */

    private void blockUntilShutdown() throws InterruptedException {

        if (server != null) {

            server.awaitTermination();

        }

    }



    /**

     * Main launches the server from the command line.

     */

    public static void main(String[] args) throws IOException, InterruptedException {

        final HelloWorldServer server = new HelloWorldServer();

        server.start();

        server.blockUntilShutdown();

    }



    static class GreeterImpl extends io.grpc.examples.helloworld.GreeterGrpc.GreeterImplBase {



        @Override

        public void sayHello(io.grpc.examples.helloworld.HelloRequest req, StreamObserver<io.grpc.examples.helloworld.HelloReply> responseObserver) {

            io.grpc.examples.helloworld.HelloReply reply = io.grpc.examples.helloworld.HelloReply.newBuilder().setMessage("Hello " + req.getName()).build();

            responseObserver.onNext(reply);

            responseObserver.onCompleted();

        }

    }

}
  1. 自动生成代码
    在根目录下执行如下命令
mvn install

安装成功后在target目录下生成如下文件


image.png
  1. 启动server
    运行 HelloWorldServer 中main函数
  2. 运行client
    运行HelloWorldClient main函数发起请求,看到有响应结果


    image.png

附录

image.png

全部代码地址:https://gitee.com/neimenggudaxue/grpc3

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342