golang多平台应用部署托管解决方案插件库go-furnace的使用

Golang多平台应用部署托管解决方案插件库go-furnace的使用

简介

Furnace是一个用于AWS CloudFormation、Google Cloud Platform或DigitalOcean托管的Golang解决方案。它利用AWS CloudFormation和CodeDeploy,或GCP的DeploymentManager和Git支持,将应用程序部署到健壮、自愈、冗余的环境中。

Logo

主要特性

  • 支持AWS、GCP和DigitalOcean多平台部署
  • 轻量级配置
  • 插件系统支持自定义扩展
  • 独立的二进制文件,减小体积
  • 与Terraform相比更轻量

安装

安装所有二进制文件

# 下载/克隆最新版本
# 进入go-furnace目录
make install-all

这将安装所有依赖项和二进制文件到$GOPATH/bin目录。

构建命令

# 从根目录运行make
make

为不同环境构建

make linux
make windows

插件系统

Furnace通过HashiCorp的Go-Plugins提供了一个高度可定制的插件系统。插件使用gRPC与Furnace进行本地通信。

插件配置

在yaml文件中配置插件路径:

plugins:
  plugin_path: "./plugins"

如果未提供,默认值为./plugins

插件类型

支持以下事件的插件:

  1. 创建堆栈前:可以停止创建过程
  2. 创建堆栈后:例如发送通知
  3. 删除堆栈前:可以中止删除
  4. 删除堆栈后:例如清理资源

Go插件示例(Slack通知)

package main

import (
	"log"

	fplugins "github.com/go-furnace/go-furnace/furnace-aws/plugins"
	"github.com/go-furnace/sdk"
	"github.com/hashicorp/go-plugin"
)

// SlackPreCreate 实现了furnace PreCreate插件接口
type SlackPreCreate struct{}

// Execute 是插件入口点
func (SlackPreCreate) Execute(stackname string) bool {
	api := slack.New("YOUR_TOKEN_HERE")
	params := slack.PostMessageParameters{}
	channelID, timestamp, err := api.PostMessage("#general", fmt.Sprintf("Stack with name '%s' is Done.", stackname), params)
	if err != nil {
		fmt.Printf("%s\n", err)
		return
	}
	fmt.Printf("Message successfully sent to channel %s at %s", channelID, timestamp)
	return true
}

func main() {
	plugin.Serve(&plugin.ServeConfig{
		HandshakeConfig: fplugins.Handshake,
		Plugins: map[string]plugin.Plugin{
			"slack-furnace-precreate": &sdk.PreCreateGRPCPlugin{Impl: &SlackPreCreate{}},
		},
		GRPCServer: plugin.DefaultGRPCServer,
	})
}

Python插件示例

from concurrent import futures
import sys
import time

import grpc

import furnace_pb2
import furnace_pb2_grpc

from grpc_health.v1.health import HealthServicer
from grpc_health.v1 import health_pb2, health_pb2_grpc

class PreCreatePluginServicer(furnace_pb2_grpc.PreCreateServicer):
    """Implementation of PreCreatePlugin service."""

    def Execute(self, request, context):
        result = furnace_pb2.Proceed()
        result.failed = True

        return result

def serve():
    # 需要构建健康服务以与go-plugin配合工作
    health = HealthServicer()
    health.set("plugin", health_pb2.HealthCheckResponse.ServingStatus.Value('SERVING'))

    # 启动服务器
    server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
    furnace_pb2_grpc.add_PreCreateServicer_to_server(PreCreatePluginServicer(), server)
    health_pb2_grpc.add_HealthServicer_to_server(health, server)
    server.add_insecure_port('127.0.0.1:1234')
    server.start()

    # 输出信息
    print("1|1|tcp|127.0.0.1:1234|grpc")
    sys.stdout.flush()

    try:
        while True:
            time.sleep(60 * 60 * 24)
    except KeyboardInterrupt:
        server.stop(0)

if __name__ == '__main__':
    serve()

插件命名规则

  • PreCreate: *-furnace-precreate*
  • PostCreate: *-furnace-postcreate*
  • PreDelete: *-furnace-predelete*
  • PostDelete: *-furnace-postdelete*

独立二进制文件

为了减小二进制文件体积,Furnace为每个服务提供独立的二进制文件:

  • AWS: furnace-aws
  • GCP: furnace-gcp
  • DigitalOcean: furnace-do

示例应用

项目提供了一个示例应用在furnace-codedeploy-app文件夹中,以及模板文件在templates文件夹中。


更多关于golang多平台应用部署托管解决方案插件库go-furnace的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang多平台应用部署托管解决方案插件库go-furnace的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Go-Furnace: Golang多平台应用部署托管解决方案

Go-Furnace 是一个用于简化Golang应用多平台部署的开源工具库,它提供了一套统一的API来管理不同云平台和托管服务的部署流程。下面我将详细介绍它的使用方法和示例代码。

Go-Furnace 核心功能

  1. 支持多种云平台(AWS、GCP、Azure等)
  2. 简化部署流程
  3. 提供基础设施即代码(Infrastructure as Code)支持
  4. 多环境管理(开发、测试、生产)
  5. 自动化扩展和负载均衡配置

安装

go get github.com/go-furnace/go-furnace

基本使用示例

1. 初始化配置

package main

import (
	"github.com/go-furnace/go-furnace/config"
	"github.com/go-furnace/go-furnace/core"
)

func main() {
	// 加载配置文件
	config.LoadConfig("config.yaml")
	
	// 初始化部署引擎
	deployer := core.NewDeployer()
	
	// 执行部署
	err := deployer.Deploy()
	if err != nil {
		panic(err)
	}
}

2. 多平台部署示例

package main

import (
	"fmt"
	"github.com/go-furnace/go-furnace/core"
	"github.com/go-furnace/go-furnace/plugins/aws"
	"github.com/go-furnace/go-furnace/plugins/gcp"
)

func main() {
	// AWS 部署
	awsDeployer := aws.NewAWSDeployer()
	err := core.DeployWith(awsDeployer, "aws-config.json")
	if err != nil {
		fmt.Println("AWS部署失败:", err)
	}

	// GCP 部署
	gcpDeployer := gcp.NewGCPDeployer()
	err = core.DeployWith(gcpDeployer, "gcp-config.json")
	if err != nil {
		fmt.Println("GCP部署失败:", err)
	}
}

3. 基础设施即代码示例

package main

import (
	"github.com/go-furnace/go-furnace/core/terraform"
)

func main() {
	// 初始化Terraform配置
	tfConfig := terraform.Config{
		WorkingDir: "./infra",
		Variables: map[string]interface{}{
			"region":       "us-west-1",
			"instance_type": "t2.micro",
		},
	}

	// 应用基础设施
	err := terraform.Apply(tfConfig)
	if err != nil {
		panic(err)
	}

	// 部署应用
	deployer := core.NewDeployer()
	err = deployer.Deploy()
	if err != nil {
		panic(err)
	}
}

高级功能

1. 蓝绿部署

package main

import (
	"github.com/go-furnace/go-furnace/core/deploy/bluegreen"
	"github.com/go-furnace/go-furnace/plugins/aws"
)

func main() {
	awsDeployer := aws.NewAWSDeployer()
	bg := bluegreen.NewBlueGreenDeployer(awsDeployer)
	
	// 执行蓝绿部署
	err := bg.Deploy("my-app", "1.0.0")
	if err != nil {
		panic(err)
	}
}

2. 自动扩展配置

package main

import (
	"github.com/go-furnace/go-furnace/core/autoscale"
	"github.com/go-furnace/go-furnace/plugins/aws"
)

func main() {
	awsDeployer := aws.NewAWSDeployer()
	
	// 配置自动扩展
	asConfig := autoscale.Config{
		MinInstances:     2,
		MaxInstances:     10,
		CPUThreshold:     70,
		MemoryThreshold:  80,
		ScaleOutCooldown: 300,
		ScaleInCooldown:  300,
	}
	
	err := autoscale.Configure(awsDeployer, "my-app", asConfig)
	if err != nil {
		panic(err)
	}
}

配置文件示例

config.yaml 示例:

platform: aws
region: us-west-1
application:
  name: my-go-app
  version: 1.0.0
  runtime: go1.16
resources:
  cpu: 1024
  memory: 2048
  instances: 2
network:
  vpc: vpc-123456
  subnets:
    - subnet-123
    - subnet-456
environment:
  variables:
    DB_HOST: db.example.com
    DB_PORT: "5432"

最佳实践

  1. 环境分离:为开发、测试和生产环境使用不同的配置文件
  2. 版本控制:将基础设施配置和部署脚本纳入版本控制
  3. 持续集成:将Go-Furnace集成到CI/CD流水线中
  4. 监控集成:部署后配置监控和告警
  5. 回滚策略:实现自动回滚机制

总结

Go-Furnace为Golang应用提供了强大的多平台部署能力,通过统一的API简化了不同云平台的部署流程。它的插件式架构使得添加新平台支持变得容易,同时提供了基础设施即代码、蓝绿部署、自动扩展等高级功能。

对于需要跨多个云平台部署Golang应用的团队,Go-Furnace可以显著减少部署复杂度,提高部署的一致性和可靠性。

更多详细信息和高级用法,请参考Go-Furnace的官方文档和GitHub仓库。

回到顶部