本文目录一览:
Vert.x 与 Node.js 有哪些区别
Vert.x是一个用于下一代异步、可伸缩、并发应用的框架,旨在为JVM提供一个Node.js的替代方案。开发者可以通过它使用JavaScript、Ruby、Groovy、Java、甚至是混合语言来编写应用。
在内部,一个vert.x实例会管理着一个小的线程集合,每个线程针对服务器上的一个可用内核。基本上每个线程都实现了一个事件循环。当部署一个vert.x应用实例(又叫做verticle)时,服务器会选择一个事件循环分配给该实例。接下来针对该实例的任务都会通过该线程进行分配。由于在某一时刻可能会有成千上万个verticle在运行,因此在同一时刻会将单个事件循环指定给多个verticle。
Verticle可与运行在相同或不同vert.x实例中的其他verticle进行通信,这是通过消息事件总线实现的,它类似于Erlang的actor模型。消息传递旨在让系统能够在多个可用核心上进行扩展而无需以多线程的方式来执行verticle代码。
事件总线是分布式的,并不只会跨越服务器,还会渗透进客户端的JavaScript以处理“实时”的Web应用。
除了并发与消息传递外,vert.x还具有如下特性:
TCP/SSL服务器与客户端
HTTP/HTTPS服务器与客户端
WebSockets/SockJS支持
InfoQ有幸采访到了VMWare的高级工程师Tim Fox以了解vert.x:
InfoQ:能否从架构上介绍一下vert.x及其构建方式?
Tim:vert.x的核心是用Java编写的,接下来我们为每一种支持的JVM语言编写了一个薄薄的API层,这样每种语言都有一个适合于该语言的API了。我们并没有向这些语言直接公开Java API。这意味着Ruby用户会通过Ruby的方式编写代码,JS用户会通过JS的方式编写代码。
InfoQ:能否描述一下在vert.x上典型的开发流程么,特别是与开发者使用Node.js的体验进行一下对比?
我觉得这与node.js是非常类似的。实际的工作流程取决于你是在本地还是云中运行应用。但这并非vert.x所特有的。
InfoQ:就调试、监控与运维来看,在JVM与Node.js上运行实时应用有何差别?
我想说监控与运维实际上与部署vert.x的环境之间的关系更为密切而非vert.x本身。比如说,如果将vert.x部署到云中,那么云提供商可能就会为你提供监控。顺便说一下,社区成员目前已经在OpenShift与Heroku上运行了Vert.x。我们希望不久之后CloudFoundry支持就会到来。
InfoQ:vert.x与Node.js有什么基准比较么?
我们尚未发布任何的官方基准。但我自己已经完成了一些,在我所做的测试中,vert.x的性能与可伸缩性都远远超越了node.js。我希望在不久之后能够发布一些基准。
InfoQ:vert.x与Netty相比如何呢?
Netty是个很棒的底层IO库。Vert.x实际上使用了Netty。但vert.x是个用于编写异步应用的完整平台。Vert.x还提供了一个组件模型、文件IO及各种Netty所没有的东西。我要说的是,在JVM世界中,Vert.x是更类似于Akka(也使用了Netty)之类的完整框架。
微信公众平台 网页 跳转 如何获取 账号
一、通过全局Access Token获取用户基本信息
1. 用户关注以及回复消息的时候,均可以获得用户的OpenID
xml
ToUserName![CDATA[gh_b629c48b653e]]/ToUserName
FromUserName![CDATA[ollB4jv7LA3tydjviJp5V9qTU_kA]]/FromUserName
CreateTime1372307736/CreateTime
MsgType![CDATA[event]]/MsgType
Event![CDATA[subscribe]]/Event
EventKey![CDATA[]]/EventKey
/xml
其中的FromUserName就是OpenID
2. 然后使用access_token接口,请求获得全局Access Token
;appid=APPIDsecret=APPSECRET
返回结果:
{
"access_token": "NU7Kr6v9L9TQaqm5NE3OTPctTZx797Wxw4Snd2WL2HHBqLCiXlDVOw2l-Se0I-WmOLLniAYLAwzhbYhXNjbLc_KAA092cxkmpj5FpuqNO0IL7bB0Exz5s5qC9Umypy-rz2y441W9qgfnmNtIZWSjSQ",
"expires_in": 7200
}
3. 再使用全局ACCESS_TOKEN获取OpenID的详细信息
;openid=OPENID
返回如下:
{
"subscribe": 1,
"openid": "oLVPpjqs2BhvzwPj5A-vTYAX4GLc",
"nickname": "方倍",
"sex": 1,
"language": "zh_CN",
"city": "深圳",
"province": "广东",
"country": "中国",
"headimgurl": "",
"subscribe_time": 1386160805
}
至此,获得用户的基本信息。
二、通过OAuth2.0方式弹出授权页面获得用户基本信息
1. 首先配置回调域名
2. 构造请求url如下:
;redirect_uri=;response_type=codescope=snsapi_userinfostate=1#wechat_redirect
页面URL中的
scope=snsapi_userinfo 表示应用授权作用域为请求用户信息
★ 如果使用别人的AppID和AppSecret,那么获得的OpenID是那个有高级接口权限的服务号的,这里可以通过消息回复,获取本公众账号下的OpenID,带入回调中,与另一个OpenID进行关联
;redirect_uri=;response_type=codescope=snsapi_userinfostate=1#wechat_redirect
将该链接回复给关注用户,用户点击后,弹出应用授权界面
3. 回调页面得到链接如下,回调url中将包含参数code
;state=1
或者 ;code=00b788e3b42043c8459a57a8d8ab5d9fstate=1
4. 再使用code换取oauth2的授权access_token
url如下:
;secret=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacode=00b788e3b42043c8459a57a8d8ab5d9fgrant_type=authorization_code
获得授权Access Token:
{
"access_token": "OezXcEiiBSKSxW0eoylIeAsR0GmYd1awCffdHgb4fhS_KKf2CotGj2cBNUKQQvj-G0ZWEE5-uBjBz941EOPqDQy5sS_GCs2z40dnvU99Y5AI1bw2uqN--2jXoBLIM5d6L9RImvm8Vg8cBAiLpWA8Vw",
"expires_in": 7200,
"refresh_token": "OezXcEiiBSKSxW0eoylIeAsR0GmYd1awCffdHgb4fhS_KKf2CotGj2cBNUKQQvj-G0ZWEE5-uBjBz941EOPqDQy5sS_GCs2z40dnvU99Y5CZPAwZksiuz_6x_TfkLoXLU7kdKM2232WDXB3Msuzq1A",
"openid": "oLVPpjqs9BhvzwPj5A-vTYAX3GLc",
"scope": "snsapi_userinfo,"
}
5. 再使用授权Access Token获取用户信息
url如下:
;openid=oLVPpjqs9BhvzwPj5A-vTYAX3GLc
返回如下
{
"openid": "oLVPpjqs9BhvzwPj5A-vTYAX3GLc",
"nickname": "方倍",
"sex": 1,
"language": "zh_CN",
"city": "Shenzhen",
"province": "Guangdong",
"country": "CN",
"headimgurl": "",
"privilege": []
}