domain 订阅
Domain,是域的意思 ,分别在数学,计算机学和生物学里有不同的解释和应用。 展开全文
Domain,是域的意思 ,分别在数学,计算机学和生物学里有不同的解释和应用。
信息
外文名
Domain
包含种类
国际域名和国内域名
中文名
应用领域
数学、计算机学、生物学
Domain概念
域是Windows网络操作系统的应用模型。 域(Domain)是Windows网络中独立运行的单位,域之间相互访问则需要建立信任关系(即Trust Relation)。信任关系是连接在域与域之间的桥梁。当一个域与其他域建立了信任关系后,2个域之间不但可以按需要相互进行管理,还可以跨网分配文件和打印机等设备资源,使不同的域之间实现网络资源的共享与管理。域既是 Windows 网络操作系统的逻辑组织单元,也是Internet的逻辑组织单元,在 Windows 网络操作系统中,域是安全边界。域管理员只能管理域的内部,除非其他的域显式地赋予他管理权限,他才能够访问或者管理其他的域;每个域都有自己的安全策略,以及它与其他域的安全信任关系。由于IP地址是数字标识,不符合人们日常使用习惯,在使用时难以记忆和书写。因此为方便使用,在IP地址的基础上又发展出一种符号化的地址方案,即域名方案。每一个域名都与一个特定的IP地址对应。由于域名是由人们熟悉的符号,如字母,数字,字符,甚至是文字(如汉字等)按一定方式组合起来的,这样网络上的资源访问起来就方便得多了。这个与网络上的数字型IP地址相对应的字符型地址,就被称为域名系统。Internet是基于TCP/IP协议进行通信和连接的。连接在网络上的每一台主机都有一个唯一的标识固定的IP地址,以区别在网络上成千上万个用户和计算机。Internet在识别所有与之相连的网络和主机时,均采用了一种唯一、通用的地址格式,即每一个与网络相连接的计算机和服务器都被指派了一个独一无二的地址。为了保证网络上每台计算机的IP地址的唯一性,用户必须向特定机构申请注册,该机构根据用户单位的网络规模和发展计划,分配IP地址。IP地址用二进制数来表示,每个IP地址长32比特,由4个小于256的数字组成,数字之间用点间隔,例如166.111.1.11表示一个IP地址。域名是上网单位和个人在网络上的重要标识,便于他人识别和检索某一企业 、组织或个人的信息资源,从而更好地实现网络上的资源共享。除了识别功能外,在虚拟环境下,域名还可以起到引导、宣传、代表等作用。一个域名一般由英文字母和阿拉伯数字以及横"-"组成,最长可达67个字符(包括后缀),并且字母的大小写没有区别,每个层次最长不能超过22个字母。这些符号构成了域名的前缀,主体和后缀等几个部分,组合在一起构成一个完整的域名。以一个常见的域名为例说明一些国家也纷纷开发使用采用本民族语言构成的域名,如德语,法语等。中国也开始使用中文域名,但可以预计的是,在中国国内今后相当长的时期内,以英语为基础的域名(即英文域名)仍然是主流。域名按照后缀又分为两类:一是国际域名(international top-level domain-names,简称iTDs),也叫国际顶级域名。这也是使用最早也最广泛的域名。例如表示工商企业的 .com,表示网络提供商的.net,表示非盈利组织的.org等。二是国内域名,又称为国内顶级域名(national top-level domainnames,简称nTLDs),即按照国家的不同分配不同后缀,这些域名即为该国的国内顶级域名。200多个国家都按照ISO3166国家代码分配了顶级域名,例如中国是cn,美国是us,日本是jp等。详细见下文。在实际使用和功能上,国际域名与国内域名没有任何区别,都是互联网上的具有唯一性的标识。只是在最终管理机构上,国际域名由美国商业部授权的互联网名称与数字地址分配机构(The Internet Corporation for Assigned Names and Numbers)即ICANN负责注册和管理;而国内域名则由中国互联网络管理中心 (China Internet Network Infomation Center) 即CNNIC负责注册和管理。域名可按级别分为顶级域名、二级域名和多级域名。上面列举的123ym同时也是一个顶级域名。二级域名是指顶级域名之下的域名,在国际顶级域名下,它是指域名注册人的网上名称,在国家顶级域名下,它是表示注册企业类别的符号,例如com,edu,gov,net等。根据实际使用的需要,在这个域名之下,又可扩展出多个域名,这些就是二级域名。同样的,在二级域名基础上又可延伸出多个三级域名。中国互联网络管理中心即CNNIC正式注册并运行的顶级域名是CN,这也是中国的一级域名。在顶级域名之下,中国的二级域名又分为类别域名和行政区域名两类。类别域名共6个,包括用于科研机构的ac;用于工商金融企业的com;用于教育机构的edu;用于政府部门的gov;用于互联网络信息中心和运行中心的net;用于非盈利组织的org。而行政区域名有34个,分别对应于中国各省、自治区和直辖市。三级域名用字母(A~Z,a~z,大小写等)、数字(0~9)和连接符(-)组成,各级域名之间用实点(.)连接,三级域名的长度不能超过20个字符。如无特殊原因,建议采用申请人的英文名(或者缩写)或者汉语拼音名(或者缩写)作为三级域名,以保持域名的清晰性和简洁性。国际域名(oranization domains)AC--- 科研机构COM--- Commercial organizations, 工、商、金融等企业EDU--- Educational institutions 教育机构GOV --- Governmental entities政府部门mil --- Military ,军事机构arpa --- Come from ARPANet,由ARPANET(美国国防部高级研究计划局建立的计算机网)沿留的名称,被用于互联网内部功能NET--- Network operations and service centers, 互联网络、接入网络的信息中心(NIC)和运行中心(NOC)ORG --- Other organizations,各种非盈利性的组织biz --- web business guide网络商务向导,适用于商业公司(注:biz是business的习惯缩用)info --- infomation,提供信息服务的企业pro --- professional,适用于医生、律师、会计师等专业人员的通用顶级域名name--- name, 适用于个人注册的通用顶级域名coop --- cooperation,适用于商业合作社的专用顶级域名aero --- aero,适用于航空运输业的专用顶级域名museum --- museum,适用于博物馆的专用顶级域名mobi 适用于手机网络的域名asia 适用于亚洲地区的域名tel 适用于电话方面的域名int --- International organizations,国际组织CC 类型:.cc/中文.cc原是岛国“Cocos (Keeling) Islands”的缩写,但也可把它看成“Commercial Company”(商业公司)的缩写,所以现已开放为全球性国际顶级域名,主要应用在商业领域内。简短,容易记忆,漂亮,容易输入,是新一代域名的新秀。tv --- 原是太平洋岛国图瓦卢“Tuvalu”的国家代码顶级域名,但因为它也是“television”(电视)的缩写,所以现已开放为全球性国际顶级域名,主要应用在:视听、电影、电视等全球无线电与广播电台领域内。US 类型:表示美国.travel 旅游域名,国际域名ME类型:南斯拉夫西南部的国家门的内哥罗(Montenegro,旧译“黑山”)的国家域名(.me)国家或地区域名(geographic domains)ae-United Arab Emirates阿联酋af-Afghanistan阿富汗ag-Antigua and Barbuda安提瓜和巴布达ai-Anguilla安圭拉al-Albania阿尔巴尼亚am-Armenia亚美尼亚an-Netherlands Antilles荷兰属地ao-Angola安哥拉aq-Antarctica南极洲ar-Argentina阿根廷as-American Samoa东萨摩亚at-Austria奥地利au-Australia澳大利亚aw-Aruba阿鲁巴az-Azerbaijan阿塞拜疆ba-Bosnia Herzegovina波黑bb-Barbados巴巴多斯bd-Bangladesh孟加拉be-Belgium比利时bf-Burkina Faso布基纳法索bg-Bulgaria保加利亚bh-Bahrain巴林bi-Burundi布隆迪bj-Benin贝宁bm-Bermuda百慕大bn-Brunei Darussalam文莱bo-Bolivia玻利维亚br-Brazil巴西bs-Bahamas巴哈马bt-Bhutan不丹bv-Bouvet Island布韦岛bw-Botswana伯兹瓦纳by-Belarus白俄罗斯bz-Belize伯利兹ca-Canada加拿大cc-Cocos Islands科科斯群岛cf-Central African Republic中非cg-Congo刚果ch-Switzerland瑞士ci-Ivory Coast象牙海岸ck-Cook Islands库克群岛cl-Chile智利cm-Cameroon喀麦隆cn-China中国co-Colombia哥伦比亚cq-Equatorial Guinea赤道几内亚cr-Costa Rica哥斯达黎加cu-Cuba古巴cv-Cape Verde佛得角cx-Christmas Island圣诞岛(英属)cy-Cyprus塞浦路斯cz-Czech Republic捷克de-Germany德国dj-Djibouti吉布提dk-Denmark丹麦dm-Dominica多米尼加联邦do-Dominican Republic多米尼加dz-Algeria阿尔及利亚ec-Ecuador厄瓜多尔ee-Estonia爱沙尼亚eg-Egypt埃及eh-Western Sahara西萨摩亚es-Spain西班牙et-Ethiopia埃塞俄比亚ev-El Salvador萨尔瓦多fi-Finland芬兰fj-Fiji斐济fk-Falkland Islands福克兰群岛fm-Micronesia密克罗尼西亚fo-Faroe Islands法罗群岛fr-France法国ga-Gabon加蓬gb-Great Britain (UK)大不列颠联合王国gd-Grenada格林纳达ge-Georgia格鲁吉亚gf-French Guiana法属圭亚那gh-Ghana加纳gi-Gibraltar直布罗陀gl-Greenland格陵兰群岛gm-Gambia冈比亚gn-Guinea几内亚gp-Guadeloupe瓜德罗普岛(法属)gr-Greece希腊gt-Guatemala危地马拉gu-Guam关岛gw-Guinea-Bissau几内亚比绍gy-Guyana圭亚那hk-Hong Kong香港hm-Heard赫德与麦克唐纳群岛hn-Honduras洪都拉斯hr-Croatia克罗地亚ht-Haiti海地hu-Hungary匈牙利id-Indonesia印度尼西亚ie-Ireland爱尔兰il-Israel以色列in-India印度io-British Indian Ocean Territory英属印度洋领地iq-Iraq伊拉克ir-Iran伊朗is-Iceland冰岛it-Italy意大利jm-Jamaica牙买加jo-Jordan约旦jp-Japan日本ke-Kenya肯尼亚kg-Kyrgyz Stan吉尔吉斯斯坦kh-Cambodia柬埔塞ki-Kiribati基里巴斯km-Comoros科摩罗kn-St. Kitts圣基茨和尼维斯kp-Korea-North朝鲜kr-Korea-South韩国kw-Kuwait科威特ky-Cayman Islands开曼群岛(英属)kz-Kazakhstan哈萨克斯坦la-Lao People's Republic老挝lb-Lebanon黎巴嫩lc-St. Lucia圣露西亚岛li-Liechtenstein列支敦士登lk-Sri Lanka斯里兰卡lr-Liberia利比里亚ls-Lesotho莱索托lt-Lithuania立陶宛lu-Luxembourg卢森堡lv-Latvia拉脱维亚ly-Libya利比亚ma-Morocco摩洛哥mc-Monaco摩纳哥md-Moldova摩尔多瓦mg-Madagascar马达加斯加mh-Marshall Islands马绍尔群岛ml-Mali马里mm-Myanmar缅甸mn-Mongolia蒙古mo-Macao澳门mp-Northern Mariana Islands北马里亚纳群岛mq-Martinique马提尼克岛(法属)mr-Mauritania毛里塔尼亚ms-Montserrat蒙塞拉特岛mt-Malta马尔他mv-Maldives马尔代夫mw-Malawi马拉维mx-Mexico墨西哥my-Malaysia马来西亚mz-Mozambique莫桑比克na-Namibia纳米比亚nc-New Caledonia新喀里多尼亚ne-Niger尼日尔nf-Norfolk Island诺福克岛ng-Nigeria尼日利亚ni-Nicaragua尼加拉瓜nl-Netherlands荷兰no-Norway挪威np-Nepal尼泊尔nr-Nauru瑙鲁nt-Neutral Zone中立区nu-Niue纽埃nz-New Zealand新西兰om-Oman阿曼pa-Panama巴拿马pe-Peru秘鲁pf-French Polynesia法属玻利尼西亚pg-Papua New Guinea巴布亚新几内亚ph-Philippines菲律宾pk-Pakistan巴基斯坦pl-Poland波兰pm-St. Pierre圣皮埃尔和密克隆群岛pn-Pitcairn Island皮特克恩岛pr-Puerto Rico波多黎各pt-Portugal葡萄牙pw-Palau帕劳py-Paraguay巴拉圭qa-Qatar卡塔尔re-Reunion Island留尼汪岛(法属)ro-Romania罗马尼亚ru-Russian Federation俄罗斯rw-Rwanda卢旺达sa-Saudi Arabia沙特阿拉伯sb-Solomon Islands所罗门群岛sc-Seychelles塞舌尔sd-Sudan苏丹se-Sweden瑞典sg-Singapore新加坡sh-St. Helena海伦娜si-Slovenia斯洛文尼亚sj-Svalbard 斯瓦尔巴特和扬马延岛sk-Slovakia斯洛伐克sl-Sierra Leone塞拉利昂sm-San Marino圣马力诺sn-Senegal塞内加尔so-Somalia索马里sr-Suriname苏里南st-Sao Tome圣多美和普林西比su-USSR苏联sy-Syrian Arab Republic叙利亚sz-Swaziland斯威士兰tc-Turks特克斯和凯科斯群岛td-Chad乍得tf-French Southern Territories法属南半球领地tg-Togo多哥th-Thailand泰国tj-Tajikistan塔吉克斯坦tk-Tokelau托克劳群岛tm-Turkmenistan土库曼斯坦tn-Tunisia突尼斯to-Tonga汤加tp-East Timor东帝汶tr-Turkey土耳其tt-Trinidad特立尼达和多巴哥tv-Tuvalu图瓦鲁tw-Taiwan台湾tz-Tanzania坦桑尼亚ua-Ukrainian SSR乌克兰ug-Uganda乌干达uk-United Kingdom英国us-United States美国uy-Uruguay乌拉圭va-Vatican City State梵地冈vcSt.- Vincent圣文森特和格林纳丁斯ve-Venezuela委内瑞拉vg-Virgin Islands维京群岛vn-Vietnam越南vu-Vanuatu瓦努阿图wf-Wallis 瓦利斯和富图钠群岛ws-Samoa西萨摩亚ye-Yemen也门yu-Yugoslavia南斯拉夫za-South Africa南非zm-Zambia赞比亚zr-Zaire扎伊尔zw-Zimbabwe津巴布韦按持有域名类型一、玩国外公司商号的。英文较好。一元域名是此类米农崛起的时机;二、玩精品拼音的。入行早。资金足。经常是域名新闻的制造者;三、玩流通米的。服务中小站长。各域名论坛和站长论坛的活跃份子;四、玩流量米的。低调,闷声发大财那伙的;按拿米方式一、玩竞价的。国内国外各平台的常客;二、玩抢注的。能够有效控制成本;三、玩收购的。典型的二道贩子;四、自己注册。对新闻和突发性事件比较敏感;按运作方式一、个人。单打独斗,全程个体户;二、团队。成立公司或招揽下线,集团作案,密集轰炸;三、联盟。互利互惠,共同发展;按域名业务所占比例一、兼职。绝大多数都是吧;二、专职。少数派。按心态第一类,现煮现卖型:通常钱少、心高, 刚煮完就拿出来以几百、几千倍的利润卖。PS:08年受伤指数0什么时候都会有这样的人群出现,他们的出现本身没有时代特征第二类,概念情节型:总觉的自己的概念先人一步,灵感大师,煮出一堆创意米来。PS:08年受伤指数2米市景气的话 兴许还能回本,不过即使损失也损失不大。第三类,急功近利型:疯狂利用概念炒做,以品种、特点等为概念、为噱头,拿着有点垃圾的米疯狂推销,拉人入套。PS:08年受伤指数3金融危机使的钱多人傻的人越来越少了。第四类,潮流型:手里的资金有限,煮米、偶尔参与竟价,手里的米完全符合时间特征。PS:08年受伤指数5米价的回落参与的人人有份,应该或多或少的参与了高位接盘。第五类,传统米农:了解终端概念、经常出没竟价现场,会有目的的针对一些米做出自己的决定。比如扫米、煮米、拍米、收米之类的。PS:08年受伤指数10米农应该是最受伤的人,煮米的人还好点,竟米的人参与了太多太多高位接盘的事情。第六类,精英型:深刻了解体会终端概念、了解流量概念、了解忽悠概念、了解国际行情、对市场走势有一定的预期。PS:08年受伤指数7终端成交率下降、手里的硬通货慢慢的软了,跑的快的还可以跑的慢的也比较受伤。第七类,投资人:有目的的运用大量资金来运做,发起或参与品种概念的运做,引领市场热点。PS:08年受伤指数8虽然是市场的引领者但天意难违,市场的衰退或多或少的打乱了原先的计划,出仓的收益率降底 持仓的只能慢等时机第八类,居士:这类通常是由于一些种种原因,隐居退出米市,因为时代特征的原因,手里还积存有现在已经闪闪发亮的域名……这恐怕这是大多数米农最终的归宿吧。第九类,大佬:手里拥有大量珍品,早已获利颇丰,善于以米养米的策略,用获利大手笔去回购市场出现精品,一方面补充新鲜血液、一方面手里的珍品越发的珍惜。第十类,功成深就:已经功成深就了,在希望的田野上做更有希望的事情了。国际互联网名称和编号分配公司(ICANN)2008年6月26日在巴黎年会上全票通过个性化域名方案,最早将于2009年开始会有根据自己公司名字为结尾的域名,一个形像的比喻就是这些域名结尾的所有者在某种意义上就是一个域名注册局。个性化域名对域名行业的影响个性化域名是域名种类可以增加到无限,这就对一个非主流的域名类别产生了很大的冲击,最近开放的.me域名的注册情况的不乐观就可以看出一点个性化域名的影响力。注册一个什么样的域名好?注册一个好的域名是至关重要的。一个好的域名往往与单位的以下信息一致:单位名称的中英文缩写;企业的产品注册商标;与企业广告语一致的中英文内容,但注意不要超过20个字符;注册须知:英文域名格式如下:域名由各国文字的特定字符集、英文字母、数字及“ - ” (即连字符或减号) 任意组合而成,但开头及结尾均不能含有“ - ”。域名中字母不分大小写。域名最长可达 67 个字节 (包括后缀 .com 、 .net 、 .org 等)。中文域名格式如下:各级域名长度限制在26个合法字符(汉字,英文a-z ,A-Z ,数字0-9 和 - 等均算一个字符);不能是纯英文或数字域名,应至少有一个汉字。“-”不能连续出现。域名的注册遵循先申请先注册原则,管理机构对申请人提出的域名是否违反了第三方的权利不进行任何实质审查。同时,每一个域名的注册都是独一无二的、不可重复的。因此,在网络上,域名是一种相对有限的资源,它的价值将随着注册企业的增多而逐步为人们所重视。域名 - 删除规则cn结尾的国内英文域名删除规则英文CN域名到期,将进入45天的续费期,续费期间,用户只要支付续费费用即可恢复该域名的正常使用。到期45天后,将会进入高价赎回期。赎回期为15天,赎回期内,原域名持有者可通过域名网赎回该域名,赎回后,有效期将在原域名到期日的基础上增加一年。若赎回期内该域名没有被赎回,赎回期结束后系统将删除该域名。赎回期内域名的状态变为pendingDelete,域名禁止修改信息、转移、删除,不提供DNS解析。com等国际域名删除规则A、域名过期13天内:域名可正常使用,并可通过域名管理界面自动续费。B、域名过期14-39天:域名被hold,解析停止、可以管理,可以自动续费,可通过域名管理界面自动续费,价格与注册域名价格相同。C、域名过期40-70天:域名处于赎回期(Redemption),在此期间域名需要手工续费。D、赎回期过后5天:域名被彻底删除,可以重新注册了。(可以重新注册不表示就能注册到,好的域名删除后,会有很多抢注公司第一时间抢注,不好的域名普通人才有可能重新注册到)国际域名和国内域名转移注册商规则国际域名转出要是新注册(或者操作过续费)后2个月才能转移注册商,国内域名转出也是新注册(或者操作过续费)后2个月才能转移注册商,国内域名还有一个特殊之处就是在转入商提交转出的域名要是域名距到期前至少15天的时间(精确到秒),所以办理转移一定要提前。转出是免费的,转入是要给域名续费1年。如果转出商限制转出,国际域名的用户可以直接投诉到ICANN,国内域名的客户可以投诉到CNNIC。域名 - 选取原则及技巧原则在选取域名的时候,首先要遵循两个基本原则。1.域名应该简明易记,便于输入 这是判断域名好坏最重要的因素。一个好的域名应该短而顺口,便于记忆,最好让人看一眼就能记住,而且读起来发音清晰,不会导致拼写错误。此外,域名选取还要避免同音异义词。2.域名要有一定的内涵和意义 用有一定意义和内涵的词或词组作域名,不但可记忆性好,而且有助于实现企业的营销目标。例如企业的名称、产品名称、商标名、品牌名等都是不错的选择,这样能够使企业的网络营销目标和非网络营销目标达成一致。技巧1.用企业名称的汉语拼音作为域名 2.用企业名称相应的英文名作为域名 3.用企业名称的缩写作为域名 4.用汉语拼音的谐音形式给企业注册域名 5.以中英文结合的形式给企业注册域名 6.在企业名称前后加上与网络相关的前缀和后缀 7.用与企业名不同但有相关性的词或词组作域名 8.不要注册其他公司拥有的独特商标名和国际知名企业的商标名 9.应该尽量避免被CGI脚本程序或其他动态页面产生的URL 10.注册.net域名时要谨慎 .net域名一般留给有网络背景的公司。虽然任何公司都可以注册,但极容易引起混淆,使访问者误认为访问的是一家具有网络背景的公司。企业防止他人抢注造成损失的一个解决办法是,对.net域名进行预防性注册,但不用作企业的正规域名。国内的一些企业包括某些知名公司选择了以.net结尾的域名。例如不少免费邮件提供商,如371 net、023911 net等。而国外提供与此服务相近的在线服务公司则普遍选择以.com结尾的域名。域名 - 安全防护第一,中国国内重要网络企业用户应该尽量使用国内域名注册服务商,因为境内服务商对国内重要的网络企业安全防护级别较高,此前qq com从海外转至国内就是一个案例。第二,CNNIC建议互联网企业尽量应用.CN域名。CN域名的注册管理机构位于北京,发生紧急事件时,联络和处理速度相对都会较快。并且对于重点保护的CN域名,对其NS记录等都有高频率的重点监控,监测被修改的情况,可以极大降低此次百度事件的发生概率。即使发生恶意篡改,CNNIC 7*24小时的技术支持也能够在很短时间内进行恢复。第三,中国国内重要的互联网公司,应该尽量启用其它主域名,实施多域名战略,这样可以在出现故障后,将风险及损失降至最低。domain:百度,查网页内容中包含某关键词。如:domain:www-023911-com 搜索结果是包含关键字词组(www-yiseoer-com)的所有网页。同理,domain:seo 指的是包含seo的所有网页,与直接搜索SEO相似。如果要查找有多少个网页内容中包含你的 网址,domain 可以派上用场。Google,domain 并不代表一个指令。只是一个普通的关键字。Yahoo,与 site 一样。查找域名下的所有收录网页。
收起全文
精华内容
下载资源
问答
  • domain

    千次阅读 2014-12-19 06:38:05
    http://deadhorse.me/nodejs/2013/04/13/exception_and_domain.html https://cnodejs.org/topic/516b64596d38277306407936 http://blog.fens.me/nodejs-core-domain/ 异步异常处理 异步异常的特点 由于node的回...

    文章转自:

    http://deadhorse.me/nodejs/2013/04/13/exception_and_domain.html

    https://cnodejs.org/topic/516b64596d38277306407936

    http://blog.fens.me/nodejs-core-domain/

    domain的API介绍

    基本概念

    • 隐式绑定: 把在domain上下文中定义的变量,自动绑定到domain对象
    • 显式绑定: 把不是在domain上下文中定义的变量,以代码的方式绑定到domain对象

    API介绍

    • domain.create(): 返回一个domain对象
    • domain.run(fn): 在domain上下文中执行一个函数,并隐式绑定所有事件,定时器和低级的请求。
    • domain.members: 已加入domain对象的域定时器和事件发射器的数组。
    • domain.add(emitter): 显式的增加事件
    • domain.remove(emitter): 删除事件
    • domain.bind(callback): 以return为封装callback函数
    • domain.intercept(callback): 同domain.bind,但只返回第一个参数
    • domain.enter(): 进入一个异步调用的上下文,绑定到domain
    • domain.exit(): 退出当前的domain,切换到不同的链的异步调用的上下文中。对应domain.enter()
    • domain.dispose(): 释放一个domain对象,让node进程回收这部分资源

    异步异常处理

    异步异常的特点

    由于node的回调异步特性,无法通过try catch来捕捉所有的异常:

    try {
      process.nextTick(function () {
        foo.bar();
      });
    } catch (err) {
      //can not catch it
    }
    

    而对于web服务而言,其实是非常希望这样的:

    //express风格的路由
    app.get('/index', function (req, res) {
      try {
        //业务逻辑
      } catch (err) {
        logger.error(err);
        res.statusCode = 500;
        return res.json({success: false, message: '服务器异常'});
      }
    });
    

    如果try catch能够捕获所有的异常,这样我们可以在代码出现一些非预期的错误时,能够记录下错误的同时,友好的给调用者返回一个500错误。可惜,try catch无法捕获异步中的异常。所以我们能做的只能是:

    app.get('/index', function (req, res) {
      // 业务逻辑  
    });
    
    process.on('uncaughtException', function (err) {
      logger.error(err);
    });
    

    这个时候,虽然我们可以记录下这个错误的日志,且进程也不会异常退出,但是我们是没有办法对发现错误的请求友好返回的,只能够让它超时返回。

    domain

    在node v0.8+版本的时候,发布了一个模块domain。这个模块做的就是try catch所无法做到的:捕捉异步回调中出现的异常。
    于是乎,我们上面那个无奈的例子好像有了解决的方案:

    var domain = require('domain');
    
    //引入一个domain的中间件,将每一个请求都包裹在一个独立的domain中
    //domain来处理异常
    app.use(function (req,res, next) {
      var d = domain.create();
      //监听domain的错误事件
      d.on('error', function (err) {
        logger.error(err);
        res.statusCode = 500;
        res.json({sucess:false, messag: '服务器异常'});
        d.dispose();
      });
    
      d.add(req);
      d.add(res);
      d.run(next);
    });
    
    app.get('/index', function (req, res) {
      //处理业务
    });
    

    我们通过中间件的形式,引入domain来处理异步中的异常。当然,domain虽然捕捉到了异常,但是还是由于异常而导致的堆栈丢失会导致内存泄漏,所以出现这种情况的时候还是需要重启这个进程的,有兴趣的同学可以去看看domain-middleware这个domain中间件。

    诡异的失效

    我们的测试一切正常,当正式在生产环境中使用的时候,发现domain突然失效了!它竟然没有捕获到异步中的异常,最终导致进程异常退出。经过一番排查,最后发现是由于引入了redis来存放session导致的。

    var http = require('http');
    var connect = require('connect');
    var RedisStore = require('connect-redis')(connect);
    var domainMiddleware = require('domain-middleware');
    
    var server = http.createServer();
    var app = connect();
    app.use(connect.session({
      key: 'key',
      secret: 'secret',
      store: new RedisStore(6379, 'localhost')
    }));
    //domainMiddleware的使用可以看前面的链接
    app.use(domainMiddleware({
      server: server,
      killTimeout: 30000
    }));
    

    此时,当我们的业务逻辑代码中出现了异常,发现竟然没有被domain捕获!经过一番尝试,终于将问题定位到了:

    var domain = require('domain');
    var redis = require('redis');
    var cache = redis.createClient(6379, 'localhost');
    
    function error() {
      cache.get('a', function () {
        throw new Error('something wrong');
      });
    }
    
    function ok () {
      setTimeout(function () {
        throw new Error('something wrong');
      }, 100);
    }
    var d = domain.create();
    d.on('error', function (err) {
      console.log(err);
    });
    
    d.run(ok);    //domain捕获到异常
    d.run(error); //异常被抛出
    

    奇怪了!都是异步调用,为什么前者被捕获,后者却没办法捕获到呢?

    Domain剖析

    回过头来,我们来看看domain做了些什么来让我们捕获异步的请求(代码来自node v0.10.4,此部分可能正在快速变更优化)。如果对domain还不甚了解的同学可以先简单过一下domain的文档

    node事件循环机制

    在看Domain的原理之前,我们先要了解一下nextTick_tickCallback两个方法

    function laterCallback() {
      console.log('print me later');
    }
    
    process.nextTick(laterCallback);
    console.log('print me first');
    

    上面这段代码写过node的人都很熟悉,nextTick的作用就是把laterCallback放到下一个事件循环去执行。而_tickCallback方法则是一个非公开的方法,这个方法是在当前时间循环结束之后,调用之以继续进行下一个事件循环的入口函数。

    换而言之,node为事件循环维持了一个队列,nextTick入队,_tickCallback出列。

    domain的实现

    在了解了node的事件循环机制之后,我们再来看看domain做了些什么。
    domain自身其实是一个EventEmitter对象,它通过事件的方式来传递捕获的错误。这样我们在研究它的时候,就简化到两个点:

    • 什么时候触发domain的error事件:

      • 进程抛出了异常,没有被任何的try catch捕获到,这时候将会触发整个process的processFatal,此时如果在domain包裹之中,将会在domain上触发error事件,反之,将会在process上触发uncaughtException事件。
    • domain如何在多个不同的事件循环中传递:

      1. 当domain被实例化之后,我们通常会调用它的run方法(如之前在web服务中的使用),来将某个函数在这个domain示例的包裹中执行。被包裹的函数在执行的时候,process.domain这个全局变量将会被指向这个domain实例。当这个事件循环中,抛出异常调用processFatal的时候,发现process.domain存在,就会在domain上触发error事件。
      2. 在require引入domain模块之后,会重写全局的nextTick_tickCallback,注入一些domain相关的代码
      //简化后的domain传递部分代码
      function nextDomainTick(callback) {
        nextTickQueue.push({callback: callback, domain: process.domain});
      }
      
      function _tickDomainCallback() {
        var tock = nextTickQueue.pop();
        //设置process.domain = tock.domain
        tock.domain && tock.domain.enter();
        callback();
        //清除process.domain
        tock.domain && tock.domain.exit();        
        }
      };
      

    这个是其在多个事件循环中传递domain的关键:nextTick入队的时候,记录下当前的domain,当这个被加入队列中的事件循环被_tickCallback启动执行的时候,将新的事件循环的process.domain置为之前记录的domain。这样,在被domain所包裹的代码中,不管如何调用process.nextTick, domain将会一直被传递下去。
    3. 当然,node的异步还有两种情况,一种是event形式。因此在EventEmitter构造函数有如下代码:

        if (exports.usingDomains) {
          // if there is an active domain, then attach to it.
          domain = domain || require('domain');
          if (domain.active && !(this instanceof domain.Domain)) {
            this.domain = domain.active;
          }
        }
    

    实例化EventEmitter的时候,将会把这个对象和当前的domain绑定,当通过emit触发这个对象上的事件时,像_tickCallback执行的时候一样,回调函数将会重新被当前的domain包裹住。
    4. 而另一种情况,是setTimeoutsetInterval,同样的,在timer的源码中,我们也可以发现这样的一句代码:

       if (process.domain) timer.domain = process.domain;
    

    EventEmmiter一样,之后这些timer的回调函数也将被当前的domain包裹住了。

    node通过在nextTick, timer, event三个关键的地方插入domain的代码,让它们得以在不同的事件循环中传递。

    更复杂的domain

    有些情况下,我们可能会遇到需要更加复杂的domain使用。

    • domain嵌套:我们可能会外层有domain的情况下,内层还有其他的domain,使用情景可以在文档中找到
    // create a top-level domain for the server
    var serverDomain = domain.create();
    
    serverDomain.run(function() {
      // server is created in the scope of serverDomain
      http.createServer(function(req, res) {
        // req and res are also created in the scope of serverDomain
        // however, we'd prefer to have a separate domain for each request.
        // create it first thing, and add req and res to it.
        var reqd = domain.create();
        reqd.add(req);
        reqd.add(res);
        reqd.on('error', function(er) {
          console.error('Error', er, req.url);
          try {
            res.writeHead(500);
            res.end('Error occurred, sorry.');
          } catch (er) {
            console.error('Error sending 500', er, req.url);
          }
        });
      }).listen(1337);
    });
    

    为了实现这个功能,其实domain还会偷偷的自己维持一个domain的stack,有兴趣的童鞋可以在这里看到。

    回头解决疑惑

    回过头来,我们再来看刚才遇到的问题:为什么两个看上去都是同样的异步调用,却有一个domain无法捕获到异常?理解了原理之后不难想到,肯定是调用了redis的那个异步调用在抛出错误的这个事件循环内,是不在domain的范围之内的。我们通过一段更加简短的代码来看看,到底在哪里出的问题。

    var domain = require('domain');
    var EventEmitter = require('events').EventEmitter;
    
    var e = new EventEmitter();
    
    var timer = setTimeout(function () {
      e.emit('data');  
    }, 10);
    
    function next() {
      e.once('data', function () {
        throw new Error('something wrong here');
      });
    }
    
    var d = domain.create();
    d.on('error', function () {
      console.log('cache by domain');
    });
    
    d.run(next);
    

    此时我们同样发现,错误不会被domain捕捉到,原因很清晰了:timere两个关键的对象在初始化的时候都时没有在domain的范围之内,因此,当在next函数中监听的事件被触发,执行抛出异常的回调函数时,其实根本就没有处于domain的包裹中,当然就不会被domain捕获到异常了!

    其实node针对这种情况,专门设计了一个API:domain.add。它可以将domain之外的timerevent对象,添加到当前domain中去。对于上面那个例子:

    d.add(timer);
    //or
    d.add(e);
    

    timer或者e任意一个对象添加到domain上,就可以让错误被domain捕获了。

    再来看最开始redis导致domain无法捕捉到异常的问题。我们是不是也有办法可以解决呢?
    @python发烧友 的这条微博我们就能理解,其实对于这种情况,还是没有办法实现最佳的解决方案的。现在对于非预期的异常产生的时候,我们只能够让当前请求超时,然后让这个进程停止服务,之后重新启动。graceful模块配合cluster就可以实现这个解决方案。

    domain十分强大,但不是万能的。希望在看过这篇文章之后,大家能够正确的使用domian,避免踩坑。:)


    题外推荐

    在整个问题排查与代码研究过程中,有一个工具起了巨大的作用:node-inspector,它可以让node代码在chrome下进行单步调试,能够跟进到node源码之中,@goddyzhao的文章使用node-inspector来调试node详细介绍了如何使用node-inspector


    展开全文
  • cookie的domain属性

    万次阅读 多人点赞 2018-07-31 00:57:44
    最近在改一个bug单时,有个问题涉及到了cookie的domain属性,大致场景是由于不同的服务页面出现了同名的cookie但是domain域不同,导致出现了不可思议的bug。于是查询与cookie的domain属性相关的资料并记录之。 1、...

    欢迎大家光临我的个人博客,详戳    https://545longgege.top/

    最近在改一个bug单时,有个问题涉及到了cookie的domain属性,大致场景是由于不同的服务页面出现了同名的cookie但是domain域不同,导致出现了不可思议的bug。于是查询与cookie的domain属性相关的资料并记录之。

    1、什么是Cookie?

        Cookie是由W3C组织提出,最早由NetScape社区发展的一种机制。

        Cookie是存储于访问者的计算机中的变量。每当同一台计算机通过浏览器请求某个页面时,就会发送这个cookie。

        Cookie的作用就是用于解决"如何记录客户端的用户信息":

            ①当用户访问web页面时,他的名字可以记录在Cookie中。

            ②在用户下一次访问该页面时,可以在Cookie中读取用户访问记录。

        Cookie实际上是一小段文本信息(上限为4kb)。客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端浏览器可以把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。服务还可以根据需要修改Cookie的内容。

    2、Cookie的属性

    属性名描述
    nameCookie的名称,Cookie一旦创建,名称便不可更改
    valueCookie的值,如果值为Unicode字符,需要为字符编码。如果为二进制数据,则需要使用BASE64编码
    maxAgeCookie失效的时间,单位秒。如果为整数,则该Cookie在maxAge秒后失效。如果为负数,该Cookie为临时Cookie,关闭浏览器即失效,浏览器也不会以任何形式保存该Cookie。如果为0,表示删除该Cookie。默认为-1。
    secure该Cookie是否仅被使用安全协议传输。安全协议。安全协议有HTTPS,SSL等,在网络上传输数据之前先将数据加密。默认为false。
    pathCookie的使用路径。如果设置为“/sessionWeb/”,则只有contextPath为“/sessionWeb”的程序可以访问该Cookie。如果设置为“/”,则本域名下contextPath都可以访问该Cookie。注意最后一个字符必须为“/”。
    domain可以访问该Cookie的域名。如果设置为“.google.com”,则所有以“google.com”结尾的域名都可以访问该Cookie。注意第一个字符必须为“.”。
    comment该Cookie的用处说明,浏览器显示Cookie信息的时候显示该说明。
    versionCookie使用的版本号。0表示遵循Netscape的Cookie规范,1表示遵循W3C的RFC 2109规范

    例如:

    document.cookie = "username=Darren;path=/;domain=.csdn.net"

    将上面代码复制在console控制台中输入,回车便可以在浏览器的cookie中查到username被存在Domain为'".csdn.net'的域名下。

    3、Cookie的Domain属性

        我们重点说一下这个Domain属性。一般在实现单点登录的时候会经常用到这个属性,通过在父级域设置Cookie,然后在各个子级域拿到存在父级域中的Cookie值。比如刚才设置的username属性,在blog.csdn.net下同样可以访问到,用户不用重新登录就可以拿到第一次登录进来时候的用户信息,因为这些用户信息都是存在父级域".csdn.net"下面,其他页面也可以拿到。

    所谓的单点登录是指用户在一个站点如www.studyez.com登录后切换到另一个站点communty.studyez.com时也自动 被community的Server判断为已经登录,反过来,只要用户在community.studyez.com登出后,切换到 www.studyez.com时后www的Server也会判断到这一用户已经登出。

     因此,当在"blog.csdn.net"这个域名下存入一个Cookie;如:

    document.cookie = "blogCookie=blog;path=/;domain=.blog.csdn.net";

    然后你会发现在mp.csdn.net下看不到blogCookie这个属性。这个就是所谓的Cookie跨域的问题。 

    补充说明:

    设置domain的值,前面带点和不带点的区别:

    1. 带点:任何subdomain都可以访问,包括父domain

    2. 不带点:只有完全一样的域名才能访问,subdomain不能访问(但在IE下比较特殊,它支持subdomain访问)

    总结:domain表示的是cookie所在的域,默认为请求的地址,如网址为www.study.com/study,那么domain默认为www.study.com。而跨域访问,如域A为t1.study.com,域B为t2.study.com,那么在域A生产一个令域A和域B都能访问的cookie就要将该cookie的domain设置为.study.com;如果要在域A生产一个令域A不能访问而域B能访问的cookie就要将该cookie的domain设置为t2.study.com。注意:一般在域名前是需要加一个"."的,如"domain=.study.com"。

     

    展开全文
  • domain.xml

    2019-07-10 16:16:23
    domain测试domain测试domain测试 配置新的虚拟机libvirt通过xml
  • In multi-domain wavelength-division-multiplexing (WDM) optical networks, the inter-domain routing is a challenge since each single-domain cannot view the full network topology. At the same time, ...
  • domaintools-DomainTools API的R API接口 实现了以下功能: domaintools_api_key :获取或设置DOMAINTOOLS_API_KEY值 domaintools_username :获取或设置DOMAINTOOLS_API_USERNAME的值 domain_profile :域配置文件...
  • 领域驱动设计(Domain Driven Design)参考架构详解

    万次阅读 多人点赞 2011-08-12 11:33:02
    领域驱动设计(Domain Driven Design)参考架构详解摘要本文将介绍领域驱动设计(Domain Driven Design)的官方参考架构,该架构分成了Interfaces、Applications和Domain三层以及包含各类基础设施的Infrastructure。...

    推荐:博主历时三年倾注大量心血创作的大数据平台架构与原型实现:数据中台建设实战一书已由知名IT图书品牌电子工业出版社博文视点出版发行,真诚推荐给每一位读者!点击重磅推荐:建大数据平台太难了!给我发个工程原型吧!了解图书详情,扫码进入京东手机购书页面!

     

    领域驱动设计(Domain Driven Design)参考架构详解

    摘要

    本文将介绍领域驱动设计(Domain Driven Design)的官方参考架构,该架构分成了Interfaces、Applications和Domain三层以及包含各类基础设施的Infrastructure。本文会对架构中一些重要组件和问题进行讨论,给出一些分析结论。本文原文连接:http://blog.csdn.net/bluishglc/article/details/6681253 转载请注明出处!

    目录


    1.      架构概述
    2.      架构详解
            2.1.       Interfaces-接口层
                    2.1.1.        DTO
                    2.1.2.        Assembler
                    2.1.3.        Facade
            2.2.       Application-应用层
            2.3.       Domain-领域层
            2.4.       Infrastructure-基础设施层
    3.      关于架构的一些讨论
            3.1.       架构并不能保证领域驱动设计的贯彻与执行
            3.2.       Fa?ade是否是必须的?

    1.      架构概述

     

    领域驱动设计(Domain Driven Design)有一个官方的sample工程,名为DDDSample,官网:http://dddsample.sourceforge.net/,该工程给出了一种实践领域驱动设计的参考架构,本文将对此该架构进行简单介绍,并就一些重要问题进行讨论。

    该架构分成了Interfaces、Applications和Domain三层以及包含各类基础设施的Infrastructure。下图简略描述了它们之间的关系:

    图1:领域驱动设计风格的架构草图(来自于DDDSample官网)

    下图是详细架构:

    图2:领域驱动设计参考架构

    作为参照,下图展示了传统TransactionScript风格的架构,可以看出,两者的差异并不是太大(对于Façade来说,它是一种可选设施,如果系统架构中省略Façade,则DTO与领域对象的互换工作可在service中进行),这也从则面说明推行领域驱动设计的关键并不在架构上,而在于整个团队在分析、设计和开发上没有自始至终地以领域模型为核心开展工作,以面向对象的思想进行设计和编程。

    Transaction Script风格的架构具有明显的“数据”与“操作”分离的特征,其和领域驱动设计风格的架构在两个类组件上有质的区别,一个是领域对象,一个是Service。领域驱动设计的架构核心目标是要创建一个富领域模型,其典型特征是它的领域对象具有丰富的业务方法用以处理业务逻辑,而Transaction Script风格的领域对象则仅仅是数据的载体,没有业务方法,这种领域也被称作“贫血的领域对象”(Anemic Domain Objects)。在Service方面,领域驱动设计的架构里Service是非常“薄“的一层,其并不负责处理业务逻辑,而在TransactionScript风格的架构里,Service是处理业务逻辑的主要场所,因而往往非常厚重。

    图3:数据与操作分离的Transaction Script风格的架构

    2.      架构详解

    2.1.    Interfaces-接口层

    领域驱动设计对Interfaces的定位是:

    Thislayer holds everything that interacts with other systems, such as web services,RMI interfaces or web applications, and batch processing frontends. It handlesinterpretation, validation and translation of incoming data. It also handlesserialization of outgoing data, such as HTML or XML across HTTP to web browsersor web service clients, or DTO classes and distributed facade interfaces forremote Java clients.

    该层包含与其他系统进行交互的接口与通信设施,在多数应用里,该层可能提供包括Web Services、RMI或Rest等在内的一种或多种通信接口。该层主要由Façade、DTO和Assembler三类组件构成,三类组件均是典型的J2EE模式,以下是对三类组件的具体介绍:

    2.1.1.   DTO

    DTO- DataTransfer Object(数据传输对象),也常被称作VO-Value Object(值对象)。基于面向对象技术设计的领域对象(即通常所说的“实体”)都是细粒度的,将细粒度的领域对象直接传递到远程调用端需要进行多次网络通信,DTO在设计之初的主要考量是以粗粒度的数据结构减少网络通信并简化调用接口。以下罗列了DTO的多项作用:

    •         Reduces network traffic
    •         Simplifies remote object and remote interface
    •         Transfers more data in fewer remote calls
    •         Reduces code duplication
    •         Introduces stale transfer objects
    •         Increases complexity due to synchronization and version control

    图4.DTO应用时序图(基于《Core J2EE Patterns》插图进行了修改)

    值得一提的是,DTO对实现一个独立封闭的领域模型具有积极的作用,特别是当系统使用了某些具有自动脏数据检查(automatic dirty checking)机制的ORM框架时,DTO的优势就更加明显,否则就会存在领域对象在模型层以外被意外修改并自动持久化到数据库中的风险或者是像Hibernate那样的框架因未开启OpenSessionInView (注:开启OpenSessionInView有副作用,一般认为OpenSessionInView不是一种好的实践)而导致Lazy Loading出现问题。

    关于DTO具体的设计用意和应用场景可参考如下资源:

    1.《Core J2EE™ Patterns: Best Practices and Design Strategies, SecondEdition》

    2.《Patterns of Enterprise ApplicationArchitecture》

    2.1.2.   Assembler

    在引入DTO后,DTO与领域对象之间的相互转换工作多由Assembler承担,因此Assembler几乎总是同DTO一起出现。也有一些系统使用反射机制自动实现DTO与领域对象之间的相互转换,Appache的Commons BeanUtils就提供了类似的功能。应该说这两种实现各有利弊,使用Assembler进行对象数据交换更为安全与可控,并且接受编译期检查,但是代码量明显偏多。使用反射机制自动进行象数据交换虽然代码量很少,但却是非常脆弱的,一旦对象属性名发生了变化,数据交互就会失败,并且很难追踪发现。总体来说,Assembler更为直白和稳妥。

    图5.Assebler应用类图(基于《Core J2EE Patterns》插图进行了修改)

    关于Assembler具体的设计用意和应用场景可参考如下资源:

    1.《Core J2EE™ Patterns: Best Practices and Design Strategies, SecondEdition》

    2.《Patterns of Enterprise ApplicationArchitecture》

    2.1.3.   Facade

    作为一种设计模式同时也是Interfaces层内的一类组件,Façade的用意在于为远程客户端提供粗粒度的调用接口。Façade本身不处理任何的业务逻辑,它的主要工作就是将一个用户请求委派给一个或多个Service进行处理,同时借助Assembler将Service传入或传出的领域对象转化为DTO进行传输。以下罗列了Façade的多项作用:

     

    • Introduces a layer that provides services to remote clients
    • Exposes a uniform coarse-grained interface
    • Reduces coupling between the tiers
    • Promotes layering, increases flexibility and maintainability
    • Reduces complexity
    • Improves performance, reduces fine-grained remote methods
    • Centralizes security management
    • Centralizes transaction control
    • Exposes fewer remote interfaces to clients

     

    实践Façade的过程中最难把握的问题就是Façade的粒度问题。传统的Service均以实体为单位进行组织,而Façade应该具有更粗粒度的组织依据,较为合适的粒度依据有:一个高度内聚的模块一个Façade,或者是一个“聚合”(特指领域驱动设计中的聚合)一个Façade.

    图6.Façade应用类图(基于《Core J2EE Patterns》插图进行了修改)

    图7.Façade应用时序图(基于《Core J2EE Patterns》插图进行了修改)

    关于Assembler具体的设计用意和应用场景可参考如下资源:

    1.《Core J2EE™ Patterns: Best Practices and Design Strategies, SecondEdition》

    2.《Patterns of Enterprise ApplicationArchitecture》

    3.《Design Patterns: Elementsof Reusable Object-Oriented Software》

    2.2.    Application-应用层

    领域驱动设计对Application的定位是:

    Theapplication layer is responsible for driving the workflow of the application,matching the use cases at hand. These operations are interface-independent andcan be both synchronous or message-driven. This layer is well suited forspanning transactions, high-level logging and security. The application layeris thin in terms of domain logic - it merely coordinates the domain layerobjects to perform the actual work.

    Application层中主要组件就是Service,在领域驱动设计的架构里,Service的组织粒度和接口设计依据与传统Transaction Script风格的Service是一致的,但是两者的实现却有着质的区别。TransactionScript风格的Service是实现业务逻辑的主要场所,因此往往非常厚重。而在领域驱动设计的架构里,Application是非常“薄”的一层,所有的Service只负责协调并委派业务逻辑给领域对象进行处理,其本身并真正实现业务逻辑,绝大部分的业务逻辑都由领域对象承载和实现了,这是区别系统是Transaction Script架构还是Domain Model架构的重要标志。

    不管是Transaction Script风格还Domain Model风格,Service都会与多种组件进行交互,这些组件包括:其他的Service、领域对象和Repository 或 DAO。

    图8. Service应用时序图(基于《Core J2EE Patterns》插图进行了修改)

     

    Service的接口是面向用例设计的,是控制事务、安全的适宜场所。如果Façade的某一方法需要调用两个以上的Service方法,需要注意事务问题。

     

    2.3.    Domain-领域层

     

    领域驱动设计对Domain的定位是:

    Thedomain layer is the heart of the software, and this is where the interestingstuff happens. There is one package per aggregate, and to each aggregatebelongs entities, value objects, domain events, a repository interface andsometimes factories.

    Thecore of the business logic belongs in here. The structure and naming ofaggregates, classes and methods in the domain layer should follow theubiquitous language, and you should be able to explain to a domain expert howthis part of the software works by drawing a few simple diagrams and using theactual class and method names of the source code.

    Domain层是整个系统的核心层,该层维护一个使用面向对象技术实现的领域模型,几乎全部的业务逻辑会在该层实现。Domain层包含Entity(实体)、ValueObject(值对象)、Domain Event(领域事件)和Repository(仓储)等多种重要的领域组件。

    2.4.    Infrastructure-基础设施层

    领域驱动设计对Infrastructure的定位是:

    Inaddition to the three vertical layers, there is also the infrastructure. As thethe picture shows, it supports all of the three layers in different ways,facilitating communication between the layers. In simple terms, theinfrastructure consists of everything that exists independently of ourapplication: external libraries, database engine, application server, messagingbackend and so on.

    Also,we consider code and configuration files that glues the other layers to theinfrastructure as part of the infrastructure layer. Looking for example at thepersistence aspect, the database schema definition, Hibernate configuration andmapping files and implementations of the repository interfaces are part of theinfrastructure layer.

    Whileit can be tricky to give a solid definition of what kind of code belongs to theinfrastructure layer for any given situation, it should be possible tocompletely stub out the infrastructure in pure Java unit/scenario tests andstill be able to use the domain layer and possibly the application layer towork out the core business problems.

    作为基础设施层,Infrastructure为Interfaces、Application和Domain三层提供支撑。所有与具体平台、框架相关的实现会在Infrastructure中提供,避免三层特别是Domain层掺杂进这些实现,从而“污染”领域模型。Infrastructure中最常见的一类设施是对象持久化的具体实现。

     

    3.      关于架构的一些讨论   

    3.1.    架构并不能保证领域驱动设计的贯彻与执行

     

    虽然一个合适的架构对于实施领域驱动设计是大有必要的,但只依靠架构是不能保证领域驱动设计的贯彻与执行的。实际上,在这个参考架构上使用Transaction Script的方式进行开法几乎没有任何问题,只要开发人员将领域对象变成“贫血”的“数据载体”对待,在service里实现业务逻辑,那么该参考架构将成为纯粹的TransactionScript方式。当然反过来看,这也体现了这一架构的灵活性。确保领域驱动设计的贯彻与执行需要整个团队在分析、设计和开发上没有自始至终地以领域模型为核心开展工作,以面向对象的思想进行设计和编程,才能保证实现领域驱动设计。

    3.2.    Façade是否是必须的?

    尽管在架构中对Façade的定义非常清晰,但在实践中我发现Façade并不是一个容易拿捏的东西。主要问题在于其与service之间的有太多的重叠与相似之处。我们注意到service是接口是面向一个use case的,因此事务也是追加在service这一层上,于是对于façade而言,99%的情况是,它只是把某个service的某个方法再包裹一下而已,如果把领域对象和DTO的互转换工作移至service中进行,那么façade将彻底变成空壳,而关键的是:如果service的接口设计是面向和user case的,那么,毫无疑问,service接口的传入传出参数也都应该是DTO,而这一点也在《Core J2EE™ Patterns: Best Practices and Design Strategies, SecondEdition》和《Patterns of Enterprise ApplicationArchitecture》两书的示例代码中完全印证了。那么,从更为务实角度出发,Façade并非是一种必须的组件。

    展开全文
  • 深入理解ApplicationDomain和SecurityDomain
  • domain driver

    2009-03-24 14:00:19
    domain driven development domain driven development domain driven development domain driven development domain driven development
  • Domain Driven Design

    2018-11-28 20:28:48
    Domain-Driven Design Tackling Complexity in the Heart of Software Eric Evans eric@domainlanguage.com (415) 902-7873 (Final Manuscript, April 15, 2003) For current draft and other information, see ...
  • domain层详解

    万次阅读 多人点赞 2018-07-10 14:30:58
    domain的概念,通常会分很多层,比如经典的三层架构,控制层、业务层、数据访问层(DAO),此外,还有一个层,就是domaindomain层,通常就是用于放置这个系统中,与数据库中的表,一一对应起来的JavaBean的model层...

    domain的概念,通常会分很多层,比如经典的三层架构,控制层、业务层、数据访问层(DAO),此外,还有一个层,就是domain层

    domain层,通常就是用于放置这个系统中,与数据库中的表,一一对应起来的JavaBean的


    model层:和domain区别;可能都是javaBean,

    这个区别是用途不同,domain通常就代表了与数据库表--一一对应的javaBean,

    model通常代表了不与数据库一一对应的javaBean,但是封装的数据是前端的JS脚本,需要使用的数据

    展开全文
  • Domain generalization

    千次阅读 多人点赞 2018-11-20 20:42:50
     最近由于交流的需要,读了几篇关于Domain adaptation的文章,其中一种名叫Domain generalization的技术引起了我的注意,这种技术可以在target domain未知的情况下训练出分类器而且性能还相当不错,下面就对这种...
  • domain-verification-源码

    2021-05-02 15:10:55
    domainVerification.txt(domain_url,domain_key,domain_value); domainVerification.metatag(domain_url,domain_key,domain_value); domainVerification.all(domain_url,domain_key,domain_value,domain_html_name,...
  • Unix Domain Sokcet

    2011-10-28 01:03:24
    Unix Domain Sokcet Unix Domain Sokcet Unix Domain Sokcet Unix Domain Sokcet
  • Domain driven design distilled
  • reduce_domain算子和crop_domain算子

    千次阅读 2020-02-10 21:57:44
    reduce_domain算子和crop_domain算子
  • wildfly 21的domain配置

    万次阅读 2020-12-23 21:05:34
    wildfly可以使用Standalone模式或者domain模式启动,standalone模式就很简单了,可以看做是一个单独的服务器。今天我们将会详细讲解一下domain模式。
  • Gradient-Domain Path Tracing

    2018-04-05 13:43:22
    Gradient-Domain Path TracingGradient-Domain Path TracingGradient-Domain Path TracingGradient-Domain Path TracingGradient-Domain Path TracingGradient-Domain Path TracingGradient-Domain Path Tracing
  • odoo domain详解

    千次阅读 2019-01-30 10:39:47
    odoo domain详解 参考的以下文档: luohuayong:Odoo domain写法及运用 baimo:odoo domain表达式 1、domain 表达式规则 最简单的格式:[(‘字段名’,‘操作符’,值)] 例:[(‘shenqr.user_id’,’=’,uid)] ...
  • domain codomain range 含义

    千次阅读 2013-11-22 10:41:30
    简单来说,翻译成中文。 domain: 定义域 codomain : 取值空间 range :值域
  • domain旁注检测

    2008-12-14 14:15:15
    domain旁注检测 domain旁注检测 domain旁注检测 domain旁注检测 domain旁注检测
  • 最近一个项目的CRM安装搞的我焦头烂额,其中的一个点引出了今天这篇分享,源头是客户的IT不给domain user的domain admin权限,还要求domain group需手动提前建好,不允许由安装程序自动创建,那客户IT建好了,咱不...
  • Node.js Domain(域) 简化异步代码的异常处理,可以捕捉处理try catch无法捕捉的异常。 Domain 模块可分为隐式绑定和显式绑定: 隐式绑定: 把在domain上下文中定义的变量,自动绑定到domain对象 显式绑定: 把不是...
  • New DataDomain position;DataDomain outline ;DataDomain Position;Quantum Competitor Comparison;Vs Quantum Positioning;DataDomain vs DXi6701;DataDomain vs DXi6702;DataDomain vs DXi6802;DataDomain vs DXi
  • Domain-Driven Design领域驱动设计 Domain-Driven Design领域驱动设计
  • Time Domain UWB

    2012-11-22 15:08:26
    Time Domain 公司对超宽带(UWB)定位的介绍,需要的可以下载了解,做UWB定位的可以参考
  • 本篇是迁移学习专栏介绍的第六篇论文,来自来自加州大学伯克利分校的Eric Tzeng等人发表在arXiv 2014的DDC(Deep Domain Confusion)。DDC针对预训练的AlexNet(8层)网络,在第7层(也就是feature层,softmax的上一...
  • 1、共同点:两者都是改变图像定义域的算子,不改变原图像size。 2、区别: ...文档中:The operator change_domain uses the indicated region as the new definition domain. Unlike the operator redu
  • xenserver7.0 Domain0 介绍

    2017-07-20 11:02:44
    xenserver7.0 Domain0 介绍
  • Domain-Driven Design Distilled. Vaughn Vernon.2016

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 672,185
精华内容 268,874
关键字:

domain