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日

相关文章

  • SpringBoot深入理解之内置web容器及配置的总结

    Spring Boot深入理解之内置Web容器及配置的总结 什么是Spring Boot内置Web容器 Spring Boot是一种轻量级Java开发框架,它简化了Spring应用程序的构建和部署过程。它支持内置Web容器,如Tomcat、Jetty和Undertow。这意味着您可以直接使用可执行Jar文件启动Spring应用程序而无需外部Web服务器。 S…

    Java 2023年5月15日
    00
  • java实现自定义时钟并实现走时功能

    当我们需要在Java程序中实现一个自定义的时钟控制器时,我们可以借助Java中提供的Timer和TimerTask类来实现。具体的步骤和示例如下: 步骤一:创建时钟控制器 首先,我们需要创建一个类来实现我们的时钟控制器,其中需要包含一些必需的属性和方法: public class ClockController { private Timer timer; …

    Java 2023年5月20日
    00
  • JAVA加密算法实密钥一致协议代码示例

    让我先解释一下题目的含义。所谓“JAVA加密算法实密钥一致协议代码示例”,是指使用Java编程语言实现加密算法中的“密钥一致协议”(Key Agreement)的代码示例。这个协议的目的是让双方在不泄露密钥的情况下完成一次会话的加密和解密。 实现这个协议可以使用Java中的JCE(Java Cryptography Extension)库。下面是一份简单的实…

    Java 2023年5月27日
    00
  • Spring Boot 优雅整合多数据源

    接下来我将为您详细讲解“Spring Boot 优雅整合多数据源”的完整攻略。 一、前置知识 在学习 Spring Boot 优雅整合多数据源之前,需要掌握以下知识点: Spring Boot 和 Spring Data JPA 的基础知识。 数据库连接池的使用,例如 HikariCP、Druid 等。 多数据源的基本概念。 二、多数据源的基本概念 在 Sp…

    Java 2023年6月2日
    00
  • 超级全面的PHP面试题整理集合第1/2页

    下面是详细的攻略: 第1/2页页面介绍 这是一篇关于PHP面试题的文章,分成1/2页展示,第一页包含了50道PHP面试题,第二页包含了另外50道PHP面试题。对于准备面试的PHP开发人员来说是一份不错的复习资料。该页面的排版清晰简洁,每个问题答案都有详细的解释,更新时间较新,适合PHP初级和高级开发人员进行参考。 页面内容分析 该页面的内容主要由50道PHP…

    Java 2023年6月15日
    00
  • Spring Security权限控制的实现接口

    Spring Security 是一个强大的安全框架,提供了多种方式来保证应用程序的安全性。其中最重要的就是权限控制,这也是 Spring Security 最常用的功能。 Spring Security 权限控制基于接口进行实现,主要有以下几个接口: UserDetailsService 接口:该接口用于查询用户信息,包括用户名、密码、权限等。实现该接口一…

    Java 2023年5月20日
    00
  • Java Web开发环境配置详解

    Java Web开发环境配置详解 简介 本文旨在为Java开发者提供一个完整的Java Web开发环境的配置攻略,包括Java JDK、Eclipse IDE、Tomcat服务器和Maven项目管理工具的安装和配置,并提供两个示例来演示如何使用配置好的环境来进行Java Web开发。 Java JDK安装与配置 下载并安装Java JDK。在Oracle官网…

    Java 2023年5月19日
    00
  • 通过反射实现Java下的委托机制代码详解

    先来了解一下反射和委托机制。 反射是Java语言的一种特性,它可以让我们在程序运行时动态地获取和操作类的信息。而委托机制则是一种实现面向对象编程的方法,它将任务的具体实现委托给其他对象来完成。在实际场景中,我们常常通过反射来动态地绑定委托关系,实现更加灵活和智能的程序设计。 下面就来详细讲解如何通过反射实现Java下的委托机制。 步骤一:定义一个接口 首先,…

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