【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萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章