`

Java 开发 gRPC 服务和客户端

阅读更多

一、gRPC 简介

gRPC 是Go实现的:一个高性能,开源,将移动和HTTP/2放在首位通用的RPC框架。使用gRPC可以在客户端调用不同机器上的服务端的方法,而客户端和服务端的开发语言和

运行环境可以有很多种,基本涵盖了主流语言和平台。双方交互的协议可以在proto文件中定义,客户端和服务端可以很方便的通过工具生成协议和代理代码。而消息的编码是采用google protocol buffer,数据量小、速度快。了解springcloud架构可以加求求:三五三六二四七二五九

gRPC具有以下特点:

(1)基于 HTTP/2, 继而提供了连接多路复用、Body 和 Header 压缩等机制。可以节省带宽、降低TCP链接次数、节省CPU使用和延长电池寿命等。

(2)支持主流开发语言(C, C++, Python, PHP, Ruby, NodeJS, C#, Objective-C、Golang、Java)

(3)IDL (Interface Definition Language) 层使用了 Protocol Buffers, 非常适合团队的接口设计

下面我们就通过一个java的例子来看看怎么使用gRPC。

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

新的工程创建出来之后,我们就可以先配置基础的maven相关的配置了,这里我们可以抄袭下官网的相关配置:

<properties>
  <grpc.version>1.4.0</grpc.version><!-- CURRENT_GRPC_VERSION -->
</properties>
<dependencies>
  <dependency>
    <groupId>io.grpc</groupId>
    <artifactId>grpc-netty</artifactId>
    <version>${grpc.version}</version>
  </dependency>
  <dependency>
    <groupId>io.grpc</groupId>
    <artifactId>grpc-protobuf</artifactId>
    <version>${grpc.version}</version>
  </dependency>
  <dependency>
    <groupId>io.grpc</groupId>
    <artifactId>grpc-stub</artifactId>
    <version>${grpc.version}</version>
  </dependency>
  <dependency>
    <groupId>io.grpc</groupId>
    <artifactId>grpc-testing</artifactId>
    <version>${grpc.version}</version>
    <scope>test</scope>
  </dependency>
  <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.11</version>
    <scope>test</scope>
  </dependency>
  <dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-core</artifactId>
    <version>1.9.5</version>
    <scope>test</scope>
  </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>
        <protocArtifact>com.google.protobuf:protoc:3.3.0:exe:${os.detected.classifier}</protocArtifact>
        <pluginId>grpc-java</pluginId>
        <pluginArtifact>io.grpc:protoc-gen-grpc-java:${grpc.version}:exe:${os.detected.classifier}</pluginArtifact>
       </configuration>
      <executions>
        <execution>
          <goals>
            <goal>compile</goal>
            <goal>compile-custom</goal>
          </goals>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>

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

简单起见,这里直接用的 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; 
} 

 这里注意下:如果客户端和服务端使用的语言不同,例如客户端使用Java,服务端是C++,务必保持 proto文件完全一致。

之后我们参看官网给的教程进行编写服务端以及客户端的信息情况,在写好proto之后进行mvn install一下就会在target文件夹的相应目录下创建出了默认的类

此时,我们只需要将这些类复制到我们java代码的目录中去,并开发服务端和客户端即可。

四、服务端开发

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

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

 五、客户端开发

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

 

分享到:
评论

相关推荐

    grpc客户端代码

    对于GRPC客户端,这通常包括客户端接口和用于调用服务的方法。 在给定的压缩包文件"grpc-client"中,可能包含了以下内容: 1. `.proto`文件:定义了服务接口和消息类型。 2. 生成的Go代码:包括客户端接口和用于...

    Java使用grpc需要使用的jar包

    在开发过程中,除了这些基本的依赖,还可能需要其他的库,比如gRPC的客户端和服务端实现、gRPC-stub(用于生成客户端代码)以及gRPC的protobuf编译器protoc等。在遇到问题时,查阅gRPC官方文档和社区资源通常能获得...

    Java中使用GPRC实现客户端与服务端通信示例代码.rar

    在Java开发中,gRPC是一个高性能、开源和通用的RPC框架,它基于HTTP/2协议标准设计,采用了Protocol Buffers作为消息序列化机制。gRPC允许开发者构建微服务架构,使得服务之间可以进行高效的双向流通信。这个压缩包...

    gRPC与云原生应用开发:以Go和Java为例(图灵图书) by 卡山·因德拉西里 丹尼什·库鲁普 (z-lib.org)1

    接下来,书中逐步引导读者开始使用gRPC,包括如何创建服务定义、定义消息类型和服务类型,以及如何在Go和Java中实现gRPC服务和客户端。此外,还详细讲解了gRPC的不同通信模式:一元RPC、服务器端流、客户端流和双向...

    java grpc框架

    开发者可以使用.proto文件来声明服务方法和服务间交换的消息类型。这些.proto文件可以被编译成不同语言的客户端和服务器端代码,使得跨平台的通信变得简单。 在Java gRPC框架中,服务端通过实现.proto文件中定义的...

    grpc-java,Java GRPC实现。基于http/2的rpc.zip

    - **Java实现**:这个库使得开发者可以在Java平台上使用GRPC,它提供了完整的客户端和服务端实现,以及ProtoBuf的Java支持。 - **JDK 7支持**:意味着此实现兼容Java 7及更高版本的JVM,使得更广泛的Java环境可以...

    grpc-java.rar

    3. **Stub(存根)**:GRPC自动生成客户端和服务器端的存根类。客户端存根允许调用远程服务,而服务器端存根实现服务逻辑。在Java中,这些存根是Java接口的实现,可以直接使用。 4. **HTTP/2**:GRPC基于HTTP/2协议...

    grpc-java-master

    1. **gRPC**:理解 gRPC 的核心概念,如服务定义(.proto 文件)、Stub(客户端和服务端代理)、拦截器(用于日志、认证等中间件逻辑)以及流式调用(单向流、双向流)。 2. **Protocol Buffers (protobuf)**:学习...

    protoc+protoc-gen-grpc-java

    总的来说,`protoc`和`protoc-gen-grpc-java`是gRPC Java开发中的关键工具,它们帮助开发者快速、高效地构建分布式系统,降低了跨语言通信的复杂性。通过使用这两者,你可以专注于业务逻辑,而不是底层网络通信的...

    Maven搭建Grpc项目详细流程附加grpc—java简单demo

    4. 在protobuf插件的配置中,指定protoc编译器的版本和gRPC Java代码生成器的版本: ```xml &lt;protocArtifact&gt;com.google.protobuf:protoc:3.0.2:exe:${os.detected.classifier} &lt;pluginId&gt;grpc-java ...

    grpc-demo:java版grpc 示例,使用拦截器实现了token认证

    1. **gRPC基础**:gRPC是Google推出的高性能RPC框架,它采用了Protocol Buffers作为接口定义语言,允许定义服务接口和消息类型,生成跨平台的客户端和服务端代码。 2. **gRPC拦截器**:拦截器是gRPC的核心组件之一...

    grpc头文件和库VS2015-win32_x64-Debug(MDd)_Release(MD).rar

    grpc_cpp_plugin_x64.exe和grpc_cpp_plugin.exe是gRPC的C++插件,它们是protoc的扩展,用于生成gRPC特定的客户端和服务端代码,包括服务接口和 Stub 类,这些类使得开发者能够轻松地实现gRPC通信。 “lib”目录下...

    grpc-java-examples

    本文将深入探讨 "grpc-java-examples" 这个项目的具体内容,以及如何在 Java 开发环境中运行和利用这些示例。 首先,"grpc-java-examples" 是官方提供的 Java 版本 gRPC 示例项目,它已经被重新调整为 Maven 项目...

    gRPC并发性能测试代码

    JAR文件内包含了编译后的Java代码,这些代码可能包含了gRPC客户端和/或服务器的实现,以及并发测试逻辑。使用Java编写gRPC服务的好处在于可以利用Java的多线程机制来实现并发请求。 5. **grpc-java.rar**:这是一个...

    grpc protobuf windows vs2015

    它提供了一个简单但强大的接口,允许开发者定义服务接口,并自动生成客户端和服务器端代码,支持多种编程语言,包括C++、Java、Python等。在Windows上,通过VS2015,开发者可以方便地创建gRPC服务。 二、Protocol ...

    grpc项目接口实例demo

    在 gRPC 里客户端应用可以像调用本地对象一样直接调用另一台不同的机器上服务端应用的方法,使得您能够更容易地创建分布式应用和服务。与许多 RPC 系统类似,gRPC 也是基于以下理念:定义一个服务,指定其能够被远程...

    grpc-java-1.9.0.zip_grpc-java 1.9.0源码

    6. **负载均衡**:GRPC 支持客户端和服务端的负载均衡,可以与 Envoy、Nginx 等外部负载均衡器配合,实现高效的服务发现和分发。 在 `grpc-java-1.9.0` 源码中,你可以看到以下关键组件: - **Core Library**:...

    Java Grpc实例创建负载均衡详解

    Java创建Grpc客户端和服务端的例子 创建Grpc客户端和服务端需要使用Maven项目,添加Grpc相关的依赖项和Maven的打包插件。在POM.xml文件中添加以下依赖项: ``` &lt;groupId&gt;io.grpc &lt;artifactId&gt;grpc-netty ...

    grpc-java 研究

    `gRPC`会自动生成服务接口的抽象类以及客户端和服务端的stub。 3. **Stub**:Stub是`gRPC`客户端和服务端之间的代理,允许调用远程服务就像调用本地方法一样。客户端stub处理请求的发送和响应的接收,而服务端stub...

    async-flatbuffer-demo:使用FlatBuffers和gRPC演示异步客户端-服务器应用程序

    Java中的gRPC客户端和服务器都可以通过CompletableFuture或其他异步编程模型来处理请求和响应。这种方式使得服务器可以同时处理多个请求,提高了系统的吞吐量。在Java中,gRPC客户端可以使用`ManagedChannelBuilder`...

Global site tag (gtag.js) - Google Analytics