php集成PHystrix

PHystrix 参照了 Netflix的项目 Hystrix。我们叫豪猪。豪猪的作用。

部署hystrix-dashboard界面工具。

作为一个压根不懂java的程序员。跑java程序当然不是难事。

打war包

wiki中有教你的。../gradlew jettyRun。但也许实际上会遇到一些问题。比如,我用gradlew 会提示我下载安装对应的gradle。结果没下载下来。尴尬啊。在了解了什么是gradlew(会指定对应的版本)之后。我用brew intall gradle 下载了比较新的版本。然后直接用gradle jettyRun运行。默认是跑得 是 7979端口。不用打包就可以跑。

war包

gradle build 执行。war包在 /hystrix-dashboard/build/libs 下

部署到tomcat下

下载一个tomcat。bin目录下点击运行文件直接运行(linux有start_up.sh)。这玩意儿比nginx简单。一个war包扔到 webapps目录下就执行了。

浏览器输入:http://localhost:8080/hystrix-dashboard

PHystrix的准备

需要准备好 apc模块。php7及以上安装 apcu。

pecl 的方式安装。

可以通过运行 apc.php文件,看apc使用情况。

apc.png

具体的操作配置,看下面的参考。这里注意你的php版本。

参考链接: 《PHP之APC缓存详细介绍http://www.cnblogs.com/Alight/archive/2013/06/06/3121000.html

phystrix-dashboard 代码,为java的dashboard工具提供数据流

文档中的代码即可

$config = new Zend\Config\Config(array(/* ... */));
 $metricsPoller = new \Odesk\PhystrixDashboard\MetricsEventStream\ApcMetricsPoller($config);
 $metricsServer = new \Odesk\PhystrixDashboard\MetricsEventStream\MetricsServer($metricsPoller);
 $metricsServer->run();

我们创建一个控制器 叫做 DashBoard,写个方法叫Log。我们请求这个方法。

惊喜的发现 数据流出来了。 ok,我们打开dashBoard的界面。然后,开心的填入链接。添加监听观察。然后开始不开心了。

参考链接: https://github.com/upwork/phystrix-dashboard

PHP豪猪集成遇到的问题。

不开心的地方在于。dashboard 展示出现死循环。满屏的 PhystrixCommand\UnReadCntCommand。愣是没出现图形的东东。看下图。

死循环.png

于是,开始郁闷。为什么会出现死循环。我对比了别人写的demo。跑了下,没有死循环,显示正常。我摘了端数据流。compare了下,感觉没什么差异。那就奇怪了。既然数据格式一样。问题只能在js端排查。

于是开始找循环的前端代码。
hystrixCommand.js文件中搜self.eventSourceMessageListener,在这个方法中。获取数据并解析。我对比了正常的data跟我的data。格式一样。那么问题。还不是出现数据结构上。

那么开始找展示的html(通过id搜索下)。中间展示图形html代码在hystrixCircuitContainer.html中。

<div class="monitor" id="CIRCUIT_<%= name + '_' + index %>" style="position:relative;">

发现界面死循环,会产生多个相同的id值。那么我怀疑id是不起作用的,所以数据无法填充。导致图形界面出不来。进一步验证。$("#CIRCUIT_PhystrixCommand\UnReadCntCommand_0").length。打印出来是0 ,逆天了。

那么在js文件中,肯定有相关的操作。比如定位id填充数据的操作。于是,在hystrixCommand.js代码中找到如下这个函数displayCircuit。这个函数中有对长度进行判断,然后进行相关的数据渲染操作。

if(!$('#CIRCUIT_' + data.escapedName).length) {
    // args for display
    if(self.args.includeDetailIcon != undefined && self.args.includeDetailIcon) {
        data.includeDetailIcon = true;
    }else {
        data.includeDetailIcon = false;
    }
    
    // it doesn't exist so add it
    var html = tmpl(hystrixTemplateCircuitContainer, data);
    console.log('#CIRCUIT_' + data.escapedName);
    console.log("3333333333330000");
    // remove the loading thing first
    $('#' + containerId + ' span.loading').remove();
    // now create the new data and add it
    $('#' + containerId + '').append(html);
    
    // add the default sparkline graph
    d3.selectAll('#graph_CIRCUIT_' + data.escapedName + ' svg').append("svg:path");
    
    // remember this is new so we can trigger a sort after setting data
    addNew = true;
}

既然发现问题。如何解决。key中带\所以id元素length为0。那么就在数据渲染之前,把escapedName中的\替换成空字符串。

找到了这个方法preProcessData(UI展示钱的数据处理),找到了如下代码。

 data.escapedName = data.name.replace(/([ !"#$%&'()*+,./:;<=>?@[\]^`{|}~])/g,'\\$1') + '_' + data.index;

于是在这行代码上面加了一行 data.name = data.name.replace("\\", '');。问题就这么解决了。

字符串替换.png

但,这样结束真的好吗?

我们为什么不在写缓存的时候,用不带\的Key呢?

在文件AbstractCommand中,有一个属性 protected $commandKey。在我们的文件继承中。我们设置这个属性即可。我们在类PhystrixCommand\UnReadCntCommand中。继承这个属性把key设置成UnReadCntCommand即可。

看来都是命名空间惹的祸。为什么存的key是命名空间的呢?那一定是调用的时候,内部存到了APC里面。在文件AbstractCommand有这个代码。代码很容易明白,你不指定commandKey。那么通过class名字当做key。于是,才有了命名空间的key。

    public function getCommandKey()
    {
        if ($this->commandKey) {
            return $this->commandKey;
        } else {
            // If the command key hasn't been defined in the class we use the current class name
            return get_class($this);
        }
    }
继承属性.png

参考资料:

Hystrix入门http://fobject.iteye.com/blog/2337582

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容