golang微服务框架插件Microservice的创建与使用

Golang 微服务框架插件 Microservice 的创建与使用

安装

git clone ginhub.com/claygod/microservice
cd microservice
make build
make run

完成后在浏览器访问 localhost:8080

版本检查

git clone ginhub.com/claygod/microservice
cd microservice
make build
make version

git clone ginhub.com/claygod/microservice
cd microservice
make build
micro --version

端点

代码位于 /services/gateways/gatein/gatein.go

  • / - 欢迎处理器
  • /healthz/ready - 用于 SRE
  • /healthz - 用于 Kubernetes
  • /readyness - 用于 Kubernetes
  • /metrics - Prometheus 指标
  • /swagger - 生成 API 的 Swagger 文档
  • /public/v1/bar/:key - 公共路由(示例)

注意:来自外部负载均衡器的请求应该转发到 /public 而不是端点根路径。这样服务路由中的指标和其他私有信息对外部用户将不可访问。

使用

构建并运行 main.go

示例请求:

  • localhost:8080/public/v1/bar/one -> {"Data":"three"}
  • localhost:8080/public/v1/bar/secret -> 响应 404
  • localhost:8080/public/v1/bar/looooonnngggoooooggkkkeeyyyyyyy -> 响应 400 (无效)
  • localhost:8080/healthz/ready -> 前5分钟 - 503 之后 200 (示例)
  • localhost:8080/healthz -> 前5分钟 - 503 之后 200 (示例)
  • localhost:8080/readyness -> 响应 200
  • localhost:8080/swagger -> json-swagger

Swagger

应用程序启动后,第一次调用 /swagger 路由时,会重新生成 config/swagger.yaml 文件。

环境

在环境变量中添加 export GATE_IN_TITLE=Yo-ho-ho! 👍 然后在浏览器打开 http://localhost:8080/ 🎉

清洁架构

重要:按层分配架构实体

实体

路径 /domain

用例

路径 /usecases

接口

路径 /service

基础设施

路径 /app/config 和核心

配置

默认配置文件:

  • config/config.yaml

在命令行指定其他文件:

  • yourservice -config other.yaml

依赖

github.com/claygod/tools v0.1.2
github.com/dsbasko/go-cfg v1.2.0
github.com/go-playground/validator/v10 v10.22.1
github.com/google/uuid v1.3.0
github.com/julienschmidt/httprouter v1.3.0
github.com/pborman/getopt v1.1.0
github.com/prometheus/client_golang v1.11.1
github.com/savaki/swag v0.0.0-20170722173931-3a75479e44a3
sigs.k8s.io/yaml v1.4.0

github.com/BurntSushi/toml v1.3.2 // indirect
github.com/beorn7/perks v1.0.1 // indirect
github.com/caarlos0/env/v10 v10.0.0 // indirect
github.com/cespare/xxhash/v2 v2.1.1 // indirect
github.com/gabriel-vasile/mimetype v1.4.3 // indirect
github.com/go-playground/locales v0.14.1 // indirect
github.com/go-playground/universal-translator v0.18.1 // indirect
github.com/golang/protobuf v1.5.0 // indirect
github.com/joho/godotenv v1.5.1 // indirect
github.com/kr/text v0.2.0 // indirect
github.com/leodido/go-urn v1.4.0 // indirect
github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect
github.com/prometheus/client_model v0.2.0 // indirect
github.com/prometheus/common v0.26.0 // indirect
github.com/prometheus/procfs v0.6.0 // indirect
github.com/spf13/pflag v1.极好的代码示例!以下是一个完整的 Golang 微服务示例,使用 Microservice 框架:

```go
package main

import (
	"github.com/claygod/microservice"
	"github.com/julienschmidt/httprouter"
	"net/http"
)

func main() {
	// 创建新的微服务实例
	ms := microservice.New()
	
	// 添加自定义路由
	router := httprouter.New()
	
	// 自定义欢迎路由
	router.GET("/", func(w http.ResponseWriter, r *http.Request, _ httprouter.Params) {
		w.Write([]byte("Welcome to Microservice Demo!"))
	})
	
	// 示例API路由
	router.GET("/api/v1/hello/:name", func(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
		name := ps.ByName("name")
		w.Write([]byte("Hello " + name + "!"))
	})
	
	// 将自定义路由器添加到微服务
	ms.SetRouter(router)
	
	// 启动服务
	if err := ms.Run(); err != nil {
		panic(err)
	}
}

结论

Microservice 并不声称自己是唯一正确的解决方案,但在某些情况下,它可以帮助你创建自己的微服务架构,成为未来应用程序的原型。

给我们一颗星!

提示:如果你喜欢或正在使用这个项目来学习或启动你的解决方案,请给它一颗星。谢谢!

许可证

GNU GENERAL PUBLIC LICENSE Version 3

版权

Copyright © 2017-2025 Eduard Sesigin. 保留所有权利。联系方式: claygod@yandex.ru


更多关于golang微服务框架插件Microservice的创建与使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang微服务框架插件Microservice的创建与使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Golang微服务框架插件Microservice的创建与使用

Micro是一个轻量级的Go微服务框架,它提供了一系列工具和插件来简化微服务开发。下面我将介绍如何使用Micro框架创建和使用微服务插件。

1. 安装Micro

首先需要安装Micro框架:

go get github.com/micro/micro/v3

2. 创建基础微服务

创建一个简单的微服务:

package main

import (
	"context"
	"fmt"
	"log"

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

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() {
	// 创建新服务
	srv := service.New(
		service.Name("greeter"),
	)

	// 注册处理器
	srv.Handle(srv.Server().NewHandler(&Greeter{}))

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

3. 创建自定义插件

Micro允许你创建自定义插件来扩展功能。下面是一个日志插件的示例:

package logger

import (
	"context"
	"log"

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

type LogWrapper struct {
	server.Handler
}

func (l *LogWrapper) Process(ctx context.Context, req server.Request, rsp interface{}) error {
	log.Printf("Before call: %s", req.Endpoint())
	err := l.Handler.Process(ctx, req, rsp)
	log.Printf("After call: %s", req.Endpoint())
	return err
}

func NewLogWrapper(fn server.HandlerFunc) server.Handler {
	return &LogWrapper{fn}
}

// 注册为全局插件
func init() {
	server.RegisterHandlerWrapper(NewLogWrapper)
}

4. 使用内置插件

Micro提供了许多内置插件,比如:

使用Broker插件(消息队列)

package main

import (
	"context"
	"fmt"
	"time"

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

func main() {
	// 创建服务
	srv := service.New()

	// 订阅主题
	_, err := broker.Subscribe("example.topic", func(p broker.Event) error {
		fmt.Printf("Received message: %s\n", string(p.Message().Body))
		return nil
	})
	if err != nil {
		fmt.Println(err)
		return
	}

	// 发布消息
	go func() {
		for i := 0; i < 5; i++ {
			broker.Publish("example.topic", &broker.Message{
				Body: []byte(fmt.Sprintf("Message %d", i)),
			})
			time.Sleep(1 * time.Second)
		}
	}()

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

使用Registry插件(服务发现)

package main

import (
	"fmt"
	"time"

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

func main() {
	// 创建服务
	srv := service.New()

	// 列出所有服务
	go func() {
		for {
			services, err := registry.ListServices()
			if err != nil {
				fmt.Println(err)
				continue
			}

			for _, service := range services {
				fmt.Printf("Service: %s\n", service.Name)
			}

			time.Sleep(5 * time.Second)
		}
	}()

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

5. 插件配置

Micro支持通过配置文件或环境变量配置插件:

package main

import (
	"github.com/micro/micro/v3/service"
	"github.com/micro/micro/v3/service/config"
)

type Config struct {
	Host string `json:"host"`
	Port int    `json:"port"`
}

func main() {
	// 创建服务
	srv := service.New()

	// 加载配置
	var cfg Config
	if err := config.Get("myconfig").Scan(&cfg); err != nil {
		srv.Log().Fatalf("Error loading config: %v", err)
	}

	srv.Log().Infof("Config: %+v", cfg)
	
	// 运行服务
	if err := srv.Run(); err != nil {
		srv.Log().Fatal(err)
	}
}

6. 中间件插件

创建HTTP中间件插件:

package middleware

import (
	"net/http"

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

func AuthMiddleware(next http.Handler) http.Handler {
	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		// 验证逻辑
		if r.Header.Get("Authorization") == "" {
			http.Error(w, "Unauthorized", http.StatusUnauthorized)
			return
		}
		
		// 调用下一个处理器
		next.ServeHTTP(w, r)
	})
}

// 注册中间件
func init() {
	web.RegisterMiddleware(AuthMiddleware)
}

7. 最佳实践

  1. 插件设计原则

    • 保持插件单一职责
    • 提供清晰的接口
    • 支持可配置性
  2. 性能考虑

    • 避免插件中的阻塞操作
    • 使用缓存优化重复计算
    • 考虑插件的执行顺序
  3. 错误处理

    • 提供有意义的错误信息
    • 允许插件错误不影响主流程(可配置)

Micro框架的插件系统非常灵活,你可以根据需要创建各种类型的插件来扩展微服务功能。通过合理使用插件,可以大大提高微服务的可维护性和可扩展性。

回到顶部