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

yizhihongxing

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中使用NIO(New Input/Output)时可以使用的内存区域。与Java堆内存不同,直接内存不受Java堆大小的限制,可以使用操作系统的内存,因此可以提高I/O操作的效率。在Java中,可以使用ByteBuffer类来操作直接内存。 以下是直接内存的完整使用攻略: 分配直接内存 在Java中,可以使用ByteBuffer类的a…

    Java 2023年5月12日
    00
  • 详解Spring Data Jpa 模糊查询的正确用法

    详解Spring Data JPA 模糊查询的正确用法 Spring Data JPA是基于JPA规范的一个简化操作数据库的框架,在使用Spring Data JPA进行数据库操作时,经常会使用模糊查询,下面是模糊查询的正确用法及示例。 特定字段模糊查询 特定字段模糊查询是针对某一个特定的字段进行模糊查询,示例代码如下: @Repository public…

    Java 2023年5月20日
    00
  • JAVA中JSONObject对象和Map对象之间的相互转换

    在Java中,JSONObject对象和Map对象是两种常用的数据结构,本篇攻略将介绍JSONObject对象和Map对象相互转换的方法。 什么是JSONObject对象和Map对象 JSONObject对象 JSONObject 是一个能够存储 key-value 映射的简单的开放解决方案。 JSONObject 的 constructor 支持通过传入一…

    Java 2023年5月26日
    00
  • Java springboot接口迅速上手,带你半小时极速入门

    Javaspringboot接口迅速上手,带你半小时极速入门攻略 什么是Spring Boot Spring Boot是Spring框架的扩展,使得开发者可以更加方便快捷地创建Spring Web应用和微服务应用。Spring Boot提供了很多自动化配置,通过使用Spring Boot可以快速搭建一个现代化的Web应用或者是微服务。 开始使用Spring …

    Java 2023年5月15日
    00
  • java中map和对象互转工具类的实现示例

    下面是”Java中Map和对象互转工具类的实现示例”的详细攻略: 1. 什么是Map和对象互转工具类? Map和对象互转工具类是Java编程中的一种实用工具,用于实现Map结构与Java对象之间的转换,便于数据的处理和传递。通过Map与Java对象之间的相互转换,我们可以更加方便地对数据进行处理和传递。 2. 如何实现Map和对象互转工具类? 我们可以使用反…

    Java 2023年5月26日
    00
  • Spring注解驱动之BeanFactoryPostProcessor原理解析

    Spring注解驱动之BeanFactoryPostProcessor原理解析 在Spring中,BeanFactoryPostProcessor是Spring IoC容器提供的一个扩展点,它可以在Bean被实例化之前,对Bean进行改变或者增强。本文就详细介绍一下BeanFactoryPostProcessor的原理以及示例说明。 BeanFactoryP…

    Java 2023年5月31日
    00
  • JavaWeb搭建网上图书商城毕业设计

    下面是详细讲解“JavaWeb搭建网上图书商城毕业设计”的完整攻略。 概述 实现一个基于JavaWeb技术的网上图书商城,需要掌握以下几个方面的知识和技能:- 前端开发:HTML、CSS、JavaScript、jQuery等基础知识。- 后端JavaWeb开发:Servlet、JSP、JDBC、MVC框架等技术。- 数据库MySQL的使用,包括SQL语句的编…

    Java 2023年5月20日
    00
  • Java Spring拦截器案例详解

    Java Spring拦截器是一种常用的拦截器技术,它可以在请求到达Controller之前或之后执行一些操作,比如记录日志、权限认证、参数校验等。本文将详细讲解Java Spring拦截器的使用方法和示例。 1. 创建拦截器 首先,我们需要创建一个拦截器。我们可以创建一个名为MyInterceptor的拦截器,并实现HandlerInterceptor接口…

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