新建一个普通的Maven项目:

配置pom文件,导入gRPC的依赖和插件

pom 中增加外部依赖

<dependency>
    <groupId>io.grpc</groupId>
    <artifactId>grpc-all</artifactId>
    <version>0.13.2</version>
</dependency>

 

注意,下面的增加 maven 插件: protobuf-maven-plugin:  protobuf 的插件,不是  gRPC的插件,产生的代码只会是 protobuf 序列化、反序列化的代码,没有gRPC通讯部分的代码。

增加 maven 插件: protobuf-maven-plugin: 配置

<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.xolstice.maven.plugins</groupId>
<artifactId>protobuf-maven-plugin</artifactId>
<version>0.5.0</version>
<configuration>
<!--
The version of protoc must match protobuf-java. If you don't depend on
protobuf-java directly, you will be transitively depending on the
protobuf-java version that grpc depends on.
-->
<protocArtifact>com.google.protobuf:protoc:3.0.0-beta-2:exe:${os.detected.classifier}</protocArtifact>
<pluginId>grpc-java</pluginId>
<pluginArtifact>io.grpc:protoc-gen-grpc-java:0.13.2:exe:${os.detected.classifier}</pluginArtifact>
</configuration>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>compile-custom</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
完整的 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.ghj1976</groupId>

    <artifactId>myGRPCDemo2</artifactId>

    <version>1.0-SNAPSHOT</version>

    <dependencies>

        <dependency>

            <groupId>io.grpc</groupId>

            <artifactId>grpc-all</artifactId>

            <version>0.13.2</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.xolstice.maven.plugins</groupId>

                <artifactId>protobuf-maven-plugin</artifactId>

                <version>0.5.0</version>

                <configuration>

                    <!--

                      The version of protoc must match protobuf-java. If you don't depend on

                      protobuf-java directly, you will be transitively depending on the

                      protobuf-java version that grpc depends on.

                    -->

                    <protocArtifact>com.google.protobuf:protoc:3.0.0-beta-2:exe:${os.detected.classifier}</protocArtifact>

                    <pluginId>grpc-java</pluginId>

                    <pluginArtifact>io.grpc:protoc-gen-grpc-java:0.13.2:exe:${os.detected.classifier}</pluginArtifact>

                </configuration>

                <executions>

                    <execution>

                        <goals>

                            <goal>compile</goal>

                            <goal>compile-custom</goal>

                        </goals>

                    </execution>

                </executions>

            </plugin>

        </plugins>

    </build>

</project>

 

编写 proto 文件,并编译产生对应的 java文件

简单期间这里直接用的 helloworld.proto 文件,内容如下:

// Copyright 2015, Google Inc.

// All rights reserved.

//

// Redistribution and use in source and binary forms, with or without

// modification, are permitted provided that the following conditions are

// met:

//

//     * Redistributions of source code must retain the above copyright

// notice, this list of conditions and the following disclaimer.

//     * Redistributions in binary form must reproduce the above

// copyright notice, this list of conditions and the following disclaimer

// in the documentation and/or other materials provided with the

// distribution.

//     * Neither the name of Google Inc. nor the names of its

// contributors may be used to endorse or promote products derived from

// this software without specific prior written permission.

//

// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS

// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT

// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR

// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT

// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,

// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT

// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,

// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY

// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT

// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE

// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

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;

}

 

生成 protobuf 序列化和反序列化代码

注意,这里我们使用的maven 插件是 protobuf的插件,只能产生protobuf的序列化和反序列化的代码,不能产生gRPC通讯的代码。

如果我们只需要产生这部分代码是,才需要使用这个插件。

这个插件的用法参考下图:

如果用命令行生成,则命令是:

$ protoc --java_out=./java/ ./proto/helloworld.proto

生成 gRPC 通讯部分代码

这时候我们应该使用的是 protoc-gen-grpc-java插件。

这个插件的获取和编译方法请参考: http://www.cnblogs.com/ghj1976/p/5454881.html 

我们这时候产生对应java代码的命令如下:

$ protoc --plugin=protoc-gen-grpc-java=/Users/ghj1976/project/github/grpc/grpc-java/compiler/build/exe/java_plugin/protoc-gen-grpc-java --grpc-java_out=./java/ ./proto/helloworld.proto

这两部生成的文件如下:

GreeterGrpc.java  是 protoc-gen-grpc-java 插件生成的, 其他文件时 protoc 生成的。

 

编写服务器端代码

我们服务器端的代码如下, 生成的文件在io.grpc.examples.helloworld, 我们的服务器端代码在 com.ghj1976 :

package com.ghj1976;

import io.grpc.Server;

import io.grpc.ServerBuilder;

import io.grpc.examples.helloworld.GreeterGrpc;

import io.grpc.examples.helloworld.HelloReply;

import io.grpc.examples.helloworld.HelloRequest;

import io.grpc.stub.StreamObserver;

import java.io.IOException;

import java.util.logging.Logger;

/**

* Created by ghj1976 on 16/5/4.

*/

public class HelloWorldServer {

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

    private int port = 50051;

    private Server server;

    private void start() throws IOException{

        server = ServerBuilder.forPort(port)

                .addService(new GreeterImpl())

                .build()

                .start();

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

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

            @Override

            public void run(){

                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();

        }

    }

    // block 一直到退出程序

    private void blockUntilShutdown() throws InterruptedException {

        if (server != null){

            server.awaitTermination();

        }

    }

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

        final HelloWorldServer server = new HelloWorldServer();

        server.start();

        server.blockUntilShutdown();

    }

    // 实现 定义一个实现服务接口的类

    private class GreeterImpl extends GreeterGrpc.AbstractGreeter {

        @Override

        public void sayHello(HelloRequest req,StreamObserver<HelloReply> responseObserver){

            HelloReply reply = HelloReply.newBuilder().setMessage(("Hello "+req.getName())).build();

            responseObserver.onNext(reply);

            responseObserver.onCompleted();

        }

    }

}

运行 这个类的 main 方法,就可以在 50051 端口启动服务。

go实现的服务器端代码在:

https://github.com/grpc/grpc-go/blob/master/examples/helloworld/greeter_server/main.go 

编写客户端代码

 

为了实现跨语言的调用,我们可以用下面 go 实现的客户端来试验。

https://github.com/grpc/grpc-go/blob/master/examples/helloworld/greeter_client/main.go 

 

如果用 Java 写客户端的话,则是下面代码:

package com.ghj1976;

import io.grpc.ManagedChannel;

import io.grpc.ManagedChannelBuilder;

import io.grpc.StatusRuntimeException;

import io.grpc.examples.helloworld.GreeterGrpc;

import io.grpc.examples.helloworld.HelloReply;

import io.grpc.examples.helloworld.HelloRequest;

import java.util.concurrent.TimeUnit;

import java.util.logging.Level;

import java.util.logging.Logger;

/**

* Created by ghj1976 on 16/5/4.

*/

public class HelloWorldClient {

    private final ManagedChannel channel;

    private final GreeterGrpc.GreeterBlockingStub blockingStub;

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

    public HelloWorldClient(String host,int port){

        channel = ManagedChannelBuilder.forAddress(host,port)

                .usePlaintext(true)

                .build();

        blockingStub = GreeterGrpc.newBlockingStub(channel);

    }

    public void shutdown() throws InterruptedException {

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

    }

    public  void greet(String name){

        HelloRequest request = HelloRequest.newBuilder().setName(name).build();

        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());

    }

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

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

        try{

            String user = "world";

            if (args.length > 0){

                user = args[0];

            }

            client.greet(user);

        }finally {

            client.shutdown();

        }

    }

}

Java 开发 gRPC 服务和客户端的更多相关文章

  1. 用Java开发gRPC服务的例子分析

    本文的代码例子来自:https://github.com/grpc/grpc-java  定义服务 这一步与其他语言完全一样,需要定义gRPC的服务.方法.request和response的类型. 完 ...

  2. .NET Core 3.0中用 Code-First 方式创建 gRPC 服务与客户端

    .NET Core love gRPC 千呼万唤的 .NET Core 3.0 终于在 9 月份正式发布,在它的众多新特性中,除了性能得到了大大提高,比较受关注的应该是 ASP.NET Core 3. ...

  3. [转载]Java创建WebService服务及客户端实现

    Java创建WebService服务及客户端实现 Java创建WebService服务及客户端实现

  4. grpc(3):使用 golang 开发 grpc 服务端和client

    1,关于grpc-go golang 能够能够做grpc的服务端和client. 官网的文档: http://www.grpc.io/docs/quickstart/go.html https://g ...

  5. 十分钟学会Golang开发gRPC服务

    gRPC是Google发起的一个开源RPC框架,使用HTTP/2传输协议,使用Protocol Buffers编码协议,相比RESTful框架的程序性能提高不少,而且当前流行的编程语言基本都已经支持. ...

  6. WebSocket集成XMPP网页即时通讯1:Java Web Project服务端/客户端Jetty9开发初探

    Web 应用的信息交互过程通常是客户端通过浏览器发出一个请求,服务器端接收和审核完请求后进行处理并返回结果给客户端,然后客户端浏览器将信息呈现出来,这种机制对于信息变化不是特别频繁的应用尚能相安无事, ...

  7. Java创建WebService服务及客户端实现(转)

    简介 WebService是一种服务的提供方式,通过WebService,不同应用间相互间调用变的很方便,网络上有很多常用的WebService服务,如:http://developer.51cto. ...

  8. Java创建WebService服务及客户端实现

    简介 WebService是一种服务的提供方式,通过WebService,不同应用间相互间调用变的很方便,网络上有很多常用的WebService服务,如:http://developer.51cto. ...

  9. java访问Https服务的客户端示例

    关于证书 1.每个人都可以使用一些证书生成工具为自己的https站点生成证书(比如JDK的keytool),大家称它为“自签名证书”,但是自己生成的证书是不被浏览器承认的,所以浏览器会报安全提示,要求 ...

随机推荐

  1. windows中用eclipse开发Android环境搭建SDK安装异常

    SDK更新时的“https://dl-ssl.google.com refused”错误 Download interrupted: hostname in certificate didn't ma ...

  2. Android记录11-控制ExpandableListView展开和关闭

    Android记录11-控制ExpandableListView展开和关闭 2013年12月5日 工作记录 我们在使用ExpandableListView可能会遇到各种问题,比如说只展开一个组,关闭其 ...

  3. maven学习笔记(定制一个Web项目)

    创建web项目: mvn archetype:generate -DgroupId=cn.net.comsys.ut4.simpleweb -DartifactId=simple-web -Dpack ...

  4. SET Transaction Isolation Level Read语法的四种情况

    转自:http://www.cnblogs.com/qanholas/archive/2012/01/04/2312152.html 存储过程:SET Transaction Isolation Le ...

  5. 如何通过SecureCRT FTP上传下载文件

    通过SecureCRT  FTP方式从一台机器下载文件到另一台机器上: [root@TEST144239 ~]# ftp 10.30.1.25 Connected to 10.30.1.25 (10. ...

  6. C++资料大全

    本文内容源自GitHub<Awesome C/C++>. 关于 C++ 框架.库和资源的一些汇总列表,由 fffaraz 发起和维护. 内容包括:标准库.Web应用框架.人工智能.数据库. ...

  7. C#.NET ,微信退款证书

    微信退款时遇到:基础连接已经关闭 连接被意外关闭. 服务器环境:WIN SERVER 2008 R2.  WINDOWS服务承载的WCF服务,基于.NET FRAMEWORK 3.5. 第一笔交易的退 ...

  8. Redis服务停止报错解决方案[NOAUTH Authentication required]

    Redis服务器设置密码后,使用service redis stop 会出现以下信息: service redis stop Stopping ... OK (error) NOAUTH Authen ...

  9. String、StringBuffer、StringBuilder之间的区别

    String                      字符串常量 StringBuffer         字符串变量(线程安全) StringBuilder       字符串变量(非线程安全) ...

  10. android学习笔记46——File存储

    File存储--IO操作文件 openFileOutput.openFileInput Context提供了如下两个方法来打开本应用程序的数据文件夹里面的文件IO流. 1.FileInputStrea ...