广告位联系
返回顶部
分享到

gRPC在Java中的实现与应用介绍

java 来源:互联网 作者:佚名 发布时间:2024-06-20 21:30:45 人浏览
摘要

gRPC是由Google开发的高性能、开源的通用远程过程调用(RPC)框架,它基于HTTP/2标准设计,提供了多语言支持,包括Java、C++、Python等。gRPC特别适合微服务架构,因为它支持双向流和流控制,同时提

gRPC是由Google开发的高性能、开源的通用远程过程调用(RPC)框架,它基于HTTP/2标准设计,提供了多语言支持,包括Java、C++、Python等。gRPC特别适合微服务架构,因为它支持双向流和流控制,同时提供了负载均衡、跟踪、健康检查和身份验证等特性。

本文将详细介绍如何在Java中使用gRPC,包括服务定义、服务器端实现、客户端调用以及一些高级特性。我们将通过代码示例来帮助理解gRPC的工作原理。

gRPC基础

服务定义

gRPC使用Protocol Buffers(protobuf)作为接口定义语言(IDL)。首先,我们需要定义服务和消息类型。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

// 文件:helloworld.proto

syntax = "proto3";

  

package helloworld;

  

// 定义服务

service Greeter {

  // 请求和响应消息

  rpc SayHello (HelloRequest) returns (HelloReply) {}

}

  

// 请求消息

message HelloRequest {

  string name = 1;

}

  

// 响应消息

message HelloReply {

  string message = 1;

}

生成Java代码

使用protobuf编译器protoc生成Java代码:

1

protoc --proto_path=src --java_out=build/gen src/helloworld.proto

这将生成HelloRequest、HelloReply和GreeterGrpc.java等类。

服务器端实现

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

// 文件:GreeterImpl.java

import io.grpc.stub.StreamObserver;

import helloworld.GreeterGrpc;

import helloworld.HelloRequest;

import helloworld.HelloReply;

  

public class GreeterImpl extends GreeterGrpc.GreeterImplBase {

  

    @Override

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

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

        responseObserver.onNext(reply);

        responseObserver.onCompleted();

    }

}

服务器启动代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

// 文件:Server.java

import io.grpc.Server;

import io.grpc.ServerBuilder;

  

public class Server {

    private Server server;

  

    private void start() throws IOException {

        server = ServerBuilder.forPort(8080)

                .addService(new GreeterImpl())

                .build()

                .start();

        System.out.println("Server started, listening on 8080");

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

            @Override

            public void run() {

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

                Server.this.stop();

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

            }

        });

    }

  

    private void stop() {

        if (server != null) {

            server.shutdown();

        }

    }

  

    private void blockUntilShutdown() throws InterruptedException {

        if (server != null) {

            server.awaitTermination();

        }

    }

  

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

        final Server server = new Server();

        server.start();

        server.blockUntilShutdown();

    }

}

客户端调用

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

// 文件:Client.java

import io.grpc.ManagedChannel;

import io.grpc.ManagedChannelBuilder;

import helloworld.GreeterGrpc;

import helloworld.HelloRequest;

import helloworld.HelloReply;

  

public class Client {

    private final ManagedChannel channel;

    private final GreeterGrpc.GreeterBlockingStub blockingStub;

  

    public Client(String host, int port) {

        channel = ManagedChannelBuilder.forAddress(host, port)

                .usePlaintext() // 为了简单,使用明文通信

                .build();

        blockingStub = GreeterGrpc.newBlockingStub(channel);

    }

  

    public void greet(String name) {

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

        HelloReply response = blockingStub.sayHello(request);

        System.out.println("Greeting: " + response.getMessage());

    }

  

    public void shutdown() throws InterruptedException {

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

    }

  

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

        Client client = new Client("localhost", 8080);

        client.greet("world");

        client.shutdown();

    }

}

高级特性

gRPC还支持双向流、服务器端流和客户端端流等高级特性。这些特性可以通过定义不同的RPC方法来实现。

双向流

1

rpc SayHelloStream(stream HelloRequest) returns (stream HelloReply);

服务器和客户端可以同时发送和接收消息,实现真正的双向通信。

结语

gRPC是一个强大的RPC框架,它通过HTTP/2和protobuf提供了高效、跨语言的服务调用。本文通过简单的示例介绍了gRPC在Java中的基本使用,包括服务定义、服务器实现和客户端调用。希望这些内容能帮助你快速上手gRPC,并在实际项目中发挥其强大的功能。


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。

您可能感兴趣的文章 :

原文链接 :
    Tag :
相关文章
  • SpringCloudStream原理和深入使用介绍

    SpringCloudStream原理和深入使用介绍
    Spring Cloud Stream是一个用于构建与共享消息传递系统连接的高度可扩展的事件驱动型微服务的框架。 应用程序通过inputs或outputs来与Spring Clo
  • gRPC在Java中的实现与应用介绍
    gRPC是由Google开发的高性能、开源的通用远程过程调用(RPC)框架,它基于HTTP/2标准设计,提供了多语言支持,包括Java、C++、Python等。gRPC特别适
  • SpringBoot中@FeignClient注解的作用
    在微服务架构中,服务之间的调用是非常频繁的。为了简化服务之间的调用,Spring Boot 提供了一个叫做 Feign 的组件。Feign 可以帮助我们定义
  • MyBatis-Plus介绍及Spring Boot 3集成指南

    MyBatis-Plus介绍及Spring Boot 3集成指南
    我们每个Java开发者都在使用springboot+mybatis开发时,我们经常发现自己需要为每张数据库表单独编写XML文件,并且为每个表都需要编写一套增
  • MyBatis与Spring中的SqlSession介绍
    在 MyBatis 中,你可以使用 SqlSessionFactory 来创建 SqlSession。 一旦你获得一个 session 之后,你可以使用它来执行映射了的语句,提交或回滚连接
  • java获取IP和IP的归属地的方法

    java获取IP和IP的归属地的方法
    在Java中,获取IP地址通常指的是获取本地机器的IP地址或者通过某种方式(如HTTP请求)获取的远程IP地址。代码案例如下: 而要获取IP的归属
  • idea没有services窗口、没有springboot启动项问题

    idea没有services窗口、没有springboot启动项问题
    idea没有services窗口、没有springboot启动项 idea没有services窗口 没有springboot启动项。 如果是找不到services窗口,可以在views的tools Windows下找到
  • Springboot限制IP访问指定的网址实现

    Springboot限制IP访问指定的网址实现
    IP黑白名单是网络安全管理中常见的策略工具,用于控制网络访问权限,根据业务场景的不同,其应用范围广泛 方式一: 添加一个简单的白
  • MybatisPlus多条件or()的使用问题小结

    MybatisPlus多条件or()的使用问题小结
    搞混了一次,特此笔记 1、bitCode or iotStr 跟其他ID一个都不能有重复 1 2 queryWrapper.ne(LineProductionPlan::getId,bean.getId()); queryWrapper.and(i - i.eq(LineP
  • 升级springboot3.x踩坑记录
    0x01 redis连接异常 先贴一张项目启动的堆栈信息 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 4
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计