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的协议进行调用和数据交换通信的简单案例。

相关推荐
风象南12 分钟前
SpringBoot 控制器的动态注册与卸载
java·spring boot·后端
我是一只代码狗38 分钟前
springboot中使用线程池
java·spring boot·后端
hello早上好1 小时前
JDK 代理原理
java·spring boot·spring
PanZonghui1 小时前
Centos项目部署之Java安装与配置
java·linux
沉着的码农1 小时前
【设计模式】基于责任链模式的参数校验
java·spring boot·分布式
Mr_Xuhhh2 小时前
信号与槽的总结
java·开发语言·数据库·c++·qt·系统架构
纳兰青华2 小时前
bean注入的过程中,Property of ‘java.util.ArrayList‘ type cannot be injected by ‘List‘
java·开发语言·spring·list
coding and coffee2 小时前
狂神说 - Mybatis 学习笔记 --下
java·后端·mybatis
千楼2 小时前
阿里巴巴Java开发手册(1.3.0)
java·代码规范