golang分布式系统开发框架插件go-micro的使用

Go Micro 分布式系统开发框架使用指南

概述

Go Micro 是一个用于分布式系统开发的框架,提供了 RPC 和事件驱动通信等核心功能。Go Micro 的理念是提供合理的默认值,同时具有可插拔的架构。我们提供默认值让您快速入门,但所有组件都可以轻松替换。

主要特性

Go Micro 抽象了分布式系统的细节,主要特性包括:

  • 认证 - 内置的一等公民认证功能
  • 动态配置 - 从任何地方加载和热重载动态配置
  • 数据存储 - 简单的数据存储接口
  • 服务发现 - 自动服务注册和名称解析
  • 负载均衡 - 基于服务发现的客户端负载均衡
  • 消息编码 - 基于内容类型的动态消息编码
  • RPC 客户端/服务器 - 支持双向流的 RPC 请求/响应
  • 异步消息 - 内置的 PubSub 功能
  • 可插拔接口 - 每个分布式系统抽象都使用 Go 接口

快速开始

安装

go get "go-micro.dev/v5"

创建服务并注册处理器

package main

import (
        "context"
        "go-micro.dev/v5"
)

// 定义请求结构体
type Request struct {
        Name string `json:"name"`
}

// 定义响应结构体
type Response struct {
        Message string `json:"message"`
}

// 定义处理器类型
type Say struct{}

// 实现处理器方法
func (h *Say) Hello(ctx context.Context, req *Request, rsp *Response) error {
        rsp.Message = "Hello " + req.Name
        return nil
}

func main() {
        // 创建服务
        service := micro.NewService(
                micro.Name("helloworld"),
        )

        // 注册处理器
        service.Handle(new(Say))

        // 运行服务
        if err := service.Run(); err != nil {
                panic(err)
        }
}

设置固定地址

service := micro.NewService(
    micro.Name("helloworld"),
    micro.Address(":8080"),
)

通过 curl 调用

curl -XPOST \
     -H 'Content-Type: application/json' \
     -H 'Micro-Endpoint: Say.Hello' \
     -d '{"name": "alice"}' \
      http://localhost:8080

完整示例

下面是一个更完整的示例,包含服务端和客户端:

服务端代码 (server.go):

package main

import (
        "context"
        "log"
        
        "go-micro.dev/v5"
)

type Request struct {
        Name string `json:"name"`
}

type Response struct {
        Message string `json:"message"`
}

type Greeter struct{}

func (g *Greeter) Hello(ctx context.Context, req *Request, rsp *Response) error {
        rsp.Message = "Hello, " + req.Name
        return nil
}

func main() {
        // 创建新服务
        service := micro.NewService(
                micro.Name("greeter"),
                micro.Version("latest"),
        )

        // 初始化服务
        service.Init()

        // 注册处理器
        if err := micro.RegisterHandler(service.Server(), new(Greeter)); err != nil {
                log.Fatal(err)
        }

        // 运行服务
        if err := service.Run(); err != nil {
                log.Fatal(err)
        }
}

客户端代码 (client.go):

package main

import (
        "context"
        "fmt"
        "log"
        "time"
        
        "go-micro.dev/v5"
        "go-micro.dev/v5/client"
)

type Request struct {
        Name string `json:"name"`
}

type Response struct {
        Message string `json:"message"`
}

func main() {
        // 创建服务客户端
        service := micro.NewService(
                micro.Name("greeter.client"),
        )
        service.Init()

        // 创建新的请求客户端
        greeter := micro.NewService("greeter", service.Client())

        // 调用服务
        req := &Request{Name: "John"}
        rsp := &Response{}
        
        ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
        defer cancel()
        
        if err := greeter.Call(ctx, greeter.NewRequest("Greeter", "Hello", req), rsp); err != nil {
                log.Fatal(err)
        }
        
        fmt.Println(rsp.Message)
}

实验性功能

Go Micro 提供了一个新的 genai 包,用于生成式 AI 功能。这是一个不断发展的特性,可能会随着时间的推移而变化。


更多关于golang分布式系统开发框架插件go-micro的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang分布式系统开发框架插件go-micro的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Go-Micro 分布式系统开发框架使用指南

Go-Micro 是一个强大的 Go 语言微服务框架,它提供了构建分布式系统所需的核心组件。下面我将详细介绍 Go-Micro 的核心功能和使用方法。

1. 安装与初始化

首先安装 Go-Micro:

go get github.com/asim/go-micro/v3

2. 创建微服务

基本服务示例

package main

import (
	"context"
	"fmt"
	"log"
	"time"

	"github.com/asim/go-micro/v3"
	"github.com/asim/go-micro/v3/server"
)

// 定义服务处理程序
type Greeter struct{}

func (g *Greeter) Hello(ctx context.Context, req *string, rsp *string) error {
	*rsp = fmt.Sprintf("Hello, %s!", *req)
	return nil
}

func main() {
	// 创建新服务
	service := micro.NewService(
		micro.Name("greeter"),
		micro.Version("latest"),
		micro.RegisterTTL(time.Second*30),
		micro.RegisterInterval(time.Second*10),
	)

	// 初始化服务
	service.Init()

	// 注册处理器
	if err := micro.RegisterHandler(service.Server(), new(Greeter)); err != nil {
		log.Fatal(err)
	}

	// 运行服务
	if err := service.Run(); err != nil {
		log.Fatal(err)
	}
}

3. 服务发现与调用

服务调用示例

package main

import (
	"context"
	"fmt"
	"log"

	"github.com/asim/go-micro/v3"
	"github.com/asim/go-micro/v3/client"
)

func main() {
	// 创建服务客户端
	service := micro.NewService(micro.Name("greeter.client"))
	service.Init()

	// 创建客户端
	greeter := service.Client().NewRequest(
		"greeter",          // 服务名
		"Greeter.Hello",    // 方法名
		"World",            // 请求参数
		client.WithContentType("application/json"),
	)

	// 声明响应变量
	var response string

	// 调用服务
	if err := service.Client().Call(context.Background(), greeter, &response); err != nil {
		log.Fatal(err)
	}

	fmt.Println(response) // 输出: Hello, World!
}

4. 发布/订阅模式

发布消息

package main

import (
	"context"
	"log"
	"time"

	"github.com/asim/go-micro/v3"
)

func main() {
	service := micro.NewService(micro.Name("publisher"))
	service.Init()

	// 创建发布者
	publisher := micro.NewEvent("events", service.Client())

	// 发布消息
	if err := publisher.Publish(context.Background(), &Event{
		Id:        "123",
		Timestamp: time.Now().Unix(),
		Message:   "Hello from publisher",
	}); err != nil {
		log.Fatal(err)
	}
}

type Event struct {
	Id        string
	Timestamp int64
	Message   string
}

订阅消息

package main

import (
	"context"
	"log"

	"github.com/asim/go-micro/v3"
	"github.com/asim/go-micro/v3/event"
)

func main() {
	service := micro.NewService(micro.Name("subscriber"))
	service.Init()

	// 注册订阅者
	if err := micro.RegisterSubscriber("events", service.Server(), new(Subscriber)); err != nil {
		log.Fatal(err)
	}

	if err := service.Run(); err != nil {
		log.Fatal(err)
	}
}

type Subscriber struct{}

func (s *Subscriber) Process(ctx context.Context, event *Event) error {
	log.Printf("Received event: %+v", event)
	return nil
}

5. 中间件使用

添加中间件

package main

import (
	"context"
	"log"

	"github.com/asim/go-micro/v3"
	"github.com/asim/go-micro/v3/server"
)

func main() {
	// 创建服务
	service := micro.NewService(
		micro.Name("greeter"),
		micro.WrapHandler(loggingWrapper),
	)

	service.Init()
	
	// 注册处理器
	if err := service.Server().Handle(
		service.Server().NewHandler(new(Greeter)),
	); err != nil {
		log.Fatal(err)
	}

	if err := service.Run(); err != nil {
		log.Fatal(err)
	}
}

// 日志中间件
func loggingWrapper(fn server.HandlerFunc) server.HandlerFunc {
	return func(ctx context.Context, req server.Request, rsp interface{}) error {
		log.Printf("Before serving request: %s", req.Method())
		err := fn(ctx, req, rsp)
		log.Printf("After serving request: %s", req.Method())
		return err
	}
}

6. 配置管理

package main

import (
	"log"

	"github.com/asim/go-micro/v3"
	"github.com/asim/go-micro/v3/config"
)

func main() {
	// 创建服务
	service := micro.NewService(micro.Name("config-demo"))
	
	// 初始化配置
	if err := config.LoadFile("./config.json"); err != nil {
		log.Fatal(err)
	}

	// 获取配置值
	dbHost := config.Get("database", "host").String("localhost")
	log.Printf("Database host: %s", dbHost)
}

7. 健康检查

package main

import (
	"log"

	"github.com/asim/go-micro/v3"
	"github.com/asim/go-micro/v3/health"
)

func main() {
	service := micro.NewService(micro.Name("health-demo"))
	service.Init()

	// 添加健康检查
	h := health.NewChecker()
	h.AddChecker("database", func() error {
		// 实现数据库健康检查逻辑
		return nil
	})

	// 注册健康检查
	if err := health.Register(service.Server(), h); err != nil {
		log.Fatal(err)
	}

	if err := service.Run(); err != nil {
		log.Fatal(err)
	}
}

最佳实践

  1. 服务命名:使用有意义的服务名称,遵循命名规范
  2. 错误处理:始终检查并处理错误
  3. 超时设置:为远程调用设置合理的超时
  4. 日志记录:记录关键操作和错误
  5. 监控:集成监控工具跟踪服务性能
  6. 版本控制:使用语义化版本控制服务

Go-Micro 提供了构建强大分布式系统所需的所有工具,通过合理使用其组件,可以轻松实现服务发现、负载均衡、消息传递等分布式系统核心功能。

回到顶部