文章目录

  • 简介
  • 什么是grpc
  • 项目需求
  • 服务端设计步骤
  • 客户端设计
  • 演示实例
  • 文件代码地址


简介

多个服务在进行拆分后,我们往往要通过服务之间互相调用来实现某个业务功能,我们知道在java领域,有springCloud,Dubbo这些封装的很好的通信组件,但是如果服务之间是跨语言的,那么这些就不能解决了,今天有个需求,我想实现go服务和java服务之间的通信,于是就借鉴了一下google的一个轻量且高效的通讯框架-grpc来实现

什么是grpc

grpc官方文档

项目需求

实现一个简单的,用Go服务远程调用Java服务一个整数相加的接口

服务端设计步骤

  • 服务端是maven工程,新建一个工程后,导入maven坐标
  • 在main目录下,java同级目录下建立proto文件夹,用来存放基于http2和protobuf的通信协议,新建justtest.proto
syntax = "proto3"; //协议版本号

option java_multiple_files = true;
option java_package = "io.grpc.add";
option java_outer_classname = "remote_add_service";

package Test; // 包名

//定义服务
service Greeter {
  //注意:这里是returns 不是return
  rpc RemoteAdd (AddRequest) returns (AddResponse) {}
}
//定义消息类型
message AddRequest {
  int32 num1 = 1;
  int32 num2 = 2;
}
message AddResponse {
  int32 answer = 1;
}
  • 新建proto文件,写入文件协议规定的字段
  • 使用maven install生成由protoc反向解析出的一系列文件
  • 启动服务端

客户端设计

  • 客户端的工程是golang工程,我们要事先安装好protobuf的包,网上有很多教程,大家可以去自行下载
  • 值得注意的是,go服务需要一些grpc的包,这些包…有些还真在github上找不到,所以大家可以去下载我的go所需要的库的仓库,我全部都打在了项目的govendor目录下,里头的包都是完整的,拿来就可以用
  • 将maven工程中的protoc文件拷贝到golang工程里面的proto包里,然后进入这个文件夹目录,使用下面的指令去生成一系列反向解析出来的go文件
protoc --go-grpc_out=. 你的proto文件名.proto
 protoc --go_out=. 你的proto文件名.proto
  • 新建客户端服务,去监听一个端口,同时去调用这个远程接口服务

演示实例

服务端启动java服务

go语言如何调用java接口 golang调用java代码_rpc

客户端启动golang服务
client.go文件

package main

import (
	"fmt"
	"github.com/gin-gonic/gin"
	pb "go_grpc/pb"
	"google.golang.org/grpc"
	"log"
	"net/http"
)

func main() {
	// Set up a connection to the server.
	conn, err := grpc.Dial("localhost:50051", grpc.WithInsecure())
	if err != nil {
		log.Fatalf("did not connect: %v", err)
	}
	defer conn.Close()
	client := pb.NewGreeterClient(conn)

	r := gin.Default()
	r.GET("/", func(c *gin.Context) {
		//todo 远程调用整数相加
		req := &pb.AddRequest{Num1: 10,Num2: 10}
		res, err := client.RemoteAdd(c, req)
		if err != nil {
			c.JSON(http.StatusInternalServerError, gin.H{
				"error": err.Error(),
			})
			return
		}
		c.JSON(http.StatusOK, gin.H{
			"result": fmt.Sprint(res.Answer),
		})
	})
	// Run http server
	if err := r.Run(":8052"); err != nil {
		log.Fatalf("could not run server: %v", err)
	}
}

go语言如何调用java接口 golang调用java代码_服务端_02

文件代码地址

文件代码在我的git上,测试可以通过,大家可以fetch下来使用,里头的不同分支是不同的服务
https://github.com/zxhjames/grpc_demo