成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

滴滴二面: 聊聊對(duì) gRPC 的理解!

開發(fā) 系統(tǒng)
這篇文章,我們?cè)敿?xì)地介紹了gRPC并且通過一個(gè)完整的代碼示例進(jìn)行了演示,gRPC作為一個(gè)高性能、功能豐富的RPC框架,在現(xiàn)代分布式系統(tǒng)中扮演著重要角色。

這篇文章我們來分析一道滴滴的面試題:聊聊對(duì) gRPC的理解!文章會(huì)解答:gRPC是什么?它是如何工作的?我們要如何編寫 gRPC的代碼?

一、什么是 gRPC?

簡單來說,gRPC是一個(gè)高性能、開源和通用的遠(yuǎn)程過程調(diào)用(RPC)框架,由Google開發(fā)。它基于HTTP/2協(xié)議,使用Protocol Buffers(protobuf)作為接口描述語言,支持多種編程語言。gRPC讓不同服務(wù)之間的通信變得簡單、高效,廣泛應(yīng)用于微服務(wù)架構(gòu)中。

二、為什么選擇 gRPC?

在微服務(wù)架構(gòu)中,服務(wù)之間頻繁通信是不可避免的。傳統(tǒng)的REST API使用JSON進(jìn)行數(shù)據(jù)傳輸,雖然易于理解,但在性能和效率上存在一些瓶頸。gRPC則通過以下優(yōu)勢脫穎而出:

  • 高效的二進(jìn)制傳輸:使用protobuf序列化,比JSON更輕量,傳輸更快。
  • 多語言支持:支持包括Java、C++, Python等多種語言,便于跨語言開發(fā)。
  • 內(nèi)建的負(fù)載均衡、認(rèn)證和流控:減少了開發(fā)者的配置負(fù)擔(dān)。
  • 基于HTTP/2:支持多路復(fù)用、流控、壓縮等特性,提升通信效率。

三、gRPC 的工作原理

讓我們深入了解一下gRPC的工作機(jī)制。

1. Protocol Buffers(protobuf)

gRPC依賴protobuf來定義服務(wù)接口和消息結(jié)構(gòu)。protobuf是一種高效的二進(jìn)制序列化工具,它通過.proto文件描述服務(wù)和數(shù)據(jù)結(jié)構(gòu),然后生成對(duì)應(yīng)語言的代碼。

示例:定義一個(gè)簡單的gRPC服務(wù)

// helloworld.proto
syntax = "proto3";

option java_package = "com.yuanjava.grpc";
option java_outer_classname = "HelloWorldProto";

service Greeter {
// 定義一個(gè)SayHello的RPC方法
rpc SayHello (HelloRequest) returns (HelloReply) {}
}

message HelloRequest {
  string name = 1;
}

message HelloReply {
string message = 1;
}

2. 服務(wù)端與客戶端

在gRPC中,服務(wù)端實(shí)現(xiàn)接口定義的方法,客戶端通過生成的代碼調(diào)用這些方法。通信過程透明化,開發(fā)者不需要關(guān)心底層的HTTP/2細(xì)節(jié)。

服務(wù)端示例(Java):

public class GreeterImpl extends GreeterGrpc.GreeterImplBase {
    @Override
    public void sayHello(HelloRequest req, StreamObserver<HelloReply> responseObserver) {
        String greeting = "Hello, " + req.getName();
        HelloReply reply = HelloReply.newBuilder().setMessage(greeting).build();
        responseObserver.onNext(reply);
        responseObserver.onCompleted();
    }
}

客戶端示例(Java):

public class GreeterClient {
    private final GreeterGrpc.GreeterBlockingStub blockingStub;

    public GreeterClient(Channel channel) {
        blockingStub = GreeterGrpc.newBlockingStub(channel);
    }

    public void greet(String name) {
        HelloRequest request = HelloRequest.newBuilder().setName(name).build();
        HelloReply reply = blockingStub.sayHello(request);
        System.out.println(reply.getMessage());
    }
}

3. HTTP/2 特性

gRPC基于HTTP/2協(xié)議,這帶來了許多優(yōu)勢:

  • 多路復(fù)用:在一個(gè)TCP連接上,可以發(fā)送多個(gè)請(qǐng)求和響應(yīng),減少延遲。
  • 頭部壓縮:減少帶寬使用,加快傳輸速度。
  • 流控制:更好地管理數(shù)據(jù)流,避免擁塞。

4. gRPC 的實(shí)際應(yīng)用

接下來,讓我們通過一個(gè)實(shí)際的例子,看看如何在Java中使用gRPC。

(1) 步驟一:定義服務(wù)

使用上面的helloworld.proto文件,定義我們的gRPC服務(wù)。

(2) 步驟二:生成代碼

使用protoc編譯器生成Java代碼:

protoc --java_out=. --grpc-java_out=. helloworld.proto

(3) 步驟三:實(shí)現(xiàn)服務(wù)端

在服務(wù)端,實(shí)現(xiàn)GreeterImpl類,并在main()方法中啟動(dòng)服務(wù)。

public class HelloWorldServer {
    public static void main(String[] args) throws IOException, InterruptedException {
        Server server = ServerBuilder.forPort(50051)
            .addService(new GreeterImpl())
            .build()
            .start();

        System.out.println("Server started, listening on 50051");
        server.awaitTermination();
    }
}

(4) 步驟四:實(shí)現(xiàn)客戶端

在客戶端,實(shí)現(xiàn)GreeterClient類,并在main()方法中啟動(dòng)客戶端。

public class HelloWorldClient {
    public static void main(String[] args) throws Exception {
        ManagedChannel channel = ManagedChannelBuilder.forAddress("localhost", 50051)
            .usePlaintext()
            .build();

        GreeterClient client = new GreeterClient(channel);
        client.greet("World");

        channel.shutdownNow().awaitTermination(5, TimeUnit.SECONDS);
    }
}

(5) 步驟五:運(yùn)行示例

啟動(dòng)服務(wù)端:

java HelloWorldServer

啟動(dòng)客戶端:

java HelloWorldClient

我們可以在客戶端看到輸出:

Hello, World

五、總結(jié)

這篇文章,我們?cè)敿?xì)地介紹了gRPC并且通過一個(gè)完整的代碼示例進(jìn)行了演示,gRPC作為一個(gè)高性能、功能豐富的RPC框架,在現(xiàn)代分布式系統(tǒng)中扮演著重要角色。作為后端人員,建議去掌握其原理。

責(zé)任編輯:趙寧寧 來源: 猿java
相關(guān)推薦

2024-05-31 08:10:58

Netty線程模型多路復(fù)用模型

2023-11-29 08:26:38

2024-06-27 12:26:32

2025-03-07 00:11:00

JWTJSONSession

2025-05-06 07:45:12

2021-10-26 09:55:52

CAP理論分布式

2024-05-15 16:41:57

進(jìn)程IO文件

2022-11-04 08:19:18

gRPC框架項(xiàng)目

2024-01-22 10:18:32

平臺(tái)工程開發(fā)人員技術(shù)

2023-08-09 09:11:57

算法分發(fā)效果

2021-07-11 12:12:49

.NETJWTjson

2022-03-31 17:54:29

ReactHooks前端

2022-09-13 14:42:35

Redis內(nèi)存函數(shù)

2023-07-12 13:08:58

性能測試數(shù)據(jù)

2024-09-13 10:05:05

2024-10-10 17:17:57

2021-06-18 11:37:28

人工智能交互設(shè)計(jì)人機(jī)交互

2023-11-28 12:25:02

多線程安全

2022-06-30 09:10:33

NoSQLHBaseRedis

2024-10-15 10:59:18

Spring MVCJava開發(fā)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: av中文字幕在线 | 亚洲欧美综合 | 国产美女一区二区 | 日韩av一区二区在线观看 | 天堂中文av | 一级黄色片网址 | 99福利视频 | 久久国产精品72免费观看 | 中文字幕第49页 | 91精品国产91久久久久久吃药 | 久久视频精品 | 午夜影院 | 精品日韩一区二区 | 亚洲欧美久久 | 91夜色在线观看 | 亚洲精品一区二区三区 | 视频在线一区二区 | 欧美激情精品久久久久 | a在线观看 | 久草在线 | 国内精品久久久久久久影视简单 | 久久亚洲视频 | 国产高清在线 | 久久久久网站 | 草在线| av在线一区二区 | 日本人做爰大片免费观看一老师 | 黄色骚片| 午夜电影一区 | 日韩中文字幕一区二区 | 国产精品一区二区在线播放 | 一级片毛片 | 亚洲精品久久久久久宅男 | 国产精品午夜电影 | 91xxx在线观看 | 精品一区二区三区日本 | 日韩av啪啪网站大全免费观看 | 黄色网址在线免费观看 | 网黄在线 | 亚洲第一成人av | 国产精品久久亚洲 |