rpc跨平台通信的简单案例,java和go

当我们使用Go和Java进行RPC(Remote Procedure Call,远程过程调用)跨平台通信时,你可以使用gRPC作为通信框架。gRPC是一个高性能、开源的RPC框架,它支持多种编程语言,包括Go和Java。下面我将为你提供一个简单的案例来说明如何使用Go和Java进行RPC跨平台通信。

Go作为服务器端,Java作为客户端。

首先,你需要定义一个包含所需方法的.proto文件(Protocol Buffers文件),这个文件将用于生成Go和Java的RPC代码。假设你的.proto文件名为example.proto,内容如下:

protobuf 复制代码
syntax = "proto3";

package example;

service MyService {
  rpc SayHello (HelloRequest) returns (HelloResponse) {}
}

message HelloRequest {
  string name = 1;
}

message HelloResponse {
  string message = 1;
}

接下来,你需要使用该.proto文件生成Go和Java的RPC代码。使用以下命令生成Go代码:

shell 复制代码
protoc --go_out=. example.proto

这将生成一个名为example.pb.go的Go文件。

然后,使用以下命令生成Java代码:

shell 复制代码
protoc --java_out=. example.proto

这将生成一个名为Example.java的Java文件。

现在我们来编写服务器端的Go代码(假设文件名为server.go):

go 复制代码
package main

import (
	"context"
	"log"
	"net"

	"google.golang.org/grpc"

	pb "path/to/generated/go/package" // 替换为实际的Go生成代码包路径
)

type server struct{}

func (s *server) SayHello(ctx context.Context, req *pb.HelloRequest) (*pb.HelloResponse, error) {
	name := req.GetName()
	message := "Hello, " + name
	return &pb.HelloResponse{Message: message}, nil
}

func main() {
	lis, err := net.Listen("tcp", ":50051")
	if err != nil {
		log.Fatalf("failed to listen: %v", err)
	}

	s := grpc.NewServer()
	pb.RegisterMyServiceServer(s, &server{})

	log.Println("Server started on port 50051")
	if err := s.Serve(lis); err != nil {
		log.Fatalf("failed to serve: %v", err)
	}
}

确保将path/to/generated/go/package替换为实际的Go生成代码包的路径。

现在我们来编写客户端的Java代码:

java 复制代码
import example.Example.MyService;
import example.Example.HelloRequest;
import example.Example.HelloResponse;

import io.grpc.ManagedChannel;
import io.grpc.ManagedChannelBuilder;

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

        MyService blockingStub = MyService.newBlockingStub(channel);

        HelloRequest request = HelloRequest.newBuilder()
                .setName("John")
                .build();

        HelloResponse response = blockingStub.sayHello(request);

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

        channel.shutdown();
    }
}

确保将example.Example替换为实际的Java生成代码的包名。

现在,你可以在终端中分别运行服务器端的Go代码和客户端的Java代码。服务器将在本地的50051端口上监听,并等待客户端的请求。客户端将连接到服务器,并向服务器发送一个带有名字的请求。服务器将返回一个包含问候消息的响应,并在客户端上打印该消息。

这就是使用Go和Java进行RPC跨平台通信的简单示例。你可以根据自己的需求扩展和修改代码。记得在实际使用时,替换相应的包路径和端口号来适应你的环境。

go做客户端,java做服务端的案例

使用Java作为服务端,Go作为客户端进行RPC跨平台通信

Java服务端代码

首先,我们从Java服务端开始。在这个案例中,我们将使用Java和gRPC构建一个简单的服务端,它提供一个名为GreetingService的RPC服务,客户端可以调用该服务来获取问候消息。

  1. 创建一个名为GreetingService.proto的Protocol Buffers文件,定义了服务和消息的结构。
protobuf 复制代码
syntax = "proto3";

package example;

service GreetingService {
  rpc SayHello (HelloRequest) returns (HelloResponse) {}
}

message HelloRequest {
  string name = 1;
}

message HelloResponse {
  string message = 1;
}
  1. 使用gRPC的插件生成Java代码。
shell 复制代码
protoc --java_out=. GreetingService.proto
  1. 创建一个名为GreetingServiceImpl.java的Java类,实现GreetingService接口。
java 复制代码
package example;

import io.grpc.stub.StreamObserver;

public class GreetingServiceImpl extends GreetingServiceGrpc.GreetingServiceImplBase {
    @Override
    public void sayHello(HelloRequest request, StreamObserver<HelloResponse> responseObserver) {
        String name = request.getName();
        String message = "Hello, " + name;
        HelloResponse response = HelloResponse.newBuilder().setMessage(message).build();
        responseObserver.onNext(response);
        responseObserver.onCompleted();
    }
}
  1. 创建一个名为Server.java的Java类,启动gRPC服务端。
java 复制代码
package example;

import io.grpc.Server;
import io.grpc.ServerBuilder;
import java.io.IOException;

public class Server {
    private final int port;
    private final Server server;

    public Server(int port) throws IOException {
        this.port = port;
        this.server = ServerBuilder.forPort(port)
                .addService(new GreetingServiceImpl())
                .build();
    }

    public void start() throws IOException {
        server.start();
        System.out.println("Server started on port " + port);
        Runtime.getRuntime().addShutdownHook(new Thread(() -> {
            System.out.println("Shutting down gRPC server");
            Server.this.stop();
            System.out.println("Server shut down");
        }));
    }

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

    public void blockUntilShutdown() throws InterruptedException {
        if (server != null) {
            server.awaitTermination();
        }
    }

    public static void main(String[] args) throws IOException, InterruptedException {
        Server server = new Server(50051);
        server.start();
        server.blockUntilShutdown();
    }
}

Go客户端代码

接下来,我们编写Go客户端代码,通过gRPC调用Java服务端提供的RPC方法。

  1. 创建一个名为main.go的Go文件,导入gRPC和自动生成的Go代码。
go 复制代码
package main

import (
	"context"
	"log"

	"google.golang.org/grpc"

	pb "path/to/generated/go/package" // 替换为实际的Go生成代码包路径
)

func main() {
	conn, err := grpc.Dial("localhost:50051", grpc.WithInsecure())
	if err != nil {
		log.Fatalf("failed to connect: %v", err)
	}
	defer conn.Close()

	client := pb.NewGreetingServiceClient(conn)

	request := &pb.HelloRequest{
		Name: "John",
	}

	response, err := client.SayHello(context.Background(), request)
	if err != nil {
		log.Fatalf("failed to call SayHello: %v", err)
	}

	log.Printf("Response: %s", response.Message)
}

确保将path/to/generated/go/package替换为实际的Go生成代码包的路径。

运行代码

在终端中分别运行Java服务端和Go客户端的代码。

首先,运行Java服务端:

shell 复制代码
java -cp <path_to_grpc_libraries>:. example.Server

确保将<path_to_grpc_libraries>替换为你的gRPC库的路径。

然后,运行Go客户端:

shell 复制代码
go run main.go

以上就是go和java的跨平台使用rpc的协议进行调用和数据交换通信的简单案例。

相关推荐
Re.不晚10 分钟前
Java入门15——抽象类
java·开发语言·学习·算法·intellij-idea
雷神乐乐16 分钟前
Maven学习——创建Maven的Java和Web工程,并运行在Tomcat上
java·maven
码农派大星。19 分钟前
Spring Boot 配置文件
java·spring boot·后端
顾北川_野27 分钟前
Android 手机设备的OEM-unlock解锁 和 adb push文件
android·java
江深竹静,一苇以航29 分钟前
springboot3项目整合Mybatis-plus启动项目报错:Invalid bean definition with name ‘xxxMapper‘
java·spring boot
confiself1 小时前
大模型系列——LLAMA-O1 复刻代码解读
java·开发语言
Wlq04151 小时前
J2EE平台
java·java-ee
XiaoLeisj1 小时前
【JavaEE初阶 — 多线程】Thread类的方法&线程生命周期
java·开发语言·java-ee
杜杜的man1 小时前
【go从零单排】go中的结构体struct和method
开发语言·后端·golang
幼儿园老大*1 小时前
走进 Go 语言基础语法
开发语言·后端·学习·golang·go