一、GRPC微服务简述
1.什么是微服务?
其实是一种架构风格,把一个应用整体划分成一个个独立的小服务,一个服务只做一个事情,服务之间相互协调配合。
2.什么是gRPC?
gRPC是Google开发的高性能、通用的开源RPC框架,其由Google主要面向移动应用开发并基于HTTP/2协议标准而设计,基于Protobuf(Protocol Buffers)序列化协议开发,且支持众多开发语言。在gRPC中一个客户端可以像使用本地对象那样直接调用位于不同机器上的服务端应用的方法(methods)。
3.为什么要使用微服务架构呢?(优缺点)
优点
-
每个服务只完成一个特定的功能,服务之间可以互相调用,高内聚,松耦合
-
每个服务能被独立团队单独开发
-
不受语言的限制
-
适用于敏捷开发,持续集成
-
每个服务可以有自己的存储
缺点
-
追踪问题变难
-
运维变得复杂
二、Go gRPC
1.新建工程
2.安装插件
xxxxxx@ubuntu:~/MyProject/Practice$ go get -u github.com/golang/protobuf/protoc-gen-go
go: found github.com/golang/protobuf/protoc-gen-go in github.com/golang/protobuf v1.5.2
go: google.golang.org/protobuf upgrade => v1.27.1
go: downloading google.golang.org/protobuf v1.27.1
xxxxxx@ubuntu:~/MyProject/Practice$ go get -u google.golang.org/grpc
3.编写proto文件
syntax = "proto3";
option go_package = ".;pb";
service Greet {
rpc HelloWorld (Request) returns(Response);
}
message Request {
string ping = 1;
}
message Response {
string pong= 1;
}
4. protoc编译proto文件成.go文件
xxxxxx@ubuntu:~/MyProject/Practice$ protoc -I pb/ pb/helloworld.proto --go_out=plugins=grpc:pb
命令简析
protoc
报错可以去搜索一下,安装protoc编译工具-I
后面指定proto文件存放目录,和proto文件--go_out=plugins=grpc:pb
中的pb
是指存放目录
5. 编写grpc服务端
package main
import (
"Practice/pb"
"context"
"fmt"
"google.golang.org/grpc"
"google.golang.org/grpc/reflection"
"net"
)
// 实现 `hellworld.pb.go`中相应的接口 `type GreetServer interface`
type Server struct {}
// 编写相应的逻辑
func (s *Server) HelloWorld(ctx context.Context, in *pb.Request) (*pb.Response, error) {
return &pb.Response{Pong: "HelloWorld"}, nil
}
func main() {
// 监听本地端口
l, err := net.Listen("tcp", ":8080")
if err != nil {
fmt.Println("监听端口失败: ", err)
return
}
// 创建gRPC服务器
s := grpc.NewServer()
// 注册服务
pb.RegisterGreetServer(s, &Server{})
reflection.Register(s)
err = s.Serve(l)
if err != nil {
fmt.Println("开启服务失败: ", err)
return
}
}
6. 编写grpc客户端
package main
import (
"Practice/pb"
"context"
"fmt"
"google.golang.org/grpc"
)
func main(){
// 连接服务器
conn, err := grpc.Dial(":8080", grpc.WithInsecure())
if err != nil {
fmt.Println("连接服务端失败: ", err)
return
}
defer conn.Close()
// 新建一个客户端
c := pb.NewGreetClient(conn)
// 调用服务端函数
r, err := c.HelloWorld(context.Background(), &pb.Request{})
if err != nil {
fmt.Println("调用服务端代码失败: ", err)
return
}
fmt.Println("调用成功: ", r.Pong)
}
7.结果展示
先运行服务器,在运行客户端
三、go-zero框架(强烈推荐)
go-zero是一个集成了各种工程实践的web和rpc框架,非常方便