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 tidy
和make 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
更多关于golang分布式系统运行时插件库micro的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
Go Micro 分布式系统运行时插件库使用指南
Micro 是一个强大的 Go 语言分布式系统开发框架,它提供了一组可插拔的组件用于构建微服务。下面我将详细介绍 Micro 的核心功能和使用方法。
安装 Micro
go get github.com/micro/micro/v3
核心组件
Micro 包含以下核心组件:
- Service - 微服务基础
- Client/Server - RPC 通信
- Broker - 异步消息
- Store - 数据存储
- Config - 配置管理
- 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),
)
}
最佳实践
- 服务命名:使用有意义的服务名称,如
user.service
或payment.service
- 错误处理:始终检查并处理错误
- 上下文传递:使用 context 传递请求级数据
- 日志记录:使用 Micro 的 logger 进行结构化日志记录
- 配置分离:将配置与代码分离,使用配置中心
总结
Micro 提供了一个完整的工具包来构建分布式系统,其主要优势包括:
- 模块化设计,可插拔组件
- 内置服务发现、消息传递、配置管理等功能
- 简单易用的 API
- 活跃的社区和丰富的插件生态系统
通过合理使用 Micro 的各种组件,可以快速构建出健壮、可扩展的分布式系统。
希望这份指南对你有所帮助!如需更深入的信息,可以参考 Micro 的官方文档和示例代码库。