golang多平台应用部署托管解决方案插件库go-furnace的使用
Golang多平台应用部署托管解决方案插件库go-furnace的使用
简介
Furnace是一个用于AWS CloudFormation、Google Cloud Platform或DigitalOcean托管的Golang解决方案。它利用AWS CloudFormation和CodeDeploy,或GCP的DeploymentManager和Git支持,将应用程序部署到健壮、自愈、冗余的环境中。
主要特性
- 支持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
。
插件类型
支持以下事件的插件:
- 创建堆栈前:可以停止创建过程
- 创建堆栈后:例如发送通知
- 删除堆栈前:可以中止删除
- 删除堆栈后:例如清理资源
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
更多关于golang多平台应用部署托管解决方案插件库go-furnace的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
Go-Furnace: Golang多平台应用部署托管解决方案
Go-Furnace 是一个用于简化Golang应用多平台部署的开源工具库,它提供了一套统一的API来管理不同云平台和托管服务的部署流程。下面我将详细介绍它的使用方法和示例代码。
Go-Furnace 核心功能
- 支持多种云平台(AWS、GCP、Azure等)
- 简化部署流程
- 提供基础设施即代码(Infrastructure as Code)支持
- 多环境管理(开发、测试、生产)
- 自动化扩展和负载均衡配置
安装
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"
最佳实践
- 环境分离:为开发、测试和生产环境使用不同的配置文件
- 版本控制:将基础设施配置和部署脚本纳入版本控制
- 持续集成:将Go-Furnace集成到CI/CD流水线中
- 监控集成:部署后配置监控和告警
- 回滚策略:实现自动回滚机制
总结
Go-Furnace为Golang应用提供了强大的多平台部署能力,通过统一的API简化了不同云平台的部署流程。它的插件式架构使得添加新平台支持变得容易,同时提供了基础设施即代码、蓝绿部署、自动扩展等高级功能。
对于需要跨多个云平台部署Golang应用的团队,Go-Furnace可以显著减少部署复杂度,提高部署的一致性和可靠性。
更多详细信息和高级用法,请参考Go-Furnace的官方文档和GitHub仓库。