Golang gRPC双微服务实战

我正在学习使用Golang开发gRPC微服务,想实现双微服务之间的通信。请问在实际项目中该如何设计服务间的调用关系?特别是如何处理服务发现、负载均衡以及错误重试机制?有没有推荐的中间件或最佳实践可以参考?希望能分享一些实际项目经验或代码示例。

2 回复

Golang gRPC双微服务实战:使用Go构建两个微服务,通过gRPC进行通信。定义proto文件生成代码,实现服务端和客户端。适合高并发、低延迟场景,结合容器部署提升可扩展性。

更多关于Golang gRPC双微服务实战的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在Golang中实现gRPC双微服务实战,主要包括以下步骤:

1. 定义Proto文件

创建 service.proto 文件,定义两个服务:

syntax = "proto3";

package main;

service ServiceA {
  rpc CallServiceA (RequestA) returns (ResponseA);
}

service ServiceB {
  rpc CallServiceB (RequestB) returns (ResponseB);
}

message RequestA {
  string data = 1;
}

message ResponseA {
  string result = 1;
}

message RequestB {
  string data = 1;
}

message ResponseB {
  string result = 1;
}

2. 生成gRPC代码

protoc --go_out=. --go-grpc_out=. service.proto

3. 实现服务端

服务A:

package main

import (
    "context"
    "log"
    "net"

    "google.golang.org/grpc"
)

type serverA struct {
    UnimplementedServiceAServer
}

func (s *serverA) CallServiceA(ctx context.Context, req *RequestA) (*ResponseA, error) {
    return &ResponseA{Result: "ServiceA processed: " + req.Data}, nil
}

func main() {
    lis, _ := net.Listen("tcp", ":50051")
    s := grpc.NewServer()
    RegisterServiceAServer(s, &serverA{})
    log.Printf("ServiceA listening on :50051")
    s.Serve(lis)
}

服务B:

package main

import (
    "context"
    "log"
    "net"

    "google.golang.org/grpc"
)

type serverB struct {
    UnimplementedServiceBServer
}

func (s *serverB) CallServiceB(ctx context.Context, req *RequestB) (*ResponseB, error) {
    return &ResponseB{Result: "ServiceB processed: " + req.Data}, nil
}

func main() {
    lis, _ := net.Listen("tcp", ":50052")
    s := grpc.NewServer()
    RegisterServiceBServer(s, &serverB{})
    log.Printf("ServiceB listening on :50052")
    s.Serve(lis)
}

4. 实现客户端调用

创建客户端调用另一个服务:

package main

import (
    "context"
    "log"

    "google.golang.org/grpc"
)

func callServiceB() {
    conn, _ := grpc.Dial("localhost:50052", grpc.WithInsecure())
    defer conn.Close()
    client := NewServiceBClient(conn)
    resp, _ := client.CallServiceB(context.Background(), &RequestB{Data: "from ServiceA"})
    log.Printf("Response from ServiceB: %s", resp.Result)
}

5. 运行服务

  1. 启动服务A:go run serviceA.go service.pb.go
  2. 启动服务B:go run serviceB.go service.pb.go
  3. 测试客户端调用

关键点:

  • 使用不同端口避免冲突
  • 通过Proto定义明确服务契约
  • 客户端使用gRPC连接池管理连接
  • 可添加TLS加密和认证机制

这个示例展示了基本的双服务gRPC通信架构,实际项目中可结合服务发现、负载均衡等机制扩展。

回到顶部