价格:$ 0.99
大小:-
类型:iphone 程序
语言:english, chines
two lazy to keep a diary? no problem, we have diary-9 now. with pre-defined categories, just fill in content without thinking too much. record your colorful life! start from now!
以下列出的是 httpclient 提供的主要的功能,要知道更多详细的功能可以参见 httpclient 的凯发k8网页登录主页。
下面将逐一介绍怎样使用这些功能。首先,我们必须安装好 httpclient。
下面是个我写的程序:
package com.newpalm.unicomfetch.threads;
import java.util.vector;
import org.apache.commons.httpclient.cookie;
import org.apache.commons.httpclient.httpclient;
import org.apache.commons.httpclient.namevaluepair;
import org.apache.commons.httpclient.cookie.cookiepolicy;
import org.apache.commons.httpclient.cookie.cookiespec;
import org.apache.commons.httpclient.methods.getmethod;
import org.apache.commons.httpclient.methods.postmethod;
import org.htmlparser.node;
import org.htmlparser.parser;
import org.htmlparser.tags.tablecolumn;
import org.htmlparser.tags.tablerow;
import org.htmlparser.tags.tabletag;
import org.htmlparser.visitors.objectfindingvisitor;
/**
* 用来演示登录表单的示例
* @author liudong
*/
public class formlogindemo {
public static void main(string[] args) throws exception{
parser parser = null;
objectfindingvisitor visitor = null;
httpclient client = new httpclient();
//模拟登录页面
postmethod post = new postmethod("");
namevaluepair name = new namevaluepair("txthandsetnumber", "123456");
namevaluepair pass = new namevaluepair("txtpassword", "123456");
namevaluepair __viewstate = new namevaluepair("__viewstate", "ddwtmtuxmzkxntq0mzt0pdtspgk8mt47pjtsphq8o2w8atwxpjs o2w8ddxwpgw8vgv4dds o2w8xdxtyxjxdwvlierpcmvjdglvbj0idxaiigjlagf2aw9ypsjzy3jvbgwiicbozwlnahq9jze1mccgc2nyb2xszgvsyxk9mzawig9ubw91c2vvdmvypsd0aglzlnn0b3aokscgb25tb3vzzw91dd0ndghpcy5zdgfydcgpj1w xdxpbwcgc3jjpsjpbwfnzs9kzwzhdwx0x2nhbgxfawnvbi5nawyiihdpzhropsi0iibozwlnahq9ijcixd4mbmjzcfw7jm5ic3bco1w8ysbocmvmid0iiyigb25jbgljaz0ib3blbldpbmrvdygnl0j1bgxldglulmfzchg/qnvsbgv0aw5jzd0ymycpilw c3dkujrliqhmjqxlhaxms6jmhi/kuovpoblcpc9hxd4kxdxiclw xdxiclw xdwvbwfycxvlzvw oz4 ozs oz4 oz4 o2w8ynrutg9naw47pj4pkegdivj1jmrdgjas7sgzd39jzg==");
namevaluepair btnloginx = new namevaluepair("btnlogin.x", "0");
namevaluepair btnloginy = new namevaluepair("btnlogin.y", "5");
post.setrequestbody(new namevaluepair[]{name,pass,__viewstate,btnloginx,btnloginy});
int status = client.executemethod(post);
post.releaseconnection();
//查看cookie信息
cookiespec cookiespec = cookiepolicy.getdefaultspec();
cookie[] cookies = client.getstate().getcookies();
if (cookies.length == 0) {
system.out.println("none");
} else {
for (int i = 0; i < cookies.length; i) {
system.out.println(cookies[i].tostring());
}
}
//访问所需的页面
getmethod get = new getmethod("");
client.executemethod(get);
visitor = new objectfindingvisitor(tabletag.class);
parser = new parser();
parser.setinputhtml(get.getresponsebodyasstring());
parser.setencoding("gbk");
parser.visitallnodeswith(visitor);
//取得要解析的页面数
node[] tables = visitor.gettags();
tabletag tabletag = (tabletag) tables[tables.length-1];
tablerow[] rows = tabletag.getrows();
tablerow row = rows[0];
tablecolumn[] col = row.getcolumns();
int pagenumber = integer.parseint(col[0].getchildrenhtml().substring(25, 29));
get.releaseconnection();
for(int i=1;i<pagenumber;i){
postmethod pt = new postmethod("");
namevaluepair txtpage = new namevaluepair("txtpage",integer.tostring(i));
__viewstate = new namevaluepair("__viewstate", "")
namevaluepair __eventtarget = new namevaluepair("__eventtarget", "");
namevaluepair __eventargument = new namevaluepair("__eventargument", "");
namevaluepair tbmdn = new namevaluepair("tbmdn", "");
namevaluepair tbservicetype = new namevaluepair("tbservicetype", "");
namevaluepair tbstarttime = new namevaluepair("tbstarttime", "");
namevaluepair tbendtime = new namevaluepair("tbendtime", "");
namevaluepair btngotox = new namevaluepair("btngoto.x", "26");
namevaluepair btngotoy = new namevaluepair("btngoto.y", "13");
pt.setrequestbody(new namevaluepair[]{__eventtarget,__eventargument,__viewstate,tbmdn,tbservicetype,tbstarttime,tbendtime,txtpage,btngotox,btngotoy});
int a = client.executemethod(pt);
parser.setinputhtml(pt.getresponsebodyasstring());
parser.setencoding("gbk");
parser.visitallnodeswith(visitor);
tables = visitor.gettags();
tabletag = (tabletag) tables[tables.length-3];
rows = tabletag.getrows();
row = rows[1];
col = row.getcolumns();
system.out.println(col[4].getchildrenhtml().tostring());
get.releaseconnection();
}
}
}
下面介绍在使用httpclient过程中常见的一些问题。
某目标页的编码可能出现在两个地方,第一个地方是服务器返回的http头中,另外一个地方是得到的html/xml页面中。
根据rfc2616中对自动转向的定义,主要有两种:301和302。301表示永久的移走(moved permanently),当返回的是301,则表示请求的资源已经被移到一个固定的新地方,任何向该地址发起请求都会被转到新的地址上。302表示暂时 的转向,比如在服务器端的servlet程序调用了sendredirect方法,则在客户端就会得到一个302的代码,这时服务器返回的头信息中 location的值就是sendredirect转向的目标地址。
httpclient支持自动转向处理,但是象post和put方式这种要求接受后继服务的请求方式,暂时不支持自动转向,因此如果碰到post方 式提交后返回的是301或者302的话需要自己处理。就像刚才在postmethod中举的例子:如果想进入登录bbs后的页面,必须重新发起登录的请 求,请求的地址可以在头字段location中得到。不过需要注意的是,有时候location返回的可能是相对路径,因此需要对location返回的 值做一些处理才可以发起向新地址的请求。
另外除了在头中包含的信息可能使页面发生重定向外,在页面中也有可能会发生页面的重定向。引起页面自动转发的标签是:。如果你想在程序中也处理这种情况的话得自己分析页面来实现转向。需要注意的是,在上面那 个标签中url的值也可以是一个相对地址,如果是这样的话,需要对它做一些处理后才可以转发。
httpclient提供了对ssl的支持,在使用ssl之前必须安装jsse。在sun提供的1.4以后的版本中,jsse已经集成到jdk中, 如果你使用的是jdk1.4以前的版本则必须安装jsse。jsse不同的厂家有不同的实现。下面介绍怎么使用httpclient来打开https连 接。这里有两种方法可以打开https连接,第一种就是得到服务器颁发的证书,然后导入到本地的keystore中;另外一种办法就是通过扩展 httpclient的类来实现自动接受证书。
方法1,取得证书,并导入本地的keystore:
2. 单击”view certificate”,在弹出的对话框中选择”details”,然后再单击”copy to file”,根据提供的向导生成待访问网页的证书文件
3. 向导第一步,欢迎界面,直接单击”next”,
4. 向导第二步,选择导出的文件格式,默认,单击”next”,
5. 向导第三步,输入导出的文件名,输入后,单击”next”,
6. 向导第四步,单击”finish”,完成向导
7. 最后弹出一个对话框,显示导出成功
|
其中参数alias后跟的值是当前证书在keystore中的唯一标识符,但是大小写不区分;参数file后跟的是刚才通过ie导出的证书所在的路径和文件名;如果你想删除刚才导入到keystore的证书,可以用命令:
|
|
运行该程序可能出现的问题:
1. 抛出异常java.net.socketexception: algorithm ssl not available。出现这个异常可能是因为没有加jsseprovider,如果用的是ibm的jsse provider,在程序中加入这样的一行:
|
或者也可以打开
|
后面加入security.provider.3=com.ibm.jsse.ibmjsseprovider
2. 抛出异常java.net.socketexception: ssl implementation not available。出现这个异常可能是你没有把ibmjsse.jar拷贝到
3. 抛出异常javax.net.ssl.sslhandshakeexception: unknown certificate。出现这个异常表明你的jsse应该已经安装正确,但是可能因为你没有把证书导入到当前运行jre的keystore中,请按照前 面介绍的步骤来导入你的证书。
方法2,扩展httpclient类实现自动接受证书
因为这种方法自动接收所有证书,因此存在一定的安全问题,所以在使用这种方法前请仔细考虑您的系统的安全需求。具体的步骤如下:
|
|
httpclient中使用代理服务器非常简单,调用httpclient中setproxy方法就可以,方法的第一个参数是代理服务器地址,第二个参数是端口号。另外httpclient也支持socks代理。
dec 2nd 2010 | from print edition
towards the end of 2003 and early in 2004 china’s most senior leaders put aside the routine of governing 1.3 billion people to spend a couple of afternoons studying the rise of great powers. you can imagine history’s grim inventory of war and destruction being laid out before them as they examined how, from the 15th century, empires and upstarts had often fought for supremacy. and you can imagine them moving on to the real subject of their inquiry: whether china will be able to take its place at the top without anyone resorting to arms.
in many ways china has made efforts to try to reassure an anxious world. it has repeatedly promised that it means only peace. it has spent freely on aid and investment, settled border disputes with its neighbours and rolled up its sleeves in un peacekeeping forces and international organisations. when north korea shelled a south korean island last month china did at least try to create a framework to rein in its neighbour.
but reasonable china sometimes gives way to aggressive china. in march, when the north sank a south korean warship, killing 46 sailors, china failed to issue any condemnation. a few months later it fell out with japan over some chinese fishermen, arrested for ramming japanese coastguard vessels around some disputed islands—and then it locked up some japanese businessmen and withheld exports of rare earths vital for japanese industry. and it has forcefully reasserted its claim to the spratly and paracel islands and to sovereignty over virtually the entire south china sea.
as the chinese leaders’ history lesson will have told them, the relationship that determines whether the world is at peace or at war is that between pairs of great powers. sometimes, as with britain and america, it goes well. sometimes, as between britain and germany, it does not.
so far, things have gone remarkably well between america and china. while china has devoted itself to economic growth, american security has focused on islamic terrorism and war in iraq and afghanistan. but the two mistrust each other. china sees america as a waning power that will eventually seek to block its own rise. and america worries about how chinese nationalism, fuelled by rediscovered economic and military might, will express itself (see our ).
the peloponnesian pessimists
pessimists believe china and america are condemned to be rivals. the countries’ visions of the good society are very different. and, as china’s power grows, so will its determination to get its way and to do things in the world. america, by contrast, will inevitably balk at surrendering its pre-eminence.
they are probably right about chinese ambitions. yet china need not be an enemy. unlike the soviet union, it is no longer in the business of exporting its ideology. unlike the 19th-century european powers, it is not looking to amass new colonies. and china and america have a lot in common. both benefit from globalisation and from open markets where they buy raw materials and sell their exports. both want a broadly stable world in which nuclear weapons do not spread and rogue states, like iran and north korea, have little scope to cause mayhem. both would lose incalculably from war.
the best way to turn china into an opponent is to treat it as one. the danger is that spats and rows will sour relations between china and america, just as the friendship between germany and britain crumbled in the decades before the first world war. it is already happening in defence. feeling threatened by american naval power, china has been modernising its missiles, submarines, radar, cyber-warfare and anti-satellite weapons. now america feels on its mettle. recent pentagon assessments of china’s military strength warn of the threat to taiwan and american bases and to aircraft-carriers near the chinese coast. the us navy has begun to deploy more forces in the pacific. feeling threatened anew, china may respond. even if neither america nor china intended harm—if they wanted only to ensure their own security—each could nevertheless see the other as a growing threat.
some would say the solution is for america to turn its back on military rivalry. but a weaker america would lead to chronic insecurity in east asia and thus threaten the peaceful conduct of trade and commerce on which america’s prosperity depends. america therefore needs to be strong enough to guarantee the seas and protect taiwan from chinese attack.
how to take down the great wall
history shows that superpowers can coexist peacefully when the rising power believes it can rise unhindered and the incumbent power believes that the way it runs the world is not fundamentally threatened. so a military build-up needs to be accompanied by a build-up of trust.
there are lots of ways to build trust in asia. one would be to help ensure that disputes and misunderstandings do not get out of hand. china should thus be more open about its military doctrine—about its nuclear posture, its aircraft-carriers and missile programme. likewise, america and china need rules for disputes including north korea (see ), taiwan, space and cyber-warfare. and asia as a whole needs agreements to help prevent every collision at sea from becoming a trial of strength.
america and china should try to work multilaterally. instead of today’s confusion of competing venues, asia needs a single regional security forum, such as the east asia summit, where it can do business. asian countries could also collaborate more in confidence-boosting non-traditional security, such as health, environmental protection, anti-piracy and counter-terrorism, where threats by their nature cross borders.
if america wants to bind china into the rules-based liberal order it promotes, it needs to stick to the rules itself. every time america breaks them—by, for instance, protectionism—it feeds china’s suspicions and undermines the very order it seeks.
china and america have one advantage over history’s great-power pairings: they saw the 20th century go disastrously wrong. it is up to them to ensure that the 21st is different.
译者注:wordpress是最受欢迎的博客发布平台之一,具有免费,高度可定制、容易安装和使用等特色。由于wordpress是如此流行和受欢迎,你可以找到大量的wordpress开发以及管理等方面的资源,丰富的用户指南让你能够快速的上手使用。参考资料:
有很多天才设计师选择发表免费的主题。大多数时候,对于他们来说唯一的一点小要求就是保留他们的设计元素,并链接到他们的网站(非常合理的要求)。
在本文中,我们整理了50个优秀的、高质量的、给大家。这些主题包含了制作精细且华丽的主题,也有简洁清爽的主题,你可以找到适合你的设计品位的wordpress主题。
说明: 请务必检查主题的许可协议,不要违反使用限制(如果有的话),并且保留设计师的设计属性[footer中的设计信息],即使设计师没有要求你这么做。[注:设 计一个漂亮的wordpress theme,需要花费设计师很多的时间和精力,如果你喜欢这些免费的wordpress主题,请尊重设计师的劳动成果。]
译者注:在本文中介绍的wordpress主题均为英文模板,对于使用英文写博客的朋友来说,这里还有我收集的3个英文写作软件可以参考,都有免费试用版本可供下载:1、 - 最适合esl使用的英文写作和语法纠错软件,支持mac os。2、 - 最适合公司,组织,作家使用的plain english写作软件。3、 - 英文拼写和语法检查软件,和whitesmoke差不多,但更为专业的英文写作工具。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
为了向你展示这些 css hack 是否正常运作,我新建六个 p 标签,并给每一个 p 标签一个特有的 id。这将向你展示 css hack 的运作情况。
我来自 opera 7.2 - 9.5
我是神奇的 safari
我来自 firefox
我是你爷爷 firefox 1 - 2
我是囧 ie 7
我是脑瘸 ie 6
然后我让这些 p 标签默认都不显示
使用 ie css 条件注释区分 ie 浏览器
最简单的区分 ie 浏览器的方法自然是使用他们的条件注释。 微软创建了一个强大的语法来让我们去实现这个功能。我不想再详细地介绍 ie 条件注释了,我想你在搜索引擎能搜索到上万个搜索条目,我这里只要这两个:
使用 css 解析器 hacks 区分 ie
虽说 ie 条件注释十分简单好用,但是如果你想把全部的 css 放到一个文件里的 话,那么你不得不使用别的方法。注意这里的 ie 7 hack将只对 ie7 有效,因为 ie6 根本不知道 > 选择符。同时你也得注意 > 选择符对于其他浏览器同样是无效的。
html > body #ie7 {*display: block;}
body #ie6 {_display: block;}
css hack 区分 firefox
第一个使用了 body:empty 来区分 firefox 1 和 2 。第二个 hack使用了全部 firefox 浏览器的专有扩展 -moz。 -moz 只对 firefox有效,使用这个 hack 大可不必担心其他浏览器的影响。
body:empty #firefox12 {display: block;}
@-moz-document url-prefix() {#firefox { display: block; }}
css hack 区分 safari
safari 的 css hack 与 firefox 的 hack 看起来很像,使用的是 safari浏览器的专有扩展 -webkit 且只对 safari 浏览器有效。
@media screen and (-webkit-min-device-pixel-ratio:0) {#safari { display: block; }}
css hack 区分 opera
@media all and (-webkit-min-device-pixel-ratio:10000), not all and (-webkit-min-device-pixel-ratio:0) {head~body #opera { display: block; }}
然后,全部合在一起便是
body p {
display: none;
}
html:first-child #opera {
display: block;
}
html > body #ie7 {
*display: block;
}
body #ie6 {
_display: block;
}
body:empty #firefox12 {
display: block;
}
@-moz-document url-prefix() {
#firefox {
display: block;
}
}
@media screen and (-webkit-min-device-pixel-ratio:0) {
#safari {
display: block;
}
}
@media all and (-webkit-min-device-pixel-ratio:10000), not all and (-webkit-min-device-pixel-ratio:0) {
head~body #opera {
display: block;
}
}
我来自 opera 7.2 - 9.5
我是神奇的 safari
我来自 firefox
我是你爷爷 firefox 1 - 2
我是囧 ie 7
我是脑瘸 ie 6
css hack 虽好且方便兼容各浏览器,但是通不过 w3c 验证,所以还得自己权衡是否有必要去使用。
"一切都在流动,没有什么是持久的。一切都在融化,没有什么是固定不变的" - 赫拉克利特(heracleitus)
大约在2003年中的时候,soa的概念逐渐进入人们的视野,一时间众人乐此不疲的发表各自对soa的见解。soa已经成 为it业,尤其是软件开发及系统集成领域从业者的热门话题。很多的权威机构也纷纷预测soa的美妙前景,例如,gartner 预言,到了 2008 年,至少 60% 的企业将使用 soa 作为其it架构。抛开喧嚣躁动以及随声附和,对于软件开发者而言,经过了一年多的概念灌输,伴随着不断增长的困惑,更多的人希望能静下心来看一看:究竟怎 样的系统架构是符合soa设计的,而又有哪些技术可以用来实现soa呢?特别是企业服务总线(enterprise service bus, esb), 看起来更是soa中一个玄虚的概念,本系列文章将通过实际的案例分析来详细讲解在soa系统中是怎样实施esb的。
本系列文章将直接面向广大的软件开发人员, 首先以直观的方式介绍什么是esb, 然后引入一个实际案例,以此为基础,详细介绍怎样一步一步实现esb。现在我们谈论soa和esb的时候都不再是空中楼阁,ibm作为soa的倡导者,已 经提供了很好的产品来实现我们的设想。我们会在本系列中的第二、第三部分中分别介绍基于websphere 6 和ibm eai产品的两种实现方式, 然后在第四部分中介绍在复杂的企业应用场景中总线(bus)怎样互联, 怎样扩展。希望通过本系列文章,能让广大读者朋友快速掌握esb的实际开发技巧。
关于soa的概念,你可以找到很多的文章从不同的角度来描述它,不同的软件提供商也有不同的定义方式。bea有流体计算, 微软有indigo 和soa-building, sap有esa。 每个人都可以从不同的视角来理解soa,从程序员的角度,soa是一种全新的开发技术,新的组件模型,比如说web service;从架构设计师的角度,soa就是一种新的设计模式,方法学;从业务分析人员的角度,soa就是基于标准的业务应用服务。从概念的角 度,ibm对soa的定义是最为全面的,既soa是一种构造分布式系统的方法,它将业务应用功能以服务的形式提供给最终用户应用或其他服务。soa包括如 下要素:
本文针对的读者是软件开发人员,站在开发人员的角度,往往希望软件开发能够满足对于开发效率、可靠性、易维护性、易管理等多方面的更高要求。让我们通过回顾软件开发的演化过程来看一看soa出现的必然性:
我们注意到,soa同样也强调重用(reuse), 但是相对于传统的代码重用,对象重用,和部件重用,soa的重用粒度更粗。soa的重用在于业务级的应用,即服务的重用,这与软件的发展规律是相一致的。 在软件发展的过程中,软件重用的对象越来越接近我们的现实生活。通过部件的重用,软件的开发更具效率,并且开始试图用组件表达业务模式。但是,it人员仍 很难对业务人员解释清楚it结构怎样映射到业务模型上。然而,it架构与业务模型的弥合是不可避免的方向。现代企业的业务环境所面临的最大挑战就是变化, 规则在变,需求在变,而对变化做出最快的反应,尽快地适应变化,成为企业占得先机,成功运作的关键。很多企业的业务环境依赖于他们的it架构,因此,it 部门往往直接承载了业务变化带来的压力。每一个具体的业务变化,都直接反应到对现有的it平台的要求:要么企业it架构本身对变化自适应,要么it架构能 够在短时间内根据新的业务规则做出调整。这就是soa架构提出的根本原因,我们需要一种更加贴近业务的it架构,能够直接描绘业务,对那些不懂it技术的 业务领域专家来说,业务服务却是他们最熟悉的,也就是说是soa把软件重用的对象从it人员上升到了业务人员。因此,我们可以说soa与其它的模式相比, 最大的进步在于它与业务的关联性,"服务"对应到实际业务。it通过"服务"与业务发生了密切的关系,业务人员和it人员都可以专注于业务逻辑的实现,而 共同的语言就是"服务"。
但不是什么场合都适用soa。通常来讲,soa适用于较为复杂的it架构,经常需要与外部复杂的it环境交互,并且需要快 速地应对频繁发生的业务变化。就像你不可能在控制洗衣机的芯片上使用ejb开发一样,如果你的it环境规模很小,足以灵活地应对变化,不需要与其他的异构 it环境频繁交互,那么soa带来的好处就不足以抵消它给你带来的系统复杂性。但是,即令如此,你也并没有被完全排除在soa的大趋势之外。soa是如此 地倍受瞩目,我们可以预见到它的迅猛发展,因此即使你的内部it架构本身并不是基于soa的,你也还有机会参与到未来的soa架构中去。例如,将你的某个 业务以服务的形式发布到某个外部soa平台上供别人使用,作为第三方soa平台的一个服务提供者(service provider)存在。
在选择soa的实施方案时,要记住,软件的具体实现技术诸如web 服务与soa是两回事,soa是一个概念,方法学, 或者用一个更时髦的词:一种模型。而web 服务呢?它是一种具体的实现技术,就像ejb一样。soa ≠ web服务。不过公平地讲,web 服务倒确实是目前最适合实现soa的技术之一,用web 服务来封装业务服务是个不错的选择。因为web服务是标准的,ws-i协议保证了来自不同厂商的web服务即使运行在不同的平台上,底层的实现机理不同也 可以顺利交互,这是以前的任何一种技术如corba,ejb,或dcom都不能做到的。而且,web服务的定义与实现是分开描述的,即松散耦合,因此,可 以很方便地替换服务的内在实现而不会对现有的系统造成任何冲击,这也极大地促进了it架构的灵活性。
对于soa更进一步的了解,可以参考ibm developerworks上其他soa相关的文章(请参见参考资料),我们的系列文章将主要讨论esb,因此不再此过多地论述soa了。为了使我们下面的论述更顺畅,请先牢记典型的soa架构有哪些基本的要求:
让我们暂时回到网络技术不普及的时代,你怎样在两台机器之间传递文件?我还记得为了给实验室的每台机器安装borland c 的环境,猜猜我动用了什么:一根"串口线"。不过,我仍然觉得庆幸,好在每台机器都运行同样的操作系统- dos(很少有人还记得dos中有interlnk这样一个命令吧), 用来通过串口线在两台机器间传递流文件。否则我将不得不用软盘来拷贝所有的安装文件。我那个时候的梦想就是,哪一天有这么一个叫做"网络"的东西能够把实 验室里面所有机器都连接起来,而不用我在各机器之间跑来跑去。
让我们回归主题,你现在已经基本明白了什么是soa。假定你已经按照soa的思想提炼出了各种业务服务,公布出来,同样, 你发现其他很多人也做了同样的事情。大家都很振奋,开始踊跃的尝试,我调用你的一个服务,你调我的一个服务。啊哈!大家都soa了。且慢,那么这个soa 给你们带来了什么好处呢?ok,现在我可以在j2ee环境里调用.net的组件了,但是原来没有soa的时候也可以做到的呀。只要两个节点之间互相认可对 方的方式,即使不存在公开/统一的服务界面也可以实现点到点的互联。因此我们不得不承认,如果我们只有服务,而服务的请求者和服务的提供者之间仍然需要这 种显式的点到点的调用,那么这就不是一个典型的soa架构。请看图二,服务的参与双方都必须建立1对1 的联系。这样一个结构与我十几年前的那种互联的方式何其相似!但是,还记得我们上面提到的soa三个基本要素吗?显然第三点没有做到。
因此,在soa中,我们还需要这样一个中间层,能够帮助实现在soa架构中不同服务之间的智能化管理。最容易想到的是这样 一个hub-spoke结构,在soa架构中的各服务之间设置一个类似于hub的中间件,由它充当整个soa架构的中央管理器的作用。请看图三,现在服务 的请求者和提供者之间有了一个智能的中转站, 服务的请求者不再需要了解服务提供者的细节。不错!看上去是一个好的soa结构。事实上,传统的eai就是通过这样一种方式来试图解决企业内部的应用整合 问题。
eai的目标是支持对现有it系统的重新利用,通过eai技术能够将不同的软件和系统串联起来,延长这些应用系统的生命周 期。传统的eai,往往使用如corba和com等的消息中间件进行分布式,跨平台的程序交互,修改企业资源规划以达到新的目标,使用中间件、xml等方 法来进行数据分配。因此,实际上传统的eai是部件级的重用。很不幸的是,基于部件的架构没有统一的标准,因此,各个厂商都有各自不同的eai凯发天生赢家一触即发官网的解决方案, 你会看到各种各样的中间件平台。如果eai碰到了异构的it环境,就必须分别考虑怎样在各个不同的中间件之间周旋,来实现合理的互联方式,你不得不考虑各 种复杂的可能性。因此,你所见过的大多数传统eai凯发天生赢家一触即发官网的解决方案都比较笨重。
再回顾一下我们上面介绍过的soa的应用场景:复杂的企业级架构。如果我们选择hub的模式来构建soa基础架构,从纯粹 逻辑的角度,可能会出现哪些问题呢?首先,整个soa架构的性能,如果每个服务的请求都经过中央hub的中转,那么hub的负担会很重,速度会随着参与者 的增多而愈来愈慢;其次,这样的系统会很脆弱,一旦hub出错,整个soa架构都会瘫痪;最后,这样的架构会破坏soa的开放性原则,参与者运行在一个相 对封闭的环境中,扩展起来十分麻烦。因此,这也不是理想的soa架构。
好了,现在该esb登场了,请看我们的正解:
它与前面的hub结构有什么不同呢?首先,它比单一hub的形式更开放,总线结构有无限扩展的可能;其次,真正体现了 soa的理念, 一切皆为服务,服务在总线(bus)中处于平等的地位。即使我们需要一些hub,那么它们也是以某种服务的形式部署在总线上,相比上面的结构要灵活的多。 这就是esb,我们需要给它一个明确的定义:esb是一种在松散耦合的服务和应用之间标准的集成方式。它可以作用于:
很不幸,上面的定义看上去很拗口,我们暂且用一句较通俗的话来描述它:esb就是在soa架构中实现服务间智能化集成与管 理的中介。而它与soa的关系要相对好理解一些:esb是逻辑上与soa 所遵循的基本原则保持一致的服务集成基础架构,它提供了服务管理的方法和在分布式异构环境中进行服务交互的功能。可以这样说,esb是特定环境下(soa 架构中)实施eai的方式: 首先,在esb系统中,被集成的对象被明确定义为服务,而不是传统eai中各种各样的中间件平台,这样就极大简化了在集成异构性上的考虑,因为不管有怎样 的应用底层实现,只要是soa架构中的服务,它就一定是基于标准的。
其次,esb明确强调消息(message)处理在集成过程中的作用,这里的消息指的是应用环境中被集成对象之间的沟通。 以往传统的eai实施中碰到的最大的问题就是被集成者都有自己的方言,即各自的消息格式。作为基础架构的eai系统,必须能够对系统范畴内的任何一种消息 进行解析。传统的eai系统中的消息处理大多是被动的,消息的处理需要各自中间件的私有方式支持,例如api的方式。因此尽管消息处理本身很重要,但消息 的直接处理不会是传统eai系统的核心。esb系统由于集成对象统一到服务,消息在应用服务之间传递时格式是标准的,直接面向消息的处理方式成为可能。如 果esb能够在底层支持现有的各种通讯协议,那么对消息的处理就完全不考虑底层的传输细节,而直接通过消息的标准格式定义来进行。这样,在esb中,对消 息的处理就会成为esb的核心,因为通过消息处理来集成服务是最简单可行的方式。这也是esb中总线(bus)功能的体现。其实,总线的概念并不新鲜,传 统的eai系统中,也曾经提出过信息总线的概念,通过某种中间件平台,如corba来连接企业信息孤岛,但是,esb的概念不仅仅是提供消息交互的通道, 更重要的是提供服务的智能化集成基础架构。
最后,事件驱动成为esb的重要特征。通常服务之间传递的消息有两种形式,一种是调用(call), 即请求/回应方式,这是常见的同步模式。还有一种我们称之为单路消息(one-way),它的目的往往是触发异步的事件, 发送者不需要马上得到回复。考虑到有些应用服务是长时间运行的,因此,这种异步服务之间的消息交互也是esb必须支持的。除此之外,esb的很多功能都可 以利用这种机制来实现,例如,soa中服务的性能监控等基础架构功能,需要通过esb来提供数据,当服务的请求通过esb中转的时候,esb很容易通过事 件驱动机制向soa的基础架构服务传递信息。
首先,我们来看一看esb有哪些基本的功能。既然esb会以中介的身份出现,它就必须有两方面的考虑,首先它必须了解被它 中介的两个端点:1)服务的请求者以及请求者对服务的要求,2)服务的提供者和它所提供服务的描述;其次,它必须具有某种机制能够完成中介的任务。我们把 这两类考虑归纳为esb的两个基本功能:面向服务的原数据(metadata)管理功能 和中介(mediation)功能。 作为soa的重要构成部分,esb承担的重任还包括怎样将企业架构中已存在的业务服务连接到总线上来,我们称之为适配器(adapter)功能。尽管服务 本身已经用公开的接口来描述,但具体的实现还是运行在不同的环境中,因此,esb还应该提供对服务底层协议的支持,譬如应用协议j2ee,.net, 通讯协议如http,jms等等。除此之外,还需要对具体应用中涉及到的服务加以管理,如性能,可靠性,安全性等等。
esb 提供了最基本的功能来保障soa系统的运行,这些功能应该包含下列内容:
很多时候,很难界定哪些功能是应该由soa的基础架构(infrastructure)提供的,而哪些应该放在esb的范 畴内来解决。笔者认为,放大或突出esb在soa架构中的地位并不很恰当。比较合理的解释是:esb应该构筑在完善的soa架构上,做它应该做的事-服务 集成。至于怎样集成,应该根据你的上下文环境,考虑有哪些soa的基础设施可供你使用,然后再基于soa的基础架构来实现你的esb设计。
在更高的层次,esb还提供诸如服务代理,协议转换等等功能,我们称之为esb的应用模式(esb usage pattern)。作为soa架构的服务集成功能提供者,我们可以总结出的一些比较常用的应用模式,例如:
1)协议转换模型,用于当服务的请求者与服务提供者基于不同协议时的消息转换情形
2)消息广播模式,用于事件驱动多个动作或者消息广播的情形
3)服务匹配模式,用于需要动态选择服务提供者的情形,例如可以根据消息的内容,或负载情况,或服务级别约定(sla),来为服务请求者选择合适的服务。
这里我们只列举了3个典型的模式,而这样的例子实在太多了,发挥你的创造性,你还会想出来更多的,这也是esb的魅力所 在。但是,在esb的设计上,注意不能喧宾夺主,esb的功能在于帮助服务的集成,而不是参与业务逻辑。业务逻辑应该封装在业务服务中,或通过业务编排服 务(process service)来组织。
关于esb,目前还没有被一致接受的标准。我们可以通过选择成熟的eai 中间件来实现服务的集成与互操作性。这样做的好处是你的开发过程会很顺畅,因为它已经足够稳定且有丰富的工具支持。通常这样的eai产品在目前阶段都还不 是基于开放的标准,例如ibm的websphere mq5.3,作为ibm eai实现esb的消息平台,就不是开放的标准。如果一定要选择开放标准的esb实现方式,web 服务加上ws-* 协议几乎是我们唯一的选择,但毕竟soa、esb仍处于起步的阶段,一方面我们还没有很成熟的产品支持所有的ws-*协议,另一方面这些ws-* 协议本身还处在频繁变化的阶段。因此当你选择esb实施方案的时候,最好考虑平衡esb实施、开发的工作量。
这里你可能会有疑问,既然soa架构追求开放性,为什么我们要容忍用私有的esb产品如ibm wbi/mq来构建soa架构的集成环境?这是一个好问题。soa始终是我们追求的大目标,开放是必然的趋势,这是毋庸置疑的。但是,请注意esb的定 义,至少到目前为止,还没有明确的要求它的实现一定是开放的,每一个软件供应商对它都可能有不同的理解和实现的策略。我们不用怀疑esb将来的开放之路, 但至少在目前阶段,我们不能坐下来等待它的到来。 其实,esb充当的是soa中的中介角色,因此,即使将来esb变化了,对服务的请求者和服务的提供者都不会造成很大的冲击,因为它本来就是对用户透明 的。举个例子,j2ee,它的标准一直在变化中,但是大家通常都能接受它的变化,社会总是要进步的,it也一样。你不可能因为j2ee 两年以后要出1.6就不再使用现在的1.4了。
ibm目前可以用于esb实施的产品也可以分为两大阵营:
现有的eai凯发天生赢家一触即发官网的解决方案,可能涉及如下的ibm软件产品:
was6 中提供了崭新的消息服务平台wpm(websphere platform messaging),并基于这一平台提供了esb的一个具体实现- sibus(service integration bus) 它可以支持同步和异步的消息通信。总线(bus)通过互联的消息引擎管理消息源。同时支持基于web服务和jms,mq格式的消息交互。你可以从was6 身上看到ibm战略的变化,sibus只是ibm加大对于soa支持的一步,你还会很快看到更多的变化,例如独立的esb产品,esb的开发工具等等。但 是,你完全不必担心,这些变化都会保持兼容性,现在soa的投入,无论是以哪一种方式,都会在ibm的soa整体考虑之中。
上述的两种方案并不是对立的,你可以选择基于成熟产品实现esb,也可以尝试一下ibm的最新技术。这两种方案甚至可以互联,见图八。我们将在系列的第四部分讲解这一较为复杂的场景。
在本系列文章接下来的三部分中,我们将继续详细描述esb的具体实现步骤。
本文向您介绍了soa以及esb 的基本知识,确定了一些 esb 实现中最常见的基本功能,论述了esb产生的必要性,以及esb在soa中的地位。
李珉,ibm soa design center 高级工程师,技术经理,曾领导was6 sibus的测试工作,对esb的技术发展一直有所关注。
1996年,gartner最早提出soa。2002年12月,gartner提出soa是"现代应用开发领域最重要的课题",soa并不是一个新事 物,it组织已经成功建立并实施soa应用软件很多年了,bea、ibm、等厂商看到了它的价值,纷纷跟进。soa的目标在于让it变得更有弹性,以更快 地响应业务单位的需求,实现实时企业(real-time enterprise,这是gartner为soa描述的愿景目标)。而bea的cio rhonda早在2001年6月就提出要将bea的it基础架构转变为soa,并且从对整个企业架构的控制能力、提升开发效率、加快开发速度、降低在客户 化和人员技能的投入等方面取得了不错的成绩。
soa是在计算环境下设计、开发、应用、管理分散的逻辑(服务)单元的一种规范。这个定义决定了soa的广泛性。soa要求开发者从服务集成的 角度来设计应用软件,即使这么做的利益不会马上显现。soa要求开发者超越应用软件来思考,并考虑复用现有的服务,或者检查如何让服务被重复利用。soa 鼓励使用可替代的技术和方法(例如消息机制),通过把服务联系在一起而非编写新代码来构架应用。经过适当构架后,这种消息机制的应用允许公司仅通过调整原 有服务模式而非被迫进行大规模新的应用代码的开发,使得在商业环境许可的时间内对变化的市场条件做出快速的响应。
soa也不仅仅是一种开发的方法论--它还包含管理。例如,应用soa后,管理者可以方便的管理这些搭建在服务平台上的企业应用,而不 是管理单一的应用模块。其原理是,通过分析服务之间的相互调用,soa使得公司管理人员方便的拿到什么时候、什么原因、哪些商业逻辑被执行的数据信息,这 样就帮助了企业管理人员或应用架构师迭代地优化他们的企业业务流程、应用系统。
soa的一个中心思想就是使得企业应用摆脱面向技术的凯发天生赢家一触即发官网的解决方案的束缚,轻松应对企业商业服务变化、发展的需要。企业环境中单个应用程序 是无法包容业务用户的(各种)需求的,即使是一个大型的erp凯发天生赢家一触即发官网的解决方案,仍然不能满足这个需求在不断膨胀、变化的缺口,对市场快速做出反应,商业用户只能 通过不断开发新应用、扩展现有应用程序来艰难的支撑其现有的业务需求。通过将注意力放在服务上,应用程序能够集中起来提供更加丰富、目的性更强的商业流 程。其结果就是,基于soa的企业应用系统通常会更加真实地反映出与业务模型的结合。服务是从业务流程的角度来看待技术的--这是从上向下看的。这种角度 同一般的从可用技术所驱动的商业视角是相反的。服务的优势很清楚:它们会同业务流程结合在一起,因此能够更加精确地表示业务模型、更好地支持业务流程。相 反我们可以看到以应用程序为中心的企业应用模型迫使业务用户将其能力局限为应用程序的能力。
企业流程(enterprise process)是流经企业框架的空气,它赋予业务模型里的组件以生命,并更加清晰地定义了它们之间的关系。流程定义了同业务模型进行交互操作的专门方 法。例如,会计可能是企业服务系统的一个组件--但是将发票寄给客户却是一个业务流程。服务被定义用来支持业务流程,因而贯穿整个流程始终的是:各种服务 组件在流程和逻辑实现过程中的装配操作。理解业务流程是定制服务的关键所在。
二、soa 的描述所适用的原则
图 1说明了这些原则。注意,虽然 web 服务技术非常符合这些原则,但它并不是唯一符合这些原则的技术。
为了实现 soa,应用程序和基础架构都必须支持 soa 原则。启用 soa 应用程序涉及到创建服务接口,服务接口可以直接也可以间接地通过使用适配器用于现有的或新的功能。从最基本的级别来看,启用该基础架构涉及到规划功能来将服务请求路由和传递给正确的服务提供者。然而,基础架构支持在不影响服务的客户端的情况下由另一个服务实现替代原有的服务实现也是至关重要的。这不仅需要根据 soa 原则指定服务接口,而且需要基础架构允许客户端代码以独立于所涉及的服务位置和通信协议的方式来调用服务。
三、esb是什么?
根据,esb有如下特性:
对于其中一些厂商(ibm、微软)来说,esb是将一系列能力联结在一起的一种模式,而其他厂商认为esb是一种产品。在2005年,微软identity platform的产品经理rich turner:
esb[产品]是一根聪明的管子,用来连接各个愚笨的节点。[……]web service的途径让节点本身也变得聪明,减少了对底下聪明管道的需要,并确保了跨越任何平台与设备的开放的通讯。