gprc-java与golang分别实现服务端,客户端,跨语言通信(二.golang实现)
2024-09-05 08:26:59
1.编译器protoc, 下载地址:https://github.com/protocolbuffers/protobuf/releases (下载对应的版本, 解压后放到go的bin中)
2.安装golang扩展, go get -u github.com/golang/protobuf/protoc-gen-go
3.grpc库, git clone https://github.com/grpc/grpc-go.git $GOPATH/src/google.golang.org/gprc
4.编写DIL文件
syntax = "proto3"; package helloworld; // The greeting service definition.
service Greeter {
// Sends a greeting
rpc SayHello (HelloRequest) returns (HelloReply) {}
} // The request message containing the user's name.
message HelloRequest {
string name = 1;
} // The response message containing the greetings
message HelloReply {
string message = 1;
} 5.生成文件, 在IDL文件目录执行: protoc --go_out=plugins=grpc:. ./hello.proto
6.服务端代码:
package main import (
"fmt"
"golang.org/x/net/context"
"google.golang.org/grpc"
"net"
pb "IDL文件生成的hello.pb.go"
) type service struct{} //声明一个结构体, 实现服务 func (s *service) SayHello(ctx context.Context, req *pb.HelloRequest) (*pb.HelloReply, error) { //服务逻辑, 出入参要和hello.pd.go中的方法一样
name := req.Name //请求结构体中的数据
fmt.Println("this is golang service, request...", name)
return &pb.HelloReply{
Message: "this is golang service", //返回数据
}, nil
} func main() {
lis, err := net.Listen("tcp", ":50001")
if err != nil {
panic(err)
} s := grpc.NewServer()
pb.RegisterGreeterServer(s, &service{}) //注册
_ = s.Serve(lis)
}
7.客户端代码
package main import (
"fmt"
"golang.org/x/net/context"
"google.golang.org/grpc"
"hello.pb.go"
) func main() {
conn, err := grpc.Dial("localhost:50001", grpc.WithInsecure()) //连接
if err != nil {
fmt.Println(err)
}
defer conn.Close() hc := helloworld.NewGreeterClient(conn)
res, err := hc.SayHello(context.Background(), &helloworld.HelloRequest{
Name: "this is golang client request",
}) if err != nil {
fmt.Println(err)
} fmt.Println("this is golang client, response...", res.Message) } java与go的客户端和服务端代码都完成了, 并且可以跨语言调用
跨语言通信需要注意, IDL一定要一致, IDL中的package定义也一定要一致, 是grpc服务名的一部分
最新文章
- memset 的实现分析
- jquery刷新页面
- nginx 中 PHP 调用PEAR.php遇到的问题
- Java魔法堂:注释和注释模板
- &;10 基本数据结构——栈,队列和链表
- Appium下Android keyevent整理
- 从基于idea的第一个javaweb项目到shell脚本项目自动发布(jdk1.8,mysql5.7,maven3.5,tomcat9,subversion,centos7.3)之一
- 201521123050 《Java程序设计》第11周学习总结
- PhpStorm服务激活
- 深入css布局篇(2) — 定位与浮动
- win 10 在vs2017下对mpi的安装以及认识
- Node 系列之path模块
- MVC 获取控制器名称和Action名称(转载)
- EF5.0区别于EF4.0的crud区别
- Linux LAMP架构搭建
- redis配置文件redis.conf翻译、解释以及常用注意事项(持续更新中...)
- JavaScript 中的原型(总则)
- unity, ugui button 禁止重复点击
- Netty处理TCP拆包、粘包
- mybatis入参方式和缓冲