Fabio 安装和简单使用

Fabio(Go 语言):https://github.com/eBay/fabio

Fabio 是一个快速、现代、zero-conf 负载均衡 HTTP(S) 路由器,用于部署 Consul 管理的微服务。

Fabio 由 eBay Classifieds Group 开发,用于处理 marktplaats.nl 和 kijiji.it 的流量。Marktplaats 所有的流量都经过 Fabio ,每秒有 250000 个请求,分发于数个 Fabio 实例,并且没有出现任何延迟。

简单流程图(摘自 http://dockone.io/article/1567):

======    服务注册     =========       =========
A服务   <------>      consul集群  ---->  健康的 A/不健康的 A 集群
======    健康检查     =========       =========^| 加入/移出路由表|========fabio 集群========|| A服务   如果找到则成功路由否则返回错误Vhttp 请求

Mac OS 安装命令(如果没有安装 Consul,会自动安装):

$ brew install fabio
Updating Homebrew...
==> Auto-updated Homebrew!Updated 1 tap (homebrew/core).
==> New Formulae
crystal-icr     gcc@4.7         gnome-autoar    libchaos        llvm@3.8        pdftoipe        tomcat@8.0dbt             gcc@5           isl@0.12        libswiftnav     mps-youtube     recipes         ucg
gcc@4.6         gcc@6           lasso           llvm@3.7        ndenv           servus
==> Updated Formulae
afflib                 dnscrypt-proxy         handbrake              mpv                    sassc
ant                    doxygen                hebcal                 mysql                  sbcl
antigen                duply                  highlight              mysql-connector-c++    sqldiff
antlr                  flex                   hugo                   mysql-sandbox          sqlite
apache-spark           fluent-bit             imagemagick            nagios                 sqlite-analyzer
arangodb               fobis                  ipv6calc               nagios-plugins         stunnel
astyle                 fontforge              jasper                 ncdc                   syncthing
ats2-postiats          fpp                    jenkins                ncftp                  tarantool
aws-sdk-cpp            freetype               lean-cli               neo4j                  taylor
awscli                 ganglia                leptonica              nvm                    tile38
bup                    gcc                    libass                 ooniprobe              vim
cdiff                  gcc@4.9                libgit2                opentsdb               volatility
cfr-decompiler         geos                   libgit2-glib           osm2pgsql              vowpal-wabbit
checkstyle             git-annex              libpng                 osquery                weechat
cloog                  git-lfs                libxml2                pngpaste               wine
compcert               gitg                   lmdb                   poco                   winetricks
couchdb                gitless                m-cli                  pure-ftpd              wireguard-tools
cppcheck               gmic                   macosvpn               qt5                    x265
czmq                   gnome-builder          menhir                 questdb                yaz
dbhash                 gnutls                 mg                     rclone                 youtube-dl
dmd                    groonga                mitmproxy              re2
==> Deleted Formulae
cloog@0.18                            qt                                    tutumError: Could not link:
/usr/local/share/man/man1/brew.1Please delete these paths and run `brew update`.
==> Installing dependencies for fabio: consul
==> Installing fabio dependency: consul
==> Downloading https://homebrew.bintray.com/bottles/consul-0.7.2.sierra.bottle.tar.gz
######################################################################## 100.0%
==> Pouring consul-0.7.2.sierra.bottle.tar.gzError: The `brew link` step did not complete successfully
The formula built, but is not symlinked into /usr/localCould not symlink bin/consul
Target /usr/local/bin/consul
already exists. You may want to remove it:rm '/usr/local/bin/consul'To force the link and overwrite all conflicting files:brew link --overwrite consulTo list all files that would be deleted:brew link --overwrite --dry-run consulPossible conflicting files are:
/usr/local/bin/consul
==> CaveatsIf consul was built with --with-web-ui, you can activate the UI by runningconsul with `-ui-dir /usr/local/Cellar/consul/0.7.2/share/consul/web-ui`.zsh completion has been installed to:/usr/local/share/zsh/site-functionsTo have launchd start consul now and restart at login:brew services start consulOr, if you don't want/need a background service you can just run:  consul agent -dev -advertise 127.0.0.1 ==> Summary  /usr/local/Cellar/consul/0.7.2: 5 files, 27.6M ==> Installing fabio ==> Downloading https://homebrew.bintray.com/bottles/fabio-1.3.5.sierra.bottle.tar.gz ######################################################################## 100.0% ==> Pouring fabio-1.3.5.sierra.bottle.tar.gz  /usr/local/Cellar/fabio/1.3.5: 6 files, 10.1M

Ubuntu 安装比较麻烦点,具体步骤:

1. 创建fabio目录

$ mkdir /opt/fabio

2. 设置环境变量

$ export PATH=$PATH:/opt/fabio

3. 创建fabio.properties文件(/opt/fabio工作目录下)

$ touch fabio.properties

4. 下载 Fabio 文件(地址:https://github.com/eBay/fabio/releases):

$ wget https://github.com/eBay/fabio/releases/download/v1.3.5/fabio-1.3.5-go1.7.3-linux_amd64

5. 赋予权限

$ chmod a+x fabio-1.3.5-go1.7.3-linux_amd64

6. 设置fabio命令

$ ln -s fabio-1.3.5-go1.7.3-linux_amd64 fabio

安装好之后,直接输入命令(启动 Fabio):

$ fabio2017/01/04 03:04:44 [INFO] Runtime config
{    "Proxy": {        "Strategy": "rnd",        "Matcher": "prefix",        "NoRouteStatus": 404,        "MaxConn": 10000,        "ShutdownWait": 0,        "DialTimeout": 30000000000,        "ResponseHeaderTimeout": 0,        "KeepAliveTimeout": 0,        "ReadTimeout": 0,        "WriteTimeout": 0,        "FlushInterval": 1000000000,        "LocalIP": "10.0.2.15",        "ClientIPHeader": "",        "TLSHeader": "",        "TLSHeaderValue": "",        "GZIPContentTypesValue": "",        "GZIPContentTypes": null},    "Registry": {        "Backend": "consul",        "Static": {            "Routes": ""},        "File": {            "Path": ""},        "Consul": {            "Addr": "localhost:8500",            "Scheme": "http",            "Token": "",            "KVPath": "/fabio/config",            "TagPrefix": "urlprefix-",            "Register": true,            "ServiceAddr": ":9998",            "ServiceName": "fabio",            "ServiceTags": null,            "ServiceStatus": [                "passing"],            "CheckInterval": 1000000000,            "CheckTimeout": 3000000000}},    "Listen": [{            "Addr": ":9999",            "Proto": "http",            "ReadTimeout": 0,            "WriteTimeout": 0,            "CertSource": {                "Name": "",                "Type": "",                "CertPath": "",                "KeyPath": "",                "ClientCAPath": "",                "CAUpgradeCN": "",                "Refresh": 0,                "Header": null},            "StrictMatch": false}],    "CertSources": {},    "Metrics": {        "Target": "",        "Prefix": "{{clean .Hostname}}.{{clean .Exec}}",        "Names": "{{clean .Service}}.{{clean .Host}}.{{clean .Path}}.{{clean .TargetURL.Host}}",        "Interval": 30000000000,        "GraphiteAddr": "",        "StatsDAddr": "",        "CirconusAPIKey": "",        "CirconusAPIApp": "fabio",        "CirconusAPIURL": "",        "CirconusCheckID": "",        "CirconusBrokerID": ""},    "UI": {        "Addr": ":9998",        "Color": "light-green",        "Title": ""},    "Runtime": {        "GOGC": 800,        "GOMAXPROCS": 1},    "ListenerValue": [        ":9999"],    "CertSourcesValue": null
}2017/01/04 03:04:44 [INFO] Version 1.3.5 starting2017/01/04 03:04:44 [INFO] Go runtime is go1.7.32017/01/04 03:04:44 [INFO] Using routing strategy "rnd"2017/01/04 03:04:44 [INFO] Using routing matching "prefix"2017/01/04 03:04:44 [INFO] Setting GOGC=8002017/01/04 03:04:44 [INFO] Setting GOMAXPROCS=12017/01/04 03:04:44 [INFO] Metrics disabled2017/01/04 03:04:44 [INFO] consul: Connecting to "localhost:8500" in datacenter "dc1"2017/01/04 03:04:44 [INFO] Admin server listening on ":9998"2017/01/04 03:04:44 [INFO] HTTP proxy listening on :99992017/01/04 03:04:44 [INFO] consul: Using dynamic routes2017/01/04 03:04:44 [INFO] consul: Using tag prefix "urlprefix-"2017/01/04 03:04:44 [INFO] consul: Watching KV path "/fabio/config"2017/01/04 03:04:44 [INFO] agent: Synced service 'fabio-vagrant-ubuntu-trusty-9998'2017/01/04 03:04:44 [INFO] consul: Registered fabio with id "fabio-vagrant-ubuntu-trusty-9998"2017/01/04 03:04:44 [INFO] consul: Registered fabio with address "10.0.2.15"2017/01/04 03:04:44 [INFO] consul: Registered fabio with tags ""2017/01/04 03:04:44 [INFO] consul: Registered fabio with health check to "http://[10.0.2.15]:9998/health"2017/01/04 03:04:44 [INFO] consul: Health changed to #58782017/01/04 03:04:44 [INFO] consul: Manual config changed to #12017/01/04 03:04:44 [INFO] Updated config to2017/01/04 03:04:44 [INFO] consul: Health changed to #58792017/01/04 03:04:44 [INFO] agent: Synced check 'service:fabio-vagrant-ubuntu-trusty-9998'

Fabio 启动会连接本地的 Consul 服务,Fabio 常用地址(示例):

  • http://10.9.10.173:9998/health:服务可以请求到这个地址,用于服务的健康检查(Fabio 统一健康检查)。

  • http://10.9.10.173:9999/{servicename}:服务的负载均衡地址,所有的服务调用都会请求到这个 Origin,Fabio 会进行服务分发。

  • http://10.9.10.173:9998:Fabio 后台 UI 界面,可以看到服务地址和权重,也可以增加路由规则。

服务注册的时候,需要以 Fabio 的方式进行注册(SDK 进行实现)。

服务的路由需要添加{servicename}(Fabio 识别具体的服务),比如:

[Route("server-test/values")]public class ValuesController : Controller{    public string Get()    {        return "hello world";}
}

服务调用的时候,请求地址也需要添加{servicename}(Fabio 识别具体的服务),比如:

var service = await _serviceRegistry.GetServiceInstanceAsync("server-test");var serverUrl = $"{service.Address}:{service.Port}";if (!serverUrl.StartsWith("http://", StringComparison.OrdinalIgnoreCase))serverUrl = "http://" + serverUrl;var url = $"{serverUrl}/server-test/values";var httpClient = new HttpClient();var response = await httpClient.GetAsync(url);

也可以直接在浏览器中输入服务负载均衡地址(测试 Fabio 是否正常),比如:

http://10.9.10.173:9999/server-test/values200hello world

Fabio 后台 UI 界面,示例(http://10.9.10.173:9998/routes?filter=):

相关文章: 

  • 分布式系统搭建:服务发现揭秘

原文地址:http://www.cnblogs.com/LoveOfPrince/p/6336472.html


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/327071.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java实现人脸识别源码【含测试效果图】——Service层(IUserService)

/** * Title: BaseService.java * Package org.service * Description: TODO该方法的主要作用&#xff1a; * author A18ccms A18ccms_gmail_com * date 2017-9-22 下午8:48:52 * version V1.0 */ package org.service;import org.entity.Users;/** * * 项目名称&am…

join()

join函数的定义是指&#xff1a;等待线程终止。 我们在运行线程的时候可能会遇到&#xff0c;在主线程中运行子线程&#xff0c;主线程需要获取子线程最终执行结果的情况。 但是有很多时候子线程进行了很多耗时的操作&#xff0c;主线程往往先于子线程结束&#xff0c;这个时…

计算密集型分布式内存存储和运算平台架构

1. 相关概念 1.1 内存数据库 关系型数据库处理永久、稳定的数据&#xff0c;内存数据库就是将其数据放在内存中&#xff0c;活动事务只与内存数据打交道&#xff0c;重新设计了体系结构并且在数据缓存、快速算法、并行操作方面也进行了相应的改进&#xff0c;所以数据处理速度比…

java中将Fri Feb 19 17:32:34 CST 2021时间格式转为yyyy-MM-dd HH:mm:ss时间格式

java中将Fri Feb 19 17:32:34 CST 2021时间格式转为yyyy-MM-dd HH:mm:ss时间格式 哈斗 2021-02-20 10:03:36 2034 收藏 6 分类专栏&#xff1a; java 文章标签&#xff1a; java 时间格式转换 版权 由于在项目中遇到此时间格式需要转换的问题&#xff0c;所以在此记录下转换…

java实现人脸识别源码【含测试效果图】——ServiceImpl层(UserServiceImpl)

/** * Title: BaseServiceImpl.java * Package org.service.impl * Description: TODO该方法的主要作用&#xff1a; * author A18ccms A18ccms_gmail_com * date 2017-9-22 下午8:50:26 * version V1.0 */ package org.service.impl;import org.dao.IUserDao; import or…

如何解决线程安全问题

如何解决线程安全问题 怎么解决线程的安全问题呢&#xff1f; 基本上所有解决线程安全问题的方式都是采用“序列化临界资源访问”的方式&#xff0c;即在同一时刻只有一个线程操作临界资源&#xff0c;操作完了才能让其他线程进行操作&#xff0c;也称作同步互斥访问。 在Ja…

【深入Java虚拟机】之四:类加载机制

转载自 【深入Java虚拟机】之四&#xff1a;类加载机制 类加载过程 类从被加载到虚拟机内存中开始&#xff0c;到卸载出内存为止&#xff0c;它的整个生命周期包括&#xff1a;加载、验证、准备、解析、初始化、使用和卸载七个阶段。它们开始的顺序如下图所示&#xff1a; 其中…

给职场新人的建议

给职场新人的建议 这里给职场新人的10点建议 1.不要有为老板工作的心态 这个和为了老师或者为了父母学习一样搞笑&#xff0c;你是为了自己工作&#xff0c;学到的本事&#xff0c;得到的经验&#xff0c;你离开公司你就带走了&#xff0c;老板留不下你的肉体&#xff0c;也…

违反ClassLoader双亲委派机制三部曲第二部——Tomcat类加载机制

转载自 违反ClassLoader双亲委派机制三部曲第二部——Tomcat类加载机制 前言&#xff1a; 本文是基于 ClassLoader双亲委派机制源码分析 了解过正统JDK类加载机制及其实现原理的基础上&#xff0c;进而分析这种思想如何应用到Tomcat这个web容器中&#xff0c;从源码的角度对 违…

Lock

lock接口 Lock lock ...; lock.lock(); try{//处理任务 }catch(Exception ex){ }finally{lock.unlock(); //释放锁 }经常这样使用 Lock lock ...; if(lock.tryLock()) {try{//处理任务}catch(Exception ex){}finally{lock.unlock(); //释放锁} }else {//如果不能获取锁…

红包的技术升级之旅

鸡年春节&#xff0c;红包再次成为年味儿最重要的催化剂。先是腾讯QQ钱包推出“LBSAR天降红包”等三种创新有趣的玩法&#xff0c;支付宝上线AR实景红包&#xff0c;微博亦推出视频红包等形式。虽然微信退出红包营销让人稍有意外&#xff0c;但用户对红包的热情仍未消减。 事实…

java中生成1000~10000之间的随机数

要生成在[min,max]之间的随机整数&#xff0c;可使用Random类进行相关运算&#xff1a; Random random new Random(); int s random.nextInt(max)%(max-min1) min; random.nextInt(max)表示生成[0,max]之间的随机数&#xff0c;然后对(max-min1)取模。 以生成[1000,10000]…

破坏双亲委派模型

转载自 破坏双亲委派模型 1.第一次破坏 由于双亲委派模型是在JDK1.2之后才被引入的&#xff0c;而类加载器和抽象类java.lang.ClassLoader则在JDK1.0时代就已经存在&#xff0c;面对已经存在的用户自定义类加载器的实现代码&#xff0c;Java设计者引入双亲委派模型时不得不做出…

volatile可以保证原子性吗

在之前我们了解到了线程的三大特性&#xff1a;原子性&#xff0c;可见性&#xff0c;有序性。 前面的例子我们知道了volatile可以保证共享变量的可见性&#xff0c;但是volatile可以保证原子性吗&#xff1f; 我们来看看&#xff1a; public class Test {public volatile i…

C# 7.0新功能

下面是对C#7.0 版本所有语言功能的描述。随着 Visual Studio “15” preview 4 的发布&#xff0c;大部分功能可以被更灵活的应用。现在正是时候将这些功能介绍给大家&#xff0c;你也可以借此让我们知道你的想法。 C#7.0 增加了很多新的功能&#xff0c;更专注于数据的消费&am…

MybatisPlus学习(四)条件构造器Wrapper方法详解

https://www.cnblogs.com/xianz666/p/13857733.html MybatisPlus学习&#xff08;四&#xff09;条件构造器Wrapper方法详解 文章目录 1、条件构造器2、QueryWrapper 2.1、eq、ne2.2、gt、ge、lt、le2.3、between、notBetween2.4、like、notLike、likeLeft、likeRight2.4、isN…

使用ueditor实现多图片上传案例

UEditor是由百度WEB前端研发部开发的所见即所得的开源富文本编辑器&#xff0c;具有轻量、可定制、用户体验优秀等特点。开源基于BSD协议&#xff0c;所有源代码在协议允许范围内可自由修改和使用。百度UEditor的推出&#xff0c;可以帮助不少网站开发者在开发富文本编辑器所遇…

自定义ClassLoader和双亲委派机制

转载自 自定义ClassLoader和双亲委派机制 ClassLoader ClassLoad&#xff1a;类加载器&#xff08;class loader&#xff09;用来加载 Java 类到 Java 虚拟机中。Java 源程序&#xff08;.java 文件&#xff09;在经过 Java 编译器编译之后就被转换成 Java 字节代码&#xff0…

ASP.NET Core 1.0 开发记录

ASP.NET Core 1.0 更新比较快&#xff08;可能后面更新就不大了&#xff09;&#xff0c;阅读注意时间节点&#xff0c;这篇博文主要记录用 ASP.NET Core 1.0 开发简单应用项目的一些记录&#xff0c;以备查阅。 ASP.NET Core 1.0 相关 Nuget 程序包源&#xff1a;https://api.…

volatile 关键字

volatile是干啥用的&#xff0c;有什么含义和特点呢&#xff1f; 当一个共享变量被volatile修饰时&#xff0c;它就具备了“可见性”&#xff0c;即这个变量被一个线程修改时&#xff0c;这个改变会立即被其他线程知道。当一个共享变量被volatile修饰时&#xff0c;会禁止“指…