急!!!极路由官网更新后token为空怎么处理

<div id="click_content_aid_
<div id="favrite_content_aid_
小白式的创新与代价,HiWiFi极路由试用体验
小白式的创新与代价,HiWiFi极路由试用体验
17:18&&|&&作者:
&&|&&关键字:,,,
  极路由不像是一般的路由,外观设计颇为精致,内置了Linux系统,支持多种扩展程序,提升了路由器的应用范围,使用也非常简单,这是创新之处。
  很难想像路由器这种普通至极的产品也有这样火的时候,这段时间估计享受到了春天般的温暖,就连那些不会配置路由器的朋友都在问这个东西怎么样,打听它是否好用。
  小编听到极路由的名字还是几个月前,当时最吸引我的功能是科学上网,心想有这个功能的路由也太强大了吧,省了多少事啊。早就想入手尝鲜,只不过当时只在淘宝上有内测版的极路由,官方直到7月29日才开卖正式版的,269元一台,黑白两色可选,加10块可选地球上速度最快的顺丰快递。
  这两天也了解了一下极路由的由来,发现玩过刷路由固件的高手对极路由显得不屑一顾,渴望傻瓜式使用的初级玩家对其赞不绝口,这真让人有点无所适从了,今天我们就从一个普通消费者的角度来真正用一次极路由,好不好用、值不值得很快就能见分晓了。
黑白两种颜色售价都是269元,我们选了黑色版的
到手时包装的很严密,硬壳的包装盒也非常结实,厂商还是挺用心的
极路由真身
  这款极路由(官方叫极壹,型号为HC6361)体积跟一个2.5寸移动硬盘差不多,稍微厚一些。外壳为铝合金材质,表面磨砂处理,两侧是银白色金属封边,总体感觉比以往见到的路由器高端大气上档次。
正面是塑料面板,有三个蓝色的LED灯
背部的铭牌信息
  接口部分是1个Internet入网口,2个LAN局域网口,RST重置接口及ANT天线接口,值得一提的是供电接口不是普通的DC-AC,而是Mirco-USB接口,5V
1A供电。试了一下,电脑的USB 2.0/3.0接口也能使用。
  2个LAN接口显得有些过少,至于有些玩家纠结的USB接口问题,官方会在下一代产品上提供USB接口。
这款路由器的外观、工艺还是能打动人的,耐看了许多
  附件包括电源适配器、USB 2.0数据线(大约1.5米长)、1米左右的扁平网线和天线。
电源适配器规格
◆ 拆解:8GB缓存,AR19331网卡
PCB正面(点击放大)
  拆开外面的四颗螺丝就可以看到PCB,颜色跟之前看到过的有所不同,从天蓝色变成了现在的海蓝色,不过元件布局变化不大。
背部就没什么好看的了
网卡芯片AR9331
  极路由使用的是Atheros公司的AR9331网络芯片,这是一款高集成度、低成本的IEEE 802.11n 1x1 2.4GHz SoC网络处理器,核心为MIPS
24K处理器,频率400MHz,支持16bit DDR1/DDR2/SDRAM内存及SPI NOR闪存,支持1x WAN外网、4x LAN局域网。
  从规格上看,极路由只支持150Mbps的802.11n,也只支持2.4GHz频段,在新一代路由器中这个规格有略坑的感觉,不过高速网络并不是它主打的功能和方向,而且150Mbps无线网络对日常使用来说倒也不是瓶颈,这一点就忍了吧。
SK Hynix的内存
  内存为SK Hynix出品的H5DU51262ETR-E3C DDR400,容量512Mb(64MB),现在好点的路由都配128MB或者256MB内存了,64MB内存不算突出。
美光出品的闪存
  官方宣传的一大卖点是其超大的内存和缓存,特别是缓存使用了美光出的29F64G08CBAAA,25nm MLC异步NAND,8GB容量,看旁边的空位应该还可以再使用一颗的,这样总的存储容量就可以达到16GB,可以安装更多的程序和应用了。
擎泰公司的SK6226 USB 2.0主控
这个应该是Spansion出品的NOR闪存,具体资料未知
MNC出品的H1601CG芯片是Lan变压器(LAN Transformers)
◆ 系统及应用:功能强大的智能系统
  极路由号称智能路由器,相比一般的路由器设置好就被遗忘的地位来说,极路由可参与的用户网络活动更多,拨号上网、网络加速、视频加速、应用商店加速、代理甚至去广告都有它的参与。
首次设置会弹出设置想到
有线及无线网络设置
  与一般路由器固定、呆板的UI界面相比,极路由的设置界面更加图形化,而且风格小清新,界面设计的很简洁,主界面集成了从监控到高级设置再到云插件、重启等常用功能,不至于让用户对着一大堆参数感觉无从下手。
路由器固件支持自动升级,到手的这两天内就有一次升级
高级设置中可以看到熟悉的路由器设置界面
流量监控功能
网络诊断功能
极路由的精华:可扩展应用
  界面上的改进只能说是小变化,极路由相比一般路由最特殊的地方在于可以安装应用软件,在各种应用软件的辅助下,其功能和潜力几乎是无限的。
  目前主流的路由器开源系统有Tmaoto西红柿、OpenWrt、RouterOS、ClearOS什么的,极路由没有公布他们使用的固件是基于什么开源系统的,不过有读者说是OpenWrt的,玩过路由器刷系统的高玩应该会很清楚。
  既然是基于开源Linux系统的,那么Lniux上的常用软件都可以在这个路由器上运行了。极路由的页面显示它目前可以支持AppleTV随便看、单线程下载加速、教育网IPv6加速、全球加速、小米应用商店加速(小米真是够火,极路由除了苹果和微软应用商店加速之外就是小米商店加速了,难道雷老板也有投资?)、AppStore及Google
Paly市场加速,还支持SSH代理、智能限速以及LOL英雄联盟升级加速。
  这些应用中,AppStore加速和Play加速等应用我没试,我关注的主要是全球加速和SSH代理,用途你懂得。
全球加速功能
  全球加速有四条线路,覆盖面还是挺广的,想加速那个网站就直接在白名单里设置一下,这个加速是免费的,不需要帐号什么的,每月限流量1GB。用户如果只是看看新闻,找找资料,无下载或者看视频的话,1GB流量还是够用的。
  SSH代理应用相当于省掉了myentunnel软件,工作模式也有全局和智能两种。
  别的程序没试,说说这两个体验的程序吧。全球加速的网络速度感觉很慢,打开恶魔01网站的速度明显不如我自用的SSH代理,只能说凑合着临时用用。
  SSH代理只支持主机IP地址,恰好我用的SSH是使用域名登录的,因为IP地址经常需要改变,因此这个功能对我来说就相当于没用了。
  当然,这两个小挫折并不一定影响所有用户使用,其他加速功能也或多或少地帮助了有需求的用户,官方要做的是不断升级固件,提升易用性,而且目前的应用数量其实还是挺少的。
手机远程管理
  极路由还有手机上可用的远程管理程序,支持iOS和Android两大系统,登录帐号之后可以远程管理路由器,包括无线开关、面板灯开关、插件管理以及固件更新。
◆ 实际体验及总结
  无线路由器性能没什么好测的,日常使用主要还是手机或者笔记本连接,信号强度及网速是最重要的。简单对比了下手头的TP-Link
WR840N无线路由器,它是802.11n 2x2 2.4GHz 300Mbps的,两个路由都放在我桌子旁边,手机用的是步步高Xplay,WiFi网络下使用Speedtest安卓版分别测试两个WiFi网络的速度和延迟,为了减少误差,每个WiFi测试7次,去掉其中最好和最坏的成绩,余下五次做平均处理。
  测出的结果有好有坏,极路由的网页平均延迟比TP-Link这款要高80%,不过它的下载和上传速度要大大好于后者,速度几乎是后者的三倍,有点出乎小编的意料,毕竟整个网络的速度也不过5-6Mbps的水平。
  至于信号强度,极路由在穿过一道水泥墙和办公室内的玻璃墙之后,在门外面还有2格的信号,TP-Link这款就只有1格了,感觉用起来也不会有太大差别。
总结:小白式的创新,小白的代价
  小编最初对路由+开源系统也不了解,觉得极路由的功能非常强大,现在来看它实际上并不是“超人”,玩过路由器的高手可能会轻蔑地说一句:自己刷固件的路由器要比这个强多了,还省钱。
  但是这样的评价并不能抹杀极路由存在的意义。一个例子就是360(虽然很多资深网友对这个公司并没好感)推出的售价19元的随身WiFi,我印象很深的是有网易科技给出的评价——小白式的创新,看完之后深以为然。
  随着智能手机的普及,无线路由器在日常生活中越来越重要,但是这种看似简单的设备还真不是每个人都会配置的,这样的例子在我们的生活中太常见了,小编被朋友问到这样的问题时总会很纳闷,这么简单的东西你都不会啊,你上网都干了什么呀。
  啰嗦了这么多,意思就只有一个:很多高手不屑一顾的时候往往隐藏着巨大的商机,极路由在高玩门前可能就是个玩具,但是很多不会科学上网、不会设置AppleTV、需要代理却不懂SSH、VPN之类的普通用户会从极路由的简单中受益,这也是他们最大的目标人群。
  当然,当小白总是要付出一定代价的,极路由269元的售价不算便宜,因为随便买个能用的无线路由可能只需要69块,额外的成本就是小白图方便的代价。
  ·外观设计出色,金属机身很有质感
  ·USB接口供电,笔记本上可救急用
  ·设置简单,界面小清新
  ·智能操作系统,功能强大,扩展性强
  ·LAN接口过少,没有USB接口
  ·扩展应用数量较少
  ·269元价格偏高
关注微信号expkf01,第一时间获知精彩活动和原创科技资讯。
第一时间获知
精彩活动和原创科技资讯
微信号expkf01
本文读者还喜欢
极路由是一个路由器的名字
(你可匿名或登录后发表评论。没有帐号可,或使用和直接登录)
非著名编辑,自认为是个理性、有内涵的观察者,实则腹黑、心不黑,坚信阳光普照大地,只待涤荡眼前的黑暗。
扫一扫右边的二维码
关注超能网微信账号
买块机械键盘开车吧!
Xbox One带Kinect特价2899元
Steam游戏夏季特惠
618特价信息汇总极路由忘记wifi密码要怎么修改!急!_极路由吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:24,143贴子:
极路由忘记wifi密码要怎么修改!急!收藏
几个月前买了极路由,可是现在忘记了wifi密码,请问要从哪里改啊?修改密码的地方必须要先输入原先密码,求解!!
实在记不起来的话,用牙签按压后面的RST按键就可以了
知道后台密码的话进后台看下就知道了。
只能恢复出厂设置吧
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或路由器凭什么称极客 极路由试用报告
来源:搜狐IT
  文/范承飞
  “精神病人思路广,弱智儿童欢乐多”,这话放在IT界也可以扩展为“山寨厂商创意多”。极路由就是由一家看似规模不大有点山寨气息的公司推出。为什么这么说呢,因为笔者打400电话要求去他们在中关村e世界的公司上门购买时,对方解释办公室不方便接待,而是约笔者在楼下的星巴克门口“碰头”完成了交易。(后经工作人员来电解释,约楼下见面是因为e世界办公楼楼道复杂,怕顾客找不到。)
  闲话到此为止,该款路由器号称“极路由”,加入了一些“极客”喜欢的属性。那我们首先分析一下普通用户和“极客”们对路由器不同的需求。
  “极客”在什么地方?
  首先,极客也是普通用户的一员,他们对无线路由器会有一些共同的需求,如:
  自动ADSL拨号
  上网稳定
  无线信号强
  多人上网看视频/打游戏不卡
  极客玩家手里除了电脑还会有手机、平板电脑之类的设备,或者从事一些网络相关的工作,对路由器功能的需求更高,懂得的玩法也会多一些,举例来说一般会有这些:
  远程控制――监控或配置路由器
  端口映射――远程控制家中的电脑
  高级QOS限速――适合多人共用网络或合租的人士
  无线中继――将多台路由器用无线方式连接在一起,省了牵多条网线的麻烦
  VPN――上一些国外网站
  修改DNS服务器――实现一些特殊功能,或者加速某些网络应用
  这些偏“极客范儿”的功能往往设置起来异常复杂。而在极路由中,这类功能被做成了一个个的插件应用,在应用中心找到并安装即可,不需复杂的配置步骤。
  极路由试用报告
  “极路由”这款产品可以像普通路由器一样用网页登陆并进行配置。其配置界面采用了简洁的图形风格,并提供了提示性的设置向导,适合初级用户使用。不过打开它的“高级设置”会发现里面提供的选项也不多,例如QOS之类只要不是最便宜的路由器都有的功能都不提供。
  路由器本地配置页面
  插件需要在路由器官网安装和下载,目前就这么几款
  不过该路由器的特色就是应用插件,一些高级功能都需要第三方应用插件来实现。下面介绍一下现有的插件都能干些啥。
  App Store、Google Play加速
  由于服务器在国外,国内iOS和Android用户肯定都遇见过从商店下载应用极慢的情况,一些“极客玩家”会通过改DNS或代理服务器的方法来提升下载速度。而极路由这个插件就省了你自己去改的步骤。
  使用方法简单,装上相应插件就行,不需要任何设置。
  但目前iOS的App Store已经由苹果官方出面解决了下载速度慢的问题,此插件已经没有价值。
  Apple TV随便看
  这个功能可以让国内用户在Apple TV上看到国内视频网站的节目,甚至一些电视台的直播节目,用户可以通过在Apple TV上修改DNS来实现。而“AppleTV随便看”这个插件帮用户省去了这个步骤,虽然不算多复杂的功能,还算贴心。
  使用方法简单,装上相应插件就行,不需要任何设置。
  单线程下载加速
  插件描述里介绍说这个功能可以在不用下载软件的情况下提高浏览器下载文件的速度,特别在手机、平板这些移动设备使用时特效果明显。
  使用方法简单,装上相应插件就行,不需要任何设置。
  教育网IPv6
  专为拥有IPV6环境的教育网用户开发,有了它就可以在一些IPv6 PT站下载电影,另外有些学校的网络是按流量收费,如果通过IPV6上网则不算流量,可以帮学生老师们省钱。
  使用方法简单,装上相应插件后设置一下入口即可。
  出国加速
  实际是通过VPN或代理服务器的方法让国内用户可以访问youtube、facebook、Twiiter、Google+之类国外网站。
  安装好插件之后,会发现提供了多个国家的服务器供选,笔者换了好几次才成功连接上。
  浏览国外网站的速度还挺快,就是不知道这能用多久。
  出国加速提供了四个国家服务器供选
  智能限速(QOS)
  这个QOS插件功能非常简单,仅仅是多人上网且网络满负荷时平均分配带宽给每个设备。在一些高级路由器中会提供更丰富的QOS选项,不过极路由也可以通过更强大的QOS插件来实现。
  从目前来看,这些插件的开发都还处于很初级的阶段,可配置的选项很少。而且这些插件的功能都是一些基础网络功能,期待有更复杂更高级的插件出现。
  关于手机远程控制路由器
  厂商专门开发了iOS和Android平板的APP应用,绑定账户之后,即使你出门在外也可以通过手机APP查看路由器的状态,或者对其进行配置――这在以往是很难实现的,普通路由器都需要你的电脑或手机在局域网内才能配置路由器。
  不过,目前来看这项手机远程控制路由器的功能,对大多数用户来说还是YY为主。因为多数用户对路由器的需求就是稳定可靠,没事儿去远程控制路由器干毛啊。除非你路由器上有挂机下载BT之类的功能。
  结论与感想
  看上去,是不是很容易联想到“智能”这个词,有智能手机、智能电视,现在连路由器也变成智能了。搜狐IT在接通极路由制造公司CEO的电话之后,他的描述更朴实:“就是把极路由做成跟手机里面的iOS和Android一样呗”。
  不过最让用户担心的依然是这厂商的号召力,如何保证持续的插件开发能力。在极路由的官网中,我们看到用户可以在BBS里面发许愿贴,告诉厂商你希望增加什么样的功能。只是至今为止应用中心里也只有十来个插件,其中有官方开发的,也有第三方开发的。
  如果放下该公司规模较小这个问题不看的话,极路由这款产品还是让人充满想象力的。首先,他们卖的不只是一个路由器,而是一个可扩展的操作系统,就像iOS和Android(尽管目前还是雏形);其次,从现有的插件应用来看,极路由也是个不错的东西,例如试用报告中讲到的那些功能,就对“极客”们来说就很具诱惑力。
(责任编辑:张娟)
&&&&&&</div
主演:黄晓明/陈乔恩/乔任梁/谢君豪/吕佳容/戚迹
主演:陈晓/陈妍希/张馨予/杨明娜/毛晓彤/孙耀琦
主演:陈键锋/李依晓/张迪/郑亦桐/张明明/何彦霓
主演:尚格?云顿/乔?弗拉尼甘/Bianca Bree
主演:艾斯?库珀/ 查宁?塔图姆/ 乔纳?希尔
baby14岁写真曝光
李冰冰向成龙撒娇争宠
李湘遭闺蜜曝光旧爱
美女模特教老板走秀
曝搬砖男神奇葩择偶观
柳岩被迫成赚钱工具
大屁小P虐心恋
匆匆那年大结局
乔杉遭粉丝骚扰
男闺蜜的尴尬初夜
客服热线:86-10-
客服邮箱:Cloud_Controller_ng源码分析—启动,路由解释,处理请求
(源代码版本在v2版正式发布之前)
从可执行脚本bin/cloud_controller开始
VCAP::CloudController::Runner.new(ARGV).run!
lib/cloud_controller/runner.rb中的run!方法定义如下
start_cloud_controller
@config.dup&&&&
Seeds.write_seed_data(config) if @insert_seed_data
app = create_app(config)
# thin server收到的请求交给指定的app处理
start_thin_server(app, config)
执行create_app之前会做一些初始化工作。之后通过create_app生成一个Rack::Builder实例,最后通过start_thin_server启动一个http服务,将生成的Rack::Builder实例传递给该服务器,处理来自客户端的请求。create_app定义如下
create_app(config)
token_decoder = VCAP::UaaTokenDecoder.new(config[:uaa])
Rack::Builder.new do
use Rack::CommonLogger
# 消息发布
message_bus = VCAP::CloudController::MessageBus.instance
message_bus.register_components
message_bus.register_routes
# 订阅"dea.advertise"消息
DeaClient.run
# 订阅"staging.advertise"消息
AppStager.run
LegacyBulk.register_subscription
# 成员变量赋值
VCAP::CloudController.health_manager_respondent =
HealthManagerRespondent.new(config)
VCAP::CloudController.dea_respondent =
DeaRespondent.new(message_bus)
# 订阅"droplet.exited"消息
VCAP::CloudController.dea_respondent.start
# 对于匹配"/"的请求用Controller.new()处理;所有请求都可匹配"/"
map "/" do
run Controller.new(config, token_decoder)
通过create_app的代码可知,不管接收到什么请求,都会调用Controller进行处理。
客户端请求经过的第一站是Controller,该类定义在lib\cloud_controller.rb中。
class Controller & Sinatra::Base
&&& register
Sinatra::VCAP
&&& attr_reader
执行结果:also_reload当前路径开始的所有层级路径下的.rb文件
vcap_configure(:logger_name =& "cc.api",
&&&&&&&&&&&&&&&&&&
:reload_path =& File.dirname(__FILE__))
initialize(config, token_decoder)
@config = config
@token_decoder = token_decoder
&&& before
VCAP::CloudController::SecurityContext.clear
auth_token = env["HTTP_AUTHORIZATION"]
token_information = decode_token(auth_token)
if token_information
token_information['user_id'] ||=
token_information['client_id']
uaa_id = token_information['user_id']
user = Models::User.find(:guid =& uaa_id.to_s)
user ||= create_admin_if_in_config(token_information)
user ||= create_admin_if_in_token(token_information)
VCAP::CloudController::SecurityContext.set(user,
token_information)
validate_scheme(user,
VCAP::CloudController::SecurityContext.current_user_is_admin?)
&&& # TODO:
remove from usage in cloud_controller_spec.rb
"/hello/sync" do
"sync return\n"
下面是一些内部使用的方法
&&& ......
在cloud_controller.rb中,before部分的代码是正式处理请求之前需要执行的预处理操作,这里主要是获取客户端认证相关的信息。env是解析HTTP请求后得到的一些内容,
auth_token = env["HTTP_AUTHORIZATION"]
则是取出其认证信息。如果auth_token为空,则后面计算出来的token_information为nil。例如查询对“/hello/sync”的get请求,就没有认证信息。
get部分称作路由。一个路由包括三个要素:方法,路径和代码块。这里的路由表示,针对/hello/sync的get请求,返回“sync
return”。由于不需要认证信息,所以简单地通过在浏览器中输入target_ip:port/hello/sync,就会看到该信息。
实际上还需要更多更复杂的路由范式。这些路由是在其他文件中进行配置,并在启动时添加到Controller中的。这些路由的定义形式并不像“/hello/sync”这么简单,必须对其进行解释,才能生成rack/sinatra可识别的路由。路由生成的操作是在启动阶段进行的,起始点在lib\cloud_controller.rb中。在Controller类的定义中,有一句vcap_configure,这个语句不是方法定义的形式出现,而是以,所以可看作一段可执行代码。目的是对当前路径开始的所有路径下的.rb文件,执行also_reload方法,这时就会将其他文件中的一些代码添加到Controller类的定义中。在这个过程中,会视情况对其他文件中的路由配置进行解释,生成路由并添加到Controller中。
例如lib/cloud_controller/api/app_bits.rb中的
"#{path_id}/bits", :upload
"#{path_id}/download", :download
就是两个路由规则。前者表示对uri与"#{path_id}/bits"匹配的请求,调用同文件中的upload方法,后者表示对uri与"#{path_id}/download"匹配的请求,调用download方法。但如果在rack程序中直接这样写,而不加任何处理,服务器是无法解析这样的路由的。
生成路由 &
这些路由可分为两大类,即默认路由和自定义路由。
(1)自定义路由
app_bits.rb中采用的就是自定义路由,在文件被载入到Controller时被翻译成rack可识别的路由。
在lib/cloud_controller/api路径下的所有包含路由配置的文件,都被写成如下的形式
module VCAP::CloudController
& rest_controller :AppBits do
&&& ......
app_bits.rb也不例外。rest_controller可以看作一个宏定义的方法,在require文件app_bits.rb时(或执行到这里时?),会将其后的内容展开。rest_controller定义在lib/cloud_controller/rest_controller.rb中
& def self.rest_controller(name,
Class.new:生成一个无名的superclass的子类. 若省略superclass则生成Object的子类.
这里的superclass应该是RestController::ModelController,
Base的子类,include了routes
&&& klass =
Class.new RestController::ModelController
const_set:在模块中,定义一个名为name且值为value的常数后返回value
self.const_set name, klass
class_eval:添加方法
class_eval若带块的话,会把新生成的类传给块参数,然后在类的context中执行该块。
klass.class_eval &blk
执行了disable_default_routes的类都有自己定义的route
klass.default_routes?
否则绝大多数类都有attribute之类的语句
klass.class_eval do
define_messages
define_routes
对于app_bits.rb,参数name就是AppBits,blk就是do...end部分的内容。首先动态生成一个类,然后执行klass.class_eval将blk中的方法添加为自己的方法。添加方法的同时会执行blk。对于app_bits.rb来说,通过def...end定义的方法不会被执行,如upload,download等。而独立于方法定义之外的是语句可执行的。如disable_default_routes
put "#{path_id}/bits", :upload
get "#{path_id}/download", :download
由此可以看出,这种路由配置实际上是一个方法的执行。以put "#{path_id}/bits",
:upload为例,其方法是put,参数是"#{path_id}/bits"和:upload。
这里的put方法也是在lib/cloud_controller/rest_controller/routes.rb中定义的
[:post, :get, :put, :delete].each do |verb|
define_method(verb) do |*args, &blk|
# args包括path和method
(path, method) = *args
define_route(verb, path, method, &blk)
这里同时定义了4个方法,包括put。每一个方法的功能又是定义一个方法。对于put,该方法的名字为put,参数为args和blk,在
put "#{path_id}/bits", :upload
中,args是"#{path_id}/bits",
:upload,blk为nil。进一步解析为,path="#{path_id}/bits",method="upload"。然后执行define_route("put",
"#{path_id}/bits", "upload")。
define_route定义在lib/cloud_controller/rest_controller/routes.rb中
def define_route(verb, path, method = nil,
opts[:consumes] = [:json] if [:put, :post].include?(verb)
controller.send(verb, path, opts) do
|*args|&&&&&&
logger.debug "dispatch #{klass} #{verb}
#{path}"&&&
api = klass.new(@config, logger, env, request.params, request.body,
&&&&&&&&&&&
# dispatch定义在Base中
&&&&&&&&&&&
api.dispatch(method, *args)
&&&&&&&&&&&
blk.yield(api, *args)
controller就定义在本文件中,controller.class=Class。send若是带块调用的话,也会把块原封不动地传给方法,于是就执行put
"#{path_id}/bits" do...end,这时还不知道如何执行put,所以就展开放在这里
,成了rack可读的形式。
send后面有一个参数*args实际上是:guid,这是。Sinatra框架中,路由范式可以包括具名参数。例如
'/:path/:name' do |n, m|
"path= #{n}; name= #{m}\n"
path展开到最底层,只有一个具名参数:guid,于是*args就是:guid。
参数env和request是Sinatra::Base的成员,其中env包括很多内容,例如REQUEST_URI,REMOTE_ADDR等等。因为当前类间接地继承了Sinatra::Base,所以可以使用这些变量。
&&& 最后,路由put
"#{path_id}/bits",
:upload就被翻译为,遇到put请求,路径为"#{path_id}/bits",则调用upload处理,同时将:guid传递给upload。
(2)默认路由
app.rb及其他一些文件中,没有调用disable_default_routes,在执行到rest_controller时,会调用define_routes来定义自己的路由。通过define_routes创建的路由具有一定的相似性,源文件只需给出路径名的一部分,其他部分在define_routes中动态生成,因此可称为默认路由。
def define_routes
define_standard_routes
define_to_many_routes
define_standard_routes和define_to_many_routes定义在同名文件中。
def define_standard_routes
:enumerate],
path_id, :read],
path_id, :update],
[:delete, path_id, :delete]
].each do |verb, path, method|
define_route(verb, path, method)
define_standard_routes生成一些相对固定的路由。当path存在时,路由为path,方法为post和get;当path_id存在时,路由为path_id,方法为get,put和delete。path定义在lib/cloud_controller/rest_controller/base.rb中
"#{ROUTE_PREFIX}/#{path_base}"
# Get and set the base of the path for the api endpoint.
# @param [String] base path to the api endpoint, e.g. the apps part
# /v2/apps/...
# @return [String] base path to the api endoint
def path_base(base = nil)
@path_base = base if base
@path_base || class_basename.underscore.pluralize
# basename of the class
# @return [String] basename of the class
def class_basename
self.name.split("::").last
当类的源文件中调用了path_base时,则@path_base为传入的参数;否则@path_base为类名做如下变化的结果:将大写字母改为小写,然后将单数形式改为复数形式。例如,对于app.rb,path展开后的形式为/v2/apps,而对于app_bits.rb,path展开后的形式也为/v2/apps。
path_id定义在lib/cloud_controller/rest_controller/model_controller.rb中。
def path_id
"#{path}/:guid"
其中:guid为具名参数,根据请求内容而定。
至此,结合前面的分析,define_standard_routes的调用结果就显而易见了。例如app.rb,会生成下面这些路由
"/v2/apps"& create
get& "/va/apps"& enumerate
get& "/v2/apps/:guid"& read
put& "/v2/apps/:guid"&
delete& "/v2/apps/:guid"&
create等操作定义在lib/cloud_controller/rest_controller/model_controller.rb中。
define_routes接下来还要调用define_to_many_routes。&&&&
define_to_many_routes&&&&&&
to_many_relationships.each do |name, attr|
get "#{path_id}/#{name}" do |api, id|
&&&&&&&&&&&
api.dispatch(:enumerate_related, id, name)
put "#{path_id}/#{name}/:other_id" do |api, id, other_id|
&&&&&&&&&&&
api.dispatch(:add_related, id, name, other_id)
delete "#{path_id}/#{name}/:other_id" do |api, id, other_id|
&&&&&&&&&&&
api.dispatch(:remove_related, id, name, other_id)
如果说define_standard_routes用来解析由path和path_id定义的路由,那么define_to_many_routes就是用来解析通过to_many定义的路由。
以lib/cloud_controller/api/space.rb为例,其中有一段
define_attributes do
attribute&
:name,&&&&&&&&&&&
to_one&&&&
:organization
to_many&&&
:developers
to_many&&&
to_many&&&
to_many&&&
to_many&&&
to_many&&&
:service_instances
to_many&& :app_events
当启动时执行到这里时,就会调用define_attributes方法。define_attributes定义在lib/cloud_controller/rest_controller/model_controller.rb中
def define_attributes(&blk)
k = Class.new do
include ControllerDSL
# instance_eval:在对象的context中计算字符串expr并返回结果
k.new(self).instance_eval_r(&blk)
于是会执行attribute,to_one和to_many这些方法。其中to_many定义在lib\cloud_controller\rest_controller\controller_dsl.rb中。
to_many(name, opts = {})
to_many_relationships[name] = ToManyAttribute.new(name, opts)
对于space.rb中的to_many&&&
:apps来说,展开为
to_many_relationships[":apps"] = ToManyAttribute.new(":apps",
也就是新建一个类,添加到to_many_relationships中。根据上下文,to_many_relationships是一个Array或一个Hash结构。
执行到define_to_many_routes时,each后的参数name就是apps。api和id是路由范式中的具名参数(关于具名参数的详情可参考Sinatra文档)。以路由"#{path_id}/#{name}"为例,path_id中包括两个变量,如果一个请求和该路由匹配,则第一个变量的实际值将赋给api,第二个变量的实际值赋给id。在另外两个路由范式中,:other_id代表第三个变量。第一个变量是什么还不知道,但通过测试可知,:guid部分的内容会被赋给id,那么第一个具名参数一定在path_id中。而api在运行过程中代表一个类的实例。例如,在启动时一个路由最终展开为#{path_id}
/v2/spaces/:guid。当一个URL匹配该路由时,参数值如下
id=b28-411e-9ccf-524ab15ce37c
#{name}=apps
通过define_standard_routes定义的路由,其具名参数放在*args中,数量可以是一个。
上传app的路由是自定义路由,流程比较简单,略。
当客户端启动一个app时,发送的请求的格式如下(实际上客户端先检查app的状态,然后才决定是否发送put请求,这里假设app当前状态为stopped,因此客户端需要发送put请求)
PUT /v2/apps/:guid?stage_async=true
通过前面的分析可知,该请求和一个通过define_standard_routes定义的路由匹配,并被lib/cloud_controller/rest_controller/model_controller.rb的update方法处理。
update(id)
logger.debug "update: #{id} #{request_attrs}"
obj = find_id_and_validate_access(:update, id)
json_msg = self.class::UpdateMessage.decode(body)
@request_attrs = json_msg.extract(:stringify_keys =&
raise InvalidRequest unless request_attrs
before_modify(obj)
model.db.transaction do
obj.update_from_hash(request_attrs)
after_modify(obj)
[HTTP::CREATED, serialization.render_json(self.class, obj,
其参数即是url中的guid。find_id_and_validate_access会调用obj = model.find(:guid
=& id)得到一个Sequel::Model对象并加以验证,如果合法则返回该对象。Sequel 是一个
语言的对象映射框架(ORM),其子类Sequel::Model代表一种对象关系映射。而find_id_and_validate_access返回的Sequel::Model对象相当于数据库中的一行,:guid
id即是查询条件。obj.update_from_hash根据请求中body中的内容更新数据库?。在操作前后分别调用了before_modify和after_modify方法,其中before_modify定义如下
before_modify(app)
app.stage_async = %w(1 true).include?(params["stage_async"])
根据put请求的内容,执行before_modify后app.stage_async会变为true。当update_from_hash这个事物成功后,会调用lib/cloud_controller/models/app.rb中的after_commit,其中涉及到对该标志位的检查。
def after_commit
react_to_saved_changes(previous_changes || {})
def react_to_saved_changes(changes)
if changes.has_key?(:state)
react_to_state_change
elsif changes.has_key?(:instances)
delta = changes[:instances][1] - changes[:instances][0]
react_to_instances_change(delta)
在after_commit中调用react_to_saved_changes,执行数据库更新后应该做的一些操作。react_to_saved_changes首先检查changes这个参数,看其是否包含:state关键字。当app在数据库中的状态由stopped变为started时,changes会记录该变化,于是执行react_to_state_change。
def react_to_state_change
if started?
stage_if_needed do
&&&&&&&&&&&
DeaClient.start(self)
&&&&&&&&&&&
send_droplet_updated_message
elsif stopped?
DeaClient.stop(self)
send_droplet_updated_message
react_to_state_change判断状态是不是“STARTED”,结果为真,于是执行if后的语句。如果需要,则先执行stage操作,然后调用DeaClient.start和send_droplet_updated_message。send_droplet_updated_message向nats中发送droplet.updated消息,DeaClient.start开始启动一个app的过程。
def start(app)
start_instances_in_range(app, (0...app.instances))
app.routes_changed = false
def start_instances_in_range(app, indices)
start_instances_with_message(app, indices, {})
def start_instances_with_message(app, indices,
message_override)
msg = start_app_message(app)
indices.each do |idx|
msg[:index] = idx
dea_id = dea_pool.find_dea(app.memory, app.stack.name,
&&&&&&&&&&&
dea_publish("#{dea_id}.start", msg.merge(message_override))
&&&&&&&&&&&
dea_pool.mark_app_staged(dea_id: dea_id, app_id: app.guid)
&&&&&&&&&&&
logger.error "no resources available #{msg}"
start_instances_with_message的第一个参数是app名字,第二个参数是实例个数,controller从dea_pool中找到一个dea,通过nats向主题#{dea_id}.start发送消息。#{dea_id}对应的dea收到消息后,就会执行启动app的操作。
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

我要回帖

更多关于 魅族路由器急速版 的文章

 

随机推荐