【go语言专题】JAVA&GO通过GRPC互相调用

在这里插入图片描述

简介

  • 语言中立,支持多种语言;
  • 基于 IDL 文件定义服务,通过 proto3 工具生成指定语言的数据结构、服务端接口以及客户端 Stub;
  • 通信协议基于标准的 HTTP/2 设计,支持双向流、消息头压缩、单 TCP 的多路复用、服务端推送等特性,这些特性使得 gRPC 在移动端设备上更加省电和节省网络流量;
  • 序列化支持 PB(Protocol Buffer)和 JSON,PB 是一种语言无关的高性能序列化框架,基于 HTTP/2 + PB, 保障了 RPC 调用的高性能。

JAVA提供providerconsumer

proto文件介绍

syntax 指定语言版本
syntax 指定语言版本
option 修改配置选项
service 声明一个服务
rpc 声明一个方法
resturns 方法的返回值
message 定义一个消息类型
repeated 数组
stream 用流来交互

一个栗子🌰,helloworld.proto

syntax = "proto3";  //语法声明

// Greeter 微服务
service Greeter {
// Sends a greeting
rpc SayHello (HelloRequest) returns (HelloReply) {}
}

// HelloRequest 请求数据格式
message HelloRequest {
string name = 1;
}

// HelloReply 响应数据格式
message HelloReply {
string message = 1;
}

java grpc provider

  • 创建fast-common-grpc-proto,用来生成grpc相关接口。依赖如下,这个还配置了build,可以通过编译生成相关接口。
<dependencies>
        <dependency>
            <groupId>com.google.protobuf</groupId>
            <artifactId>protobuf-java</artifactId>
            <version>${protobuf.version}</version>
        </dependency>
        <dependency>
            <groupId>io.grpc</groupId>
            <artifactId>grpc-netty</artifactId>
            <version>${grpc.version}</version>
        </dependency>
        <dependency>
            <groupId>io.grpc</groupId>
            <artifactId>grpc-protobuf</artifactId>
            <version>${grpc.version}</version>
        </dependency>
        <dependency>
            <groupId>io.grpc</groupId>
            <artifactId>grpc-stub</artifactId>
            <version>${grpc.version}</version>
        </dependency>
    </dependencies>

    <build>
        <extensions>
            <extension>
                <groupId>kr.motd.maven</groupId>
                <artifactId>os-maven-plugin</artifactId>
                <version>${os-maven-plugin.version}</version>
            </extension>
        </extensions>
        <plugins>
            <plugin>
                <groupId>org.xolstice.maven.plugins</groupId>
                <artifactId>protobuf-maven-plugin</artifactId>
                <version>${protobuf-maven-plugin.version}</version>
                <configuration>
                    <protocArtifact>com.google.protobuf:protoc:${protoc.version}:exe:${os.detected.classifier}</protocArtifact>
                    <pluginId>grpc-java</pluginId>
                    <pluginArtifact>io.grpc:protoc-gen-grpc-java:${grpc.version}:exe:${os.detected.classifier}</pluginArtifact>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>compile</goal>
                            <goal>compile-custom</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
  • 把上面的helloworld.proto复制到 java/main/proto下,注意一定要是proto文件夹,点击compile会成生成grpc接口文件

在这里插入图片描述

  • 将文件GreeterGrpcHelloworld复制到grpc包下面,创建GreeterServer文件
    在这里插入图片描述
    GreeterServer的代码如下,继承 GreeterGrpc.GreeterImplBase 重写里面的sayHello方法
@Component
public class GreeterServer extends GreeterGrpc.GreeterImplBase implements InitializingBean {
    @Value("${gRPC.port}")
    private int port;

    @Override
    public void afterPropertiesSet() throws Exception {
        ServerBuilder.forPort(port)
                .addService(new GreeterServer())
                .build()
                .start();
    }

    @Override
    public void sayHello(Helloworld.HelloRequest request,
                         io.grpc.stub.StreamObserver<Helloworld.HelloReply> responseObserver) {
        Helloworld.HelloReply result = Helloworld.HelloReply.newBuilder().setMessage(request.getName()).build();
        responseObserver.onNext(result);
        responseObserver.onCompleted();
    }
}

java grpc consumer

  • 创建SimpleClient,调用你想要调用的接口。
    在这里插入图片描述
  • controllerservice的代码这里就不给出了。需要的可以看github的代码,后面会给出地址。

go提供providerconsumer

生成grpc文件

在根目录下运行命令

protoc -I helloworld/ helloworld/helloworld.proto --go_out=plugins=grpc:helloworld

在这里插入图片描述

go grpc provider

  • 创建service.go,代码如下
package main

import (
	"context"
	pb "go-grpc/helloworld"
	"log"
	"net"

	"google.golang.org/grpc"
	"google.golang.org/grpc/reflection"
)

const (
	port = ":50051"
)


type server struct{} //服务对象

// SayHello 实现服务的接口 在proto中定义的所有服务都是接口
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{})
	// 注册反射服务 这个服务是CLI使用的 跟服务本身没有关系
	reflection.Register(s)
	if err := s.Serve(lis); err != nil {
		log.Fatalf("failed to serve: %v", err)
	}
}

go grpc consumer

  • 创建client.go,代码如下:
package main
import (
	"context"
	"log"
	"os"
	"time"

	pb "go-grpc/helloworld"
	"google.golang.org/grpc"
)

const (
	address     = "localhost:50051"
	defaultName = "world"
)

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)

	// Contact the server and print out its response.
	name := defaultName
	if len(os.Args) > 1 {
		name = os.Args[1]
	}
	// 1秒的上下文
	ctx, cancel := context.WithTimeout(context.Background(), time.Second)
	defer cancel()
	r, err := c.SayHello(ctx, &pb.HelloRequest{Name: name})
	if err != nil {
		log.Fatalf("could not greet: %v", err)
	}
	log.Printf("Greeting: %s", r.Message)
}

测试

接下来测试服务之间的调用

java 提供grpc服务

  • java调用java,启动java服务,运行FastCommonGrpcExampleApplication这个类,访问http://localhost:8080/hello
    在这里插入图片描述
  • go 调用java,运行client.go会看到输出
    在这里插入图片描述

go 提供grpc服务

  • java 调用go ,注释掉GreeterServer,启动FastCommonGrpcExampleApplication,启动service.go,访问http://localhost:8080/hello
    在这里插入图片描述
  • go调用go,运行client.go会看到输出
    在这里插入图片描述

go地址:https://github.com/fafeidou/go-grpc
java地址:https://github.com/fafeidou/fast-cloud-nacos

参考

发布了97 篇原创文章 · 获赞 100 · 访问量 1万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章