网上关于grpc在k8s上的负载均衡很多,我这里就不在重复了,直接看代码吧: 我的grpc客户端和服务段都是用beego实现的,【我这里比较偷懒,直接把源码放到 k8s的一个master上】,首先需要说明以下我的k8s版本

Server:
协议在protos\hello.proto如下:
syntax = "proto3";
option go_package = "./;proto";
package protos;
service Greeter {
rpc SayHello (HelloRequest) returns (HelloReply) ;
}
message HelloRequest {
string name = 1;
}
message HelloReply {
string message = 1;
}
然后到路径下 执行 protoc --go_out=plugins=grpc:./ ./hello.proto
服务端我为了省事直接在main.go文件添加方法:
package main
import (
"context"
"fmt"
pb "grpcdemo/protos"
"net"
"github.com/kataras/iris/v12"
"github.com/kataras/iris/v12/middleware/logger"
"github.com/kataras/iris/v12/middleware/recover"
"google.golang.org/grpc"
"google.golang.org/grpc/reflection"
)
func main() {
GPRCServer()
// http
app := iris.New()
app.Use(recover.New())
app.Use(logger.New())
app.Handle("GET", "/", func(ctx iris.Context) {
ctx.WriteString("pong")
})
app.Run(iris.Addr(":8080"))
}
func GPRCServer() {
// 监听本地端口
listener, err := net.Listen("tcp", ":9090")
if err != nil {
return
}
s := grpc.NewServer() // 创建GRPC
pb.RegisterGreeterServer(s, &server{}) // 在GRPC服务端注册服务
reflection.Register(s)
fmt.Println("grpc serve 9090")
err = s.Serve(listener)
if err != nil {
fmt.Println(fmt.Sprintf("failed to serve: %v", err))
}
}
type server struct{}
func NewServer() *server {
return &server{}
}
func (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) {
msg := "Resuest By:" + in.Name + " Response By :" + LocalIp()
fmt.Println("GRPC Send: ", msg)
return &pb.HelloReply{Message: msg}, nil
}
func LocalIp() string {
addrs, _ := net.InterfaceAddrs()
var ip string = "localhost"
for _, address := range addrs {
if ipnet, ok := address.(*net.IPNet); ok && !ipnet.IP.IsLoopback() {
if ipnet.IP.To4() != nil {
ip = ipnet.IP.String()
}
}
}
return ip
}
服务的其他几个文件如下:Dockerfile
FROM golang:1.15.6
RUN mkdir -p /app
RUN mkdir -p /app/conf
RUN mkdir -p /app/logs
WORKDIR /app
ADD main /app/main
EXPOSE 8080
EXPOSE 9090
CMD ["./main"]
build.sh
#!/bin/bash
#cd $WORKSPACE
export GOPROXY=https://goproxy.io
#根据 go.mod 文件来处理依赖关系。
go mod tidy
# linux环境编译
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o main
# 构建docker镜像,项目中需要在当前目录下有dockerfile,否则构建失败
docker build -t grpcserver .
docker tag grpcserver 192.168.100.30:8080/go/grpcserver:2021
docker login -u admin -p '123456' 192.168.100.30:8080
docker push 192.168.100.30:8080/go/grpcserver
docker rmi grpcserver
docker rmi 192.168.100.30:8080/go/grpcserver:2021
deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: grpcserver
namespace: go
labels:
name: grpcserver
spec:
replicas: 3
minReadySeconds: 10
selector:
matchLabels:
name: grpcserver
template:
metadata:
labels:
na
本文介绍了如何将Go语言实现的gRPC服务部署到Kubernetes集群,并实现负载均衡。通过调整服务配置,如clusterIP、Ingress及Istio,观察不同场景下的连接行为。同时,文章提供了相关的Dockerfile、部署脚本和配置文件示例。
最低0.47元/天 解锁文章
582

被折叠的 条评论
为什么被折叠?



