golang分布式系统运行时插件库micro的使用

Golang分布式系统运行时插件库Micro的使用

Micro是一个用于Go微服务开发的工具包,它为构建云服务提供了基础框架。

安装CLI

通过go get安装micro:

go get github.com/micro/micro/v5@latest

或者使用安装脚本:

wget -q https://raw.githubusercontent.com/micro/micro/master/scripts/install.sh -O - | /bin/bash

创建服务

创建一个新服务(所有设置都是自动的!):

micro new helloworld

这会:

  • helloworld目录中创建新服务
  • 自动为你运行go mod tidymake proto
  • 显示更新后的项目树,包括生成的文件
  • 如果未安装protoc会发出警告,并提供安装说明

运行服务

运行服务:

micro run

列出服务查看它是否正在运行并已注册自己:

micro services

描述服务

描述服务以查看可用端点:

micro describe helloworld

输出示例:

{
    "name": "helloworld",
    "version": "latest",
    "metadata": null,
    "endpoints": [
        {
            "request": {
                "name": "Request",
                "type": "Request",
                "values": [
                    {
                        "name": "name",
                        "type": "string",
                        "values": null
                    }
                ]
            },
            "response": {
                "name": "Response",
                "type": "Response",
                "values": [
                    {
                        "name": "msg",
                        "type": "string",
                        "values": null
                    }
                ]
            },
            "metadata": {},
            "name": "Helloworld.Call"
        }
    ],
    "nodes": [
        {
            "metadata": {
                "broker": "http",
                "protocol": "mucp",
                "registry": "mdns",
                "server": "mucp",
                "transport": "http"
            },
            "id": "helloworld-31e55be7-ac83-4810-89c8-a6192fb3ae83",
            "address": "127.0.0.1:39963"
        }
    ]
}

调用服务

通过RPC端点调用:

micro call helloworld Helloworld.Call '{"name": "Asim"}'

通过动态CLI映射调用:

micro helloworld call --name=Asim

创建客户端

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

package main

import (
        "context"
        "fmt"

        "go-micro.dev/v5"
)

type Request struct {
        Name string
}

type Response struct {
        Message string
}

func main() {
        client := micro.New("helloworld").Client()

        req := client.NewRequest("helloworld", "Helloworld.Call", &Request{Name: "John"})

        var rsp Response

        err := client.Call(context.TODO(), req, &rsp)
        if err != nil {
                fmt.Println(err)
                return
        }

        fmt.Println(rsp.Message)
}

Protobuf

使用protoc-gen-micro进行代码生成。

服务器

micro服务器是一个API和Web仪表板,为查看和查询服务提供固定入口点。

运行它:

micro server

API端点

API为调用服务提供固定的HTTP入口点:

curl http://localhost:8080/api/helloworld/Helloworld/Call -d '{"name": "John"}'

Web仪表板

Web仪表板提供了一个现代化的安全UI来管理和探索你的Micro服务。主要功能包括:

  • 动态服务和端点表单:浏览所有注册的服务和端点。为每个端点生成动态表单,便于测试和探索。
  • API文档/api页面列出所有可用的服务和端点,带有请求/响应模式和快速导航的侧边栏。
  • JWT认证:所有登录和令牌管理都使用自定义JWT实用程序。
  • 令牌管理/auth/tokens页面允许你生成、查看和复制JWT令牌。
  • 用户管理/auth/users页面允许你创建、列出和删除用户。
  • 现代UI:干净、响应式的设计,改进了表单和按钮样式,提供更好的用户体验。
  • 日志和状态:直接从仪表板查看服务日志和状态(PID、运行时间等)。

要开始使用,运行:

micro server

然后浏览到localhost:8080并使用默认管理员帐户(admin/micro)登录。


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

1 回复

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


Go Micro 分布式系统运行时插件库使用指南

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

安装 Micro

go get github.com/micro/micro/v3

核心组件

Micro 包含以下核心组件:

  1. Service - 微服务基础
  2. Client/Server - RPC 通信
  3. Broker - 异步消息
  4. Store - 数据存储
  5. Config - 配置管理
  6. Registry - 服务发现

基本使用示例

1. 创建微服务

package main

import (
	"context"
	"fmt"
	"time"

	"github.com/micro/micro/v3/service"
	"github.com/micro/micro/v3/service/logger"
)

type Greeter struct{}

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

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

	// 注册处理器
	srv.Handle(new(Greeter))

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

2. 调用服务

package main

import (
	"context"
	"fmt"

	"github.com/micro/micro/v3/client"
	"github.com/micro/micro/v3/service/logger"
)

func main() {
	// 创建客户端
	greeter := client.NewClient().NewRequest(
		"greeter", 
		"Greeter.Hello", 
		"John",
	)

	var response string
	
	// 调用服务
	if err := client.Call(context.Background(), greeter, &response); err != nil {
		logger.Fatal(err)
	}

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

高级功能

1. 使用 Pub/Sub

// 发布消息
func publishEvent() {
	broker := micro.NewBroker()
	if err := broker.Connect(); err != nil {
		logger.Fatal(err)
	}

	msg := &broker.Message{
		Header: map[string]string{
			"type": "user.created",
		},
		Body: []byte(`{"id": "123", "name": "John"}`),
	}

	if err := broker.Publish("user.events", msg); err != nil {
		logger.Fatal(err)
	}
}

// 订阅消息
func subscribeEvents() {
	broker := micro.NewBroker()
	if err := broker.Connect(); err != nil {
		logger.Fatal(err)
	}

	_, err := broker.Subscribe("user.events", func(p broker.Event) error {
		fmt.Printf("Received event: %s, Body: %s\n", p.Topic(), string(p.Message().Body))
		return nil
	})
	
	if err != nil {
		logger.Fatal(err)
	}
}

2. 使用服务发现

func listServices() {
	registry := micro.NewRegistry()
	
	services, err := registry.ListServices()
	if err != nil {
		logger.Fatal(err)
	}

	for _, service := range services {
		fmt.Println("Service:", service.Name)
		nodes, err := registry.GetService(service.Name)
		if err != nil {
			continue
		}
		for _, node := range nodes {
			fmt.Printf(" - Node: %s:%d\n", node.Address, node.Port)
		}
	}
}

3. 使用配置中心

func useConfig() {
	config := micro.NewConfig()
	
	// 设置配置
	config.Set("app.name", "myapp")
	
	// 获取配置
	name := config.Get("app.name").String("default")
	fmt.Println("App name:", name)
}

插件系统

Micro 的强大之处在于其插件系统,可以轻松替换各个组件:

import (
	"github.com/micro/go-plugins/registry/consul/v3"
	"github.com/micro/go-plugins/broker/rabbitmq/v3"
)

func main() {
	// 使用 Consul 作为注册中心
	registry := consul.NewRegistry()
	
	// 使用 RabbitMQ 作为消息代理
	broker := rabbitmq.NewBroker()
	
	// 创建服务时指定插件
	service := micro.NewService(
		micro.Registry(registry),
		micro.Broker(broker),
	)
}

最佳实践

  1. 服务命名:使用有意义的服务名称,如 user.servicepayment.service
  2. 错误处理:始终检查并处理错误
  3. 上下文传递:使用 context 传递请求级数据
  4. 日志记录:使用 Micro 的 logger 进行结构化日志记录
  5. 配置分离:将配置与代码分离,使用配置中心

总结

Micro 提供了一个完整的工具包来构建分布式系统,其主要优势包括:

  • 模块化设计,可插拔组件
  • 内置服务发现、消息传递、配置管理等功能
  • 简单易用的 API
  • 活跃的社区和丰富的插件生态系统

通过合理使用 Micro 的各种组件,可以快速构建出健壮、可扩展的分布式系统。

希望这份指南对你有所帮助!如需更深入的信息,可以参考 Micro 的官方文档和示例代码库。

回到顶部