Golang微服务实战:使用gRPC实现跨语言通信! 随着微服务架构的发展,越来越多的企业开始采用微服务架构来构建分布式系统。在微服务架构中,服务之间的通信是非常重要的。而gRPC作为一种高效、跨平台、跨语言的RPC框架,成为越来越多企业的首选。 本篇文章将介绍如何使用gRPC实现跨语言通信。我们将实现一个用Golang编写的服务,与用Python编写的客户端通信,并探讨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服务
客户端启动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)
}
}
文件代码地址
文件代码在我的git上,测试可以通过,大家可以fetch下来使用,里头的不同分支是不同的服务
https://github.com/zxhjames/grpc_demo