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)
}
}
最佳实践
- 服务命名:使用有意义的服务名称,遵循命名规范
- 错误处理:始终检查并处理错误
- 超时设置:为远程调用设置合理的超时
- 日志记录:记录关键操作和错误
- 监控:集成监控工具跟踪服务性能
- 版本控制:使用语义化版本控制服务
Go-Micro 提供了构建强大分布式系统所需的所有工具,通过合理使用其组件,可以轻松实现服务发现、负载均衡、消息传递等分布式系统核心功能。