分享一个小工具 Boast:如何从服务端跟踪所有 HTTP 请求,并方便回放?

dcb9 发表了文章 • 0 个评论 • 183 次浏览 • 2017-03-31 16:17 • 来自相关话题

原文链接:http://blog.phpor.me/note/2017/03/31/track-and-replay-http-request.html
客户端工程师:“xxx 接口坏了,我的程序都没动过”,后端经常会收到这样的质问,但是我们现在如何重现这个问题?有以下几种情况:


一、后端测试了一下发现没有问题


“我这里测试了是好的啊”,就只能让客户端工程师再操作一遍,亲眼看到错误之后就肯定是有问题了,就得去找问题,这时候这台手机,以及这台手机里面的数据都非常重要,因为这些数据可以让 Bug 重现。


二、测试了也有问题


这时候后端就去修改程序了,但是每一次的测试是否有问题都需要在客户端中操作,有时候的操作非常的复杂,在这上面花的时间会比较多。最后使了各种神通才终于找到问题,原来是这个用户的某某数据有异常才会出现这种情况。


以上这种情况屡见不鲜,最麻烦的点就在于,每次都要以出现 Bug 的相同参数去请求,有时候你知道这些请求的参数,可以把它们放到 Postman 这种工具里面,但大部分时候你并不知道它对应的参数 (token)


如果我们可以在服务端跟踪所有的请求:接口地址,Header,Body,后端返回的 Header、Body,这样我们就能查到对应的请求参数和返回值,可以直接填到 Postman 里面,要是还能一键重新请求就好了,因为我们不想修改请求的参数,只是想再以相同的参数请求一遍,这样我们来调试对应的程序。


正好以前用过 ngrok,发现它有一个非常好的 debug 界面,可以达到以上的要求,但现在不需要它的内网穿透功能,于是只能自己写一个程序,只包含以下功能:



  • 记录接口所有的 Request 和 Response

  • 可以一键重新请求某个 Request


基本工作原理


HTTP 客户端                   Boast                       Web 服务器
| GET http://localhost:8080/ | 记录请求并进行反向代理 | Response 200 OK
| ---------------------------> | --------------------------> | ------┐
| | | |
| | 记录返回信息并转发给客户端 | <----┘
| <--------------------------- | <-------------------------- |

┌----------------------------------------------------------------------------┐
| url: http://localhost:8081 |
| ---------------------------------------------------------------------------|
| All Transactions ┌ - - - - - - - - - - - - - - - - - - - - - - - ┐ |
| ---------------------- | time: 10 hours ago Client: 127.0.0.1 | |
| |GET / 200 OK 100 ms | | | |
| ---------------------- | Request [ Replay ] | |
| | - - - - - - - - - - - - | |
| | GET http://localhost/ HTTP/1.1 | |
| | User-Agent: curl/7.51.0 | |
| | Accept: */* | |
| | | |
| | Response | |
| | - - - - - - - - - - - - | |
| | HTTP/1.1 200 OK | |
| | X-Server: HTTPLab | |
| | Date: Thu, 02 Mar 2017 02:25:27 GMT | |
| | Content-Length: 13 | |
| | Content-Type: text/plain; charset=utf-8 | |
| | | |
| | Hello, World | |
| └ - - - - - - - - - - - - - - - - - - - - - - - ┘ |
| |
└----------------------------------------------------------------------------┘

最近正在学习 Go,正好拿它来完成这个小程序,取名为 Boast 为了让我们在重现 Bug 上更为主动和方便,以及更快地修复,好多花点时间来造轮子!


Boast 项目地址


Go 和前端都是现学现卖,欢迎大家拍砖。

beego1.8的文档还没更新么?

回复

kaixinmao 发起了问题 • 1 人关注 • 0 个回复 • 260 次浏览 • 2017-03-23 10:31 • 来自相关话题

Gitea 发布 v1.1 版本,支持Git-LFS,两步验证,MSSQL,Github登录等大量改进

lunny 发表了文章 • 0 个评论 • 236 次浏览 • 2017-03-10 10:20 • 来自相关话题

我们很高兴的宣布Gitea 发布了 1.1.0 版本。在这个版本中,我们关闭了 查看全部

我们很高兴的宣布Gitea 发布了 1.1.0 版本。在这个版本中,我们关闭了 126 工单,同时合并了 348 合并请求。你可以从 下载页面 根据你所处的平台和架构下载预编译版本。更多安装详情请参考 安装向导



Changelog



  • BREAKING

    • The SSH keys can potentially break, make sure to regenerate the authorized keys


  • FEATURE

    • Git LFSv2 support #122

    • API endpoints for repo watching #191

    • Search within private repos #222

    • Hide user email address on explore page #336

    • Protected branch system #339

    • Sendmail for mail delivery #355

    • API endpoints for org webhooks #372

    • Enabled MSSQL support #383

    • API endpoints for org teams #370

    • API endpoints for collaborators #375

    • Graceful server restart #416

    • Commitgraph / timeline on commits page #428

    • API endpoints for repo forks #509

    • API endpoints for releases #510

    • Folder jumping #511

    • Stars tab on profile page #519

    • Notification system #523

    • Push and pull through reverse proxy basic auth #524

    • Search for issues and pull requests #530

    • API endpoint for stargazers #597

    • API endpoints for subscribers #598

    • PID file support #610

    • Two factor authentication (2FA) #630

    • API endpoints for org users #645

    • Release attachments #673

    • OAuth2 consumer #679

    • Add ability to fork your own repos #761

    • Search repository on dashboard #773

    • Search bar on user profile #787

    • Track label changes on issue view #788

    • Allow using custom time format #798

    • Redirects for renamed repos #807

    • Track assignee changes on issue view #808

    • Track title changes on issue view #841

    • Archive cleanup action #885

    • Basic Open Graph support #901

    • Take back control of Git hooks #1006

    • API endpoints for user repos #1059


  • BUGFIXES

    • Fixed counting issues for issue filters #413

    • Added back default settings for SSH #500

    • Fixed repo permissions #513

    • Issues cannot be created with labels #622

    • Add a reserved wiki paths check to the wiki #720

    • Update website binding MaxSize to 255 #722

    • User can see the private activity on public history #818

    • Wrong pages number which includes private repositories #844

    • Trim whitespaces for search keyword #893

    • Don't rewrite non-gitea public keys #906

    • Use fingerprint to check instead content for public key #911

    • Fix random avatars #1147


  • ENHANCEMENT

    • Refactored process manager #75

    • Restrict rights to create new orgs #193

    • Added label and milestone sorting #199

    • Make minimum password length configurable #223

    • Speedup conflict checking on pull requests #276

    • Added button to delete merged pull request branches #441

    • Improved issue references within markdown #471

    • Dutch translation for the landingpage #487

    • Added Gogs migration script #532

    • Support a .gitea folder for issue templates #582

    • Enhanced diff-view coloring #584

    • Added ETag header to avatars #721

    • Added option to config to disable local path imports #724

    • Allow custom public files #782

    • Added pprof endpoint for debugging #801

    • Added X-GitHub-* headers #809

    • Fill SSH key title automatically #863

    • Display Git version on admin panel #921

    • Expose URL field on issue API #982

    • Statically compile the binaries #985

    • Embed build tags into version string #1051

    • Gitignore support for FSharp and Clojure #1072

    • Custom templates for static builds #1087

    • Add ProxyFromEnvironment if none set #1096


  • MISC

    • Replaced remaining Gogs references

    • Added more tests on various packages

    • Use Crowdin for translations again

    • Resolved some XSS attack vectors

    • Optimized and reduced number of database queries


72行实现个简单的MapReduce

回复

myml 发起了问题 • 2 人关注 • 0 个回复 • 315 次浏览 • 2017-02-28 15:30 • 来自相关话题

FFToast:GitHub中最强大的iOS Notification和AlertView框架,没有之一!

imlifengfeng 发表了文章 • 0 个评论 • 222 次浏览 • 2017-02-27 00:03 • 来自相关话题


GitHub地址:https://github.com/imlifengfeng/FFToast


中文使用说明


FFToast是一个非常强大的iOS message notifications和AlertView扩展。它可以很容易实现从屏幕顶部、屏幕底部和屏幕中间弹出一个通知。你可以很容易的自定义弹出的View.


要求



  • 支持iOS 8或更高版本

  • 支持ARC


特点



  • 简单易用

  • 可以很容易自定义


安装


CocoaPods


要使用CocoaPods安装FFToast,请将其集成到您现有的Podfile中,或创建一个新的Podfile:


target 'MyApp' do
pod 'FFToast'
end

然后 pod install.


手动


将FFToast文件夹添加到项目中


使用方法


#import <FFToast/FFToast.h>

你可以通过调用下面的方法创建一个显示在顶部的默认效果的消息通知:


/**
创建并显示一个Toast

@param title 标题
@param message 消息内容
@param iconImage 消息icon,toastType不为FFToastTypeDefault时iconImage为空仍然会有相应icon
@param duration 显示时长
*/
+ (void)showToastWithTitle:(NSString *)title message:(NSString *)message iconImage:(UIImage*)iconImage duration:(NSTimeInterval)duration toastType:(FFToastType)toastType;

其中的toastType:


typedef NS_ENUM(NSInteger, FFToastType) {

//灰色背景、无图标
FFToastTypeDefault = 0,
//绿色背景+成功图标
FFToastTypeSuccess = 1,
//红色背景+错误图标
FFToastTypeError = 2,
//橙色背景+警告图标
FFToastTypeWarning = 3,
//灰蓝色背景+信息图标
FFToastTypeInfo = 4,

};

例如:


[FFToast showToastWithTitle:@"标题" message:@"消息内容......." iconImage:[UIImage imageNamed:@"test"] duration:3 toastType:FFToastTypeDefault];

标题(title)、消息内容(message)、图标(iconImage)均可以为nil,FFToast会根据具体的内容进行自适应。


如果想在状态栏下方、屏幕下方或者屏幕中间显示消息通知,可以通过设置一些属性实现。
设置显示位置:


typedef NS_ENUM(NSInteger, FFToastPosition) {

//显示在屏幕顶部
FFToastPositionDefault = 0,
//显示在状态栏下方
FFToastPositionBelowStatusBar = 1,
//显示在状态栏下方+圆角+左右边距
FFToastPositionBelowStatusBarWithFillet = 2,
//显示在屏幕底部
FFToastPositionBottom = 3,
//显示在屏幕底部+圆角
FFToastPositionBottomWithFillet = 4,
//显示在屏幕中间
FFToastPositionCentre = 5,
//显示在屏幕中间+圆角
FFToastPositionCentreWithFillet = 6

};

其他的一些属性:


//背景颜色
@property (strong, nonatomic) UIColor* toastBackgroundColor;
//Toast标题文字颜色
@property (strong, nonatomic) UIColor* titleTextColor;
//Toast内容文字颜色
@property (strong, nonatomic) UIColor* messageTextColor;

//Toast标题文字字体
@property (strong, nonatomic) UIFont* titleFont;
//Toast文字字体
@property (strong, nonatomic) UIFont* messageFont;

//Toast View圆角
@property(assign,nonatomic)CGFloat toastCornerRadius;
//Toast View透明度
@property(assign,nonatomic)CGFloat toastAlpha;

//Toast显示时长
@property(assign,nonatomic)NSTimeInterval duration;
//Toast消失动画是否启用
@property(assign,nonatomic)BOOL dismissToastAnimated;

//Toast显示位置
@property (assign, nonatomic) FFToastPosition toastPosition;
//Toast显示类型
@property (assign, nonatomic) FFToastType toastType;

//是否自动隐藏,autoDismiss、enableDismissBtn、dismissBtnImage三个属性仅对从屏幕中间弹出的Toast有效
@property(assign,nonatomic)BOOL autoDismiss;
//是否在右上角显示隐藏按钮
@property(assign,nonatomic)BOOL enableDismissBtn;
//隐藏按钮的图标
@property (strong, nonatomic) UIImage* dismissBtnImage;

设置完属性后,就可以调用下面方法将其显示出来:


/**
显示一个Toast
*/
- (void)show;

或者:


/**
显示一个Toast

@param handler Toast点击回调
*/
- (void)show:(handler)handler;

例如:


FFToast *toast = [[FFToast alloc]initToastWithTitle:@"标题" message:@"消息内容......." iconImage:[UIImage imageNamed:@"fftoast_info"]];
toast.toastPosition = FFToastPositionBelowStatusBarWithFillet;
toast.toastBackgroundColor = [UIColor colorWithRed:75.f/255.f green:107.f/255.f blue:122.f/255.f alpha:1.f];
[toast show:^{
//点击消息通知时调用
}];//[toast show];

如果你想自定义一个从中间弹出的Toast,可以调用下面的方法:


/**
在中间显示一个自定义Toast

@param customToastView 自定义的ToastView
@param autoDismiss 是否自动隐藏
@param duration 显示时长(autoDismiss = NO时该参数将无效)
@param enableDismissBtn 是否显示隐藏按钮
@param dismissBtnImage 隐藏按钮图片(enableDismissBtn = NO时该参数将无效)
@return Toast
*/
- (instancetype)initCentreToastWithView:(UIView *)customToastView autoDismiss:(BOOL)autoDismiss duration:(NSTimeInterval)duration enableDismissBtn:(BOOL)enableDismissBtn dismissBtnImage:(UIImage*)dismissBtnImage;

你在自定义从中间弹出的Toast时,你可以将上面的参数autoDismiss和参数enableDismissBtn设为NO。然后在你自定义的View中自己在合适的位置添加一个关闭按钮。
关闭从中间弹出的Toast,可以调用下面的方法:


/**
隐藏一个Toast
*/
- (void)dismissCentreToast;

顶部、底部弹出的Toast不可自定义View,但是对于iconImage、Title、message均可以根据需要设置并且可以为nil,最终Toast会根据具体的内容进行自适应。


隐藏消息通知:
默认3秒后自动消失,向上滑动弹出的消息通知它也会消失。


关于


作者:
imlifengfeng

微博:
@imlifengfeng


许可


该项目在 MIT 许可协议下使用. 有关详细信息,请参阅 LICENSE .

一些用golang开发的存储项目

回复

lei 发起了问题 • 1 人关注 • 0 个回复 • 363 次浏览 • 2017-02-21 11:57 • 来自相关话题

处理文件上传的工具包 - fuh

lyric 发表了文章 • 0 个评论 • 215 次浏览 • 2017-02-19 11:17 • 来自相关话题

处理文件上传的工具包 - fuh

在平时web开发过程中,总会遇到处理文件上传的场景,每次的处理方式都是以业务为导向进行处理。现在作者就把这一... 查看全部

处理文件上传的工具包 - fuh


在平时web开发过程中,总会遇到处理文件上传的场景,每次的处理方式都是以业务为导向进行处理。现在作者就把这一块单独抽离出来,做成了一个简单的工具包。主要特点是:



  • 支持自定义文件存储

  • 支持自定义文件名

  • 支持自定义文件大小限制


引入简单,方便,欢迎来拍砖!谢谢!


$ go get github.com/LyricTian/fuh

package main

import (
"encoding/json"
"net/http"

"github.com/LyricTian/fuh"
)

func main() {
http.HandleFunc("/fileupload", func(w http.ResponseWriter, r *http.Request) {
finfo, err := fuh.Upload(r, "file", nil, nil)
if err != nil {
w.WriteHeader(http.StatusBadRequest)
return
}
json.NewEncoder(w).Encode(finfo)
})

http.ListenAndServe(":8080", nil)
}

gmcache一个用go写的分布式缓存,类似memcached

stirlingx 发表了文章 • 0 个评论 • 350 次浏览 • 2017-01-19 16:01 • 来自相关话题

主要是用来练手的,欢迎大家仍砖头

  • 使用ectd做服务发现
  • broker作为代理服务器,对client的请求做转发,用一致性hash算法对key映射到后端gmcache。

项目地... 查看全部

主要是用来练手的,欢迎大家仍砖头



  • 使用ectd做服务发现

  • broker作为代理服务器,对client的请求做转发,用一致性hash算法对key映射到后端gmcache。


项目地址:


https://github.com/liyue201/gmcache


Gmcache


A distributed key/value memory cache written in go.


Features



  • Light weight

  • Pure golang

  • Supports set,get and delete

  • Supports grpc and http protocols

  • Scalable architecture


Architecture


gmcache-cluster

beegoapix - beego api extension

luffyke 发表了文章 • 0 个评论 • 256 次浏览 • 2017-01-18 15:43 • 来自相关话题

简介

beegoapix是一个beego API开发框架,用于快速开发API服务。

安装

go get github.com/lu... 			查看全部
					

简介


beegoapix是一个beego API开发框架,用于快速开发API服务。


安装


go get github.com/luffyke/beegoapix

功能



  1. 统一API请求处理和返回(v0.1)

  2. 统一日志处理(v0.1)

  3. 异常控制(v0.1)

  4. API版本控制(v0.2)

  5. API权限控制(v0.2)

  6. 组合接口

  7. 接口缓存

  8. 自定义请求


示例


首先确保安装beego和bee工具。


新建Api项目


bee api hello

编辑router.go,添加api路由


package routers

import (
"hello/controllers"
"github.com/luffyke/beegoapix"
)

func init() {
beegoapix.Router()
// add your business path mapping
beegoapix.RegController("app", controllers.AppController{})
}

实现业务controller


package controllers

import (
"github.com/luffyke/beegoapix/api"

"github.com/astaxie/beego/logs"
)

type AppController struct {
}

func (this *AppController) CheckVersion(request api.ApiRequest) (response api.ApiResponse) {
logs.Debug(request.Id)
logs.Debug(request.Data["versionCode"])
response.Data = make(map[string]interface{})
response.Data["versionName"] = "version name 1.0"
return response
}

运行服务


bee run

测试请求


http://localhost:8080/v1/app/check-version

请求示例


{
"id":"12345678",
"sign":"abc",
"client":{
"caller":"app",
"os":"android",
"ver":"1.0",
"platform":"android",
"ch":"offical",
"ex":{
"imei":"1a2b3c"
}
},
"page":{
"page":1,
"size":10
},
"user":{
"uid":"123",
"sid":"abc"
},
"data":{
"versionCode":"v1.0.0"
}
}

返回

{
"state": {
"code": 0,
"msg": ""
},
"data": {
"versionName": "version name 1.0"
}
}

Android 示例


参考项目 beegoapix-android-demo

go-workerpool 支持每分钟百万并发的抽象原型

qianguozheng 发表了文章 • 0 个评论 • 265 次浏览 • 2017-01-14 23:15 • 来自相关话题

使用 Golang 实现了一个简单的消费者模式, 主要解决每分钟百万请求的问题。

基本原理:建立固定的工作线程去缓冲池中取数据处理。以此来控制固定时间内处理的请求数

源码地址

查看全部

使用 Golang 实现了一个简单的消费者模式, 主要解决每分钟百万请求的问题。


基本原理:建立固定的工作线程去缓冲池中取数据处理。以此来控制固定时间内处理的请求数


源码地址


https://github.com/qianguozheng/go-workerpool.git


用途



  1. 控制goroutine的数目

  2. 简练模型


实际使用场景及灵感来源


http://marcio.io/2015/07/handling-1-million-requests-per-minute-with-golang/

Grumpy:Google开源神器 Go上运行Python

wwdyy 发表了文章 • 0 个评论 • 555 次浏览 • 2017-01-07 13:46 • 来自相关话题

Grumpy是一个Python to Go的源码源代码翻译编译器和运行时,旨在取代CPython 2.7。

关键区别在于,Grumpy是将Python源码编译为Go源代码,然后将其编译为本地代码,而不是字节码。这也就意味着Grumpy没... 查看全部

Grumpy是一个Python to Go的源码源代码翻译编译器和运行时,旨在取代CPython 2.7。


关键区别在于,Grumpy是将Python源码编译为Go源代码,然后将其编译为本地代码,而不是字节码。这也就意味着Grumpy没有虚拟机(VM)。编译好的Go源码是对Grumpy运行时的一系列调用,一个Go库服务于具有相似目的的Python C API(尽管不直接支持C API)。


运行Grumpy程序


方法1:grumprun:


执行Grumpy程序的最简单方法就是使用make run,它封装了一个名为grumprun的shell脚本,它将stdin上的Python代码基于Grumpy构建和运行。以下所有的命令都假设从Grumpy源码根目录开始运行:


echo "print 'hello, world'" | make run

方法2:grumpc


对于复杂一些的程序,你需要使用grumpc把Python代码编译成Go源码以后再进行构建。首先,写一个简单的.py脚本;


echo 'print "hello, world"' > hello.py

接下来,创建工具链并导出一些使工具链工作的环境变量:


 make

export GOPATH=$PWD/build

export PYTHONPATH=$PWD/build/lib/python2.7/site-packages

最后,编译Python脚本并从中构建一个二进制文件:


tools/grumpc hello.py > hello.go

go build -o hello hello.go

好了,现在执行./hello二进制到你的核心内容里即可。


关于Grumpy更多内容,大家可以访问其源码托管地址:https://github.com/google/grumpy

Gitea 发布 1.0.1版本

lunny 发表了文章 • 0 个评论 • 309 次浏览 • 2017-01-05 22:52 • 来自相关话题

很高兴的宣布我们今天发布了Bug修订版 Gitea v1.0.1。这个版本我们合并了 查看全部

很高兴的宣布我们今天发布了Bug修订版 Gitea v1.0.1。这个版本我们合并了 9 个提交请求。你可以从 下载页面 下载二进制文件,注意选择适合你的平台。更多详细安装信息请参见 安装向导.


变更日志



  • BUGFIXES

    • Fixed localized MIN_PASSWORD_LENGTH #501

    • Fixed 500 error on organization delete #507

    • Ignore empty wiki repo on migrate #544

    • Proper check access for forking #563

    • Fix SSH domain on installer #506

    • Fix missing data rows on admin UI #580

    • Do not delete tags with releases by default #579

    • Fix missing session config data on admin UI #578

    • Properly show the version within footer on the UI #593


数人云Mesos调度器Swan v0.2最新功能演示

数人云 发表了文章 • 0 个评论 • 237 次浏览 • 2016-12-29 11:00 • 来自相关话题

数人云Mesos调度器Swan开源已经一个月啦,在社区和大家的共同呵护下成长了许多。小数带来了Swan v0.2的新版本,添加了很多新功能,工程师为了... 查看全部

数人云Mesos调度器Swan开源已经一个月啦,在社区和大家的共同呵护下成长了许多。小数带来了Swan v0.2的新版本,添加了很多新功能,工程师为了大家更好地了解Swan的新功能,为大家提供了录屏,欢迎收看!


腾讯地址:
https://v.qq.com/x/page/p0358dzspz5.html


Fork me on GitHub!
https://github.com/Dataman-Cloud/swan


关于数人云Mesos调度器Swan


Swan是基于Mesos Restful API编写的应用调度框架,可以帮助用户轻松发布应用,实现应用的滚动更新,并根据用户指定的策略做应用的健康检测和故障转移。

【goxel】Go 版的 axel 小工具

山羊wayne 发表了文章 • 0 个评论 • 304 次浏览 • 2016-12-20 14:21 • 来自相关话题

之前练手写的一个小工具 goxel,类似于 axel,如果你感觉对你有用或者还不错,不要吝啬你的 Star 哈,当然有任何问题或者改进也请告诉我... 查看全部

之前练手写的一个小工具 goxel,类似于 axel,如果你感觉对你有用或者还不错,不要吝啬你的 Star 哈,当然有任何问题或者改进也请告诉我。


goxel




Description


goxel like axel tool

Installation


$ go get github.com/WayneZhouChina/goxel

Usage


goxel [options...] <url>

Options:
-n Numbers of blocks to run(must).
-H Add header string.
-v More status information.
-o Specify local output file(must).
-h Help information.
-V Version information.
-cpus Number of used cpu cores(Default is current machine cores).

Example:


goxel -n 10 -o outfile http://xxx.com

版本更新 | Mesos调度器Swan v0.2来啦

数人云 发表了文章 • 0 个评论 • 219 次浏览 • 2016-12-13 19:22 • 来自相关话题

数人云Mesos调度器 Swan开源已经... 查看全部


数人云Mesos调度器 Swan开源已经一个月啦,在社区和大家的共同呵护下成长了许多。今天小数带来了Swan v0.2的新版本,添加了很多新功能,大家快来看看吧——




Feature List



  • Uri 支持:支持自定义资源,支持多资源下载

  • PortIndex:支持端口命名,健康检测支持portIndex,portName和portValue

  • Cli:命令行工具

  • Heathcheck:支持mesos自带的healthcheck,http和tcp两种

  • Raft:高可用,分布式数据复制和leader选举

  • Proxy:自带proxy功能,支持负载均衡

  • DNS:自带DNS功能,支持域名解析

  • 一容器一IP:支持IP地址固定分配,一容器一IP

  • Constraints:支持约束条件,UNIQUE和LIKE


Fork me on GitHub!
https://github.com/Dataman-Cloud/swan


关于数人云Mesos调度器Swan


Swan是基于Mesos Restful API编写的应用调度框架,可以帮助用户轻松发布应用,实现应用的滚动更新,并根据用户指定的策略做应用的健康检测和故障转移。