GoLang与Java各自生成grpc代码流程介绍

GoLang与Java都支持gRPC服务的生成,下面将详细介绍它们各自生成gRPC代码的流程:

GoLang生成gRPC代码的流程

1.准备proto文件

准备好proto文件,它定义了gRPC服务所需要的消息结构和服务接口。

syntax = "proto3";

package greeter;

message HelloRequest {
  string name = 1;
}

message HelloReply {
  string message = 1;
}

service Greeter {
  rpc SayHello (HelloRequest) returns (HelloReply) {}
}

2.使用protoc编译proto文件

使用官方提供的protoc工具,生成Go语言的gRPC代码。

protoc --go_out=plugins=grpc:. greeter.proto

其中,--go_out=plugins=grpc:参数表示生成gRPC代码,并指定输出目录为当前目录。

3.编写服务器代码

编写gRPC服务器代码,实现proto文件中定义的服务接口。

package main

import (
    "context"
    "log"
    "net"

    "google.golang.org/grpc"

    pb "github.com/yourPackageName/yourProtoPackageName"
)

const (
    port = ":50051"
)

type server struct {}

func (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) {
    return &pb.HelloReply{Message: "Hello " + in.Name}, nil
}

func main() {
    lis, err := net.Listen("tcp", port)
    if err != nil {
        log.Fatalf("failed to listen: %v", err)
    }
    s := grpc.NewServer()
    pb.RegisterGreeterServer(s, &server{})
    if err := s.Serve(lis); err != nil {
        log.Fatalf("failed to serve: %v", err)
    }
}

4.编写客户端代码

编写Golang gRPC客户端代码,调用proto文件中定义的服务接口。

package main

import (
    "context"
    "log"

    "google.golang.org/grpc"

    pb "github.com/yourPackageName/yourProtoPackageName"
)

const (
    address = "localhost:50051"
)

func main() {
    conn, err := grpc.Dial(address, grpc.WithInsecure())
    if err != nil {
        log.Fatalf("did not connect: %v", err)
    }
    defer conn.Close()
    c := pb.NewGreeterClient(conn)

    name := "world"
    r, err := c.SayHello(context.Background(), &pb.HelloRequest{Name: name})
    if err != nil {
        log.Fatalf("could not greet: %v", err)
    }
    log.Printf("Greeting: %s", r.Message)
}

Java生成gRPC代码的流程

1.准备proto文件

准备好proto文件,它定义了gRPC服务所需要的消息结构和服务接口。

syntax = "proto3";

package greeter;

option java_package = "com.example.grpc";
option java_outer_classname = "GreeterProto";
option objc_class_prefix = "HLW";

message HelloRequest {
  string name = 1;
}

message HelloReply {
  string message = 1;
}

service Greeter {
  rpc SayHello (HelloRequest) returns (HelloReply) {}
}

2.使用protobuf插件生成Java代码

使用protobuf插件,生成Java语言的gRPC代码。

protoc --plugin=protoc-gen-grpc-java=path/to/protoc-gen-grpc-java --grpc-java_out=path/to/output/directory --proto_path=path/to/proto/files --java_out=path/to/output/directory greeter.proto

其中,--grpc-java_out参数表示生成gRPC Java代码,--proto_path--java_out参数表示proto文件和Java代码的输出目录。

3.编写服务器代码

编写gRPC服务器代码,实现proto文件中定义的服务接口。

package com.example.grpc;

import io.grpc.Server;
import io.grpc.ServerBuilder;
import io.grpc.stub.StreamObserver;

public class GreeterServer {
    private int port = 50051;
    private Server server;

    private void start() throws Exception {
        server = ServerBuilder.forPort(port)
            .addService(new GreeterImpl())
            .build()
            .start();
        System.out.println("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");
                GreeterServer.this.stop();
                System.err.println("*** server shut down");
            }
        });
    }

    private void stop() {
        if (server != null) {
            server.shutdown();
        }
    }

    private void blockUntilShutdown() throws Exception {
        if (server != null) {
            server.awaitTermination();
        }
    }

    public static void main(String[] args) throws Exception {
        final GreeterServer server = new GreeterServer();
        server.start();
        server.blockUntilShutdown();
    }

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

4.编写客户端代码

编写Java gRPC客户端代码,调用proto文件中定义的服务接口。

package com.example.grpc;

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;

public class GreeterClient {
    private static final Logger logger = Logger.getLogger(GreeterClient.class.getName());

    private final ManagedChannel channel;
    private final GreeterGrpc.GreeterBlockingStub blockingStub;

    public GreeterClient(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 Exception {
        GreeterClient client = new GreeterClient("localhost", 50051);
        try {
            String user = "world";
            client.greet(user);
        } finally {
            client.shutdown();
        }
    }
}

上述示例中,我们演示了使用GoLang与Java各自生成gRPC代码的流程,包括准备proto文件、使用相应的工具编译proto文件生成gRPC代码、编写服务器与客户端代码实现服务调用。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:GoLang与Java各自生成grpc代码流程介绍 - Python技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • java基础教程之拼图游戏的实现

    Java 基础教程之拼图游戏的实现 1. 游戏介绍 拼图是一种经典的益智游戏,目的是将图片划分成若干个小块并打乱排列,然后将其重新组合成完整的图片。在这个项目中,我们将使用 Java 语言实现一个简单的拼图游戏,涉及的主要知识点包括 Java Swing 及基本的面向对象编程。 2. 实现步骤 2.1 项目初始化 首先,我们需要创建一个 Java 项目,并添…

    Java 2023年5月20日
    00
  • springboot 返回json格式数据时间格式配置方式

    下面是关于“springboot 返回json格式数据时间格式配置方式”的完整攻略。 一、需求分析 在Spring Boot应用中,我们常常需要返回JSON格式数据。而JSON格式中的时间字段经常需要进行格式化,以便更加直观和易读。因此,我们需要对返回的时间字段进行格式化处理。 二、解决方法 Spring Boot提供了多种方式来解决这个问题,下面将介绍两种…

    Java 2023年5月26日
    00
  • bootstrap自定义样式之bootstrap实现侧边导航栏功能

    下面是关于“bootstrap自定义样式之bootstrap实现侧边导航栏功能”的完整攻略: 什么是Bootstrap? Bootstrap是一种流行的CSS框架,可帮助开发人员快速创建响应式网站。它提供了大量的CSS和JavaScript组件,可以轻松添加到你的网站上。它不仅可以帮助节省开发时间,还可以提高网站的可访问性和易用性。 Bootstrap如何实…

    Java 2023年5月30日
    00
  • Struts2中ognl遍历数组,list和map方法详解

    Struts2 中 OGNL 遍历数组、List 和 Map 方法详解 OGNL 简介 OGNL 全称 Object-Graph Navigation Language,是 Struts2 框架中一个非常重要的技术,主要用于页面动态数据的展示和提交,OGNL 通过引用类似中缀表达式的方法调用方式或操作符号,遍历对象的场景、属性或方法来获取数据。 OGNL 的…

    Java 2023年5月20日
    00
  • 如何进行Java性能调优?

    如何进行Java性能调优? Java性能调优主要是通过一系列的措施来减少应用程序消耗的资源,提高程序的性能。一般通过以下几个步骤来进行Java性能调优: 分析异常现象和性能问题,并定位问题根源 首先需要收集一些关键指标以判断Java应用程序的健康状况。例如:CPU使用率、内存使用率、线程数、网络I/O等等。然后根据这些指标,在出现异常或性能瓶颈的时候,对应用…

    Java 2023年5月11日
    00
  • Springboot 全局时间格式化操作

    下面是关于Spring Boot全局时间格式化操作的完整攻略。 背景 Spring Boot是一个使用很方便的轻量级框架,它内置了很多常用的扩展功能。在实际应用中,我们经常需要对时间类型数据进行格式化处理,以满足业务需求。此时,全局时间格式化就成了必不可少的一个功能。 解决方案 方案一:在全局配置文件中配置时间格式 可以在application.proper…

    Java 2023年5月20日
    00
  • 全面解析java中的hashtable

    全面解析java中的Hashtable 介绍 Hashtable是Java中提供的一种哈希表数据结构的实现,它实现了Map接口,采用键/值对的方式存储数据,并根据键的哈希值存储和访问数据,具有快速查找的优势。 Hashtable是线程安全的,因为它的所有方法都是同步的,但这也导致在高并发情况下性能较低,在JDK1.5之后,Java提供了ConcurrentH…

    Java 2023年5月26日
    00
  • Java 如何同时返回多个不同类型

    实现 Java 同时返回多个不同类型的方法可以有多种,以下是三种可行的方案: 方案一:利用类封装多个返回值 在 Java 中,可以使用一个类封装多个返回值。通过定义一个类(比如下面的 Result 类),该类包含多个字段,每个字段表示一个要返回的值,然后在需要返回多个值的函数中,可以将这些值封装并返回一个 Result 类的实例。以下是实现过程的示例: pu…

    Java 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部