blob: f69625fbf3b9bd998249a275fa3481fc5177a624 [file] [log] [blame]
<!DOCTYPE html>
<html>
<head>
<title>User Guide - Dubbo - Alibaba Open Sesame</title>
<meta http-equiv="X-UA-Compatible" content="IE=8">
<meta charset="UTF-8">
<!-- Deprecated since 3.4. To be removed in a future version of Confluence; use AJS.Confluence.getContextPath() -->
<meta id="confluence-context-path" name="confluence-context-path" content="/wiki">
<meta name="ajs-context-path" content="/wiki">
<meta name="ajs-version-number" content="3.5.9">
<meta name="ajs-build-number" content="2166">
<meta id="atlassian-token" name="atlassian-token" content="c116db80711201b36e2067aa83f3b044c2d5a30e">
<meta id="confluence-space-key" name="confluence-space-key" content="dubbo">
<meta name="ajs-remote-user" content="">
<meta name="ajs-static-resource-url-prefix" content="/wiki/s/en/2166/34/_">
<script type="text/javascript">
// Deprecated global variables. To be removed in a future version of Confluence.
var contextPath = '/wiki';
</script>
<!-- include system css resources -->
<link type="text/css" rel="stylesheet" href="batch.css" tppabs="http://10.20.160.198/wiki/s/en/2166/34/26/_/download/superbatch/css/batch.css" media="all">
<!--[if IE]>
<link type="text/css" rel="stylesheet" href="batch.css-ieonly=true.css" tppabs="http://10.20.160.198/wiki/s/en/2166/34/26/_/download/superbatch/css/batch.css?ieonly=true" media="all">
<![endif]-->
<link type="text/css" rel="stylesheet" href="batch.css-media=print.css" tppabs="http://10.20.160.198/wiki/s/en/2166/34/26/_/download/superbatch/css/batch.css?media=print" media="print">
<link type="text/css" rel="stylesheet" href="com.atlassian.confluence.ext.newcode-macro-plugin-syntaxhighlighter.css" tppabs="http://10.20.160.198/wiki/s/en/2166/34/1.9.10/_/download/batch/com.atlassian.confluence.ext.newcode-macro-plugin:syntaxhighlighter/com.atlassian.confluence.ext.newcode-macro-plugin:syntaxhighlighter.css" media="all">
<link type="text/css" rel="stylesheet" href="com.atlassian.confluence.ext.newcode-macro-plugin-sh-theme-confluence.css" tppabs="http://10.20.160.198/wiki/s/en/2166/34/1.9.10/_/download/batch/com.atlassian.confluence.ext.newcode-macro-plugin:sh-theme-confluence/com.atlassian.confluence.ext.newcode-macro-plugin:sh-theme-confluence.css" media="all">
<link type="text/css" rel="stylesheet" href="confluence-forms.css" tppabs="http://10.20.160.198/wiki/s/en/2166/34/1.0/_/download/resources/confluence.web.resources:aui-forms/confluence-forms.css" media="all">
<!--[if IE]>
<link type="text/css" rel="stylesheet" href="confluence.web.resources-aui-forms.css-ieonly=true.css" tppabs="http://10.20.160.198/wiki/s/en/2166/34/1.0/_/download/batch/confluence.web.resources:aui-forms/confluence.web.resources:aui-forms.css?ieonly=true" media="all">
<![endif]-->
<link type="text/css" rel="stylesheet" href="com.atlassian.confluence.plugins.share-page-mail-page-resources.css" tppabs="http://10.20.160.198/wiki/s/en/2166/34/1.8/_/download/batch/com.atlassian.confluence.plugins.share-page:mail-page-resources/com.atlassian.confluence.plugins.share-page:mail-page-resources.css" media="all">
<link type="text/css" rel="stylesheet" href="confluence.web.resources-view-comment.css" tppabs="http://10.20.160.198/wiki/s/en/2166/34/1.0/_/download/batch/confluence.web.resources:view-comment/confluence.web.resources:view-comment.css" media="all">
<!--[if IE]>
<link type="text/css" rel="stylesheet" href="confluence.web.resources-view-comment.css-ieonly=true.css" tppabs="http://10.20.160.198/wiki/s/en/2166/34/1.0/_/download/batch/confluence.web.resources:view-comment/confluence.web.resources:view-comment.css?ieonly=true" media="all">
<![endif]-->
<link type="text/css" rel="stylesheet" href="confluence.macros.advanced-fancy-box.css" tppabs="http://10.20.160.198/wiki/s/en/2166/34/1.16/_/download/batch/confluence.macros.advanced:fancy-box/confluence.macros.advanced:fancy-box.css" media="all">
<link type="text/css" rel="stylesheet" href="com.atlassian.confluence.plugins.drag-and-drop-support.css" tppabs="http://10.20.160.198/wiki/s/en/2166/34/1.0.16/_/download/batch/com.atlassian.confluence.plugins.drag-and-drop:support/com.atlassian.confluence.plugins.drag-and-drop:support.css" media="all">
<link type="text/css" rel="stylesheet" href="com.atlassian.plugins.shortcuts.atlassian-shortcuts-module-shortcuts.css" tppabs="http://10.20.160.198/wiki/s/en/2166/34/0.8/_/download/batch/com.atlassian.plugins.shortcuts.atlassian-shortcuts-module:shortcuts/com.atlassian.plugins.shortcuts.atlassian-shortcuts-module:shortcuts.css" media="all">
<link type="text/css" rel="stylesheet" href="com.atlassian.confluence.keyboardshortcuts-confluence-keyboard-shortcuts.css" tppabs="http://10.20.160.198/wiki/s/en/2166/34/3.5.9/_/download/batch/com.atlassian.confluence.keyboardshortcuts:confluence-keyboard-shortcuts/com.atlassian.confluence.keyboardshortcuts:confluence-keyboard-shortcuts.css" media="all">
<!-- end system css resources -->
<link rel="stylesheet" href="combined.css-spaceKey=dubbo.css" tppabs="http://10.20.160.198/wiki/s/en/2166/34/3/_/styles/combined.css?spaceKey=dubbo" type="text/css">
<meta name="confluence-request-time" content="1392025680035">
<meta name="loggedInUsername" content="">
<meta name="ajs-keyboardshortcut-hash" content="bf02a79603372a43d395a0a429bdf66">
<!-- Deprecated since 3.4. To be removed in a future version of Confluence; use atl.header -->
<script type="text/x-template" title="share-content-popup">
<form action="#" method="post" class="aui share-content-popup">
<fieldset>
<label for="users">User name or email</label>
<div class="autocomplete-user-target">
<input class="text autocomplete-sharepage" id="users" data-max="10" data-dropdown-target=".autocomplete-user-target" data-none-message="No matching user or email found"/>
</div>
<ol class="recipients">
</ol>
<div><label for="note">Note</label></div>
<textarea class="textarea" id="note" placeholder="Add an optional note"/>
</fieldset>
<div class="button-panel">
<div class="progress-messages-icon"></div>
<div class="progress-messages">
</div>
<input class="button submit" type="submit" value="Share" disabled/>
<a class="close-dialog" href="#">Cancel</a>
</div>
</form>
</script>
<script type="text/x-template" title="share-content-popup-recipient-username">
<li data-username="{username}" style="display: none">
<span>
<img src="{thumbnailLink.href}" title="{title}">
<span>{title}</span>
<span class="remove-recipient"/>
</span>
</li>
</script>
<script type="text/x-template" title="share-content-popup-recipient-email">
<li data-email="{email}" style="display: none">
<span>
<img src="{icon}" title="{email}">
<span>{email}</span>
<span class="remove-recipient"/>
</span>
</li>
</script>
<meta name="ajs-use-keyboard-shortcuts" content="true">
<link rel="shortcut icon" href="/wiki/favicon.ico">
<link rel="icon" type="image/png" href="/wiki/s/en/2166/34/_/images/logo/confluence_16.png">
<link rel="search" type="application/opensearchdescription+xml" href="/wiki/opensearch/osd.action" title="Alibaba Open Sesame"/>
<!-- include system javascript resources -->
<script type="text/javascript" src="batch.js" tppabs="http://10.20.160.198/wiki/s/en/2166/34/26/_/download/superbatch/js/batch.js" ></script>
<script type="text/javascript" src="com.atlassian.confluence.ext.newcode-macro-plugin-syntaxhighlighter.js" tppabs="http://10.20.160.198/wiki/s/en/2166/34/1.9.10/_/download/batch/com.atlassian.confluence.ext.newcode-macro-plugin:syntaxhighlighter/com.atlassian.confluence.ext.newcode-macro-plugin:syntaxhighlighter.js" ></script>
<script type="text/javascript" src="com.atlassian.confluence.ext.newcode-macro-plugin-syntaxhighlighter-brushes.js" tppabs="http://10.20.160.198/wiki/s/en/2166/34/1.9.10/_/download/batch/com.atlassian.confluence.ext.newcode-macro-plugin:syntaxhighlighter-brushes/com.atlassian.confluence.ext.newcode-macro-plugin:syntaxhighlighter-brushes.js" ></script>
<script type="text/javascript" src="com.atlassian.confluence.plugins.share-page-mail-page-resources.js" tppabs="http://10.20.160.198/wiki/s/en/2166/34/1.8/_/download/batch/com.atlassian.confluence.plugins.share-page:mail-page-resources/com.atlassian.confluence.plugins.share-page:mail-page-resources.js" ></script>
<script type="text/javascript" src="confluence.macros.advanced-fancy-box.js" tppabs="http://10.20.160.198/wiki/s/en/2166/34/1.16/_/download/batch/confluence.macros.advanced:fancy-box/confluence.macros.advanced:fancy-box.js" ></script>
<script type="text/javascript" src="confluence.macros.advanced-thumbnail-images.js" tppabs="http://10.20.160.198/wiki/s/en/2166/34/1.16/_/download/batch/confluence.macros.advanced:thumbnail-images/confluence.macros.advanced:thumbnail-images.js" ></script>
<script type="text/javascript" src="com.atlassian.confluence.plugins.drag-and-drop-support.js" tppabs="http://10.20.160.198/wiki/s/en/2166/34/1.0.16/_/download/batch/com.atlassian.confluence.plugins.drag-and-drop:support/com.atlassian.confluence.plugins.drag-and-drop:support.js" ></script>
<script type="text/javascript" src="com.atlassian.confluence.plugins.drag-and-drop-drag-and-drop-for-view-content.js" tppabs="http://10.20.160.198/wiki/s/en/2166/34/1.0.16/_/download/batch/com.atlassian.confluence.plugins.drag-and-drop:drag-and-drop-for-view-content/com.atlassian.confluence.plugins.drag-and-drop:drag-and-drop-for-view-content.js" ></script>
<script type="text/javascript" src="com.atlassian.confluence.plugins.doctheme-splitter.js" tppabs="http://10.20.160.198/wiki/s/en/2166/34/1.9/_/download/batch/com.atlassian.confluence.plugins.doctheme:splitter/com.atlassian.confluence.plugins.doctheme:splitter.js" ></script>
<script type="text/javascript" src="com.atlassian.plugins.shortcuts.atlassian-shortcuts-module-shortcuts.js" tppabs="http://10.20.160.198/wiki/s/en/2166/34/0.8/_/download/batch/com.atlassian.plugins.shortcuts.atlassian-shortcuts-module:shortcuts/com.atlassian.plugins.shortcuts.atlassian-shortcuts-module:shortcuts.js" ></script>
<script type="text/javascript" src="com.atlassian.confluence.keyboardshortcuts-confluence-keyboard-shortcuts.js" tppabs="http://10.20.160.198/wiki/s/en/2166/34/3.5.9/_/download/batch/com.atlassian.confluence.keyboardshortcuts:confluence-keyboard-shortcuts/com.atlassian.confluence.keyboardshortcuts:confluence-keyboard-shortcuts.js" ></script>
<script type="text/javascript" src="legacy.confluence.web.resources-prototype.js" tppabs="http://10.20.160.198/wiki/s/en/2166/34/1.0/_/download/batch/legacy.confluence.web.resources:prototype/legacy.confluence.web.resources:prototype.js" ></script>
<!-- end system javascript resources -->
<link rel="canonical" href="http://code.alibabatech.com/wiki/display/dubbo/User+Guide">
<link rel="shortlink" href="http://code.alibabatech.com/wiki/x/QIBg">
<meta name="wikilink" content="[dubbo:User Guide]">
<meta name="page-version" content="287">
</head>
<body onload="placeFocus()"
id="com-atlassian-confluence" class="theme-default ">
<ul id="assistive-skip-links" class="assistive">
<li><a href="#title-heading">Skip to content</a></li>
<li><a href="#breadcrumbs">Skip to breadcrumbs</a></li>
<li><a href="#header-menu-bar">Skip to header menu</a></li>
<li><a href="#navigation">Skip to action menu</a></li>
<li><a href="#quick-search-query">Skip to quick search</a></li>
</ul>
<div id="page">
<div id="full-height-container">
<fieldset class="hidden parameters">
<input type="hidden" id="shortcutDialogTip" value="Shortcut tip: Pressing <b>{shortcut}</b> also opens this dialog box">
<input type="hidden" title="i18n.close.name" value="Close">
<input type="hidden" title="i18n.cancel.name" value="Cancel">
</fieldset><fieldset class="hidden parameters">
<input type="hidden" id="statusDialogHeading" value="What are you working on?">
<input type="hidden" id="statusDialogAccessibilityLabel" value="Enter your status (140 character limit)">
<input type="hidden" id="statusDialogLatestLabel" value="Last update:">
<input type="hidden" id="statusDialogUpdateButtonLabel" value="Update">
<input type="hidden" id="statusDialogCancelButtonLabel" value="Cancel">
</fieldset>
<fieldset class="hidden parameters">
<input type="hidden" id="globalSettingsAttachmentMaxSize" value="10485760">
<input type="hidden" id="userLocale" value="en_GB">
<input type="hidden" id="staticResourceUrlPrefix" value="/wiki/s/en/2166/34/_">
<input type="hidden" id="contextPath" value="/wiki">
</fieldset>
<div id="header" class="" style="display: none">
<form id="quick-search" class="quick-search" method="get" action="http://10.20.160.198/wiki/dosearchsite.action">
<fieldset>
<label class="assistive" for="quick-search-query">Quick Search</label>
<input class="quick-search-query" id="quick-search-query" type="text" accessKey="q" autocomplete="off" name="queryString" size="25" title="Quick Search" />
<input class="quick-search-submit" id="quick-search-submit" type="submit" value="Search" />
<div class="aui-dd-parent quick-nav-drop-down"><!-- Quick nav appears here --></div>
</fieldset>
<fieldset class="hidden parameters">
<input type="hidden" id="quickNavEnabled" value="true" />
</fieldset>
</form>
<ul id="header-menu-bar" class="ajs-menu-bar">
<li class="normal ajs-menu-item">
<a id="browse-menu-link" class="browse trigger ajs-menu-title" href="#"><span><span>Browse</span></span></a> <div class="assistive ajs-drop-down">
<ul id="browse-menu-link-leading" class="section-leading first">
<li>
<a id="space-pages-link" href="javascript:if(confirm(%27http://10.20.160.198/wiki/pages/listpages.action?key=dubbo \n\nThis file was not retrieved by Teleport Ultra, because it is addressed on a domain or path outside the boundaries set for its Starting Address. \n\nDo you want to open it from the server?%27))window.location=%27http://10.20.160.198/wiki/pages/listpages.action?key=dubbo%27" tppabs="http://10.20.160.198/wiki/pages/listpages.action?key=dubbo" class="" title="Browse pages in the Dubbo space">
<span>Pages</span></a> </li>
<li>
<a id="space-blogposts-link" href="javascript:if(confirm(%27http://10.20.160.198/wiki/pages/viewrecentblogposts.action?key=dubbo \n\nThis file was not retrieved by Teleport Ultra, because it is addressed on a domain or path outside the boundaries set for its Starting Address. \n\nDo you want to open it from the server?%27))window.location=%27http://10.20.160.198/wiki/pages/viewrecentblogposts.action?key=dubbo%27" tppabs="http://10.20.160.198/wiki/pages/viewrecentblogposts.action?key=dubbo" class="" title="Browse blogs in the Dubbo space">
<span>Blog</span></a> </li>
<li>
<a id="space-labels-link" href="javascript:if(confirm(%27http://10.20.160.198/wiki/labels/listlabels-heatmap.action?key=dubbo \n\nThis file was not retrieved by Teleport Ultra, because it is addressed on a domain or path outside the boundaries set for its Starting Address. \n\nDo you want to open it from the server?%27))window.location=%27http://10.20.160.198/wiki/labels/listlabels-heatmap.action?key=dubbo%27" tppabs="http://10.20.160.198/wiki/labels/listlabels-heatmap.action?key=dubbo" class="" title="Browse labels in the Dubbo space">
<span>Labels</span></a> </li>
<li>
<a id="space-attachments-link" href="javascript:if(confirm(%27http://10.20.160.198/wiki/spaces/listattachmentsforspace.action?key=dubbo \n\nThis file was not retrieved by Teleport Ultra, because it is addressed on a domain or path outside the boundaries set for its Starting Address. \n\nDo you want to open it from the server?%27))window.location=%27http://10.20.160.198/wiki/spaces/listattachmentsforspace.action?key=dubbo%27" tppabs="http://10.20.160.198/wiki/spaces/listattachmentsforspace.action?key=dubbo" class="" title="Browse attachments in the Dubbo space">
<span>Attachments</span></a> </li>
<li>
<a id="space-mail-link" href="javascript:if(confirm(%27http://10.20.160.198/wiki/spaces/viewmailarchive.action?key=dubbo \n\nThis file was not retrieved by Teleport Ultra, because it is addressed on a domain or path outside the boundaries set for its Starting Address. \n\nDo you want to open it from the server?%27))window.location=%27http://10.20.160.198/wiki/spaces/viewmailarchive.action?key=dubbo%27" tppabs="http://10.20.160.198/wiki/spaces/viewmailarchive.action?key=dubbo" class="" title="Browse mail in the Dubbo space">
<span>Mail</span></a> </li>
<li>
<a id="space-advanced-link" href="javascript:if(confirm(%27http://10.20.160.198/wiki/spaces/viewspacesummary.action?key=dubbo \n\nThis file was not retrieved by Teleport Ultra, because it is addressed on a domain or path outside the boundaries set for its Starting Address. \n\nDo you want to open it from the server?%27))window.location=%27http://10.20.160.198/wiki/spaces/viewspacesummary.action?key=dubbo%27" tppabs="http://10.20.160.198/wiki/spaces/viewspacesummary.action?key=dubbo" class="" title="Browse additional space functions in the Dubbo space">
<span>Advanced</span></a> </li>
<li>
<a href="javascript:if(confirm(%27http://10.20.160.198/wiki/spaces/usage/report.action?key=dubbo \n\nThis file was not retrieved by Teleport Ultra, because it is addressed on a domain or path outside the boundaries set for its Starting Address. \n\nDo you want to open it from the server?%27))window.location=%27http://10.20.160.198/wiki/spaces/usage/report.action?key=dubbo%27" tppabs="http://10.20.160.198/wiki/spaces/usage/report.action?key=dubbo" class="" title="">
<span>Activity</span></a> </li>
</ul>
<ul id="browse-menu-link-global" class="section-global">
<li>
<a id="whats-new-menu-link" href="javascript:if(confirm(%27http://docs.atlassian.com/confluence/docs-35/whatsnew/iframe \n\nThis file was not retrieved by Teleport Ultra, because it is addressed on a domain or path outside the boundaries set for its Starting Address. \n\nDo you want to open it from the server?%27))window.location=%27http://docs.atlassian.com/confluence/docs-35/whatsnew/iframe%27" tppabs="http://docs.atlassian.com/confluence/docs-35/whatsnew/iframe" class="" title="">
<span>What’s New</span></a> </li>
<li>
<a id="people-directory-link" href="javascript:if(confirm(%27http://10.20.160.198/wiki/peopledirectory.action \n\nThis file was not retrieved by Teleport Ultra, because it is addressed on a domain or path outside the boundaries set for its Starting Address. \n\nDo you want to open it from the server?%27))window.location=%27http://10.20.160.198/wiki/peopledirectory.action%27" tppabs="http://10.20.160.198/wiki/peopledirectory.action" class="" title="Browse the Confluence people directory">
<span>People Directory</span></a> </li>
<li>
<a id="space-directory-link" href="javascript:if(confirm(%27http://10.20.160.198/wiki/spacedirectory/view.action \n\nThis file was not retrieved by Teleport Ultra, because it is addressed on a domain or path outside the boundaries set for its Starting Address. \n\nDo you want to open it from the server?%27))window.location=%27http://10.20.160.198/wiki/spacedirectory/view.action%27" tppabs="http://10.20.160.198/wiki/spacedirectory/view.action" class="" title="Browse the Confluence space directory">
<span>Space Directory</span></a> </li>
<li>
<a id="keyboard-shortcuts-link" href="javascript:if(confirm(%27http://10.20.160.198/wiki \n\nThis file was not retrieved by Teleport Ultra, because it is addressed on a domain or path outside the boundaries set for its Starting Address. \n\nDo you want to open it from the server?%27))window.location=%27http://10.20.160.198/wiki%27" tppabs="http://10.20.160.198/wiki" class="" title="View available keyboard shortcuts">
<span>Keyboard Shortcuts</span></a> </li>
<li>
<a id="gadget-directory-link" href="javascript:if(confirm(%27http://10.20.160.198/wiki \n\nThis file was not retrieved by Teleport Ultra, because it is addressed on a domain or path outside the boundaries set for its Starting Address. \n\nDo you want to open it from the server?%27))window.location=%27http://10.20.160.198/wiki%27" tppabs="http://10.20.160.198/wiki" class="user-item administration-link" title="Browse gadgets provided by Confluence">
<span>Confluence Gadgets</span></a> </li>
</ul>
</div>
</li>
<li class="ajs-menu-item normal">
<a id="login-link" href="javascript:if(confirm(%27http://10.20.160.198/wiki/login.action?os_destination=%2Fdisplay%2Fdubbo%2FUser%2BGuide%3FshowChildren%3Dfalse \n\nThis file was not retrieved by Teleport Ultra, because it is addressed on a domain or path outside the boundaries set for its Starting Address. \n\nDo you want to open it from the server?%27))window.location=%27http://10.20.160.198/wiki/login.action?os_destination=%2Fdisplay%2Fdubbo%2FUser%2BGuide%3FshowChildren%3Dfalse%27" tppabs="http://10.20.160.198/wiki/login.action?os_destination=%2Fdisplay%2Fdubbo%2FUser%2BGuide%3FshowChildren%3Dfalse" class="user-item login-link" title="">
<span>Log In</span></a> </li>
</ul>
<ol id="breadcrumbs">
<li class="first" >
<span><a href="javascript:if(confirm(%27http://10.20.160.198/wiki/dashboard.action \n\nThis file was not retrieved by Teleport Ultra, because it is addressed on a domain or path outside the boundaries set for its Starting Address. \n\nDo you want to open it from the server?%27))window.location=%27http://10.20.160.198/wiki/dashboard.action%27" tppabs="http://10.20.160.198/wiki/dashboard.action" title="Go to Dashboard">Dashboard</a></span>
</li>
<li>
<span><a href="javascript:if(confirm(%27http://10.20.160.198/wiki/display/dubbo \n\nThis file was not retrieved by Teleport Ultra, because it is addressed on a domain or path outside the boundaries set for its Starting Address. \n\nDo you want to open it from the server?%27))window.location=%27http://10.20.160.198/wiki/display/dubbo%27" tppabs="http://10.20.160.198/wiki/display/dubbo">Dubbo</a></span>
</li>
<li>
<span><a href="Home.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/Home">Home</a></span>
</li>
<li>
<span>User Guide</span>
</li>
</ol>
</div><!-- \#header -->
<div id="main" >
<div id="navigation" class="content-navigation view" style="display: none">
<fieldset class="hidden parameters">
<input type="hidden" id="pageId" value="6324288">
</fieldset>
<ul class="ajs-menu-bar">
<li class="normal ajs-menu-item">
<a id="add-menu-link" class="add trigger ajs-menu-title" href="#"><span><span>Add</span></span></a> <div class="assistive ajs-drop-down">
<ul id="add-menu-link-page" class="section-page first">
<li>
<a id="add-comment-menu-link" href="User+Guide-showComments=true&showCommentArea=true.htm#addcomment" tppabs="http://10.20.160.198/wiki/display/dubbo/User+Guide?showComments=true&showCommentArea=true#addcomment" class="add-comment" title="Add a Comment">
<span>Comment</span></a> </li>
</ul>
</div>
</li>
<li class="normal ajs-menu-item">
<a id="action-menu-link" class="action trigger ajs-menu-title" href="#"><span><span>Tools</span></span></a> <div class="assistive ajs-drop-down">
<ul id="action-menu-link-primary" class="section-primary first">
<li>
<a id="view-attachments-link" href="javascript:if(confirm(%27http://10.20.160.198/wiki/pages/viewpageattachments.action?pageId=6324288 \n\nThis file was not retrieved by Teleport Ultra, because it is addressed on a domain or path outside the boundaries set for its Starting Address. \n\nDo you want to open it from the server?%27))window.location=%27http://10.20.160.198/wiki/pages/viewpageattachments.action?pageId=6324288%27" tppabs="http://10.20.160.198/wiki/pages/viewpageattachments.action?pageId=6324288" class="action-view-attachments" accessKey="a" title="View Attachments">
<span><u>A</u>ttachments (0)</span></a> </li>
<li>
<a id="action-view-history-link" href="javascript:if(confirm(%27http://10.20.160.198/wiki/pages/viewpreviousversions.action?pageId=6324288 \n\nThis file was not retrieved by Teleport Ultra, because it is addressed on a domain or path outside the boundaries set for its Starting Address. \n\nDo you want to open it from the server?%27))window.location=%27http://10.20.160.198/wiki/pages/viewpreviousversions.action?pageId=6324288%27" tppabs="http://10.20.160.198/wiki/pages/viewpreviousversions.action?pageId=6324288" class="action-view-history" title="">
<span>Page History</span></a> </li>
<li>
<a id="action-page-permissions-link" href="javascript:if(confirm(%27http://10.20.160.198/wiki/pages/viewinfo.action?pageId=6324288 \n\nThis file was not retrieved by Teleport Ultra, because it is addressed on a domain or path outside the boundaries set for its Starting Address. \n\nDo you want to open it from the server?%27))window.location=%27http://10.20.160.198/wiki/pages/viewinfo.action?pageId=6324288%27" tppabs="http://10.20.160.198/wiki/pages/viewinfo.action?pageId=6324288" class="action-page-permissions" title="Edit restrictions">
<span>Restrictions</span></a> </li>
</ul>
<ul id="action-menu-link-secondary" class="section-secondary">
<li>
<a id="view-page-info-link" href="javascript:if(confirm(%27http://10.20.160.198/wiki/pages/viewinfo.action?pageId=6324288 \n\nThis file was not retrieved by Teleport Ultra, because it is addressed on a domain or path outside the boundaries set for its Starting Address. \n\nDo you want to open it from the server?%27))window.location=%27http://10.20.160.198/wiki/pages/viewinfo.action?pageId=6324288%27" tppabs="http://10.20.160.198/wiki/pages/viewinfo.action?pageId=6324288" class="action-view-info" title="">
<span>Info</span></a> </li>
<li>
<a id="link-to-page-link" href="javascript:if(confirm(%27http://10.20.160.198/wiki/pages/viewinfo.action?pageId=6324288 \n\nThis file was not retrieved by Teleport Ultra, because it is addressed on a domain or path outside the boundaries set for its Starting Address. \n\nDo you want to open it from the server?%27))window.location=%27http://10.20.160.198/wiki/pages/viewinfo.action?pageId=6324288%27" tppabs="http://10.20.160.198/wiki/pages/viewinfo.action?pageId=6324288" class="" title="Link to this Page">
<span>Link to this Page&hellip;</span></a> </li>
<li>
<a id="view-in-hierarchy-link" href="javascript:if(confirm(%27http://10.20.160.198/wiki/pages/listpages-dirview.action?key=dubbo&openId=6324288 \n\nThis file was not retrieved by Teleport Ultra, because it is addressed on a domain or path outside the boundaries set for its Starting Address. \n\nDo you want to open it from the server?%27))window.location=%27http://10.20.160.198/wiki/pages/listpages-dirview.action?key=dubbo&openId=6324288#selectedPageInHierarchy%27" tppabs="http://10.20.160.198/wiki/pages/listpages-dirview.action?key=dubbo&openId=6324288#selectedPageInHierarchy" class="" title="">
<span>View in Hierarchy</span></a> </li>
<li>
<a id="action-view-source-link" href="javascript:if(confirm(%27http://10.20.160.198/wiki/pages/viewpagesrc.action?pageId=6324288 \n\nThis file was not retrieved by Teleport Ultra, because it is addressed on a domain or path outside the boundaries set for its Starting Address. \n\nDo you want to open it from the server?%27))window.location=%27http://10.20.160.198/wiki/pages/viewpagesrc.action?pageId=6324288%27" tppabs="http://10.20.160.198/wiki/pages/viewpagesrc.action?pageId=6324288" class="action-view-source popup-link" title="">
<span>View Wiki Markup</span></a> </li>
</ul>
</div>
</li>
</ul>
</div>
<h1 id="title-heading" class="pagetitle" style="display: none">
<a href="javascript:if(confirm(%27http://10.20.160.198/wiki/display/dubbo \n\nThis file was not retrieved by Teleport Ultra, because it is addressed on a domain or path outside the boundaries set for its Starting Address. \n\nDo you want to open it from the server?%27))window.location=%27http://10.20.160.198/wiki/display/dubbo%27" tppabs="http://10.20.160.198/wiki/display/dubbo"><img class="logo space custom" src="dubbo-version=5&modificationDate=1320723683000.jpg" tppabs="http://10.20.160.198/wiki/download/attachments/6324241/dubbo?version=5&modificationDate=1320723683000" alt=""></a>
</h1>
<div id="content" class="page view">
<div id="link-to-page-fields" class="hidden parameters">
<input type="hidden" id="linkToThisPageHeading" value="Link to this Page">
<input type="hidden" id="linkToThisPageLink" value="Link">
<input type="hidden" id="linkToThisPageTinyLink" value="Tiny Link">
<input type="hidden" id="linkToThisPageWikiMarkup" value="Wiki Markup">
<input type="hidden" id="linkToThisPageClose" value="Close">
</div>
<fieldset class="hidden parameters">
<input type="hidden" title="movePageDialogViewPageTitle" value="Move Page &ndash; &#8216;User Guide&#8217;">
<input type="hidden" title="movePageDialogEditPageTitle" value="Set Page Location">
<input type="hidden" title="movePageDialogMoveButton" value="Move">
<input type="hidden" title="movePageDialogCancelButton" value="Cancel">
<input type="hidden" title="movePageDialogBrowsePanelTip" value="Click to select the new parent page for this page and its children.">
<input type="hidden" title="movePageDialogSearchPanel" value="Search">
<input type="hidden" title="movePageDialogHistoryPanel" value="Recently Viewed">
<input type="hidden" title="movePageDialogHistoryNoResults" value="There were no recently viewed pages found.">
<input type="hidden" title="movePageDialogLocationPanel" value="Known Location">
<input type="hidden" title="movePageDialogLocationNotFound" value="The specified page was not found.">
<input type="hidden" title="movePageDialogBrowsePanel" value="Browse">
<input type="hidden" title="movePageDialogPanelLoadErrorMsg" value="Error reading the panel content from the server.">
<input type="hidden" title="movePageDialogPanelLoadErrorTip" value="You could try reloading the page and launching the dialog again.">
<input type="hidden" title="movePageDialogPanelLoadErrorStatus" value="HTTP Status">
<input type="hidden" title="movePageDialogNoSelectionErrorMsg" value="You must make a selection in the tree before you can move the page.">
<input type="hidden" title="movePageDialogSearchError" value="Failed to retrieve search results from the server.">
<input type="hidden" title="movePageDialogSearchNoResults" value="There were no pages found containing <b>{0}</b>.">
<input type="hidden" title="movePageDialogSearchResultCount" value="Showing <b>{0}</b>-<b>{1}</b> of <b>{2}</b> pages containing <b>{3}</b>.">
<input type="hidden" title="movePageDialogMoveFailed" value="Move failed. There was a problem contacting the server.">
<input type="hidden" title="movePageDialogCannotChangeSpace" value="You cannot move this page to another space because you do not have permission to remove it from this space.">
<input type="hidden" title="pageTitle" value="User Guide"/>
<input type="hidden" title="parentPageTitle" value="Home"/>
<input type="hidden" title="fromPageTitle" value=""/>
<input type="hidden" title="spaceKey" value="dubbo"/>
<input type="hidden" title="spaceName" value="Dubbo"/>
<input type="hidden" title="movePageDialogInvalidLocation" value="You cannot move a page to be underneath itself or its children."/>
<input type="hidden" title="movePageDialogOrderingTitle" value="Page Ordering"/>
<input type="hidden" title="movePageDialogBackButton" value="Back"/>
<input type="hidden" title="movePageDialogMoveAndOrderButton" value="Reorder"/>
<input type="hidden" title="movePageDialogNextButton" value="Move"/>
</fieldset>
<script type="text/x-template" title="movePageDialog">
<div class="row information">
<div class="inner">
<div class="element">
Specify the new parent page for this page and its children by space and title.
</div>
</div>
</div>
<div class="form">
<fieldset>
<legend class="assistive"><span>Change the Parent Page to a Known Page</span></legend>
<div class="row">
<label for="new-space">New space:</label>
<div class="value new-space-value">
<input id="new-space-key" name="new-space-key" type="hidden" value="dubbo">
<span class="space-input">
<input id="new-space" name="new-space" value="Dubbo" disabled="disabled">
</span>
<span class="description warning">You cannot move this page to another space because you do not have permission to remove it from this space.</span>
<div class="new-space-dropdown aui-dd-parent autocomplete"></div>
</div>
</div>
<div class="row">
<label for="new-parent-page">New parent page:</label>
<div class="value new-parent-page-value">
<span class="page-input">
<input id="new-parent-page" name="new-parent-page" value="Home">
</span>
<span class="description">Start typing a page title to see a list of suggestions.</span>
<div class="new-parent-page-dropdown aui-dd-parent autocomplete"></div>
</div>
</div>
</fieldset>
</div>
<div class="location-info">
<div class="row">
<label>Current location:</label>
<div class="value breadcrumbs-container">
<div class="breadcrumbs-line">
<ul id="current-parent-breadcrumbs" class="breadcrumbs">
</ul>
</div>
</div>
</div>
<div class="row">
<label>New location:</label>
<div class="value breadcrumbs-container">
<div class="breadcrumbs-line">
<ul id="new-parent-breadcrumbs" class="breadcrumbs">
</ul>
</div>
</div>
</div>
</div>
</script>
<script type="text/x-template" title="movePageErrors">
<div id="move-errors" class="hidden warning"></div>
</script>
<script type="text/x-template" title="movePageBreadcrumb">
<li><a class="{2}" title="{3}" tabindex="-1"><span>{0}</span></a></li>
</script>
<script type="text/x-template" title="movePageBreadcrumbLoading">
<li class="loading"><span>Loading breadcrumbs&hellip;</span></li>
</script>
<script type="text/x-template" title="movePageBreadcrumbError">
<li class="warning last"><span>Error retrieving breadcrumbs.</span></li>
</script>
<script type="text/x-template" title="movePageNoMatchingPages">
<ol><li><span class="warning">No matching pages found.</span></li></ol>
</script>
<script type="text/x-template" title="movePageNoMatchingSpaces">
<ol><li><span class="warning">No matching spaces found.</span></li></ol>
</script>
<script type="text/x-template" title="movePageSearchPanel">
<div class="row information">
<div class="inner">
<div class="element">
Search for and select the new parent page for this page and its children.
</div>
</div>
</div>
<div id="move-page-search-container" class="row">
<div class="search-form">
<fieldset>
<legend class="assistive"><span>Search for a New Parent Page</span></legend>
<label for="move-page-search-query" class="assistive">Search keywords</label>
<input class="search-query" id="move-page-search-query">
<label for="move-page-search-space" class="assistive">Search in space</label>
<select id="move-page-search-space" class="search-space" disabled="disabled">
<option value="dubbo" selected="selected">Dubbo</option>
</select>
<input type="button" value="Search">
<div class="description warning">You cannot move this page to another space because you do not have permission to remove it from this space.</div>
</fieldset>
</div>
<div class="search-results">
</div>
</div>
</script>
<script type="text/x-template" title="movePageSearchResultsLoading">
<div class="searching">Searching…</div>
</script>
<script type="text/x-template" title="movePageHistoryPanel">
<div class="row information">
<div class="inner">
<div class="element">
Select the new parent page for this page and its children from your history.
</div>
</div>
</div>
<div id="move-page-search-container" class="row">
<div class="search-results">
</div>
</div>
</script>
<script type="text/x-template" title="movePageHistoryLoading">
<div class="searching">Loading…</div>
</script>
<script type="text/x-template" title="movePageBrowsePanel">
<div class="row information">
<div class="inner">
<div class="element">
Click to select the new parent page for this page and its children.
</div>
</div>
</div>
<div class="tree"></div>
</script>
<script type="text/x-template" title="movePagePanelLoading">
<span>Loading…</span>
</script>
<script type="text/x-template" title="movePageBrowsePanelSpace">
<ul><li id='tree-root-node-item' class='root-node-list-item'><a class='root-node' href='#'>{0}</a></li></ul>
</script>
<script type="text/x-template" title="orderingPagePanel">
<div id="orderingPlaceHolder"></div>
</script>
<script type="text/x-template" title="reorderCheckbox">
<span id="reorderRequirement"><input id="reorderCheck" type="checkbox" name="reorderFlag" title="Choose the position of this page within the list of child pages."/><label for="reorderCheck" title="Choose the position of this page within the list of child pages.">Reorder</label></span>
</script>
<script type="text/x-template" title="move-help-link">
<div class="dialog-help-link">
<a href="http://docs.atlassian.com/confluence/docs-35/Moving+a+Page" target="_blank">Help</a>
</div>
</script>
<script type="text/x-template" title="searchResultsGrid">
<table>
<thead>
<tr class="header">
<th class="search-result-title">Page Title</th>
<th class="search-result-space">Space</th>
<th class="search-result-date">Updated</th>
</tr>
</thead>
</table>
</script>
<script type="text/x-template" title="searchResultsGridCount">
<p class="search-result-count">{0}</p>
</script>
<script type="text/x-template" title="searchResultsGridRow">
<tr class="search-result">
<th class="search-result-title"><a href="{1}" class="content-type-{2}"><span>{0}</span></a></th>
<td class="search-result-space"><a class="space" href="http://10.20.160.198/wiki/display/{4}/" title="{3}">{3}</a></td>
<td class="search-result-date"><span class="date" title="{6}">{5}</span></td>
</tr>
</script>
<!-- Start restrictions section -->
<script type="text/x-template" title="page-permissions-div">
<div id="page-permissions-div">
<div id="page-permissions-editor-form">
<div id="page-permissions-error-div" class="hidden">
<a href="#" id="permissions-error-div-close">Ok</a>
<div></div>
</div>
<div id="page-permissions-type-radios" class="page-permissions-label-rows">
<div>
<input id="restrictViewRadio" type="radio" checked="checked" name="pagePermissionTypeRadio" value="view"/>
<label for="restrictViewRadio">Restrict viewing of this page</label>
<input id="restrictEditRadio" type="radio" name="pagePermissionTypeRadio" value="edit"/>
<label for="restrictEditRadio">Restrict editing of this page</label>
</div>
</div>
<div id="page-permissions-input" class="page-permissions-label-rows">
<div class="page-permissions-label">To:</div>
<div id="page-permissions-chooser-box">
<span id="page-permissions-choose-user" class="ajs-button">
<a href="#" id='userpicker-popup-link-image' onClick="var picker = window.open('http://10.20.160.198/wiki/spaces/openuserpicker.action?key=dubbo&startIndex=0&onPopupSubmit=AJS.PagePermissions.addUserPermissions', 'EntitiesPicker', 'status=yes,resizable=yes,top=100,left=200,width=700,height=680,scrollbars=yes'); picker.focus(); return false;"><img src="user_16.gif"/*tpa=http://10.20.160.198/wiki/s/en/2166/34/_/images/icons/user_16.gif*/ height=16 width=16 border=0 align="absmiddle" title="Choose users" /></a>
<a href="#" id='userpicker-popup-link-text' onClick="var picker = window.open('http://10.20.160.198/wiki/spaces/openuserpicker.action?key=dubbo&startIndex=0&onPopupSubmit=AJS.PagePermissions.addUserPermissions', 'EntitiesPicker', 'status=yes,resizable=yes,top=100,left=200,width=700,height=680,scrollbars=yes'); picker.focus(); return false;">Person...</a>
</span>
<span id="page-permissions-choose-group" class="ajs-button">
<a href="#" id='grouppicker-popup-link-image' onClick="var picker = window.open('http://10.20.160.198/wiki/spaces/opengrouppicker.action?key=dubbo&startIndex=0&actionName=dosearchgroups.action&onPopupSubmit=AJS.PagePermissions.addGroupPermissions', 'EntitiesPicker', 'status=yes,resizable=yes,top=100,left=200,width=580,height=550,scrollbars=yes'); picker.focus(); return false;"><img src="group_16.gif"/*tpa=http://10.20.160.198/wiki/s/en/2166/34/_/images/icons/group_16.gif*/ height=16 width=16 border=0 align="absmiddle" title="Choose groups" /></a>
<a href="#" id='grouppicker-popup-link-text' onClick="var picker = window.open('http://10.20.160.198/wiki/spaces/opengrouppicker.action?key=dubbo&startIndex=0&actionName=dosearchgroups.action&onPopupSubmit=AJS.PagePermissions.addGroupPermissions', 'EntitiesPicker', 'status=yes,resizable=yes,top=100,left=200,width=580,height=550,scrollbars=yes'); picker.focus(); return false;">Group...</a>
</span>
</div>
<div id="page-permissions-input-box">
<span>
<input type="text" id="page-permissions-names-input" class="input-placeholder" value="Enter user or group name" name="permissionNames" size="30" autocomplete="off"/>
</span>
<input
type="hidden"
id="page-permissions-names-hidden" /> <img height="16px" width="1px" src="spacer.gif"/*tpa=http://10.20.160.198/wiki/s/en/2166/34/_/images/border/spacer.gif*//>
<input type="button" id="add-typed-names" value="Restrict">
</div>
</div>
</div>
<div id="page-permissions-tables">
<div id="page-permissions-table-div">
<table id="page-permissions-table" class="page-permissions-table">
<tr id="page-permissions-no-views" class="marker-row">
<td colspan="3" class="page-permissions-marker-cell"><span>No view restrictions are defined for this page</span></td>
</tr>
<tr id="page-permissions-no-edits" class="marker-row">
<td colspan="3" class="page-permissions-marker-cell"><span>No edit restrictions are defined for this page</span></td>
</tr>
</table>
</div>
<div id="page-inherited-permissions-table-div" class="hidden">
<span id="page-inherited-permissions-table-desc">
<a class="icon twisty-closed">Show/Hide</a>
<a id="toggle-inherited-permissions" title="Click to see inherited restrictions">This page has restricted parent pages. It can only be seen by users who can see those parent pages.</a>
</span>
<div id="page-inherited-permissions-tables" class="hidden page-inheritance-togglable"></div>
</div>
</div>
</div>
</script>
<script type="text/x-template" title="permissions-row-template">
<tr class="permission-row">
<td class="page-permissions-marker-cell" width="20%">
<span>Viewing restricted to:</span>
</td>
<td class="permission-entity" nowrap="true" width="40%">
<span class="entity-container">
<img class="permission-entity-picture"/>
<span class="permission-entity-display-name"></span>
<span class="permission-entity-name-wrap">&nbsp;(<span class="permission-entity-name"></span>)</span>
</span>
</td>
<td class="permission-detail-column">
<div class="permission-remove-div">
<a href="#" class="remove-permission-link">Remove restriction</a>
</div>
</td>
</tr>
</script>
<script type="text/x-template" title="permissions-username-no-suggestion-template">
<ol>
<li><a href="#" class="message"><span>No matches</span></a></li>
</ol>
</script>
<script type="text/x-template" title="page-inherited-permissions-table-div-template">
<div class="page-inherited-permissions-owner-div">
<div class="page-inherited-permissions-table-desc">Viewing restrictions apply to “<a></a>”. In order to see “<span></span>”, a user must be in the following list of users and groups:</div>
<table class="page-permissions-table"></table>
</div>
</script>
<script type="text/x-template" title="page-restrictions-help-link">
<div class="dialog-help-link">
<a href="http://docs.atlassian.com/confluence/docs-35/Page+Restrictions" target="_blank">Help</a>
</div>
</script>
<!-- End restrictions section -->
<fieldset class="hidden parameters">
<input type="hidden" title="spaceKeyEncoded" value="dubbo">
<input type="hidden" title="spaceKeyDecoded" value="dubbo">
</fieldset>
<a href="#page-metadata-end" class="assistive">Skip to end of metadata</a>
<div id="page-metadata-start" class="assistive"></div>
<div class="page-metadata">
<ul>
<li class="page-metadata-item noprint">
<a id="content-metadata-page-restrictions" href="#" class="page-metadata-icon page-restrictions hidden" title="Page restrictions apply. Click the lock icon to view or edit the restriction.">
<span>Page restrictions apply</span></a> </li>
<li class="page-metadata-modification-info" style="display: none">
Added by <a href="javascript:if(confirm(%27http://10.20.160.198/wiki/display/~william.liangf \n\nThis file was not retrieved by Teleport Ultra, because it is addressed on a domain or path outside the boundaries set for its Starting Address. \n\nDo you want to open it from the server?%27))window.location=%27http://10.20.160.198/wiki/display/~william.liangf%27" tppabs="http://10.20.160.198/wiki/display/~william.liangf"
class="url fn confluence-userlink" data-username="william.liangf"
>梁 飞</a>, last edited by <a href="javascript:if(confirm(%27http://10.20.160.198/wiki/display/~william.liangf \n\nThis file was not retrieved by Teleport Ultra, because it is addressed on a domain or path outside the boundaries set for its Starting Address. \n\nDo you want to open it from the server?%27))window.location=%27http://10.20.160.198/wiki/display/~william.liangf%27" tppabs="http://10.20.160.198/wiki/display/~william.liangf"
class="url fn confluence-userlink" data-username="william.liangf"
>梁 飞</a> on 一月 23, 2013
<span class="noprint">&nbsp;(<a id="view-change-link" href="javascript:if(confirm(%27http://10.20.160.198/wiki/pages/diffpages.action?pageId=6324288&originalId=8356071 \n\nThis file was not retrieved by Teleport Ultra, because it is addressed on a domain or path outside the boundaries set for its Starting Address. \n\nDo you want to open it from the server?%27))window.location=%27http://10.20.160.198/wiki/pages/diffpages.action?pageId=6324288&originalId=8356071%27" tppabs="http://10.20.160.198/wiki/pages/diffpages.action?pageId=6324288&originalId=8356071">view change</a>)</span>
</li>
</ul>
<div id="version-comment" class="noteMacro" style="display: none;">
<strong>Comment:</strong>
<br />
</div>
</div>
<a href="#page-metadata-start" class="assistive">Go to start of metadata</a>
<div id="page-metadata-end" class="assistive"></div>
<fieldset class="hidden parameters">
<input type="hidden" title="browsePageTreeMode" value="view">
<input type="hidden" title="parentPageId" value="6324242">
</fieldset>
<div class="wiki-content">
<!-- wiki content -->
<table class="sectionMacro" border="0" cellpadding="5" cellspacing="0" width="100%"><tbody><tr><td class="confluenceTd" valign="top"><p><br class="atl-forced-newline" /></p>
<p><a href="Home.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/Home" title="Home"><b>Home</b></a> &nbsp;&#124;&#124;&nbsp; <a href="Download.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/Download" title="Download"><b>Download</b></a> &nbsp;&#124;&#124;&nbsp; <a href="User+Guide.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/User+Guide" title="User Guide"><b>User Guide</b></a> &nbsp;&#124;&#124;&nbsp; <a href="Developer+Guide.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/Developer+Guide" title="Developer Guide"><b>Developer Guide</b></a> &nbsp;&#124;&#124;&nbsp; <a href="Administrator+Guide.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/Administrator+Guide" title="Administrator Guide"><b>Administrator Guide</b></a> &nbsp;&#124;&#124;&nbsp; <a href="Training.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/Training" title="Training"><b>Training</b></a> &nbsp;&#124;&#124;&nbsp; <a href="FAQ.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/FAQ" title="FAQ"><b>FAQ</b></a> &nbsp;&#124;&#124;&nbsp; <a href="Release+Notes.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/Release+Notes" title="Release Notes"><b>Release Notes</b></a> &nbsp;&#124;&#124;&nbsp; <a href="Roadmap.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/Roadmap" title="Roadmap"><b>Roadmap</b></a> &nbsp;&#124;&#124;&nbsp; <a href="Community.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/Community" title="Community"><b>Community</b></a></p></td><td class="confluenceTd" valign="top">
<p>English | <a href="User+Guide-zh.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/User+Guide-zh" title="User Guide-zh"><b>中文</b></a></p></td></tr></tbody></table>
<h1><a name="UserGuide-UserGuide"></a>User Guide</h1>
<div>
<ul>
<li><a href='#UserGuide-GettingStarted'>Getting Started</a></li>
<ul>
<li><a href='#UserGuide-Background'>Background</a></li>
<li><a href='#UserGuide-Requirement'>Requirement</a></li>
<li><a href='#UserGuide-Architecture'>Architecture</a></li>
<li><a href='#UserGuide-Usage'>Usage</a></li>
</ul>
<li><a href='#UserGuide-QuickStart'>Quick Start</a></li>
<ul>
<li><a href='#UserGuide-ServiceProvider'>Service Provider</a></li>
<li><a href='#UserGuide-ServiceConsumer'>Service Consumer</a></li>
</ul>
<li><a href='#UserGuide-Dependencies'>Dependencies</a></li>
<ul>
<li><a href='#UserGuide-RequiredDependencies'>Required Dependencies</a></li>
<li><a href='#UserGuide-DefaultDependencies'>Default Dependencies</a></li>
<li><a href='#UserGuide-OptionalDependencies'>Optional Dependencies</a></li>
</ul>
<li><a href='#UserGuide-Maturity'>Maturity</a></li>
<ul>
<li><a href='#UserGuide-FeatureMaturity'>Feature Maturity</a></li>
<li><a href='#UserGuide-StrategyMaturity'>Strategy Maturity</a></li>
</ul>
<li><a href='#UserGuide-Configs'>Configs</a></li>
<ul>
<li><a href='#UserGuide-XmlConfig'>Xml Config</a></li>
<li><a href='#UserGuide-PropertiesConfig'>Properties Config</a></li>
<li><a href='#UserGuide-AnnotationConfig'>Annotation Config</a></li>
<li><a href='#UserGuide-APIConfig'>API Config</a></li>
</ul>
<li><a href='#UserGuide-Examples'>Examples</a></li>
<ul>
<li><a href='#UserGuide-CheckOnStartup'>Check On Startup</a></li>
<li><a href='#UserGuide-FaultTolerance'>Fault Tolerance</a></li>
<li><a href='#UserGuide-LoadBalance'>Load Balance</a></li>
<li><a href='#UserGuide-ThreadModel'>Thread Model</a></li>
<li><a href='#UserGuide-DirectlyProvider'>Directly Provider</a></li>
<li><a href='#UserGuide-SubscribeOnly'>Subscribe Only</a></li>
<li><a href='#UserGuide-RegisterOnly'>Register Only</a></li>
<li><a href='#UserGuide-StaticProvider'>Static Provider</a></li>
<li><a href='#UserGuide-MultiProtocol'>Multi Protocol</a></li>
<li><a href='#UserGuide-MultiRegistry'>Multi Registry</a></li>
<li><a href='#UserGuide-MultiGroup'>Multi Group</a></li>
<li><a href='#UserGuide-MultiVersion'>Multi Version</a></li>
<li><a href='#UserGuide-MergeByGroup'>Merge By Group</a></li>
<li><a href='#UserGuide-ParameterValidation'>Parameter Validation</a></li>
<li><a href='#UserGuide-ResultCache'>Result Cache</a></li>
<li><a href='#UserGuide-GenericReference'>Generic Reference</a></li>
<li><a href='#UserGuide-GenericImplementation'>Generic Implementation</a></li>
<li><a href='#UserGuide-EchoTest'>Echo Test</a></li>
<li><a href='#UserGuide-RpcContext'>Rpc Context</a></li>
<li><a href='#UserGuide-AttachmentParameter'>Attachment Parameter</a></li>
<li><a href='#UserGuide-AsyncCall'>Async Call</a></li>
<li><a href='#UserGuide-LocalCall'>Local Call</a></li>
<li><a href='#UserGuide-ParameterCallback'>Parameter Callback</a></li>
<li><a href='#UserGuide-EventNotify'>Event Notify</a></li>
<li><a href='#UserGuide-StubProxy'>Stub Proxy</a></li>
<li><a href='#UserGuide-MockProxy'>Mock Proxy</a></li>
<li><a href='#UserGuide-DelayExport'>Delay Export</a></li>
<li><a href='#UserGuide-ConcurrentControl'>Concurrent Control</a></li>
<li><a href='#UserGuide-ConnectionControl'>Connection Control</a></li>
<li><a href='#UserGuide-LazyConnection'>Lazy Connection</a></li>
<li><a href='#UserGuide-StickyConnection'>Sticky Connection</a></li>
<li><a href='#UserGuide-TokenVerify'>Token Verify</a></li>
<li><a href='#UserGuide-RouterRule'>Router Rule</a></li>
<li><a href='#UserGuide-ConfiguratorRule'>Configurator Rule</a></li>
<li><a href='#UserGuide-ServiceDegradation'>Service Degradation</a></li>
<li><a href='#UserGuide-GracefulShutdown'>Graceful Shutdown</a></li>
<li><a href='#UserGuide-HostBinding'>Host Binding</a></li>
<li><a href='#UserGuide-LoggerAdpater'>Logger Adpater</a></li>
<li><a href='#UserGuide-AccessLog'>Access Log</a></li>
<li><a href='#UserGuide-ServiceContainer'>Service Container</a></li>
<li><a href='#UserGuide-ReferenceConfigCache'>Reference Config Cache</a></li>
<li><a href='#UserGuide-DistributedTransaction'>Distributed Transaction</a></li>
</ul>
<li><a href='#UserGuide-APIReference'>API Reference</a></li>
<ul>
<li><a href='#UserGuide-ConfigAPI'>Config API</a></li>
<li><a href='#UserGuide-AnnotationAPI'>Annotation API</a></li>
<li><a href='#UserGuide-ModelAPI'>Model API</a></li>
<li><a href='#UserGuide-ContextAPI'>Context API</a></li>
<li><a href='#UserGuide-ServiceAPI'>Service API</a></li>
</ul>
<li><a href='#UserGuide-ConfigurationReference'>Configuration Reference</a></li>
<ul>
<li><a href='#UserGuide-%3Cdubbo%3Aservice%2F%3E'>&lt;dubbo:service/&gt;</a></li>
<li><a href='#UserGuide-%3Cdubbo%3Areference%2F%3E'>&lt;dubbo:reference/&gt;</a></li>
<li><a href='#UserGuide-%3Cdubbo%3Aprotocol%2F%3E'>&lt;dubbo:protocol/&gt;</a></li>
<li><a href='#UserGuide-%3Cdubbo%3Aregistry%2F%3E'>&lt;dubbo:registry/&gt;</a></li>
<li><a href='#UserGuide-%3Cdubbo%3Amonitor%2F%3E'>&lt;dubbo:monitor/&gt;</a></li>
<li><a href='#UserGuide-%3Cdubbo%3Aapplication%2F%3E'>&lt;dubbo:application/&gt;</a></li>
<li><a href='#UserGuide-%3Cdubbo%3Amodule%2F%3E'>&lt;dubbo:module/&gt;</a></li>
<li><a href='#UserGuide-%3Cdubbo%3Aprovider%2F%3E'>&lt;dubbo:provider/&gt;</a></li>
<li><a href='#UserGuide-%3Cdubbo%3Aconsumer%2F%3E'>&lt;dubbo:consumer/&gt;</a></li>
<li><a href='#UserGuide-%3Cdubbo%3Amethod%2F%3E'>&lt;dubbo:method/&gt;</a></li>
<li><a href='#UserGuide-%3Cdubbo%3Aargument%2F%3E'>&lt;dubbo:argument/&gt;</a></li>
<li><a href='#UserGuide-%3Cdubbo%3Aparameter%2F%3E'>&lt;dubbo:parameter/&gt;</a></li>
</ul>
<li><a href='#UserGuide-ProtocolReference'>Protocol Reference</a></li>
<ul>
<li><a href='#UserGuide-dubbo%3A%2F%2F'>dubbo://</a></li>
<li><a href='#UserGuide-rmi%3A%2F%2F'>rmi://</a></li>
<li><a href='#UserGuide-hessian%3A%2F%2F'>hessian://</a></li>
<li><a href='#UserGuide-http%3A%2F%2F'>http://</a></li>
<li><a href='#UserGuide-webservice%3A%2F%2F'>webservice://</a></li>
<li><a href='#UserGuide-thrift%3A%2F%2F'>thrift://</a></li>
<li><a href='#UserGuide-memcached%3A%2F%2F'>memcached://</a></li>
<li><a href='#UserGuide-redis%3A%2F%2F'>redis://</a></li>
</ul>
<li><a href='#UserGuide-RegistryReference'>Registry Reference</a></li>
<ul>
<li><a href='#UserGuide-MulticastRegistry'>Multicast Registry</a></li>
<li><a href='#UserGuide-ZookeeperRegistry'>Zookeeper Registry</a></li>
<li><a href='#UserGuide-RedisRegistry'>Redis Registry</a></li>
<li><a href='#UserGuide-SimpleRegistry'>Simple Registry</a></li>
<li><a href='#UserGuide-SimpleMonitor'>Simple Monitor</a></li>
</ul>
<li><a href='#UserGuide-TelnetCommandReference'>Telnet Command Reference</a></li>
<ul>
<li><a href='#UserGuide-ls'>ls</a></li>
<li><a href='#UserGuide-ps'>ps</a></li>
<li><a href='#UserGuide-cd'>cd</a></li>
<li><a href='#UserGuide-pwd'>pwd</a></li>
<li><a href='#UserGuide-trace'>trace</a></li>
<li><a href='#UserGuide-count'>count</a></li>
<li><a href='#UserGuide-invoke'>invoke</a></li>
<li><a href='#UserGuide-status'>status</a></li>
<li><a href='#UserGuide-log'>log</a></li>
<li><a href='#UserGuide-help'>help</a></li>
<li><a href='#UserGuide-clear'>clear</a></li>
<li><a href='#UserGuide-exit'>exit</a></li>
</ul>
<li><a href='#UserGuide-MavenPluginReference'>Maven Plugin Reference</a></li>
<ul>
<li><a href='#UserGuide-mvndubbo%3Aregistry'>mvn dubbo:registry</a></li>
<li><a href='#UserGuide-mvndubbo%3Acreate'>mvn dubbo:create</a></li>
</ul>
<li><a href='#UserGuide-ServiceBestPractices'>Service Best Practices</a></li>
<ul>
<li><a href='#UserGuide-Package'>Package</a></li>
<li><a href='#UserGuide-Interface'>Interface</a></li>
<li><a href='#UserGuide-Version'>Version</a></li>
<li><a href='#UserGuide-Compatibility'>Compatibility</a></li>
<li><a href='#UserGuide-Enum'>Enum</a></li>
<li><a href='#UserGuide-Serialization'>Serialization</a></li>
<li><a href='#UserGuide-Exception'>Exception</a></li>
<li><a href='#UserGuide-Invocation'>Invocation</a></li>
</ul>
<li><a href='#UserGuide-RecommendedUsage'>Recommended Usage</a></li>
<li><a href='#UserGuide-CapacityEstimated'>Capacity Estimated</a></li>
<li><a href='#UserGuide-BenchmarkTestToolkit'>Benchmark Test Toolkit</a></li>
<li><a href='#UserGuide-PerformanceTestReport'>Performance Test Report</a></li>
<ul>
<li><a href='#UserGuide-Scene'>Scene</a></li>
<li><a href='#UserGuide-Environment'>Environment</a></li>
<li><a href='#UserGuide-Purpose'>Purpose</a></li>
<li><a href='#UserGuide-Script'>Script</a></li>
<li><a href='#UserGuide-Result'>Result</a></li>
<li><a href='#UserGuide-Analysis'>Analysis</a></li>
</ul>
<li>Code Coverage Report</li>
</ul></div>
<h2><a name="UserGuide-GettingStarted"></a>Getting Started</h2>
<p>(<a href="Getting+Started.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/Getting+Started" title="Getting Started">+</a>) (<a href="#UserGuide-GettingStarted">#</a>)</p>
<h3><a name="UserGuide-Background"></a>Background</h3>
<p>(<a href="#UserGuide-Background">#</a>)</p>
<p>随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,亟需一个治理系统确保架构有条不紊的演进。</p>
<p><span class="image-wrap" style=""><img src="dubbo-architecture-roadmap.jpg-version=1&modificationDate=1331143666000.jpg" tppabs="http://10.20.160.198/wiki/download/attachments/6947616/dubbo-architecture-roadmap.jpg?version=1&modificationDate=1331143666000" style="border: 0px solid black" /></span></p>
<ul>
<li><b>单一应用架构</b>
<ul>
<li>当网站流量很小时,只需一个应用,将所有功能都部署在一起,以减少部署节点和成本。</li>
<li>此时,用于简化增删改查工作量的 <b>数据访问框架(ORM)</b> 是关键。</li>
</ul>
</li>
<li><b>垂直应用架构</b>
<ul>
<li>当访问量逐渐增大,单一应用增加机器带来的加速度越来越小,将应用拆成互不相干的几个应用,以提升效率。</li>
<li>此时,用于加速前端页面开发的 <b>Web框架(MVC)</b> 是关键。</li>
</ul>
</li>
<li><b>分布式服务架构</b>
<ul>
<li>当垂直应用越来越多,应用之间交互不可避免,将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心,使前端应用能更快速的响应多变的市场需求。</li>
<li>此时,用于提高业务复用及整合的 <b>分布式服务框架(RPC)</b> 是关键。</li>
</ul>
</li>
<li><b>流动计算架构</b>
<ul>
<li>当服务越来越多,容量的评估,小服务资源的浪费等问题逐渐显现,此时需增加一个调度中心基于访问压力实时管理集群容量,提高集群利用率。</li>
<li>此时,用于提高机器利用率的 <b>资源调度和治理中心(SOA)</b> 是关键。</li>
</ul>
</li>
</ul>
<h3><a name="UserGuide-Requirement"></a>Requirement</h3>
<p>(<a href="#UserGuide-Requirement">#</a>)</p>
<p><span class="image-wrap" style=""><img src="dubbo-service-governance.jpg-version=1&modificationDate=1331887614000.jpg" tppabs="http://10.20.160.198/wiki/download/attachments/6947616/dubbo-service-governance.jpg?version=1&modificationDate=1331887614000" style="border: 0px solid black" /></span></p>
<p>在大规模服务化之前,应用可能只是通过RMI或Hessian等工具,简单的暴露和引用远程服务,通过配置服务的URL地址进行调用,通过F5等硬件进行负载均衡。</p>
<p><b>(1) 当服务越来越多时,服务URL配置管理变得非常困难,F5硬件负载均衡器的单点压力也越来越大。</b></p>
<p>此时需要一个服务注册中心,动态的注册和发现服务,使服务的位置透明。</p>
<p>并通过在消费方获取服务提供方地址列表,实现软负载均衡和Failover,降低对F5硬件负载均衡器的依赖,也能减少部分成本。</p>
<p><b>(2) 当进一步发展,服务间依赖关系变得错踪复杂,甚至分不清哪个应用要在哪个应用之前启动,架构师都不能完整的描述应用的架构关系。</b></p>
<p>这时,需要自动画出应用间的依赖关系图,以帮助架构师理清理关系。</p>
<p><b>(3) 接着,服务的调用量越来越大,服务的容量问题就暴露出来,这个服务需要多少机器支撑?什么时候该加机器?</b></p>
<p>为了解决这些问题,第一步,要将服务现在每天的调用量,响应时间,都统计出来,作为容量规划的参考指标。</p>
<p>其次,要可以动态调整权重,在线上,将某台机器的权重一直加大,并在加大的过程中记录响应时间的变化,直到响应时间到达阀值,记录此时的访问量,再以此访问量乘以机器数反推总容量。</p>
<p>以上是Dubbo最基本的几个需求,更多服务治理问题参见:</p>
<p><a href="javascript:if(confirm(%27http://code.alibabatech.com/blog/experience_1402/service-governance-process.html \n\nThis file was not retrieved by Teleport Ultra, because it is addressed on a domain or path outside the boundaries set for its Starting Address. \n\nDo you want to open it from the server?%27))window.location=%27http://code.alibabatech.com/blog/experience_1402/service-governance-process.html%27" tppabs="http://code.alibabatech.com/blog/experience_1402/service-governance-process.html" class="external-link" rel="nofollow">http://code.alibabatech.com/blog/experience_1402/service-governance-process.html</a></p>
<h3><a name="UserGuide-Architecture"></a>Architecture</h3>
<p>(<a href="#UserGuide-Architecture">#</a>)</p>
<p><span class="image-wrap" style=""><img src="dubbo-architecture.jpg-version=1&modificationDate=1330892870000.jpg" tppabs="http://10.20.160.198/wiki/download/attachments/6947616/dubbo-architecture.jpg?version=1&modificationDate=1330892870000" style="border: 0px solid black" /></span></p>
<p><b>节点角色说明:</b></p>
<ul>
<li><b>Provider:</b> 暴露服务的服务提供方。</li>
<li><b>Consumer:</b> 调用远程服务的服务消费方。</li>
<li><b>Registry:</b> 服务注册与发现的注册中心。</li>
<li><b>Monitor:</b> 统计服务的调用次调和调用时间的监控中心。</li>
<li><b>Container:</b> 服务运行容器。</li>
</ul>
<p><b>调用关系说明:</b></p>
<ul>
<li>0. 服务容器负责启动,加载,运行服务提供者。</li>
<li>1. 服务提供者在启动时,向注册中心注册自己提供的服务。</li>
<li>2. 服务消费者在启动时,向注册中心订阅自己所需的服务。</li>
<li>3. 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。</li>
<li>4. 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。</li>
<li>5. 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。</li>
</ul>
<p><b>(1) 连通性:</b></p>
<ul>
<li>注册中心负责服务地址的注册与查找,相当于目录服务,服务提供者和消费者只在启动时与注册中心交互,注册中心不转发请求,压力较小</li>
<li>监控中心负责统计各服务调用次数,调用时间等,统计先在内存汇总后每分钟一次发送到监控中心服务器,并以报表展示</li>
<li>服务提供者向注册中心注册其提供的服务,并汇报调用时间到监控中心,此时间不包含网络开销</li>
<li>服务消费者向注册中心获取服务提供者地址列表,并根据负载算法直接调用提供者,同时汇报调用时间到监控中心,此时间包含网络开销</li>
<li>注册中心,服务提供者,服务消费者三者之间均为长连接,监控中心除外</li>
<li>注册中心通过长连接感知服务提供者的存在,服务提供者宕机,注册中心将立即推送事件通知消费者</li>
<li>注册中心和监控中心全部宕机,不影响已运行的提供者和消费者,消费者在本地缓存了提供者列表</li>
<li>注册中心和监控中心都是可选的,服务消费者可以直连服务提供者</li>
</ul>
<p><b>(2) 健状性:</b></p>
<ul>
<li>监控中心宕掉不影响使用,只是丢失部分采样数据</li>
<li>数据库宕掉后,注册中心仍能通过缓存提供服务列表查询,但不能注册新服务</li>
<li>注册中心对等集群,任意一台宕掉后,将自动切换到另一台</li>
<li>注册中心全部宕掉后,服务消费者通过本地缓存的服务提供者列表,与服务提供者通讯</li>
<li>服务提供者无状态,任意一台宕掉后,不影响使用</li>
<li>服务提供者全部宕掉后,服务消费者应用将无法使用,并无限次重连等待服务提供者恢复</li>
</ul>
<p><b>(3) 伸缩性:</b></p>
<ul>
<li>注册中心为对等集群,可动态增加机器部署实例,注册中心发送新注册中心集群列表到所有客户端(即自动发现新的注册中心)</li>
<li>服务提供者无状态,可动态增加机器部署实例,注册中心将推送新的服务提供者信息给消费者</li>
</ul>
<p><b>(4) 升级性:</b></p>
<ul>
<li>当服务集群规模进一步扩大,带动IT治理结构进一步升级,需要实现动态部署,进行流动计算,现有分布式服务架构不会带来阻力:</li>
</ul>
<p><span class="image-wrap" style=""><img src="dubbo-architecture-future.jpg-version=1&modificationDate=1329978098000.jpg" tppabs="http://10.20.160.198/wiki/download/attachments/6947616/dubbo-architecture-future.jpg?version=1&modificationDate=1329978098000" style="border: 0px solid black" /></span></p>
<ul>
<li><del><b>Deployer:</b> 自动部署服务的本地代理。</del></li>
<li><del><b>Repository:</b> 仓库用于存储服务应用发布包。</del></li>
<li><del><b>Scheduler:</b> 调度中心基于访问压力自动增减服务提供者。</del></li>
<li><del><b>Admin:</b> 统一管理控制台。</del></li>
</ul>
<h3><a name="UserGuide-Usage"></a>Usage</h3>
<p>(<a href="#UserGuide-Usage">#</a>)</p>
<h4><a name="UserGuide-%E6%9C%AC%E5%9C%B0%E6%9C%8D%E5%8A%A1%EF%BC%9A%28Spring%E9%85%8D%E7%BD%AE%29"></a>本地服务:(Spring配置)</h4>
<div class="code panel" style="border-width: 1px;"><div class="codeHeader panelHeader" style="border-bottom-width: 1px;"><b>local.xml</b></div><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;bean id=“xxxService class=“com.xxx.XxxServiceImpl /&gt;
&lt;bean id=“xxxAction class=“com.xxx.XxxAction”&gt;
&lt;property name=“xxxService ref=“xxxService /&gt;
&lt;/bean&gt;]]></script>
</div></div>
<h4><a name="UserGuide-%E8%BF%9C%E7%A8%8B%E6%9C%8D%E5%8A%A1%EF%BC%9A%28Spring%E9%85%8D%E7%BD%AE%29"></a>远程服务:(Spring配置)</h4>
<p>在本地服务的基础上,只需做简单配置,即可完成远程化:</p>
<ul>
<li>将上面的local.xml配置拆分成两份,将服务定义部分放在服务提供方remote-provider.xml,将服务引用部分放在服务消费方remote-consumer.xml。</li>
<li>并在提供方增加暴露服务配置&lt;dubbo:service&gt;,在消费方增加引用服务配置&lt;dubbo:reference&gt;。</li>
</ul>
<p>如下:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeHeader panelHeader" style="border-bottom-width: 1px;"><b>remote-provider.xml</b></div><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;bean id=“xxxService class=“com.xxx.XxxServiceImpl /&gt; &lt;!-- 和本地服务一样实现远程服务 --&gt;
&lt;dubbo:service interface=“com.xxx.XxxService ref=“xxxService /&gt; &lt;!-- 增加暴露远程服务配置 --&gt;]]></script>
</div></div>
<div class="code panel" style="border-width: 1px;"><div class="codeHeader panelHeader" style="border-bottom-width: 1px;"><b>remote-consumer.xml</b></div><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:reference id=“xxxService interface=“com.xxx.XxxService /&gt; &lt;!-- 增加引用远程服务配置 --&gt;
&lt;bean id=“xxxAction class=“com.xxx.XxxAction”&gt; &lt;!-- 和本地服务一样使用远程服务 --&gt;
&lt;property name=“xxxService ref=“xxxService /&gt;
&lt;/bean&gt;]]></script>
</div></div>
<h2><a name="UserGuide-QuickStart"></a>Quick Start</h2>
<p>(<a href="Quick+Start.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/Quick+Start" title="Quick Start">+</a>) (<a href="#UserGuide-QuickStart">#</a>)</p>
<div class='panelMacro'><table class='tipMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="check.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/check.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>Dubbo also support usage WITHOUT spring, 
but it's more painful and not recommended. Please refer to: <a href="User+Guide.htm#UserGuide-APIConfig" tppabs="http://10.20.160.198/wiki/display/dubbo/User+Guide#UserGuide-APIConfig">API Config</a> (<a href="API+Config.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/API+Config" title="API Config">+</a>)</td></tr></table></div>
<h3><a name="UserGuide-ServiceProvider"></a>Service Provider</h3>
<p>(<a href="#UserGuide-ServiceProvider">#</a>)</p>
<div class='panelMacro'><table class='tipMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="check.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/check.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>See: <a href="Administrator+Guide.htm#AdministratorGuide-DemoProviderInstallation" tppabs="http://10.20.160.198/wiki/display/dubbo/Administrator+Guide#AdministratorGuide-DemoProviderInstallation">Demo Provider Installation</a> (<a href="Demo+Provider+Installation.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/Demo+Provider+Installation" title="Demo Provider Installation">+</a>)</td></tr></table></div>
<p>Define the service interface:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeHeader panelHeader" style="border-bottom-width: 1px;"><b>DemoService.java</b></div><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: java; gutter: false"><![CDATA[package com.alibaba.dubbo.demo;
public interface DemoService {
String sayHello(String name);
}]]></script>
</div></div>
<p>Provide the service implementation</p>
<div class="code panel" style="border-width: 1px;"><div class="codeHeader panelHeader" style="border-bottom-width: 1px;"><b>DemoServiceImpl.java</b></div><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: java; gutter: false"><![CDATA[package com.alibaba.dubbo.demo.provider;
import com.alibaba.dubbo.demo.DemoService;
public class DemoServiceImpl implements DemoService {
public String sayHello(String name) {
return "Hello " + name;
}
}]]></script>
</div></div>
<p>Setup the spring configuration</p>
<div class="code panel" style="border-width: 1px;"><div class="codeHeader panelHeader" style="border-bottom-width: 1px;"><b>provider.xml</b></div><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"&gt;
&lt;!-- Application name --&gt;
&lt;dubbo:application name="hello-world-app" /&gt;
&lt;!-- registry address, used for service to register itself --&gt;
&lt;dubbo:registry address="multicast://224.5.6.7:1234" /&gt;
&lt;!-- expose this service through dubbo protocol, through port 20880 --&gt;
&lt;dubbo:protocol name="dubbo" port="20880" /&gt;
&lt;!-- which service interface do we expose? --&gt;
&lt;dubbo:service interface="com.alibaba.dubbo.demo.DemoService" ref="demoService" /&gt;
&lt;!-- designate implementation --&gt;
&lt;bean id="demoService" class="com.alibaba.dubbo.demo.provider.DemoServiceImpl" /&gt;
&lt;/beans&gt;]]></script>
</div></div>
<p>Kick it off with following java code</p>
<div class="code panel" style="border-width: 1px;"><div class="codeHeader panelHeader" style="border-bottom-width: 1px;"><b>Provider.java</b></div><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: java; gutter: false"><![CDATA[import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Provider {
public static void main(String[] args) throws Exception {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"http://10.20.160.198/wiki/display/dubbo/provider.xml"});
context.start();
System.out.println("Press any key to exit.");
System.in.read();
}
}]]></script>
</div></div>
<p>Congrats&#33; The DemoService now is exported by dubbo and waiting for incoming requests at port 20880.</p>
<h3><a name="UserGuide-ServiceConsumer"></a>Service Consumer</h3>
<p>(<a href="#UserGuide-ServiceConsumer">#</a>)</p>
<div class='panelMacro'><table class='tipMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="check.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/check.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>See: <a href="Administrator+Guide.htm#AdministratorGuide-DemoConsumerInstallation" tppabs="http://10.20.160.198/wiki/display/dubbo/Administrator+Guide#AdministratorGuide-DemoConsumerInstallation">Demo Consumer Installation</a> (<a href="Demo+Consumer+Installation.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/Demo+Consumer+Installation" title="Demo Consumer Installation">+</a>)</td></tr></table></div>
<p>Setup the spring XML</p>
<div class="code panel" style="border-width: 1px;"><div class="codeHeader panelHeader" style="border-bottom-width: 1px;"><b>consumer.xml</b></div><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"&gt;
&lt;!-- consumer application name --&gt;
&lt;dubbo:application name="consumer-of-helloworld-app" /&gt;
&lt;!-- registry address, used for consumer to discover services --&gt;
&lt;dubbo:registry address="multicast://224.5.6.7:1234" /&gt;
&lt;!-- which service to consume? --&gt;
&lt;dubbo:reference id="demoService" interface="com.alibaba.dubbo.demo.DemoService" /&gt;
&lt;/beans&gt;]]></script>
</div></div>
<p>Client side java code.</p>
<div class="code panel" style="border-width: 1px;"><div class="codeHeader panelHeader" style="border-bottom-width: 1px;"><b>Consumer.java</b></div><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: java; gutter: false"><![CDATA[import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.alibaba.dubbo.demo.DemoService;
public class Consumer {
public static void main(String[] args) throws Exception {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"http://10.20.160.198/wiki/display/dubbo/consumer.xml"});
context.start();
DemoService demoService = (DemoService)context.getBean("demoService"); // get service invocation proxy
String hello = demoService.sayHello("world"); // do invoke!
System.out.println( hello ); // cool, how are you~
}
}]]></script>
</div></div>
<h2><a name="UserGuide-Dependencies"></a>Dependencies</h2>
<p>(<a href="Dependencies.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/Dependencies" title="Dependencies">+</a>) (<a href="#UserGuide-Dependencies">#</a>)</p>
<h3><a name="UserGuide-RequiredDependencies"></a>Required Dependencies</h3>
<ul>
<li>JDK1.5+</li>
</ul>
<div class='panelMacro'><table class='tipMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="check.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/check.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>理论上Dubbo可以只依赖JDK,不依赖于任何三方库运行,只需配置使用JDK相关实现策略。</td></tr></table></div>
<h3><a name="UserGuide-DefaultDependencies"></a>Default Dependencies</h3>
<p>通过mvn dependency:tree &gt; dep.log命令分析,Dubbo缺省依赖以下三方库:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: text; gutter: false"><![CDATA[[INFO] +- com.alibaba:dubbo:jar:2.1.2:compile
[INFO] | +- log4j:log4j:jar:1.2.16:compile
[INFO] | +- org.javassist:javassist:jar:3.15.0-GA:compile
[INFO] | +- org.springframework:spring:jar:2.5.6.SEC03:compile
[INFO] | +- commons-logging:commons-logging:jar:1.1.1:compile
[INFO] | \- org.jboss.netty:netty:jar:3.2.5.Final:compile]]></script>
</div></div>
<p>这里所有依赖都是换照Dubbo缺省配置选的,这些缺省值是基于稳定性和性能考虑的。</p>
<ul>
<li>log4j.jar和commons-logging.jar日志输出包。
<ul>
<li>可以直接去掉,dubbo本身的日志会自动切换为JDK的java.util.logging输出。</li>
<li>但如果其它三方库比如spring.jar间接依赖commons-logging,则不能去掉。</li>
</ul>
</li>
<li>javassist.jar 字节码生成。
<ul>
<li>如果&lt;dubbo:provider proxy="jdk" /&gt;或&lt;dubbo:consumer proxy="jdk" /&gt;,以及&lt;dubbo:application compiler="jdk" /&gt;,则不需要。</li>
</ul>
</li>
<li>spring.jar 配置解析。
<ul>
<li>如果用ServiceConfig和ReferenceConfig的API调用,则不需要。</li>
</ul>
</li>
<li>netty.jar 网络传输。
<ul>
<li>如果&lt;dubbo:protocol server="mina"/&gt;或&lt;dubbo:protocol server="grizzly"/&gt;,则换成mina.jar或grizzly.jar。</li>
<li>如果&lt;protocol name="rmi"/&gt;,则不需要。</li>
</ul>
</li>
</ul>
<h3><a name="UserGuide-OptionalDependencies"></a>Optional Dependencies</h3>
<p>以下依赖,在主动配置使用相应实现策略时用到,需自行加入依赖。</p>
<ul>
<li>mina: 1.1.7</li>
<li>grizzly: 2.1.4</li>
<li>httpclient: 4.1.2</li>
<li>hessian_lite: 3.2.1-fixed</li>
<li>xstream: 1.4.1</li>
<li>fastjson: 1.1.8</li>
<li>zookeeper: 3.3.3</li>
<li>jedis: 2.0.0</li>
<li>xmemcached: 1.3.6</li>
<li>jfreechart: 1.0.13</li>
<li>hessian: 4.0.7</li>
<li>jetty: 6.1.26</li>
<li>hibernate-validator: 4.2.0.Final</li>
<li>zkclient: 0.1</li>
<li>curator: 1.1.10</li>
<li>cxf: 2.6.1</li>
<li>thrift: 0.8.0</li>
</ul>
<p>JEE:</p>
<ul>
<li>servlet: 2.5</li>
<li>bsf: 3.1</li>
<li>validation-api: 1.0.0.GA</li>
<li>jcache: 0.4</li>
</ul>
<h2><a name="UserGuide-Maturity"></a>Maturity</h2>
<p>(<a href="Maturity.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/Maturity" title="Maturity">+</a>) (<a href="#UserGuide-Maturity">#</a>)</p>
<h3><a name="UserGuide-FeatureMaturity"></a>Feature Maturity</h3>
<p>(<a href="#UserGuide-FeatureMaturity">#</a>)</p>
<div class='table-wrap'>
<table class='confluenceTable'><tbody>
<tr>
<th class='confluenceTh'> <font color="#000000">Feature</font> </th>
<th class='confluenceTh'> <font color="#000000">Maturity</font> </th>
<th class='confluenceTh'> <font color="#000000">Strength</font> </th>
<th class='confluenceTh'> <font color="#000000">Problem</font> </th>
<th class='confluenceTh'> <font color="#000000">Advise</font> </th>
<th class='confluenceTh'> <font color="#000000">User</font> </th>
</tr>
<tr>
<td class='confluenceTd'> <a href="#UserGuide-ConcurrentControl">Concurrent Control</a> </td>
<td class='confluenceTd'> Tested </td>
<td class='confluenceTd'> 并发控制 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> 试用 </td>
<td class='confluenceTd'>&nbsp;</td>
</tr>
<tr>
<td class='confluenceTd'> <a href="#UserGuide-ConnectionControl">Connection Control</a> </td>
<td class='confluenceTd'> Tested </td>
<td class='confluenceTd'> 连接数控制 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> 试用 </td>
<td class='confluenceTd'>&nbsp;</td>
</tr>
<tr>
<td class='confluenceTd'> <a href="#UserGuide-DirectlyProvider">Directly Provider</a> </td>
<td class='confluenceTd'> Tested </td>
<td class='confluenceTd'> 点对点直连服务提供方,用于测试 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> 测试环境使用 </td>
<td class='confluenceTd'> Alibaba </td>
</tr>
<tr>
<td class='confluenceTd'> <a href="#UserGuide-MergeByGroup">Merge By Group</a> </td>
<td class='confluenceTd'> Tested </td>
<td class='confluenceTd'> 分组合并返回值,用于菜单聚合等服务 </td>
<td class='confluenceTd'> 特殊场景使用 </td>
<td class='confluenceTd'> 可用于生产环境 </td>
<td class='confluenceTd'>&nbsp;</td>
</tr>
<tr>
<td class='confluenceTd'> <a href="#UserGuide-ParameterValidation">Parameter Validation</a> </td>
<td class='confluenceTd'> Tested </td>
<td class='confluenceTd'> 参数验证,JSR303验证框架集成 </td>
<td class='confluenceTd'> 对性能有影响 </td>
<td class='confluenceTd'> 试用 </td>
<td class='confluenceTd'> LaiWang </td>
</tr>
<tr>
<td class='confluenceTd'> <a href="#UserGuide-ResultCache">Result Cache</a> </td>
<td class='confluenceTd'> Tested </td>
<td class='confluenceTd'> 结果缓存,用于加速请求 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> 试用 </td>
<td class='confluenceTd'>&nbsp;</td>
</tr>
<tr>
<td class='confluenceTd'> <a href="#UserGuide-GenericReference">Generic Reference</a> </td>
<td class='confluenceTd'> Stable </td>
<td class='confluenceTd'> 泛化调用,无需业务接口类进行远程调用,用于测试平台,开放网关桥接等 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> 可用于生产环境 </td>
<td class='confluenceTd'> Alibaba </td>
</tr>
<tr>
<td class='confluenceTd'> <a href="#UserGuide-GenericImplementation">Generic Implementation</a> </td>
<td class='confluenceTd'> Stable </td>
<td class='confluenceTd'> 泛化实现,无需业务接口类实现任意接口,用于Mock平台 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> 可用于生产环境 </td>
<td class='confluenceTd'> Alibaba </td>
</tr>
<tr>
<td class='confluenceTd'> <a href="#UserGuide-EchoTest">Echo Test</a> </td>
<td class='confluenceTd'> Tested </td>
<td class='confluenceTd'> 回声测试 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> 试用 </td>
<td class='confluenceTd'>&nbsp;</td>
</tr>
<tr>
<td class='confluenceTd'> <a href="#UserGuide-AttachmentParameter">Attachment Parameter</a> </td>
<td class='confluenceTd'> Stable </td>
<td class='confluenceTd'> 附加参数 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> 可用于生产环境 </td>
<td class='confluenceTd'>&nbsp;</td>
</tr>
<tr>
<td class='confluenceTd'> <a href="#UserGuide-AsyncCall">Async Call</a> </td>
<td class='confluenceTd'> Tested </td>
<td class='confluenceTd'> 不可靠异步调用 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> 试用 </td>
<td class='confluenceTd'>&nbsp;</td>
</tr>
<tr>
<td class='confluenceTd'> <a href="#UserGuide-LocalCall">Local Call</a> </td>
<td class='confluenceTd'> Tested </td>
<td class='confluenceTd'> 本地调用 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> 试用 </td>
<td class='confluenceTd'>&nbsp;</td>
</tr>
<tr>
<td class='confluenceTd'> <a href="#UserGuide-ParameterCallback">Parameter Callback</a> </td>
<td class='confluenceTd'> Tested </td>
<td class='confluenceTd'> 参数回调 </td>
<td class='confluenceTd'> 特殊场景使用 </td>
<td class='confluenceTd'> 试用 </td>
<td class='confluenceTd'> Registry </td>
</tr>
<tr>
<td class='confluenceTd'> <a href="#UserGuide-EventNotify">Event Notify</a> </td>
<td class='confluenceTd'> Tested </td>
<td class='confluenceTd'> 事件通知,在远程调用执行前后触发 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> 试用 </td>
<td class='confluenceTd'>&nbsp;</td>
</tr>
<tr>
<td class='confluenceTd'> <a href="#UserGuide-StubProxy">Stub Proxy</a> </td>
<td class='confluenceTd'> Stable </td>
<td class='confluenceTd'> 在客户端执行部分逻辑 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> 可用于生产环境 </td>
<td class='confluenceTd'> Alibaba </td>
</tr>
<tr>
<td class='confluenceTd'> <a href="#UserGuide-MockProxy">Mock Proxy</a> </td>
<td class='confluenceTd'> Stable </td>
<td class='confluenceTd'> 伪造返回结果,可在失败时执行,或直接执行,用于服务降级 </td>
<td class='confluenceTd'> 需注册中心支持 </td>
<td class='confluenceTd'> 可用于生产环境 </td>
<td class='confluenceTd'> Alibaba </td>
</tr>
<tr>
<td class='confluenceTd'> <a href="#UserGuide-DelayExport">Delay Export</a> </td>
<td class='confluenceTd'> Stable </td>
<td class='confluenceTd'> 延迟暴露服务,用于等待应用加载warmup数据,或等待spring加载完成 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> 可用于生产环境 </td>
<td class='confluenceTd'> Alibaba </td>
</tr>
<tr>
<td class='confluenceTd'> <a href="#UserGuide-LazyConnection">Lazy Connection</a> </td>
<td class='confluenceTd'> Tested </td>
<td class='confluenceTd'> 延迟建立连接,调用时建立 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> 试用 </td>
<td class='confluenceTd'> Registry </td>
</tr>
<tr>
<td class='confluenceTd'> <a href="#UserGuide-StickyConnection">Sticky Connection</a> </td>
<td class='confluenceTd'> Tested </td>
<td class='confluenceTd'> 粘滞连接,总是向同一个提供方发起请求,除非此提供方挂掉,再切换到另一台 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> 试用 </td>
<td class='confluenceTd'> Registry </td>
</tr>
<tr>
<td class='confluenceTd'> <a href="#UserGuide-TokenVerify">Token Verify</a> </td>
<td class='confluenceTd'> Tested </td>
<td class='confluenceTd'> 令牌验证,用于服务授权 </td>
<td class='confluenceTd'> 需注册中心支持 </td>
<td class='confluenceTd'> 试用 </td>
<td class='confluenceTd'>&nbsp;</td>
</tr>
<tr>
<td class='confluenceTd'> <a href="#UserGuide-RouterRule">Router Rule</a> </td>
<td class='confluenceTd'> Tested </td>
<td class='confluenceTd'> 动态决定调用关系 </td>
<td class='confluenceTd'> 需注册中心支持 </td>
<td class='confluenceTd'> 试用 </td>
<td class='confluenceTd'>&nbsp;</td>
</tr>
<tr>
<td class='confluenceTd'> <a href="#UserGuide-ConfiguratorRule">Configurator Rule</a> </td>
<td class='confluenceTd'> Tested </td>
<td class='confluenceTd'> 动态下发配置,实现功能的开关 </td>
<td class='confluenceTd'> 需注册中心支持 </td>
<td class='confluenceTd'> 试用 </td>
<td class='confluenceTd'>&nbsp;</td>
</tr>
<tr>
<td class='confluenceTd'> <a href="#UserGuide-AccessLog">Access Log</a> </td>
<td class='confluenceTd'> Tested </td>
<td class='confluenceTd'> 访问日志,用于记录调用信息 </td>
<td class='confluenceTd'> 本地存储,影响性能,受磁盘大小限制 </td>
<td class='confluenceTd'> 试用 </td>
<td class='confluenceTd'>&nbsp;</td>
</tr>
<tr>
<td class='confluenceTd'> Distributed Transaction </td>
<td class='confluenceTd'> Research </td>
<td class='confluenceTd'> JTA/XA三阶段提交事务 </td>
<td class='confluenceTd'> 不稳定 </td>
<td class='confluenceTd'> 不可用 </td>
<td class='confluenceTd'>&nbsp;</td>
</tr>
</tbody></table>
</div>
<h3><a name="UserGuide-StrategyMaturity"></a>Strategy Maturity</h3>
<p>(<a href="#UserGuide-StrategyMaturity">#</a>)</p>
<div class='table-wrap'>
<table class='confluenceTable'><tbody>
<tr>
<th class='confluenceTh'> <font color="#000000">Feature</font> </th>
<th class='confluenceTh'> <font color="#000000">Maturity</font> </th>
<th class='confluenceTh'> <font color="#000000">Strength</font> </th>
<th class='confluenceTh'> <font color="#000000">Problem</font> </th>
<th class='confluenceTh'> <font color="#000000">Advise</font> </th>
<th class='confluenceTh'> <font color="#000000">User</font> </th>
</tr>
<tr>
<td class='confluenceTd'> <a href="#UserGuide-ZookeeperRegistry">Zookeeper Registry</a> </td>
<td class='confluenceTd'> Stable </td>
<td class='confluenceTd'> 支持基于网络的集群方式,有广泛周边开源产品,建议使用dubbo-2.3.3以上版本(推荐使用) </td>
<td class='confluenceTd'> 依赖于Zookeeper的稳定性 </td>
<td class='confluenceTd'> 可用于生产环境 </td>
<td class='confluenceTd'>&nbsp;</td>
</tr>
<tr>
<td class='confluenceTd'> <a href="#UserGuide-RedisRegistry">Redis Registry</a> </td>
<td class='confluenceTd'> Stable </td>
<td class='confluenceTd'> 支持基于客户端双写的集群方式,性能高 </td>
<td class='confluenceTd'> 要求服务器时间同步,用于检查心跳过期脏数据 </td>
<td class='confluenceTd'> 可用于生产环境 </td>
<td class='confluenceTd'>&nbsp;</td>
</tr>
<tr>
<td class='confluenceTd'> <a href="#UserGuide-MulticastRegistry">Multicast Registry</a> </td>
<td class='confluenceTd'> Tested </td>
<td class='confluenceTd'> 去中心化,不需要安装注册中心 </td>
<td class='confluenceTd'> 依赖于网络拓普和路由,跨机房有风险 </td>
<td class='confluenceTd'> 小规模应用或开发测试环境 </td>
<td class='confluenceTd'>&nbsp;</td>
</tr>
<tr>
<td class='confluenceTd'> <a href="#UserGuide-SimpleRegistry">Simple Registry</a> </td>
<td class='confluenceTd'> Tested </td>
<td class='confluenceTd'> Dogfooding,注册中心本身也是一个标准的RPC服务 </td>
<td class='confluenceTd'> 没有集群支持,可能单点故障 </td>
<td class='confluenceTd'> 试用 </td>
<td class='confluenceTd'>&nbsp;</td>
</tr>
<tr>
<th class='confluenceTh'> <font color="#000000">Feature</font> </th>
<th class='confluenceTh'> <font color="#000000">Maturity</font> </th>
<th class='confluenceTh'> <font color="#000000">Strength</font> </th>
<th class='confluenceTh'> <font color="#000000">Problem</font> </th>
<th class='confluenceTh'> <font color="#000000">Advise</font> </th>
<th class='confluenceTh'> <font color="#000000">User</font> </th>
</tr>
<tr>
<td class='confluenceTd'> <a href="#UserGuide-SimpleMonitor">Simple Monitor</a> </td>
<td class='confluenceTd'> Stable </td>
<td class='confluenceTd'> 支持JFreeChart统计报表 </td>
<td class='confluenceTd'> 没有集群支持,可能单点故障,但故障后不影响RPC运行 </td>
<td class='confluenceTd'> 可用于生产环境 </td>
<td class='confluenceTd'>&nbsp;</td>
</tr>
<tr>
<th class='confluenceTh'> <font color="#000000">Feature</font> </th>
<th class='confluenceTh'> <font color="#000000">Maturity</font> </th>
<th class='confluenceTh'> <font color="#000000">Strength</font> </th>
<th class='confluenceTh'> <font color="#000000">Problem</font> </th>
<th class='confluenceTh'> <font color="#000000">Advise</font> </th>
<th class='confluenceTh'> <font color="#000000">User</font> </th>
</tr>
<tr>
<td class='confluenceTd'> <a href="#UserGuide-dubbo%253A%252F%252F">Dubbo Protocol</a> </td>
<td class='confluenceTd'> Stable </td>
<td class='confluenceTd'> 采用NIO复用单一长连接,并使用线程池并发处理请求,减少握手和加大并发效率,性能较好(推荐使用) </td>
<td class='confluenceTd'> 在大文件传输时,单一连接会成为瓶颈 </td>
<td class='confluenceTd'> 可用于生产环境 </td>
<td class='confluenceTd'> Alibaba </td>
</tr>
<tr>
<td class='confluenceTd'> <a href="#UserGuide-rmi%253A%252F%252F">Rmi Protocol</a> </td>
<td class='confluenceTd'> Stable </td>
<td class='confluenceTd'> 可与原生RMI互操作,基于TCP协议 </td>
<td class='confluenceTd'> 偶尔会连接失败,需重建Stub </td>
<td class='confluenceTd'> 可用于生产环境 </td>
<td class='confluenceTd'> Alibaba </td>
</tr>
<tr>
<td class='confluenceTd'> <a href="#UserGuide-hessian%253A%252F%252F">Hessian Protocol</a> </td>
<td class='confluenceTd'> Stable </td>
<td class='confluenceTd'> 可与原生Hessian互操作,基于HTTP协议 </td>
<td class='confluenceTd'> 需hessian.jar支持,http短连接的开销大 </td>
<td class='confluenceTd'> 可用于生产环境 </td>
<td class='confluenceTd'>&nbsp;</td>
</tr>
<tr>
<th class='confluenceTh'> <font color="#000000">Feature</font> </th>
<th class='confluenceTh'> <font color="#000000">Maturity</font> </th>
<th class='confluenceTh'> <font color="#000000">Strength</font> </th>
<th class='confluenceTh'> <font color="#000000">Problem</font> </th>
<th class='confluenceTh'> <font color="#000000">Advise</font> </th>
<th class='confluenceTh'> <font color="#000000">User</font> </th>
</tr>
<tr>
<td class='confluenceTd'> Netty Transporter </td>
<td class='confluenceTd'> Stable </td>
<td class='confluenceTd'> JBoss的NIO框架,性能较好(推荐使用) </td>
<td class='confluenceTd'> 一次请求派发两种事件,需屏蔽无用事件 </td>
<td class='confluenceTd'> 可用于生产环境 </td>
<td class='confluenceTd'> Alibaba </td>
</tr>
<tr>
<td class='confluenceTd'> Mina Transporter </td>
<td class='confluenceTd'> Stable </td>
<td class='confluenceTd'> 老牌NIO框架,稳定 </td>
<td class='confluenceTd'> 待发送消息队列派发不及时,大压力下,会出现FullGC </td>
<td class='confluenceTd'> 可用于生产环境 </td>
<td class='confluenceTd'> Alibaba </td>
</tr>
<tr>
<td class='confluenceTd'> Grizzly Transporter </td>
<td class='confluenceTd'> Tested </td>
<td class='confluenceTd'> Sun的NIO框架,应用于GlassFish服务器中 </td>
<td class='confluenceTd'> 线程池不可扩展,Filter不能拦截下一Filter </td>
<td class='confluenceTd'> 试用 </td>
<td class='confluenceTd'>&nbsp;</td>
</tr>
<tr>
<th class='confluenceTh'> <font color="#000000">Feature</font> </th>
<th class='confluenceTh'> <font color="#000000">Maturity</font> </th>
<th class='confluenceTh'> <font color="#000000">Strength</font> </th>
<th class='confluenceTh'> <font color="#000000">Problem</font> </th>
<th class='confluenceTh'> <font color="#000000">Advise</font> </th>
<th class='confluenceTh'> <font color="#000000">User</font> </th>
</tr>
<tr>
<td class='confluenceTd'> Hessian Serialization </td>
<td class='confluenceTd'> Stable </td>
<td class='confluenceTd'> 性能较好,多语言支持(推荐使用) </td>
<td class='confluenceTd'> Hessian的各版本兼容性不好,可能和应用使用的Hessian冲突,Dubbo内嵌了hessian3.2.1的源码 </td>
<td class='confluenceTd'> 可用于生产环境 </td>
<td class='confluenceTd'> Alibaba </td>
</tr>
<tr>
<td class='confluenceTd'> Dubbo Serialization </td>
<td class='confluenceTd'> Tested </td>
<td class='confluenceTd'> 通过不传送POJO的类元信息,在大量POJO传输时,性能较好 </td>
<td class='confluenceTd'> 当参数对象增加字段时,需外部文件声明 </td>
<td class='confluenceTd'> 试用 </td>
<td class='confluenceTd'>&nbsp;</td>
</tr>
<tr>
<td class='confluenceTd'> Json Serialization </td>
<td class='confluenceTd'> Tested </td>
<td class='confluenceTd'> 纯文本,可跨语言解析,缺省采用FastJson解析 </td>
<td class='confluenceTd'> 性能较差 </td>
<td class='confluenceTd'> 试用 </td>
<td class='confluenceTd'>&nbsp;</td>
</tr>
<tr>
<td class='confluenceTd'> Java Serialization </td>
<td class='confluenceTd'> Stable </td>
<td class='confluenceTd'> Java原生支持 </td>
<td class='confluenceTd'> 性能较差 </td>
<td class='confluenceTd'> 可用于生产环境 </td>
<td class='confluenceTd'>&nbsp;</td>
</tr>
<tr>
<th class='confluenceTh'> <font color="#000000">Feature</font> </th>
<th class='confluenceTh'> <font color="#000000">Maturity</font> </th>
<th class='confluenceTh'> <font color="#000000">Strength</font> </th>
<th class='confluenceTh'> <font color="#000000">Problem</font> </th>
<th class='confluenceTh'> <font color="#000000">Advise</font> </th>
<th class='confluenceTh'> <font color="#000000">User</font> </th>
</tr>
<tr>
<td class='confluenceTd'> Javassist ProxyFactory </td>
<td class='confluenceTd'> Stable </td>
<td class='confluenceTd'> 通过字节码生成代替反射,性能比较好(推荐使用) </td>
<td class='confluenceTd'> 依赖于javassist.jar包,占用JVM的Perm内存,Perm可能要设大一些:java&nbsp;-XX:PermSize=128m </td>
<td class='confluenceTd'> 可用于生产环境 </td>
<td class='confluenceTd'> Alibaba </td>
</tr>
<tr>
<td class='confluenceTd'> Jdk ProxyFactory </td>
<td class='confluenceTd'> Stable </td>
<td class='confluenceTd'> JDK原生支持 </td>
<td class='confluenceTd'> 性能较差 </td>
<td class='confluenceTd'> 可用于生产环境 </td>
<td class='confluenceTd'>&nbsp;</td>
</tr>
<tr>
<th class='confluenceTh'> <font color="#000000">Feature</font> </th>
<th class='confluenceTh'> <font color="#000000">Maturity</font> </th>
<th class='confluenceTh'> <font color="#000000">Strength</font> </th>
<th class='confluenceTh'> <font color="#000000">Problem</font> </th>
<th class='confluenceTh'> <font color="#000000">Advise</font> </th>
<th class='confluenceTh'> <font color="#000000">User</font> </th>
</tr>
<tr>
<td class='confluenceTd'> <a href="#UserGuide-FailoverCluster">Failover Cluster</a> </td>
<td class='confluenceTd'> Stable </td>
<td class='confluenceTd'> 失败自动切换,当出现失败,重试其它服务器,通常用于读操作(推荐使用) </td>
<td class='confluenceTd'> 重试会带来更长延迟 </td>
<td class='confluenceTd'> 可用于生产环境 </td>
<td class='confluenceTd'> Alibaba </td>
</tr>
<tr>
<td class='confluenceTd'> <a href="#UserGuide-FailfastCluster">Failfast Cluster</a> </td>
<td class='confluenceTd'> Stable </td>
<td class='confluenceTd'> 快速失败,只发起一次调用,失败立即报错,通常用于非幂等性的写操作 </td>
<td class='confluenceTd'> 如果有机器正在重启,可能会出现调用失败 </td>
<td class='confluenceTd'> 可用于生产环境 </td>
<td class='confluenceTd'> Alibaba </td>
</tr>
<tr>
<td class='confluenceTd'> <a href="#UserGuide-FailsafeCluster">Failsafe Cluster</a> </td>
<td class='confluenceTd'> Stable </td>
<td class='confluenceTd'> 失败安全,出现异常时,直接忽略,通常用于写入审计日志等操作 </td>
<td class='confluenceTd'> 调用信息丢失 </td>
<td class='confluenceTd'> 可用于生产环境 </td>
<td class='confluenceTd'> Monitor </td>
</tr>
<tr>
<td class='confluenceTd'> <a href="#UserGuide-FailbackCluster">Failback Cluster</a> </td>
<td class='confluenceTd'> Tested </td>
<td class='confluenceTd'> 失败自动恢复,后台记录失败请求,定时重发,通常用于消息通知操作 </td>
<td class='confluenceTd'> 不可靠,重启丢失 </td>
<td class='confluenceTd'> 可用于生产环境 </td>
<td class='confluenceTd'> Registry </td>
</tr>
<tr>
<td class='confluenceTd'> <a href="#UserGuide-ForkingCluster">Forking Cluster</a> </td>
<td class='confluenceTd'> Tested </td>
<td class='confluenceTd'> 并行调用多个服务器,只要一个成功即返回,通常用于实时性要求较高的读操作 </td>
<td class='confluenceTd'> 需要浪费更多服务资源 </td>
<td class='confluenceTd'> 可用于生产环境 </td>
<td class='confluenceTd'>&nbsp;</td>
</tr>
<tr>
<td class='confluenceTd'> <a href="#UserGuide-BroadcastCluster">Broadcast Cluster</a> </td>
<td class='confluenceTd'> Tested </td>
<td class='confluenceTd'> 广播调用所有提供者,逐个调用,任意一台报错则报错,通常用于更新提供方本地状态 </td>
<td class='confluenceTd'> 速度慢,任意一台报错则报错 </td>
<td class='confluenceTd'> 可用于生产环境 </td>
<td class='confluenceTd'>&nbsp;</td>
</tr>
<tr>
<th class='confluenceTh'> <font color="#000000">Feature</font> </th>
<th class='confluenceTh'> <font color="#000000">Maturity</font> </th>
<th class='confluenceTh'> <font color="#000000">Strength</font> </th>
<th class='confluenceTh'> <font color="#000000">Problem</font> </th>
<th class='confluenceTh'> <font color="#000000">Advise</font> </th>
<th class='confluenceTh'> <font color="#000000">User</font> </th>
</tr>
<tr>
<td class='confluenceTd'> <a href="#UserGuide-RandomLoadBalance">Random LoadBalance</a> </td>
<td class='confluenceTd'> Stable </td>
<td class='confluenceTd'> 随机,按权重设置随机概率(推荐使用) </td>
<td class='confluenceTd'> 在一个截面上碰撞的概率高,重试时,可能出现瞬间压力不均 </td>
<td class='confluenceTd'> 可用于生产环境 </td>
<td class='confluenceTd'> Alibaba </td>
</tr>
<tr>
<td class='confluenceTd'> <a href="#UserGuide-RoundRobinLoadBalance">RoundRobin LoadBalance</a> </td>
<td class='confluenceTd'> Stable </td>
<td class='confluenceTd'> 轮循,按公约后的权重设置轮循比率 </td>
<td class='confluenceTd'> 存在慢的机器累积请求问题,极端情况可能产生雪崩 </td>
<td class='confluenceTd'> 可用于生产环境 </td>
<td class='confluenceTd'>&nbsp;</td>
</tr>
<tr>
<td class='confluenceTd'> <a href="#UserGuide-LeastActiveLoadBalance">LeastActive LoadBalance</a> </td>
<td class='confluenceTd'> Stable </td>
<td class='confluenceTd'> 最少活跃调用数,相同活跃数的随机,活跃数指调用前后计数差,使慢的机器收到更少请求 </td>
<td class='confluenceTd'> 不支持权重,在容量规划时,不能通过权重把压力导向一台机器压测容量 </td>
<td class='confluenceTd'> 可用于生产环境 </td>
<td class='confluenceTd'>&nbsp;</td>
</tr>
<tr>
<td class='confluenceTd'> <a href="#UserGuide-ConsistentHashLoadBalance">ConsistentHash LoadBalance</a> </td>
<td class='confluenceTd'> Stable </td>
<td class='confluenceTd'> 一致性Hash,相同参数的请求总是发到同一提供者,当某一台提供者挂时,原本发往该提供者的请求,基于虚拟节点,平摊到其它提供者,不会引起剧烈变动 </td>
<td class='confluenceTd'> 压力分摊不均 </td>
<td class='confluenceTd'> 可用于生产环境 </td>
<td class='confluenceTd'>&nbsp;</td>
</tr>
<tr>
<th class='confluenceTh'> <font color="#000000">Feature</font> </th>
<th class='confluenceTh'> <font color="#000000">Maturity</font> </th>
<th class='confluenceTh'> <font color="#000000">Strength</font> </th>
<th class='confluenceTh'> <font color="#000000">Problem</font> </th>
<th class='confluenceTh'> <font color="#000000">Advise</font> </th>
<th class='confluenceTh'> <font color="#000000">User</font> </th>
</tr>
<tr>
<td class='confluenceTd'> <a href="#UserGuide-ConditionRouterRule">Condition Router Rule</a> </td>
<td class='confluenceTd'> Stable </td>
<td class='confluenceTd'> 基于条件表达式的路由规则,功能简单易用 </td>
<td class='confluenceTd'> 有些复杂多分支条件情况,规则很难描述 </td>
<td class='confluenceTd'> 可用于生产环境 </td>
<td class='confluenceTd'> Alibaba </td>
</tr>
<tr>
<td class='confluenceTd'> <a href="#UserGuide-ScriptRouterRule">Script Router Rule</a> </td>
<td class='confluenceTd'> Tested </td>
<td class='confluenceTd'> 基于脚本引擎的路由规则,功能强大 </td>
<td class='confluenceTd'> 没有运行沙箱,脚本能力过于强大,可能成为后门 </td>
<td class='confluenceTd'> 试用 </td>
<td class='confluenceTd'>&nbsp;</td>
</tr>
<tr>
<th class='confluenceTh'> <font color="#000000">Feature</font> </th>
<th class='confluenceTh'> <font color="#000000">Maturity</font> </th>
<th class='confluenceTh'> <font color="#000000">Strength</font> </th>
<th class='confluenceTh'> <font color="#000000">Problem</font> </th>
<th class='confluenceTh'> <font color="#000000">Advise</font> </th>
<th class='confluenceTh'> <font color="#000000">User</font> </th>
</tr>
<tr>
<td class='confluenceTd'> <a href="#UserGuide-SpringContainer">Spring Container</a> </td>
<td class='confluenceTd'> Stable </td>
<td class='confluenceTd'> 自动加载META-INF/spring目录下的所有Spring配置 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> 可用于生产环境 </td>
<td class='confluenceTd'> Alibaba </td>
</tr>
<tr>
<td class='confluenceTd'> <a href="#UserGuide-JettyContainer">Jetty Container</a> </td>
<td class='confluenceTd'> Stable </td>
<td class='confluenceTd'> 启动一个内嵌Jetty,用于汇报状态 </td>
<td class='confluenceTd'> 大量访问页面时,会影响服务器的线程和内存 </td>
<td class='confluenceTd'> 可用于生产环境 </td>
<td class='confluenceTd'> Alibaba </td>
</tr>
<tr>
<td class='confluenceTd'> <a href="#UserGuide-Log4jContainer">Log4j Container</a> </td>
<td class='confluenceTd'> Stable </td>
<td class='confluenceTd'> 自动配置log4j的配置,在多进程启动时,自动给日志文件按进程分目录 </td>
<td class='confluenceTd'> 用户不能控制log4j的配置,不灵活 </td>
<td class='confluenceTd'> 可用于生产环境 </td>
<td class='confluenceTd'> Alibaba </td>
</tr>
</tbody></table>
</div>
<h2><a name="UserGuide-Configs"></a>Configs</h2>
<p>(<a href="Configs.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/Configs" title="Configs">+</a>) (<a href="#UserGuide-Configs">#</a>)</p>
<h3><a name="UserGuide-XmlConfig"></a>Xml Config</h3>
<p>(<a href="Xml+Config.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/Xml+Config" title="Xml Config">+</a>) (<a href="#UserGuide-XmlConfig">&#35;</a>)</p>
<div class='panelMacro'><table class='tipMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="check.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/check.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td><b>配置项说明</b><br />详细配置项,请参见:<a href="#UserGuide-ConfigurationReference">Configuration Reference</a> (<a href="Configuration+Reference.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/Configuration+Reference" title="Configuration Reference">+</a>)</td></tr></table></div>
<div class='panelMacro'><table class='tipMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="check.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/check.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td><b>API使用说明</b><br />如果不想使用Spring配置,而希望通过API的方式进行调用,请参见:<a href="#UserGuide-APIConfig">API Config</a> (<a href="API+Config.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/API+Config" title="API Config">+</a>)</td></tr></table></div>
<div class='panelMacro'><table class='tipMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="check.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/check.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td><b>配置使用说明</b><br />想知道如何使用配置,请参见:<a href="#UserGuide-QuickStart">Quick Start</a> (<a href="Quick+Start.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/Quick+Start" title="Quick Start">+</a>)</td></tr></table></div>
<p>示例:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeHeader panelHeader" style="border-bottom-width: 1px;"><b>provider.xml</b></div><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"&gt;
&lt;dubbo:application name="hello-world-app" /&gt;
&lt;dubbo:registry address="multicast://224.5.6.7:1234" /&gt;
&lt;dubbo:protocol name="dubbo" port="20880" /&gt;
&lt;dubbo:service interface="com.alibaba.dubbo.demo.DemoService" ref="demoServiceLocal" /&gt;
&lt;dubbo:reference id="demoServiceRemote" interface="com.alibaba.dubbo.demo.DemoService" /&gt;
&lt;/beans&gt;]]></script>
</div></div>
<div class='panelMacro'><table class='tipMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="check.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/check.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>所有标签者支持自定义参数,用于不同扩展点实现的特殊配置。</td></tr></table></div>
<p>如:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:protocol name="jms"&gt;
&lt;dubbo:parameter key="queue" value="http://10.20.160.198/wiki/display/dubbo/10.20.31.22" /&gt;
&lt;/dubbo:protocol&gt;]]></script>
</div></div>
<p>或:(2.1.0开始支持)</p>
<div class='panelMacro'><table class='noteMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="warning-3.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/warning.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>注意声明:xmlns:p="http://www.springframework.org/schema/p"</td></tr></table></div>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"&gt;
&lt;dubbo:protocol name="jms" p:queue="http://10.20.160.198/wiki/display/dubbo/10.20.31.22" /&gt;
&lt;/beans&gt;]]></script>
</div></div>
<p><b>Configuration Relation:</b></p>
<p><span class="image-wrap" style=""><img src="dubbo-config.jpg-version=1&modificationDate=1330708121000.jpg" tppabs="http://10.20.160.198/wiki/download/attachments/7668102/dubbo-config.jpg?version=1&modificationDate=1330708121000" style="border: 0px solid black" /></span></p>
<ul>
<li><a href="#UserGuide-%253Cdubbo%253Aservice%252F%253E">&lt;dubbo:service/&gt;</a> 服务配置,用于暴露一个服务,定义服务的元信息,一个服务可以用多个协议暴露,一个服务也可以注册到多个注册中心。</li>
<li><a href="#UserGuide-%253Cdubbo%253Areference%252F%253E">&lt;dubbo:reference/&gt;</a> 引用配置,用于创建一个远程服务代理,一个引用可以指向多个注册中心。</li>
<li><a href="#UserGuide-%253Cdubbo%253Aprotocol%252F%253E">&lt;dubbo:protocol/&gt;</a> 协议配置,用于配置提供服务的协议信息,协议由提供方指定,消费方被动接受。</li>
<li><a href="#UserGuide-%253Cdubbo%253Aapplication%252F%253E">&lt;dubbo:application/&gt;</a> 应用配置,用于配置当前应用信息,不管该应用是提供者还是消费者。</li>
<li><a href="#UserGuide-%253Cdubbo%253Amodule%252F%253E">&lt;dubbo:module/&gt;</a> 模块配置,用于配置当前模块信息,可选。</li>
<li><a href="#UserGuide-%253Cdubbo%253Aregistry%252F%253E">&lt;dubbo:registry/&gt;</a> 注册中心配置,用于配置连接注册中心相关信息。</li>
<li><a href="#UserGuide-%253Cdubbo%253Amonitor%252F%253E">&lt;dubbo:monitor/&gt;</a> 监控中心配置,用于配置连接监控中心相关信息,可选。</li>
<li><a href="#UserGuide-%253Cdubbo%253Aprovider%252F%253E">&lt;dubbo:provider/&gt;</a> 提供方的缺省值,当ProtocolConfig和ServiceConfig某属性没有配置时,采用此缺省值,可选。</li>
<li><a href="#UserGuide-%253Cdubbo%253Aconsumer%252F%253E">&lt;dubbo:consumer/&gt;</a> 消费方缺省配置,当ReferenceConfig某属性没有配置时,采用此缺省值,可选。</li>
<li><a href="#UserGuide-%253Cdubbo%253Amethod%252F%253E">&lt;dubbo:method/&gt;</a> 方法配置,用于ServiceConfig和ReferenceConfig指定方法级的配置信息。</li>
<li><a href="#UserGuide-%253Cdubbo%253Aargument%252F%253E">&lt;dubbo:argument/&gt;</a> 用于指定方法参数配置。</li>
</ul>
<p><b>Configuration Override:</b></p>
<p><span class="image-wrap" style=""><img src="dubbo-config-override.jpg-version=1&modificationDate=1330708128000.jpg" tppabs="http://10.20.160.198/wiki/download/attachments/7668102/dubbo-config-override.jpg?version=1&modificationDate=1330708128000" style="border: 0px solid black" /></span></p>
<ul>
<li>上图中以timeout为例,显示了配置的查找顺序,其它retries, loadbalance, actives等类似。
<ul>
<li>方法级优先,接口级次之,全局配置再次之。</li>
<li>如果级别一样,则消费方优先,提供方次之。</li>
</ul>
</li>
<li>其中,服务提供方配置,通过URL经由注册中心传递给消费方。</li>
<li>建议由服务提供方设置超时,因为一个方法需要执行多长时间,服务提供方更清楚,如果一个消费方同时引用多个服务,就不需要关心每个服务的超时设置。</li>
<li>理论上ReferenceConfig的非服务标识配置,在ConsumerConfig,ServiceConfig, ProviderConfig均可以缺省配置。</li>
</ul>
<h3><a name="UserGuide-PropertiesConfig"></a>Properties Config</h3>
<p>(<a href="Properties+Config.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/Properties+Config" title="Properties Config">+</a>) (<a href="#UserGuide-PropertiesConfig">#</a>)</p>
<div class='panelMacro'><table class='tipMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="check.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/check.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>如果公共配置很简单,没有多注册中心,多协议等情况,或者想多个Spring容器想共享配置,可以使用dubbo.properties作为缺省配置。</td></tr></table></div>
<div class='panelMacro'><table class='tipMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="check.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/check.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>Dubbo将自动加载classpath根目录下的dubbo.properties,可以通过JVM启动参数:-Ddubbo.properties.file=xxx.properties 改变缺省配置位置。</td></tr></table></div>
<div class='panelMacro'><table class='noteMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="warning-3.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/warning.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>如果classpath根目录下存在多个dubbo.properties,比如多个jar包中有dubbo.properties,Dubbo会任意加载,并打印Error日志,后续可能改为抛异常。</td></tr></table></div>
<p>映射规则:</p>
<ul>
<li>将XML配置的标签名,加属性名,用点分隔,多个属性拆成多行:
<ul>
<li>比如:dubbo.application.name=foo等价于&lt;dubbo:application name="foo" /&gt;</li>
<li>比如:dubbo.registry.address=10.20.153.10:9090等价于&lt;dubbo:registry address="10.20.153.10:9090" /&gt;</li>
</ul>
</li>
<li>如果XML有多行同名标签配置,可用id号区分,如果没有id号将对所有同名标签生效:
<ul>
<li>比如:dubbo.protocol.rmi.port=1234等价于&lt;dubbo:protocol id="rmi" name="rmi" port="1099" /&gt; (协议的id没配时,缺省使用协议名作为id)</li>
<li>比如:dubbo.registry.china.address=10.20.153.10:9090等价于&lt;dubbo:registry id="china" address="10.20.153.10:9090" /&gt;</li>
</ul>
</li>
</ul>
<p>典型配置如:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeHeader panelHeader" style="border-bottom-width: 1px;"><b>dubbo.properties</b></div><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: java; gutter: false"><![CDATA[dubbo.application.name=foo
dubbo.application.owner=bar
dubbo.registry.address=10.20.153.10:9090]]></script>
</div></div>
<p><span class="image-wrap" style=""><img src="dubbo-properties-override.jpg-version=1&modificationDate=1326771444000.jpg" tppabs="http://10.20.160.198/wiki/download/attachments/6950129/dubbo-properties-override.jpg?version=1&modificationDate=1326771444000" style="border: 0px solid black" /></span></p>
<p>覆盖策略:</p>
<ul>
<li>JVM启动-D参数优先,这样可以使用户在部署和启动时进行参数重写,比如在启动时需改变协议的端口。</li>
<li>XML次之,如果在XML中有配置,则dubbo.properties中的相应配置项无效。</li>
<li>Properties最后,相当于缺省值,只有XML没有配置时,dubbo.properties的相应配置项才会生效,通常用于共享公共配置,比如应用名。</li>
</ul>
<h3><a name="UserGuide-AnnotationConfig"></a>Annotation Config</h3>
<p>(<a href="Annotation+Config.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/Annotation+Config" title="Annotation Config">+</a>) (<a href="#UserGuide-AnnotationConfig">#</a>)</p>
<div class='panelMacro'><table class='noteMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="warning-3.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/warning.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>2.2.1以上版本支持</td></tr></table></div>
<p>服务提供方注解:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: java; gutter: false"><![CDATA[import com.alibaba.dubbo.config.annotation.Service;
@Service(version="1.0.0")
public class FooServiceImpl implements FooService {
// ......
}]]></script>
</div></div>
<p>服务提供方配置:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;!-- 公共信息,也可以用dubbo.properties配置 --&gt;
&lt;dubbo:application name="annotation-provider" /&gt;
&lt;dubbo:registry address="127.0.0.1:4548" /&gt;
&lt;!-- 扫描注解包路径,多个包用逗号分隔,不填pacakge表示扫描当前ApplicationContext中所有的类 --&gt;
&lt;dubbo:annotation package="com.foo.bar.service" /&gt;]]></script>
</div></div>
<p>服务消费方注解:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: java; gutter: false"><![CDATA[import com.alibaba.dubbo.config.annotation.Reference;
import org.springframework.stereotype.Component;
@Component
public class BarAction {
@Reference(version="1.0.0")
private FooService fooService;
}]]></script>
</div></div>
<p>服务消费方配置:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;!-- 公共信息,也可以用dubbo.properties配置 --&gt;
&lt;dubbo:application name="annotation-consumer" /&gt;
&lt;dubbo:registry address="127.0.0.1:4548" /&gt;
&lt;!-- 扫描注解包路径,多个包用逗号分隔,不填pacakge表示扫描当前ApplicationContext中所有的类 --&gt;
&lt;dubbo:annotation package="com.foo.bar.action" /&gt;]]></script>
</div></div>
<p>也可以使用:(等价于前面的:&lt;dubbo:annotation package="com.foo.bar.service" /&gt;)</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:annotation /&gt;
&lt;context:component-scan base-package="com.foo.bar.service"&gt;
&lt;context:include-filter type="annotation" expression="com.alibaba.dubbo.config.annotation.Service" /&gt;
&lt;/context:component-scan&gt;]]></script>
</div></div>
<div class='panelMacro'><table class='noteMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="warning-3.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/warning.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>Spring2.5及以后版本支持component-scan,如果用的是Spring2.0及以前版本,需配置:
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;!-- Spring2.0支持@Service注解配置,但不支持package属性自动加载bean的实例,需人工定义bean的实例。--&gt;
&lt;dubbo:annotation /&gt;
&lt;bean id="barService" class="com.foo.BarServiceImpl" /&gt;]]></script>
</div></div></td></tr></table></div>
<h3><a name="UserGuide-APIConfig"></a>API Config</h3>
<p>(<a href="API+Config.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/API+Config" title="API Config">+</a>) (<a href="#UserGuide-APIConfig">#</a>)</p>
<div class='panelMacro'><table class='noteMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="warning-3.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/warning.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td><b>API使用范围</b><br />API仅用于OpenAPI, ESB, Test, Mock等系统集成,普通服务提供方或消费方,请采用配置方式使用Dubbo,请参见:<a href="#UserGuide-XmlConfig">Xml Config</a> (<a href="Xml+Config.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/Xml+Config" title="Xml Config">+</a>)</td></tr></table></div>
<div class='panelMacro'><table class='tipMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="check.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/check.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td><b>API属性含义参考</b><br />API属性与配置项一对一,各属性含义,请参见:<a href="#UserGuide-ConfigurationReference">Configuration Reference</a> (<a href="Configuration+Reference.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/Configuration+Reference" title="Configuration Reference">+</a>),<br/>
比如:ApplicationConfig.setName("xxx") 对应 &lt;dubbo:application name="xxx" /&gt;</td></tr></table></div>
<h4><a name="UserGuide-%281%29%E6%9C%8D%E5%8A%A1%E6%8F%90%E4%BE%9B%E8%80%85%EF%BC%9A"></a>(1) 服务提供者:</h4>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: java; gutter: false"><![CDATA[import com.alibaba.dubbo.config.ApplicationConfig;
import com.alibaba.dubbo.config.RegistryConfig;
import com.alibaba.dubbo.config.ProviderConfig;
import com.alibaba.dubbo.config.ServiceConfig;
import com.xxx.XxxService;
import com.xxx.XxxServiceImpl;
// 服务实现
XxxService xxxService = new XxxServiceImpl();
// 当前应用配置
ApplicationConfig application = new ApplicationConfig();
application.setName("xxx");
// 连接注册中心配置
RegistryConfig registry = new RegistryConfig();
registry.setAddress("10.20.130.230:9090");
registry.setUsername("aaa");
registry.setPassword("bbb");
// 服务提供者协议配置
ProtocolConfig protocol = new ProtocolConfig();
protocol.setName("dubbo");
protocol.setPort(12345);
protocol.setThreads(200);
// 注意:ServiceConfig为重对象,内部封装了与注册中心的连接,以及开启服务端口
// 服务提供者暴露服务配置
ServiceConfig&lt;XxxService&gt; service = new ServiceConfig&lt;XxxService&gt;(); // 该类很重,封装了与注册中心的连接,请自行缓存,否则可能造成内存和连接泄漏
service.setApplication(application);
service.setRegistry(registry); // 多个注册中心可以用setRegistries()
service.setProtocol(protocol); // 多个协议可以用setProtocols()
service.setInterface(XxxService.class);
service.setRef(xxxService);
service.setVersion("1.0.0");
// 暴露及注册服务
service.export();]]></script>
</div></div>
<h4><a name="UserGuide-%282%29%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%EF%BC%9A"></a>(2) 服务消费者:</h4>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: java; gutter: false"><![CDATA[import com.alibaba.dubbo.config.ApplicationConfig;
import com.alibaba.dubbo.config.RegistryConfig;
import com.alibaba.dubbo.config.ConsumerConfig;
import com.alibaba.dubbo.config.ReferenceConfig;
import com.xxx.XxxService;
// 当前应用配置
ApplicationConfig application = new ApplicationConfig();
application.setName("yyy");
// 连接注册中心配置
RegistryConfig registry = new RegistryConfig();
registry.setAddress("10.20.130.230:9090");
registry.setUsername("aaa");
registry.setPassword("bbb");
// 注意:ReferenceConfig为重对象,内部封装了与注册中心的连接,以及与服务提供方的连接
// 引用远程服务
ReferenceConfig&lt;XxxService&gt; reference = new ReferenceConfig&lt;XxxService&gt;(); // 该类很重,封装了与注册中心的连接以及与提供者的连接,请自行缓存,否则可能造成内存和连接泄漏
reference.setApplication(application);
reference.setRegistry(registry); // 多个注册中心可以用setRegistries()
reference.setInterface(XxxService.class);
reference.setVersion("1.0.0");
// 和本地bean一样使用xxxService
XxxService xxxService = reference.get(); // 注意:此代理对象内部封装了所有通讯细节,对象较重,请缓存复用]]></script>
</div></div>
<h4><a name="UserGuide-%283%29%E7%89%B9%E6%AE%8A%E5%9C%BA%E6%99%AF"></a>(3) 特殊场景</h4>
<p><font color="green">注:下面只列出不同的地方,其它参见上面的写法</font></p>
<h4><a name="UserGuide-%283.1%29%E6%96%B9%E6%B3%95%E7%BA%A7%E8%AE%BE%E7%BD%AE%EF%BC%9A"></a>(3.1) 方法级设置:</h4>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: java; gutter: false"><![CDATA[...
// 方法级配置
List&lt;MethodConfig&gt; methods = new ArrayList&lt;MethodConfig&gt;();
MethodConfig method = new MethodConfig();
method.setName("createXxx");
method.setTimeout(10000);
method.setRetries(0);
methods.add(method);
// 引用远程服务
ReferenceConfig&lt;XxxService&gt; reference = new ReferenceConfig&lt;XxxService&gt;(); // 该类很重,封装了与注册中心的连接以及与提供者的连接,请自行缓存,否则可能造成内存和连接泄漏
...
reference.setMethods(methods); // 设置方法级配置
...]]></script>
</div></div>
<h4><a name="UserGuide-%283.2%29%E7%82%B9%E5%AF%B9%E7%82%B9%E7%9B%B4%E8%BF%9E%EF%BC%9A"></a>(3.2) 点对点直连:</h4>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: java; gutter: false"><![CDATA[...
ReferenceConfig&lt;XxxService&gt; reference = new ReferenceConfig&lt;XxxService&gt;(); // 该类很重,封装了与注册中心的连接以及与提供者的连接,请自行缓存,否则可能造成内存和连接泄漏
// 如果点对点直连,可以用reference.setUrl()指定目标地址,设置url后将绕过注册中心,
// 其中,协议对应provider.setProtocol()的值,端口对应provider.setPort()的值,
// 路径对应service.setPath()的值,如果未设置path,缺省path为接口名
reference.setUrl("dubbo://10.20.130.230:20880/com.xxx.XxxService");
...]]></script>
</div></div>
<h2><a name="UserGuide-Examples"></a>Examples</h2>
<p>(<a href="Examples.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/Examples" title="Examples">+</a>) (<a href="#UserGuide-Examples">#</a>)</p>
<div class='panelMacro'><table class='tipMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="check.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/check.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>想完整的运行起来,请参见:<a href="#UserGuide-QuickStart">Quick Start</a> (<a href="Quick+Start.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/Quick+Start" title="Quick Start">+</a>),这里只列出各种场景的配置方式</td></tr></table></div>
<div class='panelMacro'><table class='tipMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="check.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/check.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>以下示例全部使用基于Spring的<a href="#UserGuide-XmlConfig">Xml Config</a> (<a href="Xml+Config.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/Xml+Config" title="Xml Config">+</a>)作为参考,如果不想使用Spring,而希望通过API的方式进行调用,请参见:<a href="#UserGuide-APIConfig">API Config</a> (<a href="API+Config.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/API+Config" title="API Config">+</a>)</td></tr></table></div>
<h3><a name="UserGuide-CheckOnStartup"></a>Check On Startup</h3>
<p>(<a href="Check+On+Startup.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/Check+On+Startup" title="Check On Startup">+</a>) (<a href="#UserGuide-CheckOnStartup">#</a>)</p>
<div class='panelMacro'><table class='tipMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="check.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/check.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>Dubbo缺省会在启动时检查依赖的服务是否可用,不可用时会抛出异常,阻止Spring初始化完成,以便上线时,能及早发现问题,默认check=true。</td></tr></table></div>
<div class='panelMacro'><table class='noteMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="warning-3.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/warning.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>如果你的Spring容器是懒加载的,或者通过API编程延迟引用服务,请关闭check,否则服务临时不可用时,会抛出异常,拿到null引用,如果check=false,总是会返回引用,当服务恢复时,能自动连上。</td></tr></table></div>
<p>可以通过check="false"关闭检查,比如,测试时,有些服务不关心,或者出现了循环依赖,必须有一方先启动。</p>
<p>关闭某个服务的启动时检查:(没有提供者时报错)</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:reference interface="com.foo.BarService" check="false" /&gt;]]></script>
</div></div>
<p>关闭所有服务的启动时检查:(没有提供者时报错)</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:consumer check="false" /&gt;]]></script>
</div></div>
<p>关闭注册中心启动时检查:(注册订阅失败时报错)</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:registry check="false" /&gt;]]></script>
</div></div>
<p>也可以用dubbo.properties配置:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeHeader panelHeader" style="border-bottom-width: 1px;"><b>dubbo.properties</b></div><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: text; gutter: false"><![CDATA[dubbo.reference.com.foo.BarService.check=false
dubbo.reference.check=false
dubbo.consumer.check=false
dubbo.registry.check=false]]></script>
</div></div>
<p>也可以用-D参数:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: text; gutter: false"><![CDATA[java -Ddubbo.reference.com.foo.BarService.check=false
java -Ddubbo.reference.check=false
java -Ddubbo.consumer.check=false
java -Ddubbo.registry.check=false]]></script>
</div></div>
<div class='panelMacro'><table class='noteMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="warning-3.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/warning.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td><b>注意区别</b><br /><ul>
<li>dubbo.reference.check=false,强制改变所有reference的check值,就算配置中有声明,也会被覆盖。</li>
<li>dubbo.consumer.check=false,是设置check的缺省值,如果配置中有显式的声明,如:&lt;dubbo:reference check="true"/&gt;,不会受影响。</li>
<li>dubbo.registry.check=false,前面两个都是指订阅成功,但提供者列表是否为空时是否报错,如果注册订阅失败时,也允许启动,需使用此选项,将在后台定时重试。</li>
</ul>
</td></tr></table></div>
<p>引用缺省是延迟初始化的,只有引用被注入到其它Bean,或被getBean()获取,才会初始化。<br/>
如果需要饥饿加载,即没有人引用也立即生成动态代理,可以配置:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:reference interface="com.foo.BarService" init="true" /&gt;]]></script>
</div></div>
<h3><a name="UserGuide-FaultTolerance"></a>Fault Tolerance</h3>
<p>(<a href="Fault+Tolerance.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/Fault+Tolerance" title="Fault Tolerance">+</a>) (<a href="#UserGuide-FaultTolerance">#</a>)</p>
<div class='panelMacro'><table class='tipMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="check.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/check.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>在集群调用失败时,Dubbo提供了多种容错方案,缺省为failover重试。</td></tr></table></div>
<p><span class="image-wrap" style=""><img src="cluster.jpg-version=1&modificationDate=1321028038000.jpg" tppabs="http://10.20.160.198/wiki/download/attachments/6949932/cluster.jpg?version=1&modificationDate=1321028038000" style="border: 0px solid black" /></span></p>
<p><b>各节点关系:</b></p>
<ul>
<li>这里的Invoker是Provider的一个可调用Service的抽象,Invoker封装了Provider地址及Service接口信息。</li>
<li>Directory代表多个Invoker,可以把它看成List&lt;Invoker&gt;,但与List不同的是,它的值可能是动态变化的,比如注册中心推送变更。</li>
<li>Cluster将Directory中的多个Invoker伪装成一个Invoker,对上层透明,伪装过程包含了容错逻辑,调用失败后,重试另一个。</li>
<li>Router负责从多个Invoker中按路由规则选出子集,比如读写分离,应用隔离等。</li>
<li>LoadBalance负责从多个Invoker中选出具体的一个用于本次调用,选的过程包含了负载均衡算法,调用失败后,需要重选。</li>
</ul>
<h5><a name="UserGuide-%E9%9B%86%E7%BE%A4%E5%AE%B9%E9%94%99%E6%A8%A1%E5%BC%8F%EF%BC%9A"></a>集群容错模式:</h5>
<p>可以自行扩展集群容错策略,参见:<a href="Developer+Guide.htm#DeveloperGuide-ClusterSPI" tppabs="http://10.20.160.198/wiki/display/dubbo/Developer+Guide#DeveloperGuide-ClusterSPI">Cluster SPI</a></p>
<h6><a name="UserGuide-FailoverCluster"></a>Failover Cluster</h6>
<ul>
<li>失败自动切换,当出现失败,重试其它服务器。(缺省)</li>
<li>通常用于读操作,但重试会带来更长延迟。</li>
<li>可通过retries="2"来设置重试次数(不含第一次)。</li>
</ul>
<h6><a name="UserGuide-FailfastCluster"></a>Failfast Cluster</h6>
<ul>
<li>快速失败,只发起一次调用,失败立即报错。</li>
<li>通常用于非幂等性的写操作,比如新增记录。</li>
</ul>
<h6><a name="UserGuide-FailsafeCluster"></a>Failsafe Cluster</h6>
<ul>
<li>失败安全,出现异常时,直接忽略。</li>
<li>通常用于写入审计日志等操作。</li>
</ul>
<h6><a name="UserGuide-FailbackCluster"></a>Failback Cluster</h6>
<ul>
<li>失败自动恢复,后台记录失败请求,定时重发。</li>
<li>通常用于消息通知操作。</li>
</ul>
<h6><a name="UserGuide-ForkingCluster"></a>Forking Cluster</h6>
<ul>
<li>并行调用多个服务器,只要一个成功即返回。</li>
<li>通常用于实时性要求较高的读操作,但需要浪费更多服务资源。</li>
<li>可通过forks="2"来设置最大并行数。</li>
</ul>
<h6><a name="UserGuide-BroadcastCluster"></a>Broadcast Cluster</h6>
<ul>
<li>广播调用所有提供者,逐个调用,任意一台报错则报错。(2.1.0开始支持)</li>
<li>通常用于通知所有提供者更新缓存或日志等本地资源信息。</li>
</ul>
<p>重试次数配置如:(failover集群模式生效)</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:service retries="2" /&gt;]]></script>
</div></div>
<p>或:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:reference retries="2" /&gt;]]></script>
</div></div>
<p>或:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:reference&gt;
&lt;dubbo:method name="findFoo" retries="2" /&gt;
&lt;/dubbo:reference&gt;]]></script>
</div></div>
<p>集群模式配置如:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:service cluster="failsafe" /&gt;]]></script>
</div></div>
<p>或:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:reference cluster="failsafe" /&gt;]]></script>
</div></div>
<h3><a name="UserGuide-LoadBalance"></a>Load Balance</h3>
<p>(<a href="Load+Balance.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/Load+Balance" title="Load Balance">+</a>) (<a href="#UserGuide-LoadBalance">#</a>)</p>
<div class='panelMacro'><table class='tipMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="check.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/check.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>在集群负载均衡时,Dubbo提供了多种均衡策略,缺省为random随机调用。</td></tr></table></div>
<p>可以自行扩展负载均衡策略,参见:<a href="Developer+Guide.htm#DeveloperGuide-LoadBalanceSPI" tppabs="http://10.20.160.198/wiki/display/dubbo/Developer+Guide#DeveloperGuide-LoadBalanceSPI">LoadBalance SPI</a></p>
<h6><a name="UserGuide-RandomLoadBalance"></a>Random LoadBalance</h6>
<ul>
<li>随机,按权重设置随机概率。</li>
<li>在一个截面上碰撞的概率高,但调用量越大分布越均匀,而且按概率使用权重后也比较均匀,有利于动态调整提供者权重。</li>
</ul>
<h6><a name="UserGuide-RoundRobinLoadBalance"></a>RoundRobin LoadBalance</h6>
<ul>
<li>轮循,按公约后的权重设置轮循比率。</li>
<li>存在慢的提供者累积请求问题,比如:第二台机器很慢,但没挂,当请求调到第二台时就卡在那,久而久之,所有请求都卡在调到第二台上。</li>
</ul>
<h6><a name="UserGuide-LeastActiveLoadBalance"></a>LeastActive LoadBalance</h6>
<ul>
<li>最少活跃调用数,相同活跃数的随机,活跃数指调用前后计数差。</li>
<li>使慢的提供者收到更少请求,因为越慢的提供者的调用前后计数差会越大。</li>
</ul>
<h6><a name="UserGuide-ConsistentHashLoadBalance"></a>ConsistentHash LoadBalance</h6>
<ul>
<li>一致性Hash,相同参数的请求总是发到同一提供者。</li>
<li>当某一台提供者挂时,原本发往该提供者的请求,基于虚拟节点,平摊到其它提供者,不会引起剧烈变动。</li>
<li>算法参见:<a href="javascript:if(confirm(%27http://en.wikipedia.org/wiki/Consistent_hashing \n\nThis file was not retrieved by Teleport Ultra, because it is addressed on a domain or path outside the boundaries set for its Starting Address. \n\nDo you want to open it from the server?%27))window.location=%27http://en.wikipedia.org/wiki/Consistent_hashing%27" tppabs="http://en.wikipedia.org/wiki/Consistent_hashing" class="external-link" rel="nofollow">http://en.wikipedia.org/wiki/Consistent_hashing</a></li>
<li>缺省只对第一个参数Hash,如果要修改,请配置&lt;dubbo:parameter key="hash.arguments" value="0,1" /&gt;</li>
<li>缺省用160份虚拟节点,如果要修改,请配置&lt;dubbo:parameter key="hash.nodes" value="320" /&gt;</li>
</ul>
<p>配置如:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:service interface="..." loadbalance="roundrobin" /&gt;]]></script>
</div></div>
<p>或:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:reference interface="..." loadbalance="roundrobin" /&gt;]]></script>
</div></div>
<p>或:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:service interface="..."&gt;
&lt;dubbo:method name="..." loadbalance="roundrobin"/&gt;
&lt;/dubbo:service&gt;]]></script>
</div></div>
<p>或:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:reference interface="..."&gt;
&lt;dubbo:method name="..." loadbalance="roundrobin"/&gt;
&lt;/dubbo:reference&gt;]]></script>
</div></div>
<h3><a name="UserGuide-ThreadModel"></a>Thread Model</h3>
<p>(<a href="Thread+Model.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/Thread+Model" title="Thread Model">+</a>) (<a href="#UserGuide-ThreadModel">#</a>)</p>
<p><span class="image-wrap" style=""><img src="dubbo-protocol.jpg-version=1&modificationDate=1331068241000.jpg" tppabs="http://10.20.160.198/wiki/download/attachments/6949458/dubbo-protocol.jpg?version=1&modificationDate=1331068241000" style="border: 0px solid black" /></span></p>
<div class='panelMacro'><table class='tipMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="check.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/check.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td><b>事件处理线程说明</b><br /><ul>
<li>如果事件处理的逻辑能迅速完成,并且不会发起新的IO请求,比如只是在内存中记个标识,则直接在IO线程上处理更快,因为减少了线程池调度。</li>
<li>但如果事件处理逻辑较慢,或者需要发起新的IO请求,比如需要查询数据库,则必须派发到线程池,否则IO线程阻塞,将导致不能接收其它请求。</li>
<li>如果用IO线程处理事件,又在事件处理过程中发起新的IO请求,比如在连接事件中发起登录请求,会报“可能引发死锁”异常,但不会真死锁。</li>
</ul>
</td></tr></table></div>
<ul>
<li>Dispatcher
<ul>
<li>all 所有消息都派发到线程池,包括请求,响应,连接事件,断开事件,心跳等。</li>
<li>direct 所有消息都不派发到线程池,全部在IO线程上直接执行。</li>
<li>message 只有请求响应消息派发到线程池,其它连接断开事件,心跳等消息,直接在IO线程上执行。</li>
<li>execution 只请求消息派发到线程池,不含响应,响应和其它连接断开事件,心跳等消息,直接在IO线程上执行。</li>
<li>connection 在IO线程上,将连接断开事件放入队列,有序逐个执行,其它消息派发到线程池。</li>
</ul>
</li>
</ul>
<ul>
<li>ThreadPool
<ul>
<li>fixed 固定大小线程池,启动时建立线程,不关闭,一直持有。(缺省)</li>
<li>cached 缓存线程池,空闲一分钟自动删除,需要时重建。</li>
<li>limited 可伸缩线程池,但池中的线程数只会增长不会收缩。(为避免收缩时突然来了大流量引起的性能问题)。</li>
</ul>
</li>
</ul>
<p>配置如:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:protocol name="dubbo" dispatcher="all" threadpool="fixed" threads="100" /&gt;]]></script>
</div></div>
<h3><a name="UserGuide-DirectlyProvider"></a>Directly Provider</h3>
<p>(<a href="Directly+Provider.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/Directly+Provider" title="Directly Provider">+</a>) (<a href="#UserGuide-DirectlyProvider">#</a>)</p>
<p>在开发及测试环境下,经常需要绕过注册中心,只测试指定服务提供者,这时候可能需要点对点直连,<br/>
点对点直联方式,将以服务接口为单位,忽略注册中心的提供者列表,<br/>
A接口配置点对点,不影响B接口从注册中心获取列表。</p>
<p><span class="image-wrap" style=""><img src="dubbo-directly.jpg-version=1&modificationDate=1326853485000.jpg" tppabs="http://10.20.160.198/wiki/download/attachments/6949440/dubbo-directly.jpg?version=1&modificationDate=1326853485000" style="border: 0px solid black" /></span></p>
<p>(1) 如果是线上需求需要点对点,可在&lt;dubbo:reference&gt;中配置url指向提供者,将绕过注册中心,<b>多个地址用分号隔开</b>,配置如下:(1.0.6及以上版本支持)</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: java; gutter: false"><![CDATA[&lt;dubbo:reference id="xxxService" interface="com.alibaba.xxx.XxxService" url="dubbo://localhost:20890" /&gt;]]></script>
</div></div>
<p>(2) 在JVM启动参数中加入-D参数映射服务地址(<font color="red">只应在测试阶段使用,请不要在线上这样使用</font>),如:<br/>
(key为服务名,value为服务提供者url,此配置优先级最高,1.0.15及以上版本支持)</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: java; gutter: false"><![CDATA[java -Dcom.alibaba.xxx.XxxService=dubbo://localhost:20890]]></script>
</div></div>
<p>(3) 如果服务比较多,也可以用文件映射(<font color="red">只应在测试阶段使用,请不要在线上这样使用</font>),如:<br/>
(用-Ddubbo.resolve.file指定映射文件路径,此配置优先级高于&lt;dubbo:reference&gt;中的配置,1.0.15及以上版本支持)<br/>
(2.0以上版本自动加载${user.home}/dubbo-resolve.properties文件,不需要配置)</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: java; gutter: false"><![CDATA[java -Ddubbo.resolve.file=xxx.properties]]></script>
</div></div>
<p>然后在映射文件xxx.properties中加入:<br/>
(key为服务名,value为服务提供者url)</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: java; gutter: false"><![CDATA[com.alibaba.xxx.XxxService=dubbo://localhost:20890]]></script>
</div></div>
<h3><a name="UserGuide-SubscribeOnly"></a>Subscribe Only</h3>
<p>(<a href="Subscribe+Only.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/Subscribe+Only" title="Subscribe Only">+</a>) (<a href="#UserGuide-SubscribeOnly">#</a>)</p>
<div class='panelMacro'><table class='noteMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="warning-3.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/warning.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td><b>问题</b><br />为方便开发测试,经常会在线下共用一个所有服务可用的注册中心,这时,如果一个正在开发中的服务提供者注册,可能会影响消费者不能正常运行。</td></tr></table></div>
<div class='panelMacro'><table class='tipMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="check.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/check.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td><b>解决方案</b><br />可以让服务提供者开发方,只订阅服务(开发的服务可能依赖其它服务),而不注册正在开发的服务,通过直连测试正在开发的服务。</td></tr></table></div>
<p><span class="image-wrap" style=""><img src="subscribe-only.jpg-version=1&modificationDate=1326468174000.jpg" tppabs="http://10.20.160.198/wiki/download/attachments/6949667/subscribe-only.jpg?version=1&modificationDate=1326468174000" style="border: 0px solid black" /></span></p>
<p>禁用注册配置:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:registry address="10.20.153.10:9090" register="false" /&gt;]]></script>
</div></div>
<p>或者:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:registry address="10.20.153.10:9090?register=false" /&gt;]]></script>
</div></div>
<h3><a name="UserGuide-RegisterOnly"></a>Register Only</h3>
<p>(<a href="Register+Only.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/Register+Only" title="Register Only">+</a>) (<a href="#UserGuide-RegisterOnly">#</a>)</p>
<div class='panelMacro'><table class='noteMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="warning-3.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/warning.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td><b>问题</b><br />如果有两个镜像环境,两个注册中心,有一个服务只在其中一个注册中心有部署,另一个注册中心还没来得及部署,而两个注册中心的其它应用都需要依赖此服务,所以需要将服务同时注册到两个注册中心,但却不能让此服务同时依赖两个注册中心的其它服务。</td></tr></table></div>
<div class='panelMacro'><table class='tipMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="check.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/check.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td><b>解决方案</b><br />可以让服务提供者方,只注册服务到另一注册中心,而不从另一注册中心订阅服务。</td></tr></table></div>
<p>禁用订阅配置:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:registry id="hzRegistry" address="10.20.153.10:9090" /&gt;
&lt;dubbo:registry id="qdRegistry" address="10.20.141.150:9090" subscribe="false" /&gt;]]></script>
</div></div>
<p>或者:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:registry id="hzRegistry" address="10.20.153.10:9090" /&gt;
&lt;dubbo:registry id="qdRegistry" address="10.20.141.150:9090?subscribe=false" /&gt;]]></script>
</div></div>
<h3><a name="UserGuide-StaticProvider"></a>Static Provider</h3>
<p>(<a href="Static+Provider.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/Static+Provider" title="Static Provider">+</a>) (<a href="#UserGuide-StaticProvider">#</a>)</p>
<div class='panelMacro'><table class='tipMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="check.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/check.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>有时候希望人工管理服务提供者的上线和下线,此时需将注册中心标识为非动态管理模式。</td></tr></table></div>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:registry address="10.20.141.150:9090" dynamic="false" /&gt;]]></script>
</div></div>
<p>或者:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:registry address="10.20.141.150:9090?dynamic=false" /&gt;]]></script>
</div></div>
<p>服务提供者初次注册时为禁用状态,需人工启用,断线时,将不会被自动删除,需人工禁用。</p>
<p>如果是一个第三方独立提供者,比如memcached等,可以直接向注册中心写入提供者地址信息,消费者正常使用:<br/>
(通常由脚本监控中心页面等调用)</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: java; gutter: false"><![CDATA[RegistryFactory registryFactory = ExtensionLoader.getExtensionLoader(RegistryFactory.class).getAdaptiveExtension();
Registry registry = registryFactory.getRegistry(URL.valueOf("zookeeper://10.20.153.10:2181"));
registry.register(URL.valueOf("memcached://10.20.153.11/com.foo.BarService?category=providers&amp;dynamic=false&amp;application=foo"));]]></script>
</div></div>
<h3><a name="UserGuide-MultiProtocol"></a>Multi Protocol</h3>
<p>(<a href="Multi+Protocol.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/Multi+Protocol" title="Multi Protocol">+</a>) (<a href="#UserGuide-MultiProtocol">#</a>)</p>
<p>可以自行扩展协议,参见:<a href="Developer+Guide.htm#DeveloperGuide-ProtocolSPI" tppabs="http://10.20.160.198/wiki/display/dubbo/Developer+Guide#DeveloperGuide-ProtocolSPI">Protocol SPI</a></p>
<h4><a name="UserGuide-%281%29%E4%B8%8D%E5%90%8C%E6%9C%8D%E5%8A%A1%E4%B8%8D%E5%90%8C%E5%8D%8F%E8%AE%AE"></a>(1) 不同服务不同协议</h4>
<p>比如:不同服务在性能上适用不同协议进行传输,比如大数据用短连接协议,小数据大并发用长连接协议。</p>
<div class="code panel" style="border-width: 1px;"><div class="codeHeader panelHeader" style="border-bottom-width: 1px;"><b>consumer.xml</b></div><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://code.alibabatech.com/schema/dubbohttp://code.alibabatech.com/schema/dubbo/dubbo.xsd"&gt;
&lt;dubbo:application name="world" /&gt;
&lt;dubbo:registry id="registry" address="10.20.141.150:9090" username="admin" password="hello1234" /&gt;
&lt;!-- 多协议配置 --&gt;
&lt;dubbo:protocol name="dubbo" port="20880" /&gt;
&lt;dubbo:protocol name="rmi" port="1099" /&gt;
&lt;!-- 使用dubbo协议暴露服务 --&gt;
&lt;dubbo:service interface="com.alibaba.hello.api.HelloService" version="1.0.0" ref="helloService" protocol="dubbo" /&gt;
&lt;!-- 使用rmi协议暴露服务 --&gt;
&lt;dubbo:service interface="com.alibaba.hello.api.DemoService" version="1.0.0" ref="demoService" protocol="rmi" /&gt;
&lt;/beans&gt;]]></script>
</div></div>
<h4><a name="UserGuide-%282%29%E5%A4%9A%E5%8D%8F%E8%AE%AE%E6%9A%B4%E9%9C%B2%E6%9C%8D%E5%8A%A1"></a>(2) 多协议暴露服务</h4>
<p>比如:需要与http客户端互操作</p>
<div class="code panel" style="border-width: 1px;"><div class="codeHeader panelHeader" style="border-bottom-width: 1px;"><b>consumer.xml</b></div><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://code.alibabatech.com/schema/dubbohttp://code.alibabatech.com/schema/dubbo/dubbo.xsd"&gt;
&lt;dubbo:application name="world" /&gt;
&lt;dubbo:registry id="registry" address="10.20.141.150:9090" username="admin" password="hello1234" /&gt;
&lt;!-- 多协议配置 --&gt;
&lt;dubbo:protocol name="dubbo" port="20880" /&gt;
&lt;dubbo:protocol name="hessian" port="8080" /&gt;
&lt;!-- 使用多个协议暴露服务 --&gt;
&lt;dubbo:service id="helloService" interface="com.alibaba.hello.api.HelloService" version="1.0.0" protocol="dubbo,hessian" /&gt;
&lt;/beans&gt;]]></script>
</div></div>
<h3><a name="UserGuide-MultiRegistry"></a>Multi Registry</h3>
<p>(<a href="Multi+Registry.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/Multi+Registry" title="Multi Registry">+</a>) (<a href="#UserGuide-MultiRegistry">#</a>)</p>
<p>可以自行扩展注册中心,参见:<a href="Developer+Guide.htm#DeveloperGuide-RegistrySPI" tppabs="http://10.20.160.198/wiki/display/dubbo/Developer+Guide#DeveloperGuide-RegistrySPI">Registry SPI</a></p>
<h4><a name="UserGuide-%281%29%E5%A4%9A%E6%B3%A8%E5%86%8C%E4%B8%AD%E5%BF%83%E6%B3%A8%E5%86%8C"></a>(1) 多注册中心注册</h4>
<p>比如:中文站有些服务来不及在青岛部署,只在杭州部署,而青岛的其它应用需要引用此服务,就可以将服务同时注册到两个注册中心。</p>
<div class="code panel" style="border-width: 1px;"><div class="codeHeader panelHeader" style="border-bottom-width: 1px;"><b>consumer.xml</b></div><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://code.alibabatech.com/schema/dubbohttp://code.alibabatech.com/schema/dubbo/dubbo.xsd"&gt;
&lt;dubbo:application name="world" /&gt;
&lt;!-- 多注册中心配置 --&gt;
&lt;dubbo:registry id="hangzhouRegistry" address="10.20.141.150:9090" /&gt;
&lt;dubbo:registry id="qingdaoRegistry" address="10.20.141.151:9010" default="false" /&gt;
&lt;!-- 向多个注册中心注册 --&gt;
&lt;dubbo:service interface="com.alibaba.hello.api.HelloService" version="1.0.0" ref="helloService" registry="hangzhouRegistry,qingdaoRegistry" /&gt;
&lt;/beans&gt;]]></script>
</div></div>
<h4><a name="UserGuide-%282%29%E4%B8%8D%E5%90%8C%E6%9C%8D%E5%8A%A1%E4%BD%BF%E7%94%A8%E4%B8%8D%E5%90%8C%E6%B3%A8%E5%86%8C%E4%B8%AD%E5%BF%83"></a>(2) 不同服务使用不同注册中心</h4>
<p>比如:CRM有些服务是专门为国际站设计的,有些服务是专门为中文站设计的。</p>
<div class="code panel" style="border-width: 1px;"><div class="codeHeader panelHeader" style="border-bottom-width: 1px;"><b>consumer.xml</b></div><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://code.alibabatech.com/schema/dubbohttp://code.alibabatech.com/schema/dubbo/dubbo.xsd"&gt;
&lt;dubbo:application name="world" /&gt;
&lt;!-- 多注册中心配置 --&gt;
&lt;dubbo:registry id="chinaRegistry" address="10.20.141.150:9090" /&gt;
&lt;dubbo:registry id="intlRegistry" address="10.20.154.177:9010" default="false" /&gt;
&lt;!-- 向中文站注册中心注册 --&gt;
&lt;dubbo:service interface="com.alibaba.hello.api.HelloService" version="1.0.0" ref="helloService" registry="chinaRegistry" /&gt;
&lt;!-- 向国际站注册中心注册 --&gt;
&lt;dubbo:service interface="com.alibaba.hello.api.DemoService" version="1.0.0" ref="demoService" registry="intlRegistry" /&gt;
&lt;/beans&gt;]]></script>
</div></div>
<h4><a name="UserGuide-%283%29%E5%A4%9A%E6%B3%A8%E5%86%8C%E4%B8%AD%E5%BF%83%E5%BC%95%E7%94%A8"></a>(3) 多注册中心引用</h4>
<p>比如:CRM需同时调用中文站和国际站的PC2服务,PC2在中文站和国际站均有部署,接口及版本号都一样,但连的数据库不一样。</p>
<div class="code panel" style="border-width: 1px;"><div class="codeHeader panelHeader" style="border-bottom-width: 1px;"><b>consumer.xml</b></div><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://code.alibabatech.com/schema/dubbohttp://code.alibabatech.com/schema/dubbo/dubbo.xsd"&gt;
&lt;dubbo:application name="world" /&gt;
&lt;!-- 多注册中心配置 --&gt;
&lt;dubbo:registry id="chinaRegistry" address="10.20.141.150:9090" /&gt;
&lt;dubbo:registry id="intlRegistry" address="10.20.154.177:9010" default="false" /&gt;
&lt;!-- 引用中文站服务 --&gt;
&lt;dubbo:reference id="chinaHelloService" interface="com.alibaba.hello.api.HelloService" version="1.0.0" registry="chinaRegistry" /&gt;
&lt;!-- 引用国际站站服务 --&gt;
&lt;dubbo:reference id="intlHelloService" interface="com.alibaba.hello.api.HelloService" version="1.0.0" registry="intlRegistry" /&gt;
&lt;/beans&gt;]]></script>
</div></div>
<p>如果只是测试环境临时需要连接两个不同注册中心,使用竖号分隔多个不同注册中心地址:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeHeader panelHeader" style="border-bottom-width: 1px;"><b>consumer.xml</b></div><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://code.alibabatech.com/schema/dubbohttp://code.alibabatech.com/schema/dubbo/dubbo.xsd"&gt;
&lt;dubbo:application name="world" /&gt;
&lt;!-- 多注册中心配置,竖号分隔表示同时连接多个不同注册中心,同一注册中心的多个集群地址用逗号分隔 --&gt;
&lt;dubbo:registry address="10.20.141.150:9090|10.20.154.177:9010" /&gt;
&lt;!-- 引用服务 --&gt;
&lt;dubbo:reference id="helloService" interface="com.alibaba.hello.api.HelloService" version="1.0.0" /&gt;
&lt;/beans&gt;]]></script>
</div></div>
<h3><a name="UserGuide-MultiGroup"></a>Multi Group</h3>
<p>(<a href="Multi+Group.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/Multi+Group" title="Multi Group">+</a>) (<a href="#UserGuide-MultiGroup">#</a>)</p>
<div class='panelMacro'><table class='tipMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="check.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/check.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>当一个接口有多种实现时,可以用group区分。</td></tr></table></div>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:service group="feedback" interface="com.xxx.IndexService" /&gt;
&lt;dubbo:service group="member" interface="com.xxx.IndexService" /&gt;]]></script>
</div></div>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:reference id="feedbackIndexService" group="feedback" interface="com.xxx.IndexService" /&gt;
&lt;dubbo:reference id="memberIndexService" group="member" interface="com.xxx.IndexService" /&gt;]]></script>
</div></div>
<p>任意组:(2.2.0以上版本支持,总是只调一个可用组的实现)</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:reference id="barService" interface="com.foo.BarService" group="*" /&gt;]]></script>
</div></div>
<h3><a name="UserGuide-MultiVersion"></a>Multi Version</h3>
<p>(<a href="Multi+Version.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/Multi+Version" title="Multi Version">+</a>) (<a href="#UserGuide-MultiVersion">#</a>)</p>
<div class='panelMacro'><table class='tipMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="check.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/check.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>当一个接口实现,出现不兼容升级时,可以用版本号过渡,版本号不同的服务相互间不引用。</td></tr></table></div>
<ul>
<li>在低压力时间段,先升级一半提供者为新版本</li>
<li>再将所有消费者升级为新版本</li>
<li>然后将剩下的一半提供者升级为新版本</li>
</ul>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:service interface="com.foo.BarService" version="1.0.0" /&gt;]]></script>
</div></div>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:service interface="com.foo.BarService" version="2.0.0" /&gt;]]></script>
</div></div>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:reference id="barService" interface="com.foo.BarService" version="1.0.0" /&gt;]]></script>
</div></div>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:reference id="barService" interface="com.foo.BarService" version="2.0.0" /&gt;]]></script>
</div></div>
<p>不区分版本:(2.2.0以上版本支持)</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:reference id="barService" interface="com.foo.BarService" version="*" /&gt;]]></script>
</div></div>
<h3><a name="UserGuide-MergeByGroup"></a>Merge By Group</h3>
<p>(<a href="Merge+By+Group.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/Merge+By+Group" title="Merge By Group">+</a>) (<a href="#UserGuide-MergeByGroup">#</a>)</p>
<div class='panelMacro'><table class='tipMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="check.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/check.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>按组合并返回结果,比如菜单服务,接口一样,但有多种实现,用group区分,现在消费方需从每种group中调用一次返回结果,合并结果返回,这样就可以实现聚合菜单项。</td></tr></table></div>
<div class='panelMacro'><table class='noteMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="warning-3.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/warning.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>从2.1.0版本开始支持</td></tr></table></div>
<p><span class="image-wrap" style=""><img src="dubbo-merger.jpg-version=1&modificationDate=1329310196000.jpg" tppabs="http://10.20.160.198/wiki/download/attachments/6952105/dubbo-merger.jpg?version=1&modificationDate=1329310196000" style="border: 0px solid black" /></span></p>
<p>代码参见:<a href="javascript:if(confirm(%27http://code.alibabatech.com/svn/dubbo/trunk/dubbo-test/dubbo-test-examples/src/main/java/com/alibaba/dubbo/examples/merge \n\nThis file was not retrieved by Teleport Ultra, because it is addressed on a domain or path outside the boundaries set for its Starting Address. \n\nDo you want to open it from the server?%27))window.location=%27http://code.alibabatech.com/svn/dubbo/trunk/dubbo-test/dubbo-test-examples/src/main/java/com/alibaba/dubbo/examples/merge%27" tppabs="http://code.alibabatech.com/svn/dubbo/trunk/dubbo-test/dubbo-test-examples/src/main/java/com/alibaba/dubbo/examples/merge" class="external-link" rel="nofollow">http://code.alibabatech.com/svn/dubbo/trunk/dubbo-test/dubbo-test-examples/src/main/java/com/alibaba/dubbo/examples/merge</a></p>
<p>配置如:(搜索所有分组)</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:reference interface="com.xxx.MenuService" group="*" merger="true" /&gt;]]></script>
</div></div>
<p>或:(合并指定分组)</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:reference interface="com.xxx.MenuService" group="aaa,bbb" merger="true" /&gt;]]></script>
</div></div>
<p>或:(指定方法合并结果,其它未指定的方法,将只调用一个Group)</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:reference interface="com.xxx.MenuService" group="*"&gt;
&lt;dubbo:method name="getMenuItems" merger="true" /&gt;
&lt;/dubbo:service&gt;]]></script>
</div></div>
<p>或:(某个方法不合并结果,其它都合并结果)</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:reference interface="com.xxx.MenuService" group="*" merger="true"&gt;
&lt;dubbo:method name="getMenuItems" merger="false" /&gt;
&lt;/dubbo:service&gt;]]></script>
</div></div>
<p>或:(指定合并策略,缺省根据返回值类型自动匹配,如果同一类型有两个合并器时,需指定合并器的名称)<br/>
参见:<a href="Developer+Guide.htm#DeveloperGuide-MergerSPI" tppabs="http://10.20.160.198/wiki/display/dubbo/Developer+Guide#DeveloperGuide-MergerSPI">Merger SPI</a></p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:reference interface="com.xxx.MenuService" group="*"&gt;
&lt;dubbo:method name="getMenuItems" merger="mymerge" /&gt;
&lt;/dubbo:service&gt;]]></script>
</div></div>
<p>或:(指定合并方法,将调用返回结果的指定方法进行合并,合并方法的参数类型必须是返回结果类型本身)</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:reference interface="com.xxx.MenuService" group="*"&gt;
&lt;dubbo:method name="getMenuItems" merger=".addAll" /&gt;
&lt;/dubbo:service&gt;]]></script>
</div></div>
<h3><a name="UserGuide-ParameterValidation"></a>Parameter Validation</h3>
<p>(<a href="Parameter+Validation.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/Parameter+Validation" title="Parameter Validation">+</a>) (<a href="#UserGuide-ParameterValidation">#</a>)</p>
<div class='panelMacro'><table class='tipMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="check.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/check.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>参数验证功能是基于<a href="javascript:if(confirm(%27http://jcp.org/en/jsr/detail?id=303 \n\nThis file was not retrieved by Teleport Ultra, because it is addressed on a domain or path outside the boundaries set for its Starting Address. \n\nDo you want to open it from the server?%27))window.location=%27http://jcp.org/en/jsr/detail?id=303%27" tppabs="http://jcp.org/en/jsr/detail?id=303" class="external-link" rel="nofollow">JSR303</a>实现的,用户只需标识JSR303标准的验证Annotation,并通过声明filter来实现验证。</td></tr></table></div>
<div class='panelMacro'><table class='noteMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="warning-3.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/warning.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>2.1.0以上版本支持</td></tr></table></div>
<p>完整示例代码参见:<a href="javascript:if(confirm(%27http://code.alibabatech.com/svn/dubbo/trunk/dubbo-test/dubbo-test-examples/src/main/java/com/alibaba/dubbo/examples/validation \n\nThis file was not retrieved by Teleport Ultra, because it is addressed on a domain or path outside the boundaries set for its Starting Address. \n\nDo you want to open it from the server?%27))window.location=%27http://code.alibabatech.com/svn/dubbo/trunk/dubbo-test/dubbo-test-examples/src/main/java/com/alibaba/dubbo/examples/validation%27" tppabs="http://code.alibabatech.com/svn/dubbo/trunk/dubbo-test/dubbo-test-examples/src/main/java/com/alibaba/dubbo/examples/validation" class="external-link" rel="nofollow">http://code.alibabatech.com/svn/dubbo/trunk/dubbo-test/dubbo-test-examples/src/main/java/com/alibaba/dubbo/examples/validation</a></p>
<p>验证方式可扩展,参见:<a href="Developer+Guide.htm#DeveloperGuide-Validation" tppabs="http://10.20.160.198/wiki/display/dubbo/Developer+Guide#DeveloperGuide-Validation">Validation扩展点</a></p>
<p>参数标注示例:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: java; gutter: false"><![CDATA[import java.io.Serializable;
import java.util.Date;
import javax.validation.constraints.Future;
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Past;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Size;
public class ValidationParameter implements Serializable {
private static final long serialVersionUID = 7158911668568000392L;
@NotNull // 不允许为空
@Size(min = 1, max = 20) // 长度或大小范围
private String name;
@NotNull(groups = ValidationService.Save.class) // 保存时不允许为空,更新时允许为空 ,表示不更新该字段
@Pattern(regexp = "^\\s*\\w+(?:\\.{0,1}[\\w-]+)*@[a-zA-Z0-9]+(?:[-.][a-zA-Z0-9]+)*\\.[a-zA-Z]+\\s*$")
private String email;
@Min(18) // 最小值
@Max(100) // 最大值
private int age;
@Past // 必须为一个过去的时间
private Date loginDate;
@Future // 必须为一个未来的时间
private Date expiryDate;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Date getLoginDate() {
return loginDate;
}
public void setLoginDate(Date loginDate) {
this.loginDate = loginDate;
}
public Date getExpiryDate() {
return expiryDate;
}
public void setExpiryDate(Date expiryDate) {
this.expiryDate = expiryDate;
}
}]]></script>
</div></div>
<p>分组验证示例:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: java; gutter: false"><![CDATA[public interface ValidationService { // 缺省可按服务接口区分验证场景,如:@NotNull(groups = ValidationService.class)
@interface Save{} // 与方法同名接口,首字母大写,用于区分验证场景,如:@NotNull(groups = ValidationService.Save.class),可选
void save(ValidationParameter parameter);
void update(ValidationParameter parameter);
}]]></script>
</div></div>
<p>关联验证示例:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: java; gutter: false"><![CDATA[import javax.validation.GroupSequence;
public interface ValidationService {
@GroupSequence(Update.class) // 同时验证Update组规则
@interface Save{}
void save(ValidationParameter parameter);
@interface Update{}
void update(ValidationParameter parameter);
}]]></script>
</div></div>
<p>参数验证示例:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: java; gutter: false"><![CDATA[import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
public interface ValidationService {
void save(@NotNull ValidationParameter parameter); // 验证参数不为空
void delete(@Min(1) int id); // 直接对基本类型参数验证
}]]></script>
</div></div>
<p>在客户端验证参数:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:reference id="validationService" interface="com.alibaba.dubbo.examples.validation.api.ValidationService" validation="true" /&gt;]]></script>
</div></div>
<p>在服务器端验证参数:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:service interface="com.alibaba.dubbo.examples.validation.api.ValidationService" ref="validationService" validation="true" /&gt;]]></script>
</div></div>
<p>验证异常信息:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: java; gutter: false"><![CDATA[import javax.validation.ConstraintViolationException;
import javax.validation.ConstraintViolationException;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.alibaba.dubbo.examples.validation.api.ValidationParameter;
import com.alibaba.dubbo.examples.validation.api.ValidationService;
import com.alibaba.dubbo.rpc.RpcException;
public class ValidationConsumer {
public static void main(String[] args) throws Exception {
String config = ValidationConsumer.class.getPackage().getName().replace('.', '/') + "/validation-consumer.xml";
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(config);
context.start();
ValidationService validationService = (ValidationService)context.getBean("validationService");
// Error
try {
parameter = new ValidationParameter();
validationService.save(parameter);
System.out.println("Validation ERROR");
} catch (RpcException e) { // 抛出的是RpcException
ConstraintViolationException ve = (ConstraintViolationException) e.getCause(); // 里面嵌了一个ConstraintViolationException
Set&lt;ConstraintViolation&lt;?&gt;&gt; violations = ve.getConstraintViolations(); // 可以拿到一个验证错误详细信息的集合
System.out.println(violations);
}
}
}]]></script>
</div></div>
<p>需要加入依赖:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dependency&gt;
&lt;groupId&gt;javax.validation&lt;/groupId&gt;
&lt;artifactId&gt;validation-api&lt;/artifactId&gt;
&lt;version&gt;1.0.0.GA&lt;/version&gt;
&lt;/dependency&gt;
&lt;dependency&gt;
&lt;groupId&gt;org.hibernate&lt;/groupId&gt;
&lt;artifactId&gt;hibernate-validator&lt;/artifactId&gt;
&lt;version&gt;4.2.0.Final&lt;/version&gt;
&lt;/dependency&gt;]]></script>
</div></div>
<h3><a name="UserGuide-ResultCache"></a>Result Cache</h3>
<p>(<a href="Result+Cache.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/Result+Cache" title="Result Cache">+</a>) (<a href="#UserGuide-ResultCache">#</a>)</p>
<div class='panelMacro'><table class='tipMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="check.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/check.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>结果缓存,用于加速热门数据的访问速度,Dubbo提供声明式缓存,以减少用户加缓存的工作量。</td></tr></table></div>
<div class='panelMacro'><table class='noteMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="warning-3.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/warning.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>2.1.0以上版本支持</td></tr></table></div>
<p>示例代码:<a href="javascript:if(confirm(%27http://code.alibabatech.com/svn/dubbo/trunk/dubbo-test/dubbo-test-examples/src/main/java/com/alibaba/dubbo/examples/cache \n\nThis file was not retrieved by Teleport Ultra, because it is addressed on a domain or path outside the boundaries set for its Starting Address. \n\nDo you want to open it from the server?%27))window.location=%27http://code.alibabatech.com/svn/dubbo/trunk/dubbo-test/dubbo-test-examples/src/main/java/com/alibaba/dubbo/examples/cache%27" tppabs="http://code.alibabatech.com/svn/dubbo/trunk/dubbo-test/dubbo-test-examples/src/main/java/com/alibaba/dubbo/examples/cache" class="external-link" rel="nofollow">http://code.alibabatech.com/svn/dubbo/trunk/dubbo-test/dubbo-test-examples/src/main/java/com/alibaba/dubbo/examples/cache</a></p>
<ul>
<li>lru 基于最近最少使用原则删除多余缓存,保持最热的数据被缓存。</li>
<li>threadlocal 当前线程缓存,比如一个页面渲染,用到很多portal,每个portal都要去查用户信息,通过线程缓存,可以减少这种多余访问。</li>
<li>jcache 与<a href="javascript:if(confirm(%27http://jcp.org/en/jsr/detail?id=107 \n\nThis file was not retrieved by Teleport Ultra, because it is addressed on a domain or path outside the boundaries set for its Starting Address. \n\nDo you want to open it from the server?%27))window.location=%27http://jcp.org/en/jsr/detail?id=107%27" tppabs="http://jcp.org/en/jsr/detail?id=107" class="external-link" rel="nofollow">JSR107</a>集成,可以桥接各种缓存实现。</li>
</ul>
<p>缓存类型可扩展,参见:<a href="Developer+Guide.htm#DeveloperGuide-CacheFactory" tppabs="http://10.20.160.198/wiki/display/dubbo/Developer+Guide#DeveloperGuide-CacheFactory">CacheFactory扩展点</a></p>
<p>配置如:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:reference interface="com.foo.BarService" cache="lru" /&gt;]]></script>
</div></div>
<p>或:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:reference interface="com.foo.BarService"&gt;
&lt;dubbo:method name="findBar" cache="lru" /&gt;
&lt;/dubbo:reference&gt;]]></script>
</div></div>
<h3><a name="UserGuide-GenericReference"></a>Generic Reference</h3>
<p>(<a href="Generic+Reference.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/Generic+Reference" title="Generic Reference">+</a>) (<a href="#UserGuide-GenericReference">#</a>)</p>
<div class='panelMacro'><table class='tipMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="check.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/check.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>泛接口调用方式主要用于客户端没有API接口及模型类元的情况,参数及返回值中的所有POJO均用Map表示,通常用于框架集成,比如:实现一个通用的服务测试框架,可通过GenericService调用所有服务实现。</td></tr></table></div>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:reference id="barService" interface="com.foo.BarService" generic="true" /&gt;]]></script>
</div></div>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: java; gutter: false"><![CDATA[GenericService barService = (GenericService) applicationContext.getBean("barService");
Object result = barService.$invoke("sayHello", new String[] { "java.lang.String" }, new Object[] { "World" });]]></script>
</div></div>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: java; gutter: false"><![CDATA[import com.alibaba.dubbo.rpc.service.GenericService;
...
// 引用远程服务
ReferenceConfig&lt;GenericService&gt; reference = new ReferenceConfig&lt;GenericService&gt;(); // 该实例很重量,里面封装了所有与注册中心及服务提供方连接,请缓存
reference.setInterface("com.xxx.XxxService"); // 弱类型接口名
reference.setVersion("1.0.0");
reference.setGeneric(true); // 声明为泛化接口
GenericService genericService = reference.get(); // 用com.alibaba.dubbo.rpc.service.GenericService可以替代所有接口引用
// 基本类型以及Date,List,Map等不需要转换,直接调用
Object result = genericService.$invoke("sayHello", new String[] {"java.lang.String"}, new Object[] {"world"});
// 用Map表示POJO参数,如果返回值为POJO也将自动转成Map
Map&lt;String, Object&gt; person = new HashMap&lt;String, Object&gt;();
person.put("name", "xxx");
person.put("password", "yyy");
Object result = genericService.$invoke("findPerson", new String[]{"com.xxx.Person"}, new Object[]{person}); // 如果返回POJO将自动转成Map
...]]></script>
</div></div>
<p>假设存在POJO如: </p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: java; gutter: false"><![CDATA[package com.xxx;
public class PersonImpl implements Person {
private String name;
private String password;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password= password;
}
}]]></script>
</div></div>
<p>则POJO数据: </p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: java; gutter: false"><![CDATA[Person person = new PersonImpl();
person.setName("xxx");
person.setPassword("yyy");]]></script>
</div></div>
<p>可用下面Map表示: </p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: java; gutter: false"><![CDATA[Map&lt;String, Object&gt; map = new HashMap&lt;String, Object&gt;();
map.put("class", "com.xxx.PersonImpl"); // 注意:如果参数类型是接口,或者List等丢失泛型,可通过class属性指定类型。
map.put("name", "xxx");
map.put("password", "yyy");]]></script>
</div></div>
<h3><a name="UserGuide-GenericImplementation"></a>Generic Implementation</h3>
<p>(<a href="Generic+Implementation.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/Generic+Implementation" title="Generic Implementation">+</a>) (<a href="#UserGuide-GenericImplementation">#</a>)</p>
<div class='panelMacro'><table class='tipMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="check.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/check.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>泛接口实现方式主要用于服务器端没有API接口及模型类元的情况,参数及返回值中的所有POJO均用Map表示,通常用于框架集成,比如:实现一个通用的远程服务Mock框架,可通过实现GenericService接口处理所有服务请求。</td></tr></table></div>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;bean id="genericService" class="com.foo.MyGenericService" /&gt;
&lt;dubbo:service interface="com.foo.BarService" ref="genericService" /&gt;]]></script>
</div></div>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: java; gutter: false"><![CDATA[package com.foo;
public class MyGenericService implements GenericService {
public Object $invoke(String methodName, String[] parameterTypes, Object[] args) throws GenericException {
if ("sayHello".equals(methodName)) {
return "Welcome " + args[0];
}
}
}]]></script>
</div></div>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: java; gutter: false"><![CDATA[...
GenericService xxxService = new XxxGenericService(); // 用com.alibaba.dubbo.rpc.service.GenericService可以替代所有接口实现
ServiceConfig&lt;GenericService&gt; service = new ServiceConfig&lt;GenericService&gt;(); // 该实例很重量,里面封装了所有与注册中心,请缓存
service.setInterface("com.xxx.XxxService"); // 弱类型接口名
service.setVersion("1.0.0");
service.setRef(xxxService); // 指向一个通用服务实现
// 暴露及注册服务
service.export();]]></script>
</div></div>
<h3><a name="UserGuide-EchoTest"></a>Echo Test</h3>
<p>(<a href="Echo+Test.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/Echo+Test" title="Echo Test">+</a>) (<a href="#UserGuide-EchoTest">#</a>)</p>
<div class='panelMacro'><table class='tipMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="check.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/check.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>回声测试用于检测服务是否可用,回声测试按照正常请求流程执行,能够测试整个调用是否通畅,可用于监控。</td></tr></table></div>
<div class='panelMacro'><table class='tipMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="check.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/check.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>所有服务自动实现EchoService接口,只需将任意服务引用强制转型为EchoService,即可使用。</td></tr></table></div>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:reference id="memberService" interface="com.xxx.MemberService" /&gt;]]></script>
</div></div>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: java; gutter: false"><![CDATA[MemberService memberService = ctx.getBean("memberService"); // 远程服务引用
EchoService echoService = (EchoService) memberService; // 强制转型为EchoService
String status = echoService.$echo("OK"); // 回声测试可用性
assert(status.equals("OK"))]]></script>
</div></div>
<h3><a name="UserGuide-RpcContext"></a>Rpc Context</h3>
<p>(<a href="Rpc+Context.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/Rpc+Context" title="Rpc Context">+</a>) (<a href="#UserGuide-RpcContext">#</a>)</p>
<div class='panelMacro'><table class='tipMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="check.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/check.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>上下文中存放的是当前调用过程中所需的环境信息。</td></tr></table></div>
<div class='panelMacro'><table class='tipMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="check.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/check.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>所有配置信息都将转换为URL的参数,参见《<a href="User+Guide.htm#UserGuide-ConfigurationReference" tppabs="http://10.20.160.198/wiki/display/dubbo/User+Guide#UserGuide-ConfigurationReference">配置项一览表</a>》中的“对应URL参数”一列。</td></tr></table></div>
<div class='panelMacro'><table class='noteMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="warning-3.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/warning.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td><b>注意</b><br />RpcContext是一个ThreadLocal的临时状态记录器,当接收到RPC请求,或发起RPC请求时,RpcContext的状态都会变化。<br/>
比如:A调B,B再调C,则B机器上,在B调C之前,RpcContext记录的是A调B的信息,在B调C之后,RpcContext记录的是B调C的信息。</td></tr></table></div>
<h4><a name="UserGuide-%281%29%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E6%96%B9"></a>(1) 服务消费方</h4>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: java; gutter: false"><![CDATA[xxxService.xxx(); // 远程调用
boolean isConsumerSide = RpcContext.getContext().isConsumerSide(); // 本端是否为消费端,这里会返回true
String serverIP = RpcContext.getContext().getRemoteHost(); // 获取最后一次调用的提供方IP地址
String application = RpcContext.getContext().getUrl().getParameter("application"); // 获取当前服务配置信息,所有配置信息都将转换为URL的参数
// ...
yyyService.yyy(); // 注意:每发起RPC调用,上下文状态会变化
// ...]]></script>
</div></div>
<h4><a name="UserGuide-%282%29%E6%9C%8D%E5%8A%A1%E6%8F%90%E4%BE%9B%E6%96%B9"></a>(2) 服务提供方</h4>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: java; gutter: false"><![CDATA[public class XxxServiceImpl implements XxxService {
public void xxx() { // 服务方法实现
boolean isProviderSide = RpcContext.getContext().isProviderSide(); // 本端是否为提供端,这里会返回true
String clientIP = RpcContext.getContext().getRemoteHost(); // 获取调用方IP地址
String application = RpcContext.getContext().getUrl().getParameter("application"); // 获取当前服务配置信息,所有配置信息都将转换为URL的参数
// ...
yyyService.yyy(); // 注意:每发起RPC调用,上下文状态会变化
isProviderSide = RpcContext.getContext().isProviderSide(); // 此时本端变成消费端,这里会返回false
// ...
}
}]]></script>
</div></div>
<h3><a name="UserGuide-AttachmentParameter"></a>Attachment Parameter</h3>
<p>(<a href="Attachment+Parameter.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/Attachment+Parameter" title="Attachment Parameter">+</a>) (<a href="#UserGuide-AttachmentParameter">#</a>)</p>
<div class='panelMacro'><table class='noteMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="warning-3.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/warning.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>注:path,group,version,dubbo,token,timeout几个key有特殊处理,请使用其它key值。</td></tr></table></div>
<p><span class="image-wrap" style=""><img src="context.png-version=1&modificationDate=1320941797000.png" tppabs="http://10.20.160.198/wiki/download/attachments/6950004/context.png?version=1&modificationDate=1320941797000" style="border: 0px solid black" /></span></p>
<h4><a name="UserGuide-%281%29%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E6%96%B9"></a>(1) 服务消费方</h4>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: java; gutter: false"><![CDATA[RpcContext.getContext().setAttachment("index", "1"); // 隐式传参,后面的远程调用都会隐式将这些参数发送到服务器端,用于框架集成,不建议常规业务使用
xxxService.xxx(); // 远程调用
// ...]]></script>
</div></div>
<p>【注】 setAttachment设置的KV,在完成下面一次远程调用会被清空。即多次远程调用要多次设置。</p>
<h4><a name="UserGuide-%282%29%E6%9C%8D%E5%8A%A1%E6%8F%90%E4%BE%9B%E6%96%B9"></a>(2) 服务提供方</h4>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: java; gutter: false"><![CDATA[public class XxxServiceImpl implements XxxService {
public void xxx() { // 服务方法实现
String index = RpcContext.getContext().getAttachment("index"); // 获取客户端隐式传入的参数,用于框架集成,不建议常规业务使用
// ...
}
}]]></script>
</div></div>
<h3><a name="UserGuide-AsyncCall"></a>Async Call</h3>
<p>(<a href="Async+Call.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/Async+Call" title="Async Call">+</a>) (<a href="#UserGuide-AsyncCall">#</a>)</p>
<div class='panelMacro'><table class='tipMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="check.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/check.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>基于NIO的非阻塞实现并行调用,客户端不需要启动多线程即可完成并行调用多个远程服务,相对多线程开销较小。</td></tr></table></div>
<div class='panelMacro'><table class='noteMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="warning-3.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/warning.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>2.0.6及其以上版本支持</td></tr></table></div>
<p><span class="image-wrap" style=""><img src="future.jpg-version=1&modificationDate=1320417743000.jpg" tppabs="http://10.20.160.198/wiki/download/attachments/6949442/future.jpg?version=1&modificationDate=1320417743000" style="border: 0px solid black" /></span></p>
<p><b>配置声明:</b></p>
<div class="code panel" style="border-width: 1px;"><div class="codeHeader panelHeader" style="border-bottom-width: 1px;"><b>consumer.xml</b></div><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:reference id="fooService" interface="com.alibaba.foo.FooService"&gt;
&lt;dubbo:method name="findFoo" async="true" /&gt;
&lt;/dubbo:reference&gt;
&lt;dubbo:reference id="barService" interface="com.alibaba.bar.BarService"&gt;
&lt;dubbo:method name="findBar" async="true" /&gt;
&lt;/dubbo:reference&gt;]]></script>
</div></div>
<p><b>调用代码:</b></p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: java; gutter: false"><![CDATA[fooService.findFoo(fooId); // 此调用会立即返回null
Future&lt;Foo&gt; fooFuture = RpcContext.getContext().getFuture(); // 拿到调用的Future引用,当结果返回后,会被通知和设置到此Future。
barService.findBar(barId); // 此调用会立即返回null
Future&lt;Bar&gt; barFuture = RpcContext.getContext().getFuture(); // 拿到调用的Future引用,当结果返回后,会被通知和设置到此Future。
// 此时findFoo和findBar的请求同时在执行,客户端不需要启动多线程来支持并行,而是借助NIO的非阻塞完成。
Foo foo = fooFuture.get(); // 如果foo已返回,直接拿到返回值,否则线程wait住,等待foo返回后,线程会被notify唤醒。
Bar bar = barFuture.get(); // 同理等待bar返回。
// 如果foo需要5秒返回,bar需要6秒返回,实际只需等6秒,即可获取到foo和bar,进行接下来的处理。]]></script>
</div></div>
<p>你也可以设置是否等待消息发出:(异步总是不等待返回)</p>
<ul>
<li>sent="true" 等待消息发出,消息发送失败将抛出异常。</li>
<li>sent="false" 不等待消息发出,将消息放入IO队列,即刻返回。
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:method name="findFoo" async="true" sent="true" /&gt;]]></script>
</div></div></li>
</ul>
<p>如果你只是想异步,完全忽略返回值,可以配置return="false",以减少Future对象的创建和管理成本:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:method name="findFoo" async="true" return="false" /&gt;]]></script>
</div></div>
<h3><a name="UserGuide-LocalCall"></a>Local Call</h3>
<p>(<a href="Local+Call.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/Local+Call" title="Local Call">+</a>) (<a href="#UserGuide-LocalCall">&#35;</a>)</p>
<div class='panelMacro'><table class='tipMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="check.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/check.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>本地调用,使用了Injvm协议,是一个伪协议,它不开启端口,不发起远程调用,只在JVM内直接关联,但执行Dubbo的Filter链。</td></tr></table></div>
<p>Define injvm protocol:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:protocol name="injvm" /&gt;]]></script>
</div></div>
<p>Set default protocol:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:provider protocol="injvm" /&gt;]]></script>
</div></div>
<p>Set service protocol:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:service protocol="injvm" /&gt;]]></script>
</div></div>
<p>Use injvm first:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:consumer injvm="true" .../&gt;
&lt;dubbo:provider injvm="true" .../&gt;]]></script>
</div></div>
<p></p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:reference injvm="true" .../&gt;
&lt;dubbo:service injvm="true" .../&gt;]]></script>
</div></div>
<div class='panelMacro'><table class='tipMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="check.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/check.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>注意:服务暴露与服务引用都需要声明injvm="true"</td></tr></table></div>
<h3><a name="UserGuide-ParameterCallback"></a>Parameter Callback</h3>
<p>(<a href="Parameter+Callback.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/Parameter+Callback" title="Parameter Callback">+</a>) (<a href="#UserGuide-ParameterCallback">#</a>)</p>
<div class='panelMacro'><table class='tipMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="check.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/check.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>参数回调方式与调用本地callback或listener相同,只需要在Spring的配置文件中声明哪个参数是callback类型即可,Dubbo将基于长连接生成反向代理,这样就可以从服务器端调用客户端逻辑。</td></tr></table></div>
<div class='panelMacro'><table class='noteMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="warning-3.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/warning.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>2.0.6及其以上版本支持</td></tr></table></div>
<p>代码参见:<a href="javascript:if(confirm(%27http://code.alibabatech.com/svn/dubbo/trunk/dubbo-test/dubbo-test-examples/src/main/java/com/alibaba/dubbo/examples/callback \n\nThis file was not retrieved by Teleport Ultra, because it is addressed on a domain or path outside the boundaries set for its Starting Address. \n\nDo you want to open it from the server?%27))window.location=%27http://code.alibabatech.com/svn/dubbo/trunk/dubbo-test/dubbo-test-examples/src/main/java/com/alibaba/dubbo/examples/callback%27" tppabs="http://code.alibabatech.com/svn/dubbo/trunk/dubbo-test/dubbo-test-examples/src/main/java/com/alibaba/dubbo/examples/callback" class="external-link" rel="nofollow">http://code.alibabatech.com/svn/dubbo/trunk/dubbo-test/dubbo-test-examples/src/main/java/com/alibaba/dubbo/examples/callback</a></p>
<p><b>(1) 共享服务接口:</b></p>
<p>服务接口示例:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeHeader panelHeader" style="border-bottom-width: 1px;"><b>CallbackService.java</b></div><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: java; gutter: false"><![CDATA[package com.callback;
public interface CallbackService {
void addListener(String key, CallbackListener listener);
}]]></script>
</div></div>
<div class="code panel" style="border-width: 1px;"><div class="codeHeader panelHeader" style="border-bottom-width: 1px;"><b>CallbackListener.java</b></div><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: java; gutter: false"><![CDATA[package com.callback;
public interface CallbackListener {
void changed(String msg);
}]]></script>
</div></div>
<p><b>(2) 服务提供者:</b></p>
<p>服务提供者接口实现示例:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeHeader panelHeader" style="border-bottom-width: 1px;"><b>CallbackServiceImpl.java</b></div><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: java; gutter: false"><![CDATA[package com.callback.impl;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import com.callback.CallbackListener;
import com.callback.CallbackService;
public class CallbackServiceImpl implements CallbackService {
private final Map&lt;String, CallbackListener&gt; listeners = new ConcurrentHashMap&lt;String, CallbackListener&gt;();
public CallbackServiceImpl() {
Thread t = new Thread(new Runnable() {
public void run() {
while(true) {
try {
for(Map.Entry&lt;String, CallbackListener&gt; entry : listeners.entrySet()){
try {
entry.getValue().changed(getChanged(entry.getKey()));
} catch (Throwable t) {
listeners.remove(entry.getKey());
}
}
Thread.sleep(5000); // 定时触发变更通知
} catch (Throwable t) { // 防御容错
t.printStackTrace();
}
}
}
});
t.setDaemon(true);
t.start();
}
public void addListener(String key, CallbackListener listener) {
listeners.put(key, listener);
listener.changed(getChanged(key)); // 发送变更通知
}
private String getChanged(String key) {
return "Changed: " + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
}
}]]></script>
</div></div>
<p>服务提供者配置示例:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;bean id="callbackService" class="com.callback.impl.CallbackServiceImpl" /&gt;
&lt;dubbo:service interface="com.callback.CallbackService" ref="callbackService" connections="1" callbacks="1000"&gt;
&lt;dubbo:method name="addListener"&gt;
&lt;dubbo:argument index="1" callback="true" /&gt;
&lt;!--也可以通过指定类型的方式--&gt;
&lt;!--&lt;dubbo:argument type="com.demo.CallbackListener" callback="true" /&gt;--&gt;
&lt;/dubbo:method&gt;
&lt;/dubbo:service&gt;]]></script>
</div></div>
<p><b>(2) 服务消费者:</b></p>
<p>服务消费者配置示例:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeHeader panelHeader" style="border-bottom-width: 1px;"><b>consumer.xml</b></div><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:reference id="callbackService" interface="com.callback.CallbackService" /&gt;]]></script>
</div></div>
<p>服务消费者调用示例:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeHeader panelHeader" style="border-bottom-width: 1px;"><b>CallbackServiceTest.java</b></div><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: java; gutter: false"><![CDATA[ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath:consumer.xml");
context.start();
CallbackService callbackService = (CallbackService) context.getBean("callbackService");
callbackService.addListener("http://10.20.160.198/wiki/display/dubbo/foo.bar", new CallbackListener(){
public void changed(String msg) {
System.out.println("callback1:" + msg);
}
});]]></script>
</div></div>
<h3><a name="UserGuide-EventNotify"></a>Event Notify</h3>
<p>(<a href="Event+Notify.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/Event+Notify" title="Event Notify">+</a>) (<a href="#UserGuide-EventNotify">#</a>)</p>
<div class='panelMacro'><table class='tipMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="check.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/check.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>在调用之前,调用之后,出现异常时,会触发oninvoke, onreturn, onthrow三个事件,可以配置当事件发生时,通知哪个类的哪个方法。</td></tr></table></div>
<div class='panelMacro'><table class='noteMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="warning-3.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/warning.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>支持版本:2.0.7之后</td></tr></table></div>
<p><b>(1) 服务提供者与消费者共享服务接口:</b></p>
<div class="code panel" style="border-width: 1px;"><div class="codeHeader panelHeader" style="border-bottom-width: 1px;"><b>IDemoService.java</b></div><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: java; gutter: false"><![CDATA[interface IDemoService {
public Person get(int id);
}]]></script>
</div></div>
<p><b>(2) 服务提供者实现:</b></p>
<div class="code panel" style="border-width: 1px;"><div class="codeHeader panelHeader" style="border-bottom-width: 1px;"><b>DemoServiceImpl.java</b></div><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: java; gutter: false"><![CDATA[class NormalDemoService implements IDemoService {
public Person get(int id) {
return new Person(id, "charles`son", 4);
}
}]]></script>
</div></div>
<p><b>(3) 服务提供者配置:</b></p>
<div class="code panel" style="border-width: 1px;"><div class="codeHeader panelHeader" style="border-bottom-width: 1px;"><b>provider.xml</b></div><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:application name="rpc-callback-demo" /&gt;
&lt;dubbo:registry address="http://10.20.160.198/wiki/display/dubbo/10.20.153.186" /&gt;
&lt;bean id="demoService" class="com.alibaba.dubbo.callback.implicit.NormalDemoService" /&gt;
&lt;dubbo:service interface="com.alibaba.dubbo.callback.implicit.IDemoService" ref="demoService" version="1.0.0" group="cn"/&gt;]]></script>
</div></div>
<p><b>(4) 服务消费者Callback接口及实现:</b></p>
<div class="code panel" style="border-width: 1px;"><div class="codeHeader panelHeader" style="border-bottom-width: 1px;"><b>Nofify.java</b></div><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: java; gutter: false"><![CDATA[interface Nofify {
public void onreturn(Person msg, Integer id);
public void onthrow(Throwable ex, Integer id);
}]]></script>
</div></div>
<div class="code panel" style="border-width: 1px;"><div class="codeHeader panelHeader" style="border-bottom-width: 1px;"><b>NofifyImpl.java</b></div><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: java; gutter: false"><![CDATA[class NofifyImpl implements Nofify {
public Map&lt;Integer, Person&gt; ret = new HashMap&lt;Integer, Person&gt;();
public Map&lt;Integer, Throwable&gt; errors = new HashMap&lt;Integer, Throwable&gt;();
public void onreturn(Person msg, Integer id) {
System.out.println("onreturn:" + msg);
ret.put(id, msg);
}
public void onthrow(Throwable ex, Integer id) {
errors.put(id, ex);
}
}]]></script>
</div></div>
<p><b>(5) 服务消费者Callback接口及实现:</b></p>
<div class="code panel" style="border-width: 1px;"><div class="codeHeader panelHeader" style="border-bottom-width: 1px;"><b>consumer.xml</b></div><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;bean id ="demoCallback" class = "com.alibaba.dubbo.callback.implicit.NofifyImpl" /&gt;
&lt;dubbo:reference id="demoService" interface="com.alibaba.dubbo.callback.implicit.IDemoService" version="1.0.0" group="cn" &gt;
&lt;dubbo:method name="get" async="true" onreturn = "demoCallback.onreturn" onthrow="demoCallback.onthrow" /&gt;
&lt;/dubbo:reference&gt;]]></script>
</div></div>
<div class='panelMacro'><table class='tipMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="check.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/check.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>注:<br/>
callback与async功能正交分解:<br/>
async=true,表示结果是否马上返回.<br/>
onreturn 表示是否需要回调.
<p>组合情况:(async=false 默认)<br/>
异步回调模式:async=true onreturn="xxx"<br/>
同步回调模式:async=false onreturn="xxx"<br/>
异步无回调 :async=true<br/>
同步无回调 :async=false</p></td></tr></table></div>
<p><b>(6) TEST CASE:</b></p>
<div class="code panel" style="border-width: 1px;"><div class="codeHeader panelHeader" style="border-bottom-width: 1px;"><b>Test.java</b></div><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: java; gutter: false"><![CDATA[IDemoService demoService = (IDemoService) context.getBean("demoService");
NofifyImpl notify = (NofifyImpl) context.getBean("demoCallback");
int requestId = 2;
Person ret = demoService.get(requestId);
Assert.assertEquals(null, ret);
//for Test:只是用来说明callback正常被调用,业务具体实现自行决定.
for (int i = 0; i &lt; 10; i++) {
if (!notify.ret.containsKey(requestId)) {
Thread.sleep(200);
} else {
break;
}
}
Assert.assertEquals(requestId, notify.ret.get(requestId).getId());]]></script>
</div></div>
<h3><a name="UserGuide-StubProxy"></a>Stub Proxy</h3>
<p>(<a href="Stub+Proxy.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/Stub+Proxy" title="Stub Proxy">+</a>) (<a href="#UserGuide-StubProxy">#</a>)</p>
<div class='panelMacro'><table class='tipMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="check.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/check.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>远程服务后,客户端通常只剩下接口,而实现全在服务器端,但提供方有些时候想在客户端也执行部分逻辑,比如:做ThreadLocal缓存,提前验证参数,调用失败后伪造容错数据等等,此时就需要在API中带上Stub,客户端生成Proxy实,会把Proxy通过构造函数传给Stub,然后把Stub暴露组给用户,Stub可以决定要不要去调Proxy。</td></tr></table></div>
<div class='panelMacro'><table class='noteMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="warning-3.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/warning.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>Stub必须有可传入Proxy的构造函数。</td></tr></table></div>
<p><span class="image-wrap" style=""><img src="stub.jpg-version=1&modificationDate=1320417778000.jpg" tppabs="http://10.20.160.198/wiki/download/attachments/6949448/stub.jpg?version=1&modificationDate=1320417778000" style="border: 0px solid black" /></span></p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:service interface="com.foo.BarService" stub="true" /&gt;]]></script>
</div></div>
<p>Or:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:service interface="com.foo.BarService" stub="com.foo.BarServiceStub" /&gt;]]></script>
</div></div>
<p>api.jar:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: text; gutter: false"><![CDATA[com.foo.BarService
com.foo.BarServiceStub // 在API旁边放一个Stub实现,它实现BarService接口,并有一个传入远程BarService实例的构造函数]]></script>
</div></div>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: java; gutter: false"><![CDATA[package com.foo
public class BarServiceStub implements BarService {
private final BarService barService;
// 构造函数传入真正的远程代理对象
public (BarService barService) {
this.barService = barService;
}
public String sayHello(String name) {
// 此代码在客户端执行
// 你可以在客户端做ThreadLocal本地缓存,或预先验证参数是否合法,等等
try {
return barService.sayHello(name);
} catch (Exception e) {
// 你可以容错,可以做任何AOP拦截事项
return "容错数据";
}
}
}]]></script>
</div></div>
<h3><a name="UserGuide-MockProxy"></a>Mock Proxy</h3>
<p>(<a href="Mock+Proxy.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/Mock+Proxy" title="Mock Proxy">+</a>) (<a href="#UserGuide-MockProxy">#</a>)</p>
<div class='panelMacro'><table class='tipMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="check.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/check.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>Mock通常用于服务降级,比如某验权服务,当服务提供方全部挂掉后,客户端不抛出异常,而是通过Mock数据返回授权失败。</td></tr></table></div>
<div class='panelMacro'><table class='tipMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="check.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/check.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>Mock是Stub的一个子集,便于服务提供方在客户端执行容错逻辑,因经常需要在出现RpcException(比如网络失败,超时等)时进行容错,而在出现业务异常(比如登录用户名密码错误)时不需要容错,如果用Stub,可能就需要捕获并依赖RpcException类,而用Mock就可以不依赖RpcException,因为它的约定就是只有出现RpcException时才执行。</td></tr></table></div>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:service interface="com.foo.BarService" mock="true" /&gt;]]></script>
</div></div>
<p>Or:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:service interface="com.foo.BarService" mock="com.foo.BarServiceMock" /&gt;]]></script>
</div></div>
<p>api.jar:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: text; gutter: false"><![CDATA[com.foo.BarService
com.foo.BarServiceMock // 在API旁边放一个Mock实现,它实现BarService接口,并有一个无参构造函数]]></script>
</div></div>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: java; gutter: false"><![CDATA[package com.foo
public class BarServiceMock implements BarService {
public String sayHello(String name) {
// 你可以伪造容错数据,此方法只在出现RpcException时被执行
return "容错数据";
}
}]]></script>
</div></div>
<p>如果服务的消费方经常需要try-catch捕获异常,如:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: java; gutter: false"><![CDATA[Offer offer = null;
try {
offer = offerService.findOffer(offerId);
} catch (RpcException e) {
logger.error(e);
}]]></script>
</div></div>
<p>请考虑改为Mock实现,并在Mock中return null。</p>
<p>如果只是想简单的忽略异常,在2.0.11以上版本可用:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:service interface="com.foo.BarService" mock="return null" /&gt;]]></script>
</div></div>
<h3><a name="UserGuide-DelayExport"></a>Delay Export</h3>
<p>(<a href="Delay+Export.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/Delay+Export" title="Delay Export">+</a>) (<a href="#UserGuide-DelayExport">#</a>)</p>
<div class='panelMacro'><table class='tipMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="check.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/check.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>如果你的服务需要Warmup时间,比如初始化缓存,等待相关资源就位等,可以使用delay进行延迟暴露。</td></tr></table></div>
<p>延迟5秒暴露服务:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:service delay="5000" /&gt;]]></script>
</div></div>
<p>延迟到Spring初始化完成后,再暴露服务:(基于Spring的ContextRefreshedEvent事件触发暴露)</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:service delay="-1" /&gt;]]></script>
</div></div>
<div class='panelMacro'><table class='noteMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="warning-3.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/warning.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td><b>Spring2.x初始化死锁问题</b><br />在Spring解析到&lt;dubbo:service /&gt;时,就已经向外暴露了服务,而Spring还在接着初始化其它Bean。<br/>
如果这时有请求进来,并且服务的实现类里有调用applicationContext.getBean()的用法。
<p>1. 请求线程的applicationContext.getBean()调用,先同步singletonObjects判断Bean是否存在,不存在就同步beanDefinitionMap进行初始化,并再次同步singletonObjects写入Bean实例缓存。<br/>
<span class="image-wrap" style=""><img src="lock-get-bean.jpg-version=1&modificationDate=1330949876000.jpg" tppabs="http://10.20.160.198/wiki/download/attachments/6950732/lock-get-bean.jpg?version=1&modificationDate=1330949876000" style="border: 0px solid black" /></span><br/>
2. 而Spring初始化线程,因不需要判断Bean的存在,直接同步beanDefinitionMap进行初始化,并同步singletonObjects写入Bean实例缓存。<br/>
<span class="image-wrap" style=""><img src="lock-init-context.jpg-version=1&modificationDate=1330949881000.jpg" tppabs="http://10.20.160.198/wiki/download/attachments/6950732/lock-init-context.jpg?version=1&modificationDate=1330949881000" style="border: 0px solid black" /></span></p>
<p>这样就导致getBean线程,先锁singletonObjects,再锁beanDefinitionMap,再次锁singletonObjects。<br/>
而Spring初始化线程,先锁beanDefinitionMap,再锁singletonObjects。<br/>
反向锁导致线程死锁,不能提供服务,启动不了。</p></td></tr></table></div>
<div class='panelMacro'><table class='tipMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="check.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/check.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td><b>规避办法</b><br />1. 强烈建议不要在服务的实现类中有applicationContext.getBean()的调用,全部采用IoC注入的方式使用Spring的Bean。<br/>
2. 如果实在要调getBean(),可以将Dubbo的配置放在Spring的最后加载。<br/>
3. 如果不想依赖配置顺序,可以使用&lt;dubbo:provider deplay=”-1” /&gt;,使Dubbo在Spring容器初始化完后,再暴露服务。<br/>
4. 如果大量使用getBean(),相当于已经把Spring退化为工厂模式在用,可以将Dubbo的服务隔离单独的Spring容器。</td></tr></table></div>
<h3><a name="UserGuide-ConcurrentControl"></a>Concurrent Control</h3>
<p>(<a href="Concurrent+Control.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/Concurrent+Control" title="Concurrent Control">+</a>) (<a href="#UserGuide-ConcurrentControl">#</a>)</p>
<p>限制com.foo.BarService的每个方法,<b>服务器端</b>并发执行(或占用线程池线程数)不能超过10个:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:service interface="com.foo.BarService" executes="10" /&gt;]]></script>
</div></div>
<p>限制com.foo.BarService的sayHello方法,<b>服务器端</b>并发执行(或占用线程池线程数)不能超过10个:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:service interface="com.foo.BarService"&gt;
&lt;dubbo:method name="sayHello" executes="10" /&gt;
&lt;/dubbo:service&gt;]]></script>
</div></div>
<p>限制com.foo.BarService的每个方法,每<b>客户端</b>并发执行(或占用连接的请求数)不能超过10个:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:service interface="com.foo.BarService" actives="10" /&gt;]]></script>
</div></div>
<p>Or:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:reference interface="com.foo.BarService" actives="10" /&gt;]]></script>
</div></div>
<p>限制com.foo.BarService的sayHello方法,每<b>客户端</b>并发执行(或占用连接的请求数)不能超过10个:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:service interface="com.foo.BarService"&gt;
&lt;dubbo:method name="sayHello" actives="10" /&gt;
&lt;/dubbo:service&gt;]]></script>
</div></div>
<p>Or:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:reference interface="com.foo.BarService"&gt;
&lt;dubbo:method name="sayHello" actives="10" /&gt;
&lt;/dubbo:service&gt;]]></script>
</div></div>
<p>如果&lt;dubbo:service&gt;和&lt;dubbo:reference&gt;都配了actives,&lt;dubbo:reference&gt;优先,参见:<a href="Configuration+Reference.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/Configuration+Reference" title="Configuration Reference">配置的覆盖策略</a></p>
<p>Load Balance均衡:</p>
<p>配置服务的<b>客户端</b>的loadbalance属性为leastactive,此Loadbalance会调用并发数最小的Provider(Consumer端并发数)。</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:reference interface="com.foo.BarService" loadbalance="leastactive" /&gt;]]></script>
</div></div>
<p>Or:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:service interface="com.foo.BarService" loadbalance="leastactive" /&gt;]]></script>
</div></div>
<h3><a name="UserGuide-ConnectionControl"></a>Connection Control</h3>
<p>(<a href="Connection+Control.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/Connection+Control" title="Connection Control">+</a>) (<a href="#UserGuide-ConnectionControl">#</a>)</p>
<p>限制<b>服务器端</b>接受的连接不能超过10个:(以连接在Server上,所以配置在Provider上)</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:provider protocol="dubbo" accepts="10" /&gt;]]></script>
</div></div>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:protocol name="dubbo" accepts="10" /&gt;]]></script>
</div></div>
<p>限制<b>客户端服务</b>使用连接连接数:(如果是长连接,比如Dubbo协议,connections表示该服务对每个提供者建立的长连接数)</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:reference interface="com.foo.BarService" connections="10" /&gt;]]></script>
</div></div>
<p>Or:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:service interface="com.foo.BarService" connections="10" /&gt;]]></script>
</div></div>
<p>如果&lt;dubbo:service&gt;和&lt;dubbo:reference&gt;都配了connections,&lt;dubbo:reference&gt;优先,参见:<a href="Configuration+Reference.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/Configuration+Reference" title="Configuration Reference">配置的覆盖策略</a></p>
<h3><a name="UserGuide-LazyConnection"></a>Lazy Connection</h3>
<p>(<a href="Lazy+Connection.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/Lazy+Connection" title="Lazy Connection">+</a>) (<a href="#UserGuide-LazyConnection">#</a>)</p>
<div class='panelMacro'><table class='tipMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="check.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/check.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>延迟连接,用于减少长连接数,当有调用发起时,再创建长连接。</td></tr></table></div>
<div class='panelMacro'><table class='noteMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="warning-3.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/warning.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>只对使用长连接的dubbo协议生效。</td></tr></table></div>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:protocol name="dubbo" lazy="true" /&gt;]]></script>
</div></div>
<h3><a name="UserGuide-StickyConnection"></a>Sticky Connection</h3>
<p>(<a href="Sticky+Connection.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/Sticky+Connection" title="Sticky Connection">+</a>) (<a href="#UserGuide-StickyConnection">#</a>)</p>
<div class='panelMacro'><table class='tipMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="check.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/check.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>粘滞连接用于有状态服务,尽可能让客户端总是向同一提供者发起调用,除非该提供者挂了,再连另一台。</td></tr></table></div>
<div class='panelMacro'><table class='tipMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="check.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/check.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>粘滞连接将自动开启延迟连接,以减少长连接数,参见:<a href="#UserGuide-LazyConnection">Lazy Connection</a> (<a href="Lazy+Connection.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/Lazy+Connection" title="Lazy Connection">+</a>)</td></tr></table></div>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:protocol name="dubbo" sticky="true" /&gt;]]></script>
</div></div>
<h3><a name="UserGuide-TokenVerify"></a>Token Verify</h3>
<p>(<a href="Token+Verify.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/Token+Verify" title="Token Verify">+</a>) (<a href="#UserGuide-TokenVerify">#</a>)</p>
<p><span class="image-wrap" style=""><img src="dubbo-token.jpg-version=1&modificationDate=1326472608000.jpg" tppabs="http://10.20.160.198/wiki/download/attachments/6950705/dubbo-token.jpg?version=1&modificationDate=1326472608000" style="border: 0px solid black" /></span></p>
<ul>
<li>防止消费者绕过注册中心访问提供者</li>
<li>在注册中心控制权限,以决定要不要下发令牌给消费者</li>
<li>注册中心可灵活改变授权方式,而不需修改或升级提供者</li>
</ul>
<p>可以全局设置开启令牌验证:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;!--随机token令牌,使用UUID生成--&gt;
&lt;dubbo:provider interface="com.foo.BarService" token="true" /&gt;]]></script>
</div></div>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;!--固定token令牌,相当于密码--&gt;
&lt;dubbo:provider interface="com.foo.BarService" token="123456" /&gt;]]></script>
</div></div>
<p>也可在服务级别设置:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;!--随机token令牌,使用UUID生成--&gt;
&lt;dubbo:service interface="com.foo.BarService" token="true" /&gt;]]></script>
</div></div>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;!--固定token令牌,相当于密码--&gt;
&lt;dubbo:service interface="com.foo.BarService" token="123456" /&gt;]]></script>
</div></div>
<p>还可在协议级别设置:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;!--随机token令牌,使用UUID生成--&gt;
&lt;dubbo:protocol name="dubbo" token="true" /&gt;]]></script>
</div></div>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;!--固定token令牌,相当于密码--&gt;
&lt;dubbo:protocol name="dubbo" token="123456" /&gt;]]></script>
</div></div>
<h3><a name="UserGuide-RouterRule"></a>Router Rule</h3>
<p>(<a href="Router+Rule.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/Router+Rule" title="Router Rule">+</a>) (<a href="#UserGuide-RouterRule">#</a>)</p>
<div class='panelMacro'><table class='noteMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="warning-3.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/warning.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>2.2.0以上版本支持</td></tr></table></div>
<div class='panelMacro'><table class='tipMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="check.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/check.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>路由规则扩展点:<a href="Developer+Guide.htm#DeveloperGuide-RouterFactorySPI" tppabs="http://10.20.160.198/wiki/display/dubbo/Developer+Guide#DeveloperGuide-RouterFactorySPI">Router Factory SPI</a></td></tr></table></div>
<p>向注册中心写入路由规则:(通常由监控中心或治理中心的页面完成)</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: java; gutter: false"><![CDATA[RegistryFactory registryFactory = ExtensionLoader.getExtensionLoader(RegistryFactory.class).getAdaptiveExtension();
Registry registry = registryFactory.getRegistry(URL.valueOf("zookeeper://10.20.153.10:2181"));
registry.register(URL.valueOf("condition://0.0.0.0/com.foo.BarService?category=routers&amp;dynamic=false&amp;rule=" + URL.encode("http://10.20.160.198/wiki/display/dubbo/host = 10.20.153.10 => host = 10.20.153.11") + "));]]></script>
</div></div>
<p>其中:</p>
<ul>
<li>condition://
<ul>
<li>表示路由规则的类型,支持<a href="#UserGuide-ConditionRouterRule">Condition Router Rule</a><a href="#UserGuide-ScriptRouterRule">Script Router Rule</a>,可扩展,必填。</li>
</ul>
</li>
<li>0.0.0.0
<ul>
<li>表示对所有IP地址生效,如果只想对某个IP的生效,请填入具体IP,必填。</li>
</ul>
</li>
<li>com.foo.BarService
<ul>
<li>表示只对指定服务生效,必填。</li>
</ul>
</li>
<li>category=routers
<ul>
<li>表示该数据为动态配置类型,必填。</li>
</ul>
</li>
<li>dynamic=false
<ul>
<li>表示该数据为持久数据,当注册方退出时,数据依然保存在注册中心,必填。</li>
</ul>
</li>
<li>enabled=true
<ul>
<li>覆盖规则是否生效,可不填,缺省生效。</li>
</ul>
</li>
<li>force=false
<ul>
<li>当路由结果为空时,是否强制执行,如果不强制执行,路由结果为空的路由规则将自动失效,可不填,缺省为flase。</li>
</ul>
</li>
<li>runtime=false
<ul>
<li>是否在每次调用时执行路由规则,否则只在提供者地址列表变更时预先执行并缓存结果,调用时直接从缓存中获取路由结果。</li>
<li>如果用了参数路由,必须设为true,需要注意设置会影响调用的性能,可不填,缺省为flase。</li>
</ul>
</li>
<li>priority=1
<ul>
<li>路由规则的优先级,用于排序,优先级越大越靠前执行,可不填,缺省为0。</li>
</ul>
</li>
<li>rule=URL.encode("host = 10.20.153.10 =&gt; host = 10.20.153.11")
<ul>
<li>表示路由规则的内容,必填。</li>
</ul>
</li>
</ul>
<h4><a name="UserGuide-ConditionRouterRule"></a>Condition Router Rule</h4>
<p>(<a href="#UserGuide-ConditionRouterRule">#</a>)</p>
<p>基于条件表达式的路由规则,如:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: java; gutter: false"><![CDATA[host = 10.20.153.10 =&gt; host = 10.20.153.11]]></script>
</div></div>
<p>规则:</p>
<ul>
<li>"=&gt;"之前的为消费者匹配条件,所有参数和消费者的URL进行对比,当消费者满足匹配条件时,对该消费者执行后面的过滤规则。</li>
<li>"=&gt;"之后为提供者地址列表的过滤条件,所有参数和提供者的URL进行对比,消费者最终只拿到过滤后的地址列表。</li>
<li>如果匹配条件为空,表示对所有消费方应用,如:=&gt; host != 10.20.153.11</li>
<li>如果过滤条件为空,表示禁止访问,如:host = 10.20.153.10 =&gt;</li>
</ul>
<p>表达式:</p>
<ul>
<li>参数支持:
<ul>
<li>服务调用信息,如:method, <del>argument</del><del>(暂不支持参数路由)</del></li>
<li>URL本身的字段,如:protocol, host, port 等</li>
<li>以及URL上的所有参数,如:application, organization 等</li>
</ul>
</li>
<li>条件支持:
<ul>
<li>等号"="表示"匹配",如:host = 10.20.153.10</li>
<li>不等号"!="表示"不匹配",如:host != 10.20.153.10</li>
</ul>
</li>
<li>值支持:
<ul>
<li>以逗号","分隔多个值,如:host != 10.20.153.10,10.20.153.11</li>
<li>以星号"&#42;"结尾,表示通配,如:host != 10.20.*</li>
<li>以美元符"$"开头,表示引用消费者参数,如:host = $host</li>
</ul>
</li>
</ul>
<p>示例:</p>
<p>1. 排除预发布机:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: java; gutter: false"><![CDATA[=&gt; host != 172.22.3.91]]></script>
</div></div>
<p>2. 白名单:(注意:一个服务只能有一条白名单规则,否则两条规则交叉,就都被筛选掉了)</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: java; gutter: false"><![CDATA[host != 10.20.153.10,10.20.153.11 =&gt;]]></script>
</div></div>
<p>3. 黑名单:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: java; gutter: false"><![CDATA[host = 10.20.153.10,10.20.153.11 =&gt;]]></script>
</div></div>
<p>4. 服务寄宿在应用上,只暴露一部分的机器,防止整个集群挂掉:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: java; gutter: false"><![CDATA[=&gt; host = 172.22.3.1*,172.22.3.2*]]></script>
</div></div>
<p>5. 为重要应用提供额外的机器:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: java; gutter: false"><![CDATA[application != kylin =&gt; host != 172.22.3.95,172.22.3.96]]></script>
</div></div>
<p>6. 读写分离:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: java; gutter: false"><![CDATA[method = find*,list*,get*,is* =&gt; host = 172.22.3.94,172.22.3.95,172.22.3.96]]></script>
</div></div>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: java; gutter: false"><![CDATA[method != find*,list*,get*,is* =&gt; host = 172.22.3.97,172.22.3.98]]></script>
</div></div>
<p>7. 前后台分离:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: java; gutter: false"><![CDATA[application = bops =&gt; host = 172.22.3.91,172.22.3.92,172.22.3.93]]></script>
</div></div>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: java; gutter: false"><![CDATA[application != bops =&gt; host = 172.22.3.94,172.22.3.95,172.22.3.96]]></script>
</div></div>
<p>8. 隔离不同机房网段:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: java; gutter: false"><![CDATA[host != 172.22.3.* =&gt; host != 172.22.3.*]]></script>
</div></div>
<p>9. 提供者与消费者部署在同集群内,本机只访问本机的服务:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: java; gutter: false"><![CDATA[=&gt; host = $host]]></script>
</div></div>
<h4><a name="UserGuide-ScriptRouterRule"></a>Script Router Rule</h4>
<p>(<a href="#UserGuide-ScriptRouterRule">#</a>)</p>
<div class='panelMacro'><table class='tipMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="check.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/check.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>支持<a href="javascript:if(confirm(%27http://java.sun.com/developer/technicalArticles/J2SE/Desktop/scripting \n\nThis file was not retrieved by Teleport Ultra, because it is addressed on a domain or path outside the boundaries set for its Starting Address. \n\nDo you want to open it from the server?%27))window.location=%27http://java.sun.com/developer/technicalArticles/J2SE/Desktop/scripting%27" tppabs="http://java.sun.com/developer/technicalArticles/J2SE/Desktop/scripting" class="external-link" rel="nofollow">JDK脚本引擎</a>的所有脚本,比如:javascript,jruby,groovy等,通过type=javascript参数设置脚本类型,缺省为javascript。</td></tr></table></div>
<div class='panelMacro'><table class='noteMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="warning-3.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/warning.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>脚本没有沙箱约束,可执行任意代码,存在后门风险</td></tr></table></div>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: java; gutter: false"><![CDATA["script://0.0.0.0/com.foo.BarService?category=routers&amp;dynamic=false&amp;rule=" + URL.encode("function route(invokers) { ... } (invokers)")]]></script>
</div></div>
<p>基于脚本引擎的路由规则,如:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: javascript; gutter: false"><![CDATA[function route(invokers) {
var result = new java.util.ArrayList(invokers.size());
for (i = 0; i &lt; invokers.size(); i ++) {
if ("http://10.20.160.198/wiki/display/dubbo/10.20.153.10".equals(invokers.get(i).getUrl().getHost())) {
result.add(invokers.get(i));
}
}
return result;
} (invokers); // 表示立即执行方法]]></script>
</div></div>
<h3><a name="UserGuide-ConfiguratorRule"></a>Configurator Rule</h3>
<p>(<a href="Configurator+Rule.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/Configurator+Rule" title="Configurator Rule">+</a>) (<a href="#UserGuide-ConfiguratorRule">#</a>)</p>
<div class='panelMacro'><table class='noteMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="warning-3.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/warning.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>2.2.0以上版本支持</td></tr></table></div>
<p>向注册中心写入动态配置覆盖规则:(通常由监控中心或治理中心的页面完成)</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: java; gutter: false"><![CDATA[RegistryFactory registryFactory = ExtensionLoader.getExtensionLoader(RegistryFactory.class).getAdaptiveExtension();
Registry registry = registryFactory.getRegistry(URL.valueOf("zookeeper://10.20.153.10:2181"));
registry.register(URL.valueOf("override://0.0.0.0/com.foo.BarService?category=configurators&amp;dynamic=false&amp;application=foo&amp;timeout=1000"));]]></script>
</div></div>
<p>其中:</p>
<ul>
<li>override://
<ul>
<li>表示数据采用覆盖方式,支持override和absent,可扩展,必填。</li>
</ul>
</li>
<li>0.0.0.0
<ul>
<li>表示对所有IP地址生效,如果只想覆盖某个IP的数据,请填入具体IP,必填。</li>
</ul>
</li>
<li>com.foo.BarService
<ul>
<li>表示只对指定服务生效,必填。</li>
</ul>
</li>
<li>category=configurators
<ul>
<li>表示该数据为动态配置类型,必填。</li>
</ul>
</li>
<li>dynamic=false
<ul>
<li>表示该数据为持久数据,当注册方退出时,数据依然保存在注册中心,必填。</li>
</ul>
</li>
<li>enabled=true
<ul>
<li>覆盖规则是否生效,可不填,缺省生效。</li>
</ul>
</li>
<li>application=foo
<ul>
<li>表示只对指定应用生效,可不填,表示对所有应用生效。</li>
</ul>
</li>
<li>timeout=1000
<ul>
<li>表示将满足以上条件的timeout参数的值覆盖为1000。</li>
<li>如果想覆盖其它参数,直接加在override的URL参数上。</li>
</ul>
</li>
</ul>
<p>示例:</p>
<p>1. 禁用提供者:(通常用于临时踢除某台提供者机器,相似的,禁止消费者访问请使用<a href="User+Guide.htm#UserGuide-RouterRule" tppabs="http://10.20.160.198/wiki/display/dubbo/User+Guide#UserGuide-RouterRule">路由规则</a>)</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: java; gutter: false"><![CDATA[override://10.20.153.10/com.foo.BarService?category=configurators&amp;dynamic=false&amp;disbaled=true]]></script>
</div></div>
<p>2. 调整权重:(通常用于容量评估,缺省权重为100)</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: java; gutter: false"><![CDATA[override://10.20.153.10/com.foo.BarService?category=configurators&amp;dynamic=false&amp;weight=200]]></script>
</div></div>
<p>3. 调整负载均衡策略:(缺省负载均衡策略为random)</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: java; gutter: false"><![CDATA[override://10.20.153.10/com.foo.BarService?category=configurators&amp;dynamic=false&amp;loadbalance=leastactive]]></script>
</div></div>
<p>4. 服务降级:(通常用于临时屏蔽某个出错的非关键服务)</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: java; gutter: false"><![CDATA[override://0.0.0.0/com.foo.BarService?category=configurators&amp;dynamic=false&amp;application=foo&amp;mock=force:return+null]]></script>
</div></div>
<h3><a name="UserGuide-ServiceDegradation"></a>Service Degradation</h3>
<p>(<a href="Service+Degradation.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/Service+Degradation" title="Service Degradation">+</a>) (<a href="#UserGuide-ServiceDegradation">#</a>)</p>
<div class='panelMacro'><table class='noteMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="warning-3.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/warning.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>2.2.0以上版本支持</td></tr></table></div>
<div class='panelMacro'><table class='tipMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="check.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/check.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>参见:<a href="#UserGuide-ConfiguratorRule">Configurator Rule</a></td></tr></table></div>
<p>向注册中心写入动态配置覆盖规则:(通过由监控中心或治理中心的页面完成)</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: java; gutter: false"><![CDATA[RegistryFactory registryFactory = ExtensionLoader.getExtensionLoader(RegistryFactory.class).getAdaptiveExtension();
Registry registry = registryFactory.getRegistry(URL.valueOf("zookeeper://10.20.153.10:2181"));
registry.register(URL.valueOf("override://0.0.0.0/com.foo.BarService?category=configurators&amp;dynamic=false&amp;application=foo&amp;mock=force:return+null"));]]></script>
</div></div>
<p>其中:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: java; gutter: false"><![CDATA[mock=force:return+null]]></script>
</div></div>
<ul>
<li>表示消费方对该服务的方法调用都直接返回null值,不发起远程调用。</li>
<li>屏蔽不重要服务不可用时对调用方的影响。</li>
</ul>
<p>还可以改为:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: java; gutter: false"><![CDATA[mock=fail:return+null]]></script>
</div></div>
<ul>
<li>表示消费方对该服务的方法调用在失败后,再返回null值,不抛异常。</li>
<li>容忍不重要服务不稳定时对调用方的影响。</li>
</ul>
<h3><a name="UserGuide-GracefulShutdown"></a>Graceful Shutdown</h3>
<p>(<a href="Graceful+Shutdown.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/Graceful+Shutdown" title="Graceful Shutdown">+</a>) (<a href="#UserGuide-GracefulShutdown">#</a>)</p>
<div class='panelMacro'><table class='noteMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="warning-3.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/warning.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>Dubbo是通过JDK的ShutdownHook来完成优雅停机的,所以如果用户使用"kill -9 PID"等强制关闭指令,是不会执行优雅停机的,只有通过"kill PID"时,才会执行。</td></tr></table></div>
<p>原理:</p>
<ul>
<li>服务提供方
<ul>
<li>停止时,先标记为不接收新请求,新请求过来时直接报错,让客户端重试其它机器。</li>
<li>然后,检测线程池中的线程是否正在运行,如果有,等待所有线程执行完成,除非超时,则强制关闭。</li>
</ul>
</li>
<li>服务消费方
<ul>
<li>停止时,不再发起新的调用请求,所有新的调用在客户端即报错。</li>
<li>然后,检测有没有请求的响应还没有返回,等待响应返回,除非超时,则强制关闭。</li>
</ul>
</li>
</ul>
<p>设置优雅停机超时时间,缺省超时时间是<font color="brown">10秒</font>:(超时则强制关闭)</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:application ...&gt;
&lt;dubbo:parameter key="shutdown.timeout" value="60000" /&gt; &lt;!-- 单位毫秒 --&gt;
&lt;/dubbo:application&gt;]]></script>
</div></div>
<p>如果ShutdownHook不能生效,可以自行调用:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: java; gutter: false"><![CDATA[ProtocolConfig.destroyAll();]]></script>
</div></div>
<h3><a name="UserGuide-HostBinding"></a>Host Binding</h3>
<p>(<a href="Host+Binding.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/Host+Binding" title="Host Binding">+</a>) (<a href="#UserGuide-HostBinding">#</a>)</p>
<p>缺省主机IP查找顺序:</p>
<ul>
<li>通过LocalHost.getLocalHost()获取本机地址。</li>
<li>如果是127.*等loopback地址,则扫描各网卡,获取网卡IP。</li>
</ul>
<p>注册的地址如果获取不正确,比如需要注册公网地址,可以:<br/>
1. 可以在/etc/hosts中加入:机器名 公网IP,比如:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: java; gutter: false"><![CDATA[test1 205.182.23.201]]></script>
</div></div>
<p>2. 在dubbo.xml中加入主机地址的配置:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:protocol host="http://10.20.160.198/wiki/display/dubbo/205.182.23.201"&gt;]]></script>
</div></div>
<p>3. 或在dubbo.properties中加入主机地址的配置:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: java; gutter: false"><![CDATA[dubbo.protocol.host=205.182.23.201]]></script>
</div></div>
<p>缺省主机端口与协议相关:</p>
<ul>
<li>dubbo: 20880</li>
<li>rmi: 1099</li>
<li>http: 80</li>
<li>hessian: 80</li>
<li>webservice: 80</li>
<li>memcached: 11211</li>
<li>redis: 6379</li>
</ul>
<p>主机端口配置:</p>
<p>1. 在dubbo.xml中加入主机地址的配置:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:protocol name="dubbo" port="20880"&gt;]]></script>
</div></div>
<p>3. 或在dubbo.properties中加入主机地址的配置:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: java; gutter: false"><![CDATA[dubbo.protocol.dubbo.port=20880]]></script>
</div></div>
<h3><a name="UserGuide-LoggerAdpater"></a>Logger Adpater</h3>
<p>(<a href="Logger+Adpater.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/Logger+Adpater" title="Logger Adpater">+</a>) (<a href="#UserGuide-LoggerAdpater">#</a>)</p>
<div class='panelMacro'><table class='noteMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="warning-3.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/warning.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>2.2.1以上版本支持</td></tr></table></div>
<div class='panelMacro'><table class='tipMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="check.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/check.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>扩展点:<a href="Developer+Guide.htm#DeveloperGuide-LoggerAdapterSPI" tppabs="http://10.20.160.198/wiki/display/dubbo/Developer+Guide#DeveloperGuide-LoggerAdapterSPI">日志适配扩展</a></td></tr></table></div>
<p>缺省自动查找:</p>
<ul>
<li>log4j</li>
<li>slf4j</li>
<li>jcl</li>
<li>jdk</li>
</ul>
<p>可以通过以下方式配置日志输出策略:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: java; gutter: false"><![CDATA[java -Ddubbo.application.logger=log4j]]></script>
</div></div>
<div class="code panel" style="border-width: 1px;"><div class="codeHeader panelHeader" style="border-bottom-width: 1px;"><b>dubbo.properties</b></div><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: java; gutter: false"><![CDATA[dubbo.application.logger=log4j]]></script>
</div></div>
<div class="code panel" style="border-width: 1px;"><div class="codeHeader panelHeader" style="border-bottom-width: 1px;"><b>dubbo.xml</b></div><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: java; gutter: false"><![CDATA[&lt;dubbo:application logger="log4j" /&gt;]]></script>
</div></div>
<h3><a name="UserGuide-AccessLog"></a>Access Log</h3>
<p>(<a href="Access+Log.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/Access+Log" title="Access Log">+</a>) (<a href="#UserGuide-AccessLog">#</a>)</p>
<div class='panelMacro'><table class='tipMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="check.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/check.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>如果你想记录每一次请求信息,可开启访问日志,类似于apache的访问日志。</td></tr></table></div>
<div class='panelMacro'><table class='noteMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="warning-3.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/warning.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>此日志量比较大,请注意磁盘容量。</td></tr></table></div>
<p>将访问日志输出到当前应用的log4j日志:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:protocol accesslog="true" /&gt;]]></script>
</div></div>
<p>将访问日志输出到指定文件:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:protocol accesslog="http://10.20.160.198/wiki/display/dubbo/foo/bar.log" /&gt;]]></script>
</div></div>
<h3><a name="UserGuide-ServiceContainer"></a>Service Container</h3>
<p>(<a href="Service+Container.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/Service+Container" title="Service Container">+</a>) (<a href="#UserGuide-ServiceContainer">&#35;</a>)</p>
<div class='panelMacro'><table class='tipMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="check.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/check.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>服务容器是一个standalone的启动程序,因为后台服务不需要Tomcat或JBoss等Web容器的功能,如果硬要用Web容器去加载服务提供方,增加复杂性,也浪费资源。</td></tr></table></div>
<div class='panelMacro'><table class='tipMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="check.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/check.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>服务容器只是一个简单的Main方法,并加载一个简单的Spring容器,用于暴露服务。</td></tr></table></div>
<div class='panelMacro'><table class='tipMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="check.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/check.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>服务容器的加载内容可以扩展,内置了spring, jetty, log4j等加载,可通过Container扩展点进行扩展,参见:<a href="Developer+Guide.htm#DeveloperGuide-ContainerSPI" tppabs="http://10.20.160.198/wiki/display/dubbo/Developer+Guide#DeveloperGuide-ContainerSPI">Container</a></td></tr></table></div>
<h6><a name="UserGuide-SpringContainer"></a>Spring Container</h6>
<ul>
<li>自动加载META-INF/spring目录下的所有Spring配置。</li>
<li>配置:(配在java命令-D参数或者dubbo.properties中)
<ul>
<li>dubbo.spring.config=classpath*:META-INF/spring/*.xml ----配置spring配置加载位置</li>
</ul>
</li>
</ul>
<h6><a name="UserGuide-JettyContainer"></a>Jetty Container</h6>
<ul>
<li>启动一个内嵌Jetty,用于汇报状态。</li>
<li>配置:(配在java命令-D参数或者dubbo.properties中)
<ul>
<li>dubbo.jetty.port=8080 ----配置jetty启动端口</li>
<li>dubbo.jetty.directory=/foo/bar ----配置可通过jetty直接访问的目录,用于存放静态文件</li>
<li>dubbo.jetty.page=log,status,system ----配置显示的页面,缺省加载所有页面</li>
</ul>
</li>
</ul>
<h6><a name="UserGuide-Log4jContainer"></a>Log4j Container</h6>
<ul>
<li>自动配置log4j的配置,在多进程启动时,自动给日志文件按进程分目录。</li>
<li>配置:(配在java命令-D参数或者dubbo.properties中)
<ul>
<li>dubbo.log4j.file=/foo/bar.log ----配置日志文件路径</li>
<li>dubbo.log4j.level=WARN ----配置日志级别</li>
<li>dubbo.log4j.subdirectory=20880 ----配置日志子目录,用于多进程启动,避免冲突</li>
</ul>
</li>
</ul>
<p><b>容器启动</b></p>
<p>如:(缺省只加载spring)</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: java; gutter: false"><![CDATA[java com.alibaba.dubbo.container.Main]]></script>
</div></div>
<p>或:(通过main函数参数传入要加载的容器)</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: java; gutter: false"><![CDATA[java com.alibaba.dubbo.container.Main spring jetty log4j]]></script>
</div></div>
<p>或:(通过JVM启动参数传入要加载的容器)</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: java; gutter: false"><![CDATA[java com.alibaba.dubbo.container.Main -Ddubbo.container=spring,jetty,log4j]]></script>
</div></div>
<p>或:(通过classpath下的dubbo.properties配置传入要加载的容器)</p>
<div class="code panel" style="border-width: 1px;"><div class="codeHeader panelHeader" style="border-bottom-width: 1px;"><b>dubbo.properties</b></div><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: java; gutter: false"><![CDATA[dubbo.container=spring,jetty,log4j]]></script>
</div></div>
<p><b>在web容器中使用内置的监控页面</b></p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;filter&gt;
&lt;filter-name&gt;resource&lt;/filter-name&gt;
&lt;filter-class&gt;com.alibaba.dubbo.container.page.ResourceFilter&lt;/filter-class&gt;
&lt;/filter&gt;
&lt;servlet&gt;
&lt;servlet-name&gt;page&lt;/servlet-name&gt;
&lt;servlet-class&gt;com.alibaba.dubbo.container.page.PageServlet&lt;/servlet-class&gt;
&lt;load-on-startup&gt;2&lt;/load-on-startup&gt;
&lt;/servlet&gt;
&lt;servlet-mapping&gt;
&lt;servlet-name&gt;page&lt;/servlet-name&gt;
&lt;url-pattern&gt;/*&lt;/url-pattern&gt;
&lt;/servlet-mapping&gt;
&lt;filter-mapping&gt;
&lt;filter-name&gt;resource&lt;/filter-name&gt;
&lt;url-pattern&gt;/*&lt;/url-pattern&gt;
&lt;/filter-mapping&gt;]]></script>
</div></div>
<h3><a name="UserGuide-ReferenceConfigCache"></a>Reference Config Cache</h3>
<p>(<a href="Reference+Config+Cache.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/Reference+Config+Cache" title="Reference Config Cache">+</a>) (<a href="#UserGuide-ReferenceConfigCache">#</a>)</p>
<p>ReferenceConfig实例很重,封装了与注册中心的连接以及与提供者的连接,需要缓存,否则重复生成ReferenceConfig可能造成性能问题并且会有内存和连接泄漏。API方式编程时,容易忽略此问题。</p>
<p>Dubbo <font color="brown">2.4.0+</font>版本,提供了简单的工具类ReferenceConfigCache用于缓存ReferenceConfig实例。</p>
<p>使用方式如下:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: java; gutter: false"><![CDATA[ReferenceConfig&lt;XxxService&gt; reference = new ReferenceConfig&lt;XxxService&gt;();
reference.setInterface(XxxService.class);
reference.setVersion("1.0.0");
......
ReferenceConfigCache cache = ReferenceConfigCache.getCache();
XxxService xxxService = cache.get(reference); // cache.get方法中会Cache Reference对象,并且调用ReferenceConfig.get方法启动ReferenceConfig
// 注意! Cache会持有ReferenceConfig,不要在外部再调用ReferenceConfig的destroy方法,导致Cache内的ReferenceConfig失效!
// 使用xxxService对象
xxxService.sayHello();]]></script>
</div></div>
<p>消除Cache中的ReferenceConfig,销毁ReferenceConfig并释放对应的资源。</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: java; gutter: false"><![CDATA[ReferenceConfigCache cache = ReferenceConfigCache.getCache();
cache.destroy(reference);]]></script>
</div></div>
<p>缺省ReferenceConfigCache把相同服务Group、接口、版本的ReferenceConfig认为是相同,缓存一份。即以服务Group、接口、版本为缓存的Key。</p>
<p>可以修改这个策略,在ReferenceConfigCache.getCache时,传一个KeyGenerator。详见ReferenceConfigCache类的方法。</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: java; gutter: false"><![CDATA[KeyGenerator keyGenerator = new ...
ReferenceConfigCache cache = ReferenceConfigCache.getCache(keyGenerator );]]></script>
</div></div>
<h3><a name="UserGuide-DistributedTransaction"></a>Distributed Transaction</h3>
<p>(<a href="Distributed+Transaction.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/Distributed+Transaction" title="Distributed Transaction">+</a>) (<a href="#UserGuide-DistributedTransaction">#</a>)</p>
<div class='panelMacro'><table class='tipMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="check.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/check.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>基于JTA/XA规范实现。</td></tr></table></div>
<div class='panelMacro'><table class='noteMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="warning-3.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/warning.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>暂未实现。</td></tr></table></div>
<p>两阶段提交:</p>
<p><span class="image-wrap" style=""><img src="jta-xa.jpg-version=1&modificationDate=1333185059000.jpg" tppabs="http://10.20.160.198/wiki/download/attachments/6950008/jta-xa.jpg?version=1&modificationDate=1333185059000" style="border: 0px solid black" /></span></p>
<h2><a name="UserGuide-APIReference"></a>API Reference</h2>
<p>(<a href="API+Reference.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/API+Reference" title="API Reference">+</a>) (<a href="#UserGuide-APIReference">#</a>)</p>
<div class='panelMacro'><table class='tipMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="check.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/check.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>Dubbo的常规功能,都保持零侵入,但有些功能不得不用API侵入才能实现。</td></tr></table></div>
<div class='panelMacro'><table class='noteMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="warning-3.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/warning.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>Dubbo中除这里声明以外的接口或类,都是内部接口或扩展接口,普通用户请不要直接依赖,否则升级版本可能出现不兼容。</td></tr></table></div>
<p>API汇总如下:</p>
<h3><a name="UserGuide-ConfigAPI"></a>Config API</h3>
<ul>
<li>com.alibaba.dubbo.config.ServiceConfig</li>
<li>com.alibaba.dubbo.config.ReferenceConfig</li>
<li>com.alibaba.dubbo.config.ProtocolConfig</li>
<li>com.alibaba.dubbo.config.RegistryConfig</li>
<li>com.alibaba.dubbo.config.MonitorConfig</li>
<li>com.alibaba.dubbo.config.ApplicationConfig</li>
<li>com.alibaba.dubbo.config.ModuleConfig</li>
<li>com.alibaba.dubbo.config.ProviderConfig</li>
<li>com.alibaba.dubbo.config.ConsumerConfig</li>
<li>com.alibaba.dubbo.config.MethodConfig</li>
<li>com.alibaba.dubbo.config.ArgumentConfig
<ul>
<li>参见:<a href="#UserGuide-APIConfig">API Config</a></li>
</ul>
</li>
</ul>
<h3><a name="UserGuide-AnnotationAPI"></a>Annotation API</h3>
<ul>
<li>com.alibaba.dubbo.config.annotation.Service</li>
<li>com.alibaba.dubbo.config.annotation.Reference
<ul>
<li>参见:<a href="#UserGuide-AnnotationConfig">Annotation Config</a></li>
</ul>
</li>
</ul>
<h3><a name="UserGuide-ModelAPI"></a>Model API</h3>
<ul>
<li>com.alibaba.dubbo.common.URL</li>
<li>com.alibaba.dubbo.rpc.RpcException</li>
</ul>
<h3><a name="UserGuide-ContextAPI"></a>Context API</h3>
<ul>
<li>com.alibaba.dubbo.rpc.RpcContext
<ul>
<li>参见:<a href="#UserGuide-RpcContext">Rpc Context</a> &amp; <a href="#UserGuide-RemoteHost">Remote Host</a> &amp; <a href="#UserGuide-AttachmentParameter">Attachment Parameter</a> &amp; <a href="#UserGuide-AsyncCall">Async Call</a></li>
</ul>
</li>
</ul>
<h3><a name="UserGuide-ServiceAPI"></a>Service API</h3>
<ul>
<li>com.alibaba.dubbo.rpc.service.GenericService</li>
<li>com.alibaba.dubbo.rpc.service.GenericException
<ul>
<li>参见:<a href="#UserGuide-GenericeReference">Generice Reference</a> &amp; <a href="#UserGuide-GenericImplementation">Generic Implementation</a></li>
</ul>
</li>
<li>com.alibaba.dubbo.rpc.service.EchoService
<ul>
<li>参见:<a href="#UserGuide-EchoTest">Echo Test</a></li>
</ul>
</li>
</ul>
<h2><a name="UserGuide-ConfigurationReference"></a>Configuration Reference</h2>
<p>(<a href="Configuration+Reference.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/Configuration+Reference" title="Configuration Reference">+</a>) (<a href="#UserGuide-ConfigurationReference">&#35;</a>)</p>
<div class='panelMacro'><table class='tipMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="check.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/check.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>这里以<a href="#UserGuide-XmlConfig">Xml Config</a>为准,列举所有配置项,其它配置方式,请参见相应转换关系:<a href="#UserGuide-PropertiesConfig">Properties Config</a><a href="#UserGuide-AnnotationConfig">Annotation Config</a><a href="#UserGuide-APIConfig">API Config</a></td></tr></table></div>
<p><font color="red">注意:只有group,interface,version是服务的匹配条件,三者决定是不是同一个服务,其它配置项均为调优和治理参数。</font></p>
<p>所有配置项分为三大类,参见下表中的"作用"一列。</p>
<ul>
<li>服务发现:表示该配置项用于服务的注册与发现,目的是让消费方找到提供方。</li>
<li>服务治理:表示该配置项用于治理服务间的关系,或为开发测试提供便利条件。</li>
<li>性能调优:表示该配置项用于调优性能,不同的选项对性能会产生影响。</li>
</ul>
<p>所有配置最终都将转换为URL表示,并由服务提供方生成,经注册中心传递给消费方,各属性对应URL的参数,参见配置项一览表中的"对应URL参数"列。<br/>
URL格式:</p>
<div class="panel" style="border-width: 1px;"><div class="panelContent">
<p>protocol://username:password@host:port/path?key=value&amp;key=value</p>
</div></div>
<p>Schema: <a href="javascript:if(confirm(%27http://code.alibabatech.com/schema/dubbo/dubbo.xsd \n\nThis file was not retrieved by Teleport Ultra, because it is addressed on a domain or path outside the boundaries set for its Starting Address. \n\nDo you want to open it from the server?%27))window.location=%27http://code.alibabatech.com/schema/dubbo/dubbo.xsd%27" tppabs="http://code.alibabatech.com/schema/dubbo/dubbo.xsd" class="external-link" rel="nofollow">http://code.alibabatech.com/schema/dubbo/dubbo.xsd</a></p>
<h3><a name="UserGuide-%3Cdubbo%3Aservice%2F%3E"></a>&lt;dubbo:service/&gt;</h3>
<p>(<a href="Service+Config.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/Service+Config" title="Service Config">+</a>) (<a href="#UserGuide-%253Cdubbo%253Aservice%252F%253E">#</a>)</p>
<p>服务提供者暴露服务配置:<br/>
配置类:com.alibaba.dubbo.config.ServiceConfig</p>
<div class='table-wrap'>
<table class='confluenceTable'><tbody>
<tr>
<th class='confluenceTh'> 标签 </th>
<th class='confluenceTh'> 属性 </th>
<th class='confluenceTh'> 对应URL参数 </th>
<th class='confluenceTh'> 类型 </th>
<th class='confluenceTh'> 是否必填 </th>
<th class='confluenceTh'> 缺省值 </th>
<th class='confluenceTh'> 作用 </th>
<th class='confluenceTh'> 描述 </th>
<th class='confluenceTh'> 兼容性 </th>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:service&gt; </td>
<td class='confluenceTd'> interface </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> class </td>
<td class='confluenceTd'> <b>必填</b> </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> 服务发现 </td>
<td class='confluenceTd'> 服务接口名 </td>
<td class='confluenceTd'> 1.0.0以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:service&gt; </td>
<td class='confluenceTd'> ref </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> object </td>
<td class='confluenceTd'> <b>必填</b> </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> 服务发现 </td>
<td class='confluenceTd'> 服务对象实现引用 </td>
<td class='confluenceTd'> 1.0.0以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:service&gt; </td>
<td class='confluenceTd'> version </td>
<td class='confluenceTd'> version </td>
<td class='confluenceTd'> string </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> 0.0.0 </td>
<td class='confluenceTd'> 服务发现 </td>
<td class='confluenceTd'> 服务版本,建议使用两位数字版本,如:1.0,通常在接口不兼容时版本号才需要升级 </td>
<td class='confluenceTd'> 1.0.0以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:service&gt; </td>
<td class='confluenceTd'> group </td>
<td class='confluenceTd'> group </td>
<td class='confluenceTd'> string </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> 服务发现 </td>
<td class='confluenceTd'> 服务分组,当一个接口有多个实现,可以用分组区分 </td>
<td class='confluenceTd'> 1.0.7以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:service&gt; </td>
<td class='confluenceTd'> path </td>
<td class='confluenceTd'> &lt;path&gt; </td>
<td class='confluenceTd'> string </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> 缺省为接口名 </td>
<td class='confluenceTd'> 服务发现 </td>
<td class='confluenceTd'> 服务路径 (注意:1.0不支持自定义路径,总是使用接口名,如果有1.0调2.0,配置服务路径可能不兼容) </td>
<td class='confluenceTd'> 1.0.12以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:service&gt; </td>
<td class='confluenceTd'> delay </td>
<td class='confluenceTd'> delay </td>
<td class='confluenceTd'> int </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> 0 </td>
<td class='confluenceTd'> 性能调优 </td>
<td class='confluenceTd'> 延迟注册服务时间(毫秒) ,设为-1时,表示延迟到Spring容器初始化完成时暴露服务 </td>
<td class='confluenceTd'> 1.0.14以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:service&gt; </td>
<td class='confluenceTd'> timeout </td>
<td class='confluenceTd'> timeout </td>
<td class='confluenceTd'> int </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> 1000 </td>
<td class='confluenceTd'> 性能调优 </td>
<td class='confluenceTd'> 远程服务调用超时时间(毫秒) </td>
<td class='confluenceTd'> 2.0.0以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:service&gt; </td>
<td class='confluenceTd'> retries </td>
<td class='confluenceTd'> retries </td>
<td class='confluenceTd'> int </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> 2 </td>
<td class='confluenceTd'> 性能调优 </td>
<td class='confluenceTd'> 远程服务调用重试次数,不包括第一次调用,不需要重试请设为0 </td>
<td class='confluenceTd'> 2.0.0以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:service&gt; </td>
<td class='confluenceTd'> connections </td>
<td class='confluenceTd'> connections </td>
<td class='confluenceTd'> boolean </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> 100 </td>
<td class='confluenceTd'> 性能调优 </td>
<td class='confluenceTd'> 对每个提供者的最大连接数,rmi、http、hessian等短连接协议表示限制连接数,dubbo等长连接协表示建立的长连接个数 </td>
<td class='confluenceTd'> 2.0.0以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:service&gt; </td>
<td class='confluenceTd'> loadbalance </td>
<td class='confluenceTd'> loadbalance </td>
<td class='confluenceTd'> string </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> random </td>
<td class='confluenceTd'> 性能调优 </td>
<td class='confluenceTd'> 负载均衡策略,可选值:random,roundrobin,leastactive,分别表示:随机,轮循,最少活跃调用 </td>
<td class='confluenceTd'> 2.0.0以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:service&gt; </td>
<td class='confluenceTd'> async </td>
<td class='confluenceTd'> async </td>
<td class='confluenceTd'> boolean </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> false </td>
<td class='confluenceTd'> 性能调优 </td>
<td class='confluenceTd'> 是否缺省异步执行,不可靠异步,只是忽略返回值,不阻塞执行线程 </td>
<td class='confluenceTd'> 2.0.0以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:service&gt; </td>
<td class='confluenceTd'> stub </td>
<td class='confluenceTd'> stub </td>
<td class='confluenceTd'> class/boolean </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> false </td>
<td class='confluenceTd'> 服务治理 </td>
<td class='confluenceTd'> 设为true,表示使用缺省代理类名,即:接口名 + Local后缀,服务接口客户端本地代理类名,用于在客户端执行本地逻辑,如本地缓存等,该本地代理类的构造函数必须允许传入远程代理对象,构造函数如:public XxxServiceLocal(XxxService xxxService) </td>
<td class='confluenceTd'> 2.0.0以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:service&gt; </td>
<td class='confluenceTd'> mock </td>
<td class='confluenceTd'> mock </td>
<td class='confluenceTd'> class/boolean </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> false </td>
<td class='confluenceTd'> 服务治理 </td>
<td class='confluenceTd'> 设为true,表示使用缺省Mock类名,即:接口名 + Mock后缀,服务接口调用失败Mock实现类,该Mock类必须有一个无参构造函数,与Local的区别在于,Local总是被执行,而Mock只在出现非业务异常(比如超时,网络异常等)时执行,Local在远程调用之前执行,Mock在远程调用后执行。 </td>
<td class='confluenceTd'> 2.0.0以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:service&gt; </td>
<td class='confluenceTd'> token </td>
<td class='confluenceTd'> token </td>
<td class='confluenceTd'> string/boolean </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> false </td>
<td class='confluenceTd'> 服务治理 </td>
<td class='confluenceTd'> 令牌验证,为空表示不开启,如果为true,表示随机生成动态令牌,否则使用静态令牌,令牌的作用是防止消费者绕过注册中心直接访问,保证注册中心的授权功能有效,如果使用点对点调用,需关闭令牌功能 </td>
<td class='confluenceTd'> 2.0.0以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:service&gt; </td>
<td class='confluenceTd'> registry </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> string </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> 缺省向所有registry注册 </td>
<td class='confluenceTd'> 配置关联 </td>
<td class='confluenceTd'> 向指定注册中心注册,在多个注册中心时使用,值为&lt;dubbo:registry&gt;的id属性,多个注册中心ID用逗号分隔,如果不想将该服务注册到任何registry,可将值设为N/A </td>
<td class='confluenceTd'> 2.0.0以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:service&gt; </td>
<td class='confluenceTd'> provider </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> string </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> 缺使用第一个provider配置 </td>
<td class='confluenceTd'> 配置关联 </td>
<td class='confluenceTd'> 指定provider,值为&lt;dubbo:provider&gt;的id属性 </td>
<td class='confluenceTd'> 2.0.0以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:service&gt; </td>
<td class='confluenceTd'> deprecated </td>
<td class='confluenceTd'> deprecated </td>
<td class='confluenceTd'> boolean </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> false </td>
<td class='confluenceTd'> 服务治理 </td>
<td class='confluenceTd'> 服务是否过时,如果设为true,消费方引用时将打印服务过时警告error日志 </td>
<td class='confluenceTd'> 2.0.5以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:service&gt; </td>
<td class='confluenceTd'> dynamic </td>
<td class='confluenceTd'> dynamic </td>
<td class='confluenceTd'> boolean </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> true </td>
<td class='confluenceTd'> 服务治理 </td>
<td class='confluenceTd'> 服务是否动态注册,如果设为false,注册后将显示后disable状态,需人工启用,并且服务提供者停止时,也不会自动取消册,需人工禁用。 </td>
<td class='confluenceTd'> 2.0.5以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:service&gt; </td>
<td class='confluenceTd'> accesslog </td>
<td class='confluenceTd'> accesslog </td>
<td class='confluenceTd'> string/boolean </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> false </td>
<td class='confluenceTd'> 服务治理 </td>
<td class='confluenceTd'> 设为true,将向logger中输出访问日志,也可填写访问日志文件路径,直接把访问日志输出到指定文件 </td>
<td class='confluenceTd'> 2.0.5以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:service&gt; </td>
<td class='confluenceTd'> owner </td>
<td class='confluenceTd'> owner </td>
<td class='confluenceTd'> string </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> 服务治理 </td>
<td class='confluenceTd'> 服务负责人,用于服务治理,请填写负责人公司邮箱前缀 </td>
<td class='confluenceTd'> 2.0.5以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:service&gt; </td>
<td class='confluenceTd'> document </td>
<td class='confluenceTd'> document </td>
<td class='confluenceTd'> string </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> 服务治理 </td>
<td class='confluenceTd'> 服务文档URL </td>
<td class='confluenceTd'> 2.0.5以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:service&gt; </td>
<td class='confluenceTd'> weight </td>
<td class='confluenceTd'> weight </td>
<td class='confluenceTd'> int </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> 性能调优 </td>
<td class='confluenceTd'> 服务权重 </td>
<td class='confluenceTd'> 2.0.5以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:service&gt; </td>
<td class='confluenceTd'> executes </td>
<td class='confluenceTd'> executes </td>
<td class='confluenceTd'> int </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> 0 </td>
<td class='confluenceTd'> 性能调优 </td>
<td class='confluenceTd'> 服务提供者每服务每方法最大可并行执行请求数 </td>
<td class='confluenceTd'> 2.0.5以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:service&gt; </td>
<td class='confluenceTd'> actives </td>
<td class='confluenceTd'> actives </td>
<td class='confluenceTd'> int </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> 0 </td>
<td class='confluenceTd'> 性能调优 </td>
<td class='confluenceTd'> 每服务消费者每服务每方法最大并发调用数 </td>
<td class='confluenceTd'> 2.0.5以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:service&gt; </td>
<td class='confluenceTd'> proxy </td>
<td class='confluenceTd'> proxy </td>
<td class='confluenceTd'> string </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> javassist </td>
<td class='confluenceTd'> 性能调优 </td>
<td class='confluenceTd'> 生成动态代理方式,可选:jdk/javassist </td>
<td class='confluenceTd'> 2.0.5以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:service&gt; </td>
<td class='confluenceTd'> cluster </td>
<td class='confluenceTd'> cluster </td>
<td class='confluenceTd'> string </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> failover </td>
<td class='confluenceTd'> 性能调优 </td>
<td class='confluenceTd'> 集群方式,可选:failover/failfast/failsafe/failback/forking </td>
<td class='confluenceTd'> 2.0.5以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:service&gt; </td>
<td class='confluenceTd'> filter </td>
<td class='confluenceTd'> service.filter </td>
<td class='confluenceTd'> string </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> default </td>
<td class='confluenceTd'> 性能调优 </td>
<td class='confluenceTd'> 服务提供方远程调用过程拦截器名称,多个名称用逗号分隔 </td>
<td class='confluenceTd'> 2.0.5以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:service&gt; </td>
<td class='confluenceTd'> listener </td>
<td class='confluenceTd'> exporter.listener </td>
<td class='confluenceTd'> string </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> default </td>
<td class='confluenceTd'> 性能调优 </td>
<td class='confluenceTd'> 服务提供方导出服务监听器名称,多个名称用逗号分隔 </td>
<td class='confluenceTd'>&nbsp;</td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:service&gt; </td>
<td class='confluenceTd'> protocol </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> string </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> 配置关联 </td>
<td class='confluenceTd'> 使用指定的协议暴露服务,在多协议时使用,值为&lt;dubbo:protocol&gt;的id属性,多个协议ID用逗号分隔 </td>
<td class='confluenceTd'> 2.0.5以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:service&gt; </td>
<td class='confluenceTd'> layer </td>
<td class='confluenceTd'> layer </td>
<td class='confluenceTd'> string </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> 服务治理 </td>
<td class='confluenceTd'> 服务提供者所在的分层。如:biz、dao、intl:web、china:acton。 </td>
<td class='confluenceTd'> 2.0.7以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:service&gt; </td>
<td class='confluenceTd'> register </td>
<td class='confluenceTd'> register </td>
<td class='confluenceTd'> boolean </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> true </td>
<td class='confluenceTd'> 服务治理 </td>
<td class='confluenceTd'> 该协议的服务是否注册到注册中心 </td>
<td class='confluenceTd'> 2.0.8以上版本 </td>
</tr>
</tbody></table>
</div>
<h3><a name="UserGuide-%3Cdubbo%3Areference%2F%3E"></a>&lt;dubbo:reference/&gt;</h3>
<p>(<a href="Reference+Config.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/Reference+Config" title="Reference Config">+</a>) (<a href="#UserGuide-%253Cdubbo%253Areference%252F%253E">#</a>)</p>
<p>服务消费者引用服务配置:<br/>
配置类:com.alibaba.dubbo.config.ReferenceConfig</p>
<div class='table-wrap'>
<table class='confluenceTable'><tbody>
<tr>
<th class='confluenceTh'> 标签 </th>
<th class='confluenceTh'> 属性 </th>
<th class='confluenceTh'> 对应URL参数 </th>
<th class='confluenceTh'> 类型 </th>
<th class='confluenceTh'> 是否必填 </th>
<th class='confluenceTh'> 缺省值 </th>
<th class='confluenceTh'> 作用 </th>
<th class='confluenceTh'> 描述 </th>
<th class='confluenceTh'> 兼容性 </th>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:reference&gt; </td>
<td class='confluenceTd'> id </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> string </td>
<td class='confluenceTd'> <b>必填</b> </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> 配置关联 </td>
<td class='confluenceTd'> 服务引用BeanId </td>
<td class='confluenceTd'> 1.0.0以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:reference&gt; </td>
<td class='confluenceTd'> interface </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> class </td>
<td class='confluenceTd'> <b>必填</b> </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> 服务发现 </td>
<td class='confluenceTd'> 服务接口名 </td>
<td class='confluenceTd'> 1.0.0以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:reference&gt; </td>
<td class='confluenceTd'> version </td>
<td class='confluenceTd'> version </td>
<td class='confluenceTd'> string </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> 服务发现 </td>
<td class='confluenceTd'> 服务版本,与服务提供者的版本一致 </td>
<td class='confluenceTd'> 1.0.0以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:reference&gt; </td>
<td class='confluenceTd'> group </td>
<td class='confluenceTd'> group </td>
<td class='confluenceTd'> string </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> 服务发现 </td>
<td class='confluenceTd'> 服务分组,当一个接口有多个实现,可以用分组区分,必需和服务提供方一致 </td>
<td class='confluenceTd'> 1.0.7以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:reference&gt; </td>
<td class='confluenceTd'> timeout </td>
<td class='confluenceTd'> timeout </td>
<td class='confluenceTd'> long </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> 缺省使用&lt;dubbo:consumer&gt;的timeout </td>
<td class='confluenceTd'> 性能调优 </td>
<td class='confluenceTd'> 服务方法调用超时时间(毫秒) </td>
<td class='confluenceTd'> 1.0.5以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:reference&gt; </td>
<td class='confluenceTd'> retries </td>
<td class='confluenceTd'> retries </td>
<td class='confluenceTd'> int </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> 缺省使用&lt;dubbo:consumer&gt;的retries </td>
<td class='confluenceTd'> 性能调优 </td>
<td class='confluenceTd'> 远程服务调用重试次数,不包括第一次调用,不需要重试请设为0 </td>
<td class='confluenceTd'> 2.0.0以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:reference&gt; </td>
<td class='confluenceTd'> connections </td>
<td class='confluenceTd'> connections </td>
<td class='confluenceTd'> int </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> 缺省使用&lt;dubbo:consumer&gt;的connections </td>
<td class='confluenceTd'> 性能调优 </td>
<td class='confluenceTd'> 对每个提供者的最大连接数,rmi、http、hessian等短连接协议表示限制连接数,dubbo等长连接协表示建立的长连接个数 </td>
<td class='confluenceTd'> 2.0.0以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:reference&gt; </td>
<td class='confluenceTd'> loadbalance </td>
<td class='confluenceTd'> loadbalance </td>
<td class='confluenceTd'> string </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> 缺省使用&lt;dubbo:consumer&gt;的loadbalance </td>
<td class='confluenceTd'> 性能调优 </td>
<td class='confluenceTd'> 负载均衡策略,可选值:random,roundrobin,leastactive,分别表示:随机,轮循,最少活跃调用 </td>
<td class='confluenceTd'> 2.0.0以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:reference&gt; </td>
<td class='confluenceTd'> async </td>
<td class='confluenceTd'> async </td>
<td class='confluenceTd'> boolean </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> 缺省使用&lt;dubbo:consumer&gt;的async </td>
<td class='confluenceTd'> 性能调优 </td>
<td class='confluenceTd'> 是否异步执行,不可靠异步,只是忽略返回值,不阻塞执行线程 </td>
<td class='confluenceTd'> 2.0.0以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:reference&gt; </td>
<td class='confluenceTd'> generic </td>
<td class='confluenceTd'> generic </td>
<td class='confluenceTd'> boolean </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> 缺省使用&lt;dubbo:consumer&gt;的generic </td>
<td class='confluenceTd'> 服务治理 </td>
<td class='confluenceTd'> 是否缺省泛化接口,如果为泛化接口,将返回GenericService </td>
<td class='confluenceTd'> 2.0.0以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:reference&gt; </td>
<td class='confluenceTd'> check </td>
<td class='confluenceTd'> check </td>
<td class='confluenceTd'> boolean </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> 缺省使用&lt;dubbo:consumer&gt;的check </td>
<td class='confluenceTd'> 服务治理 </td>
<td class='confluenceTd'> 启动时检查提供者是否存在,true报错,false忽略 </td>
<td class='confluenceTd'> 2.0.0以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:reference&gt; </td>
<td class='confluenceTd'> url </td>
<td class='confluenceTd'> &lt;url&gt; </td>
<td class='confluenceTd'> string </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> 服务治理 </td>
<td class='confluenceTd'> 点对点直连服务提供者地址,<font color="red">将绕过注册中心</font> </td>
<td class='confluenceTd'> 1.0.6以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:reference&gt; </td>
<td class='confluenceTd'> stub </td>
<td class='confluenceTd'> stub </td>
<td class='confluenceTd'> class/boolean </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> 服务治理 </td>
<td class='confluenceTd'> 服务接口客户端本地代理类名,用于在客户端执行本地逻辑,如本地缓存等,该本地代理类的构造函数必须允许传入远程代理对象,构造函数如:public XxxServiceLocal(XxxService xxxService) </td>
<td class='confluenceTd'> 2.0.0以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:reference&gt; </td>
<td class='confluenceTd'> mock </td>
<td class='confluenceTd'> mock </td>
<td class='confluenceTd'> class/boolean </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> 服务治理 </td>
<td class='confluenceTd'> 服务接口调用失败Mock实现类名,该Mock类必须有一个无参构造函数,与Local的区别在于,Local总是被执行,而Mock只在出现非业务异常(比如超时,网络异常等)时执行,Local在远程调用之前执行,Mock在远程调用后执行。 </td>
<td class='confluenceTd'> Dubbo1.0.13及其以上版本支持 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:reference&gt; </td>
<td class='confluenceTd'> cache </td>
<td class='confluenceTd'> cache </td>
<td class='confluenceTd'> string/boolean </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> 服务治理 </td>
<td class='confluenceTd'> 以调用参数为key,缓存返回结果,可选:lru, threadlocal, jcache等 </td>
<td class='confluenceTd'> Dubbo2.1.0及其以上版本支持 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:reference&gt; </td>
<td class='confluenceTd'> validation </td>
<td class='confluenceTd'> validation </td>
<td class='confluenceTd'> boolean </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> 服务治理 </td>
<td class='confluenceTd'> 是否启用JSR303标准注解验证,如果启用,将对方法参数上的注解进行校验 </td>
<td class='confluenceTd'> Dubbo2.1.0及其以上版本支持 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:reference&gt; </td>
<td class='confluenceTd'> proxy </td>
<td class='confluenceTd'> proxy </td>
<td class='confluenceTd'> boolean </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> javassist </td>
<td class='confluenceTd'> 性能调优 </td>
<td class='confluenceTd'> 选择动态代理实现策略,可选:javassist, jdk </td>
<td class='confluenceTd'> 2.0.2以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:reference&gt; </td>
<td class='confluenceTd'> client </td>
<td class='confluenceTd'> client </td>
<td class='confluenceTd'> string </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> 性能调优 </td>
<td class='confluenceTd'> 客户端传输类型设置,如Dubbo协议的netty或mina。 </td>
<td class='confluenceTd'> Dubbo2.0.0以上版本支持 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:reference&gt; </td>
<td class='confluenceTd'> registry </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> string </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> 缺省将从所有注册中心获服务列表后合并结果 </td>
<td class='confluenceTd'> 配置关联 </td>
<td class='confluenceTd'> 从指定注册中心注册获取服务列表,在多个注册中心时使用,值为&lt;dubbo:registry&gt;的id属性,多个注册中心ID用逗号分隔 </td>
<td class='confluenceTd'> 2.0.0以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:reference&gt; </td>
<td class='confluenceTd'> owner </td>
<td class='confluenceTd'> owner </td>
<td class='confluenceTd'> string </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> 服务治理 </td>
<td class='confluenceTd'> 调用服务负责人,用于服务治理,请填写负责人公司邮箱前缀 </td>
<td class='confluenceTd'> 2.0.5以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:reference&gt; </td>
<td class='confluenceTd'> actives </td>
<td class='confluenceTd'> actives </td>
<td class='confluenceTd'> int </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> 0 </td>
<td class='confluenceTd'> 性能调优 </td>
<td class='confluenceTd'> 每服务消费者每服务每方法最大并发调用数 </td>
<td class='confluenceTd'> 2.0.5以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:reference&gt; </td>
<td class='confluenceTd'> cluster </td>
<td class='confluenceTd'> cluster </td>
<td class='confluenceTd'> string </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> failover </td>
<td class='confluenceTd'> 性能调优 </td>
<td class='confluenceTd'> 集群方式,可选:failover/failfast/failsafe/failback/forking </td>
<td class='confluenceTd'> 2.0.5以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:reference&gt; </td>
<td class='confluenceTd'> filter </td>
<td class='confluenceTd'> reference.filter </td>
<td class='confluenceTd'> string </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> default </td>
<td class='confluenceTd'> 性能调优 </td>
<td class='confluenceTd'> 服务消费方远程调用过程拦截器名称,多个名称用逗号分隔 </td>
<td class='confluenceTd'> 2.0.5以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:reference&gt; </td>
<td class='confluenceTd'> listener </td>
<td class='confluenceTd'> invoker.listener </td>
<td class='confluenceTd'> string </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> default </td>
<td class='confluenceTd'> 性能调优 </td>
<td class='confluenceTd'> 服务消费方引用服务监听器名称,多个名称用逗号分隔 </td>
<td class='confluenceTd'> 2.0.5以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:reference&gt; </td>
<td class='confluenceTd'> layer </td>
<td class='confluenceTd'> layer </td>
<td class='confluenceTd'> string </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> 服务治理 </td>
<td class='confluenceTd'> 服务调用者所在的分层。如:biz、dao、intl:web、china:acton。 </td>
<td class='confluenceTd'> 2.0.7以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:reference&gt; </td>
<td class='confluenceTd'> init </td>
<td class='confluenceTd'> init </td>
<td class='confluenceTd'> boolean </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> false </td>
<td class='confluenceTd'> 性能调优 </td>
<td class='confluenceTd'> 是否在afterPropertiesSet()时饥饿初始化引用,否则等到有人注入或引用该实例时再初始化。 </td>
<td class='confluenceTd'> 2.0.10以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:reference&gt; </td>
<td class='confluenceTd'> protocol </td>
<td class='confluenceTd'> protocol </td>
<td class='confluenceTd'> string </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> 服力治理 </td>
<td class='confluenceTd'> 只调用指定协议的服务提供方,其它协议忽略。 </td>
<td class='confluenceTd'> 2.2.0以上版本 </td>
</tr>
</tbody></table>
</div>
<h3><a name="UserGuide-%3Cdubbo%3Aprotocol%2F%3E"></a>&lt;dubbo:protocol/&gt;</h3>
<p>(<a href="Protocol+Config.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/Protocol+Config" title="Protocol Config">+</a>) (<a href="#UserGuide-%253Cdubbo%253Aprotocol%252F%253E">#</a>)</p>
<p>服务提供者协议配置:<br/>
配置类:com.alibaba.dubbo.config.ProtocolConfig<br/>
说明:如果需要支持多协议,可以声明多个&lt;dubbo:protocol&gt;标签,并在&lt;dubbo:service&gt;中通过protocol属性指定使用的协议。</p>
<div class='table-wrap'>
<table class='confluenceTable'><tbody>
<tr>
<th class='confluenceTh'> 标签 </th>
<th class='confluenceTh'> 属性 </th>
<th class='confluenceTh'> 对应URL参数 </th>
<th class='confluenceTh'> 类型 </th>
<th class='confluenceTh'> 是否必填 </th>
<th class='confluenceTh'> 缺省值 </th>
<th class='confluenceTh'> 作用 </th>
<th class='confluenceTh'> 描述 </th>
<th class='confluenceTh'> 兼容性 </th>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:protocol&gt; </td>
<td class='confluenceTd'> id </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> string </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> dubbo </td>
<td class='confluenceTd'> 配置关联 </td>
<td class='confluenceTd'> 协议BeanId,可以在&lt;dubbo:service protocol=""&gt;中引用此ID,如果ID不填,缺省和name属性值一样,重复则在name后加序号。 </td>
<td class='confluenceTd'> 2.0.5以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:protocol&gt; </td>
<td class='confluenceTd'> name </td>
<td class='confluenceTd'> &lt;protocol&gt; </td>
<td class='confluenceTd'> string </td>
<td class='confluenceTd'> <b>必填</b> </td>
<td class='confluenceTd'> dubbo </td>
<td class='confluenceTd'> 性能调优 </td>
<td class='confluenceTd'> 协议名称 </td>
<td class='confluenceTd'> 2.0.5以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:protocol&gt; </td>
<td class='confluenceTd'> port </td>
<td class='confluenceTd'> &lt;port&gt; </td>
<td class='confluenceTd'> int </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> dubbo协议缺省端口为20880,rmi协议缺省端口为1099,http和hessian协议缺省端口为80 </td>
<td class='confluenceTd'> 服务发现 </td>
<td class='confluenceTd'> 服务端口 </td>
<td class='confluenceTd'> 2.0.5以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:protocol&gt; </td>
<td class='confluenceTd'> host </td>
<td class='confluenceTd'> &lt;host&gt; </td>
<td class='confluenceTd'> string </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> 自动查找本机IP </td>
<td class='confluenceTd'> 服务发现 </td>
<td class='confluenceTd'> &#45;服务主机名,多网卡选择或指定VIP及域名时使用,为空则自动查找本机IP,&#45;<font color="red">建议不要配置,让Dubbo自动获取本机IP</font> </td>
<td class='confluenceTd'> 2.0.5以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:protocol&gt; </td>
<td class='confluenceTd'> threadpool </td>
<td class='confluenceTd'> threadpool </td>
<td class='confluenceTd'> string </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> fixed </td>
<td class='confluenceTd'> 性能调优 </td>
<td class='confluenceTd'> 线程池类型,可选:fixed/cached </td>
<td class='confluenceTd'> 2.0.5以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:protocol&gt; </td>
<td class='confluenceTd'> threads </td>
<td class='confluenceTd'> threads </td>
<td class='confluenceTd'> int </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> 100 </td>
<td class='confluenceTd'> 性能调优 </td>
<td class='confluenceTd'> 服务线程池大小(固定大小) </td>
<td class='confluenceTd'> 2.0.5以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:protocol&gt; </td>
<td class='confluenceTd'> iothreads </td>
<td class='confluenceTd'> threads </td>
<td class='confluenceTd'> int </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> cpu个数+1 </td>
<td class='confluenceTd'> 性能调优 </td>
<td class='confluenceTd'> io线程池大小(固定大小) </td>
<td class='confluenceTd'> 2.0.5以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:protocol&gt; </td>
<td class='confluenceTd'> accepts </td>
<td class='confluenceTd'> accepts </td>
<td class='confluenceTd'> int </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> 0 </td>
<td class='confluenceTd'> 性能调优 </td>
<td class='confluenceTd'> 服务提供方最大可接受连接数 </td>
<td class='confluenceTd'> 2.0.5以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:protocol&gt; </td>
<td class='confluenceTd'> payload </td>
<td class='confluenceTd'> payload </td>
<td class='confluenceTd'> int </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> 88388608(=8M) </td>
<td class='confluenceTd'> 性能调优 </td>
<td class='confluenceTd'> 请求及响应数据包大小限制,单位:字节 </td>
<td class='confluenceTd'> 2.0.5以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:protocol&gt; </td>
<td class='confluenceTd'> codec </td>
<td class='confluenceTd'> codec </td>
<td class='confluenceTd'> string </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> dubbo </td>
<td class='confluenceTd'> 性能调优 </td>
<td class='confluenceTd'> 协议编码方式 </td>
<td class='confluenceTd'> 2.0.5以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:protocol&gt; </td>
<td class='confluenceTd'> serialization </td>
<td class='confluenceTd'> serialization </td>
<td class='confluenceTd'> string </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> dubbo协议缺省为hessian2,rmi协议缺省为java,http协议缺省为json </td>
<td class='confluenceTd'> 性能调优 </td>
<td class='confluenceTd'> 协议序列化方式,当协议支持多种序列化方式时使用,比如:dubbo协议的dubbo,hessian2,java,compactedjava,以及http协议的json等 </td>
<td class='confluenceTd'> 2.0.5以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:protocol&gt; </td>
<td class='confluenceTd'> accesslog </td>
<td class='confluenceTd'> accesslog </td>
<td class='confluenceTd'> string/boolean </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> 服务治理 </td>
<td class='confluenceTd'> 设为true,将向logger中输出访问日志,也可填写访问日志文件路径,直接把访问日志输出到指定文件 </td>
<td class='confluenceTd'> 2.0.5以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:protocol&gt; </td>
<td class='confluenceTd'> path </td>
<td class='confluenceTd'> &lt;path&gt; </td>
<td class='confluenceTd'> string </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> 服务发现 </td>
<td class='confluenceTd'> 提供者上下文路径,为服务path的前缀 </td>
<td class='confluenceTd'> 2.0.5以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:protocol&gt; </td>
<td class='confluenceTd'> transporter </td>
<td class='confluenceTd'> transporter </td>
<td class='confluenceTd'> string </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> dubbo协议缺省为netty </td>
<td class='confluenceTd'> 性能调优 </td>
<td class='confluenceTd'> 协议的服务端和客户端实现类型,比如:dubbo协议的mina,netty等,可以分拆为server和client配置 </td>
<td class='confluenceTd'> 2.0.5以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:protocol&gt; </td>
<td class='confluenceTd'> server </td>
<td class='confluenceTd'> server </td>
<td class='confluenceTd'> string </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> dubbo协议缺省为netty,http协议缺省为servlet </td>
<td class='confluenceTd'> 性能调优 </td>
<td class='confluenceTd'> 协议的服务器端实现类型,比如:dubbo协议的mina,netty等,http协议的jetty,servlet等 </td>
<td class='confluenceTd'> 2.0.5以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:protocol&gt; </td>
<td class='confluenceTd'> client </td>
<td class='confluenceTd'> client </td>
<td class='confluenceTd'> string </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> dubbo协议缺省为netty </td>
<td class='confluenceTd'> 性能调优 </td>
<td class='confluenceTd'> 协议的客户端实现类型,比如:dubbo协议的mina,netty等 </td>
<td class='confluenceTd'> 2.0.5以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:protocol&gt; </td>
<td class='confluenceTd'> dispatcher </td>
<td class='confluenceTd'> dispatcher </td>
<td class='confluenceTd'> string </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> dubbo协议缺省为all </td>
<td class='confluenceTd'> 性能调优 </td>
<td class='confluenceTd'> 协议的消息派发方式,用于指定线程模型,比如:dubbo协议的all, direct, message, execution, connection等 </td>
<td class='confluenceTd'> 2.1.0以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:protocol&gt; </td>
<td class='confluenceTd'> queues </td>
<td class='confluenceTd'> queues </td>
<td class='confluenceTd'> int </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> 0 </td>
<td class='confluenceTd'> 性能调优 </td>
<td class='confluenceTd'> 线程池队列大小,当线程池满时,排队等待执行的队列大小,建议不要设置,当线程程池时应立即失败,重试其它服务提供机器,而不是排队,除非有特殊需求。 </td>
<td class='confluenceTd'> 2.0.5以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:protocol&gt; </td>
<td class='confluenceTd'> charset </td>
<td class='confluenceTd'> charset </td>
<td class='confluenceTd'> string </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> UTF-8 </td>
<td class='confluenceTd'> 性能调优 </td>
<td class='confluenceTd'> 序列化编码 </td>
<td class='confluenceTd'> 2.0.5以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:protocol&gt; </td>
<td class='confluenceTd'> buffer </td>
<td class='confluenceTd'> buffer </td>
<td class='confluenceTd'> int </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> 8192 </td>
<td class='confluenceTd'> 性能调优 </td>
<td class='confluenceTd'> 网络读写缓冲区大小 </td>
<td class='confluenceTd'> 2.0.5以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:protocol&gt; </td>
<td class='confluenceTd'> heartbeat </td>
<td class='confluenceTd'> heartbeat </td>
<td class='confluenceTd'> int </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> 0 </td>
<td class='confluenceTd'> 性能调优 </td>
<td class='confluenceTd'> 心跳间隔,对于长连接,当物理层断开时,比如拔网线,TCP的FIN消息来不及发送,对方收不到断开事件,此时需要心跳来帮助检查连接是否已断开 </td>
<td class='confluenceTd'> 2.0.10以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:protocol&gt; </td>
<td class='confluenceTd'> telnet </td>
<td class='confluenceTd'> telnet </td>
<td class='confluenceTd'> string </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> 服务治理 </td>
<td class='confluenceTd'> 所支持的telnet命令,多个命令用逗号分隔 </td>
<td class='confluenceTd'> 2.0.5以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:protocol&gt; </td>
<td class='confluenceTd'> register </td>
<td class='confluenceTd'> register </td>
<td class='confluenceTd'> boolean </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> true </td>
<td class='confluenceTd'> 服务治理 </td>
<td class='confluenceTd'> 该协议的服务是否注册到注册中心 </td>
<td class='confluenceTd'> 2.0.8以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:protocol&gt; </td>
<td class='confluenceTd'> contextpath </td>
<td class='confluenceTd'> contextpath </td>
<td class='confluenceTd'> String </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> 缺省为空串 </td>
<td class='confluenceTd'> 服务治理 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> 2.0.6以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:protocol&gt; </td>
<td class='confluenceTd'> default </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> boolean </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> true </td>
<td class='confluenceTd'> 配置关联 </td>
<td class='confluenceTd'> 是否缺省对所有服务生效,用于自动装配,如果设置default="false",服务将不会自动使用该协议,需用id号关联。 </td>
<td class='confluenceTd'> 2.1.2以上版本 </td>
</tr>
</tbody></table>
</div>
<h3><a name="UserGuide-%3Cdubbo%3Aregistry%2F%3E"></a>&lt;dubbo:registry/&gt;</h3>
<p>(<a href="Registry+Config.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/Registry+Config" title="Registry Config">+</a>) (<a href="#UserGuide-%253Cdubbo%253Aregistry%252F%253E">#</a>)</p>
<p>注册中心配置:<br/>
配置类:com.alibaba.dubbo.config.RegistryConfig<br/>
说明:如果有多个不同的注册中心,可以声明多个&lt;dubbo:registry&gt;标签,并在&lt;dubbo:service&gt;或&lt;dubbo:reference&gt;的registry属性指定使用的注册中心。</p>
<div class='table-wrap'>
<table class='confluenceTable'><tbody>
<tr>
<th class='confluenceTh'> 标签 </th>
<th class='confluenceTh'> 属性 </th>
<th class='confluenceTh'> 对应URL参数 </th>
<th class='confluenceTh'> 类型 </th>
<th class='confluenceTh'> 是否必填 </th>
<th class='confluenceTh'> 缺省值 </th>
<th class='confluenceTh'> 作用 </th>
<th class='confluenceTh'> 描述 </th>
<th class='confluenceTh'> 兼容性 </th>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:registry&gt; </td>
<td class='confluenceTd'> id </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> string </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> 配置关联 </td>
<td class='confluenceTd'> 注册中心引用BeanId,可以在&lt;dubbo:service registry=""&gt;或&lt;dubbo:reference registry=""&gt;中引用此ID </td>
<td class='confluenceTd'> 1.0.16以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:registry&gt; </td>
<td class='confluenceTd'> address </td>
<td class='confluenceTd'> &lt;host:port&gt; </td>
<td class='confluenceTd'> string </td>
<td class='confluenceTd'> <b>必填</b> </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> 服务发现 </td>
<td class='confluenceTd'> 注册中心服务器地址,如果地址没有端口缺省为9090,同一集群内的多个地址用逗号分隔,如:ip:port,ip:port,不同集群的注册中心,请配置多个&lt;dubbo:registry&gt;标签 </td>
<td class='confluenceTd'> 1.0.16以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:registry&gt; </td>
<td class='confluenceTd'> protocol </td>
<td class='confluenceTd'> &lt;protocol&gt; </td>
<td class='confluenceTd'> string </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> dubbo </td>
<td class='confluenceTd'> 服务发现 </td>
<td class='confluenceTd'> 注同中心地址协议,支持dubbo, http, local三种协议,分别表示,dubbo地址,http地址,本地注册中心 </td>
<td class='confluenceTd'> 2.0.0以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:registry&gt; </td>
<td class='confluenceTd'> port </td>
<td class='confluenceTd'> &lt;port&gt; </td>
<td class='confluenceTd'> int </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> 9090 </td>
<td class='confluenceTd'> 服务发现 </td>
<td class='confluenceTd'> 注册中心缺省端口,当address没有带端口时使用此端口做为缺省值 </td>
<td class='confluenceTd'> 2.0.0以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:registry&gt; </td>
<td class='confluenceTd'> username </td>
<td class='confluenceTd'> &lt;username&gt; </td>
<td class='confluenceTd'> string </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> 服务治理 </td>
<td class='confluenceTd'> 登录注册中心用户名,如果注册中心不需要验证可不填 </td>
<td class='confluenceTd'> 2.0.0以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:registry&gt; </td>
<td class='confluenceTd'> password </td>
<td class='confluenceTd'> &lt;password&gt; </td>
<td class='confluenceTd'> string </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> 服务治理 </td>
<td class='confluenceTd'> 登录注册中心密码,如果注册中心不需要验证可不填 </td>
<td class='confluenceTd'> 2.0.0以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:registry&gt; </td>
<td class='confluenceTd'> transport </td>
<td class='confluenceTd'> registry.transporter </td>
<td class='confluenceTd'> string </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> netty </td>
<td class='confluenceTd'> 性能调优 </td>
<td class='confluenceTd'> 网络传输方式,可选mina,netty </td>
<td class='confluenceTd'> 2.0.0以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:registry&gt; </td>
<td class='confluenceTd'> timeout </td>
<td class='confluenceTd'> registry.timeout </td>
<td class='confluenceTd'> int </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> 5000 </td>
<td class='confluenceTd'> 性能调优 </td>
<td class='confluenceTd'> 注册中心请求超时时间(毫秒) </td>
<td class='confluenceTd'> 2.0.0以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:registry&gt; </td>
<td class='confluenceTd'> session </td>
<td class='confluenceTd'> registry.session </td>
<td class='confluenceTd'> int </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> 60000 </td>
<td class='confluenceTd'> 性能调优 </td>
<td class='confluenceTd'> 注册中心会话超时时间(毫秒),用于检测提供者非正常断线后的脏数据,比如用心跳检测的实现,此时间就是心跳间隔,不同注册中心实现不一样。 </td>
<td class='confluenceTd'> 2.1.0以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:registry&gt; </td>
<td class='confluenceTd'> file </td>
<td class='confluenceTd'> registry.file </td>
<td class='confluenceTd'> string </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> 服务治理 </td>
<td class='confluenceTd'> 使用文件缓存注册中心地址列表及服务提供者列表,应用重启时将基于此文件恢复,<font color="#ff0000">注意:两个注册中心不能使用同一文件存储</font> </td>
<td class='confluenceTd'> 2.0.0以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:registry&gt; </td>
<td class='confluenceTd'> wait </td>
<td class='confluenceTd'> registry.wait </td>
<td class='confluenceTd'> int </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> 0 </td>
<td class='confluenceTd'> 性能调优 </td>
<td class='confluenceTd'> 停止时等待通知完成时间(毫秒) </td>
<td class='confluenceTd'> 2.0.0以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:registry&gt; </td>
<td class='confluenceTd'> check </td>
<td class='confluenceTd'> check </td>
<td class='confluenceTd'> boolean </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> true </td>
<td class='confluenceTd'> 服务治理 </td>
<td class='confluenceTd'> 注册中心不存在时,是否报错 </td>
<td class='confluenceTd'> 2.0.0以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:registry&gt; </td>
<td class='confluenceTd'> register </td>
<td class='confluenceTd'> register </td>
<td class='confluenceTd'> boolean </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> true </td>
<td class='confluenceTd'> 服务治理 </td>
<td class='confluenceTd'> 是否向此注册中心注册服务,如果设为false,将只订阅,不注册 </td>
<td class='confluenceTd'> 2.0.5以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:registry&gt; </td>
<td class='confluenceTd'> subscribe </td>
<td class='confluenceTd'> subscribe </td>
<td class='confluenceTd'> boolean </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> true </td>
<td class='confluenceTd'> 服务治理 </td>
<td class='confluenceTd'> 是否向此注册中心订阅服务,如果设为false,将只注册,不订阅 </td>
<td class='confluenceTd'> 2.0.5以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:registry&gt; </td>
<td class='confluenceTd'> dynamic </td>
<td class='confluenceTd'> dynamic </td>
<td class='confluenceTd'> boolean </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> true </td>
<td class='confluenceTd'> 服务治理 </td>
<td class='confluenceTd'> 服务是否动态注册,如果设为false,注册后将显示后disable状态,需人工启用,并且服务提供者停止时,也不会自动取消册,需人工禁用。 </td>
<td class='confluenceTd'> 2.0.5以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:registry&gt; </td>
<td class='confluenceTd'> default </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> boolean </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> true </td>
<td class='confluenceTd'> 配置关联 </td>
<td class='confluenceTd'> 是否缺省对所有服务生效,用于自动装配,如果设置default="false",服务和引用将不会自动使用该注册中心,需用id号关联。 </td>
<td class='confluenceTd'> 2.1.2以上版本 </td>
</tr>
</tbody></table>
</div>
<h3><a name="UserGuide-%3Cdubbo%3Amonitor%2F%3E"></a>&lt;dubbo:monitor/&gt;</h3>
<p>(<a href="Monitor+Config.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/Monitor+Config" title="Monitor Config">+</a>) (<a href="#UserGuide-%253Cdubbo%253Amonitor%252F%253E">#</a>)</p>
<p>监控中心配置:<br/>
配置类:com.alibaba.dubbo.config.MonitorConfig</p>
<div class='table-wrap'>
<table class='confluenceTable'><tbody>
<tr>
<th class='confluenceTh'> 标签 </th>
<th class='confluenceTh'> 属性 </th>
<th class='confluenceTh'> 对应URL参数 </th>
<th class='confluenceTh'> 类型 </th>
<th class='confluenceTh'> 是否必填 </th>
<th class='confluenceTh'> 缺省值 </th>
<th class='confluenceTh'> 作用 </th>
<th class='confluenceTh'> 描述 </th>
<th class='confluenceTh'> 兼容性 </th>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:monitor&gt; </td>
<td class='confluenceTd'> protocol </td>
<td class='confluenceTd'> protocol </td>
<td class='confluenceTd'> string </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> dubbo </td>
<td class='confluenceTd'> 服务治理 </td>
<td class='confluenceTd'> 监控中心协议,如果为protocol="registry",表示从注册中心发现监控中心地址,否则直连监控中心。 </td>
<td class='confluenceTd'> 2.0.9以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:monitor&gt; </td>
<td class='confluenceTd'> address </td>
<td class='confluenceTd'> &lt;url&gt; </td>
<td class='confluenceTd'> string </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> N/A </td>
<td class='confluenceTd'> 服务治理 </td>
<td class='confluenceTd'> 直连监控中心服务器地址,address="10.20.130.230:12080" </td>
<td class='confluenceTd'> 1.0.16以上版本 </td>
</tr>
</tbody></table>
</div>
<h3><a name="UserGuide-%3Cdubbo%3Aapplication%2F%3E"></a>&lt;dubbo:application/&gt;</h3>
<p>(<a href="Application+Config.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/Application+Config" title="Application Config">+</a>) (<a href="#UserGuide-%253Cdubbo%253Aapplication%252F%253E">#</a>)</p>
<p>应用信息配置:<br/>
配置类:com.alibaba.dubbo.config.ApplicationConfig</p>
<div class='table-wrap'>
<table class='confluenceTable'><tbody>
<tr>
<th class='confluenceTh'> 标签 </th>
<th class='confluenceTh'> 属性 </th>
<th class='confluenceTh'> 对应URL参数 </th>
<th class='confluenceTh'> 类型 </th>
<th class='confluenceTh'> 是否必填 </th>
<th class='confluenceTh'> 缺省值 </th>
<th class='confluenceTh'> 作用 </th>
<th class='confluenceTh'> 描述 </th>
<th class='confluenceTh'> 兼容性 </th>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:application&gt; </td>
<td class='confluenceTd'> name </td>
<td class='confluenceTd'> application </td>
<td class='confluenceTd'> string </td>
<td class='confluenceTd'> <b>必填</b> </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> 服务治理 </td>
<td class='confluenceTd'> 当前应用名称,用于注册中心计算应用间依赖关系,<font color="red">注意:消费者和提供者应用名不要一样,此参数不是匹配条件</font>,你当前项目叫什么名字就填什么,和提供者消费者角色无关,比如:kylin应用调用了morgan应用的服务,则kylin项目配成kylin,morgan项目配成morgan,可能kylin也提供其它服务给别人使用,但kylin项目永远配成kylin,这样注册中心将显示kylin依赖于morgan </td>
<td class='confluenceTd'> 1.0.16以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:application&gt; </td>
<td class='confluenceTd'> version </td>
<td class='confluenceTd'> application.version </td>
<td class='confluenceTd'> string </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> 服务治理 </td>
<td class='confluenceTd'> 当前应用的版本 </td>
<td class='confluenceTd'> 2.2.0以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:application&gt; </td>
<td class='confluenceTd'> owner </td>
<td class='confluenceTd'> owner </td>
<td class='confluenceTd'> string </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> 服务治理 </td>
<td class='confluenceTd'> 应用负责人,用于服务治理,请填写负责人公司邮箱前缀 </td>
<td class='confluenceTd'> 2.0.5以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:application&gt; </td>
<td class='confluenceTd'> organization </td>
<td class='confluenceTd'> organization </td>
<td class='confluenceTd'> string </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> 服务治理 </td>
<td class='confluenceTd'> 组织名称(BU或部门),用于注册中心区分服务来源,<font color="#009900">此配置项建议不要使用autoconfig,直接写死在配置中,比如china,intl,itu,crm,asc,dw,aliexpress等</font> </td>
<td class='confluenceTd'> 2.0.0以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:application&gt; </td>
<td class='confluenceTd'> architecture <br class="atl-forced-newline" /> </td>
<td class='confluenceTd'> architecture <br class="atl-forced-newline" /> </td>
<td class='confluenceTd'> string </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> 服务治理 </td>
<td class='confluenceTd'> 用于服务分层对应的架构。如,intl、china。不同的架构使用不同的分层。 </td>
<td class='confluenceTd'> 2.0.7以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:application&gt; </td>
<td class='confluenceTd'> environment </td>
<td class='confluenceTd'> environment </td>
<td class='confluenceTd'> string </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> 服务治理 </td>
<td class='confluenceTd'> 应用环境,如:develop/test/product,不同环境使用不同的缺省值,以及作为只用于开发测试功能的限制条件 </td>
<td class='confluenceTd'> 2.0.0以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:application&gt; </td>
<td class='confluenceTd'> compiler </td>
<td class='confluenceTd'> compiler </td>
<td class='confluenceTd'> string </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> javassist </td>
<td class='confluenceTd'> 性能优化 </td>
<td class='confluenceTd'> Java字节码编译器,用于动态类的生成,可选:jdk或javassist </td>
<td class='confluenceTd'> 2.1.0以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:application&gt; </td>
<td class='confluenceTd'> logger </td>
<td class='confluenceTd'> logger </td>
<td class='confluenceTd'> string </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> slf4j </td>
<td class='confluenceTd'> 性能优化 </td>
<td class='confluenceTd'> 日志输出方式,可选:slf4j,jcl,log4j,jdk </td>
<td class='confluenceTd'> 2.2.0以上版本 </td>
</tr>
</tbody></table>
</div>
<h3><a name="UserGuide-%3Cdubbo%3Amodule%2F%3E"></a>&lt;dubbo:module/&gt;</h3>
<p>(<a href="Module+Config.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/Module+Config" title="Module Config">+</a>) (<a href="#UserGuide-%253Cdubbo%253Amodule%252F%253E">#</a>)</p>
<p>模块信息配置:<br/>
配置类:com.alibaba.dubbo.config.ModuleConfig</p>
<div class='table-wrap'>
<table class='confluenceTable'><tbody>
<tr>
<th class='confluenceTh'> 标签 </th>
<th class='confluenceTh'> 属性 </th>
<th class='confluenceTh'> 对应URL参数 </th>
<th class='confluenceTh'> 类型 </th>
<th class='confluenceTh'> 是否必填 </th>
<th class='confluenceTh'> 缺省值 </th>
<th class='confluenceTh'> 作用 </th>
<th class='confluenceTh'> 描述 </th>
<th class='confluenceTh'> 兼容性 </th>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:module&gt; </td>
<td class='confluenceTd'> name </td>
<td class='confluenceTd'> module </td>
<td class='confluenceTd'> string </td>
<td class='confluenceTd'> <b>必填</b> </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> 服务治理 </td>
<td class='confluenceTd'> 当前模块名称,用于注册中心计算模块间依赖关系 </td>
<td class='confluenceTd'> 2.2.0以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:module&gt; </td>
<td class='confluenceTd'> version </td>
<td class='confluenceTd'> module.version </td>
<td class='confluenceTd'> string </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> 服务治理 </td>
<td class='confluenceTd'> 当前模块的版本 </td>
<td class='confluenceTd'> 2.2.0以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:module&gt; </td>
<td class='confluenceTd'> owner </td>
<td class='confluenceTd'> owner </td>
<td class='confluenceTd'> string </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> 服务治理 </td>
<td class='confluenceTd'> 模块负责人,用于服务治理,请填写负责人公司邮箱前缀 </td>
<td class='confluenceTd'> 2.2.0以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:module&gt; </td>
<td class='confluenceTd'> organization </td>
<td class='confluenceTd'> organization </td>
<td class='confluenceTd'> string </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> 服务治理 </td>
<td class='confluenceTd'> 组织名称(BU或部门),用于注册中心区分服务来源,<font color="#009900">此配置项建议不要使用autoconfig,直接写死在配置中,比如china,intl,itu,crm,asc,dw,aliexpress等</font> </td>
<td class='confluenceTd'> 2.2.0以上版本 </td>
</tr>
</tbody></table>
</div>
<h3><a name="UserGuide-%3Cdubbo%3Aprovider%2F%3E"></a>&lt;dubbo:provider/&gt;</h3>
<p>(<a href="Provider+Config.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/Provider+Config" title="Provider Config">+</a>) (<a href="#UserGuide-%253Cdubbo%253Aprovider%252F%253E">#</a>)</p>
<p>服务提供者缺省值配置:<br/>
配置类:com.alibaba.dubbo.config.ProviderConfig<br/>
说明:该标签为&lt;dubbo:service&gt;和&lt;dubbo:protocol&gt;标签的缺省值设置。</p>
<div class='table-wrap'>
<table class='confluenceTable'><tbody>
<tr>
<th class='confluenceTh'> 标签 </th>
<th class='confluenceTh'> 属性 </th>
<th class='confluenceTh'> 对应URL参数 </th>
<th class='confluenceTh'> 类型 </th>
<th class='confluenceTh'> 是否必填 </th>
<th class='confluenceTh'> 缺省值 </th>
<th class='confluenceTh'> 作用 </th>
<th class='confluenceTh'> 描述 </th>
<th class='confluenceTh'> 兼容性 </th>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:provider&gt; </td>
<td class='confluenceTd'> id </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> string </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> dubbo </td>
<td class='confluenceTd'> 配置关联 </td>
<td class='confluenceTd'> 协议BeanId,可以在&lt;dubbo:service proivder=""&gt;中引用此ID </td>
<td class='confluenceTd'> 1.0.16以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:provider&gt; </td>
<td class='confluenceTd'> protocol </td>
<td class='confluenceTd'> &lt;protocol&gt; </td>
<td class='confluenceTd'> string </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> dubbo </td>
<td class='confluenceTd'> 性能调优 </td>
<td class='confluenceTd'> 协议名称 </td>
<td class='confluenceTd'> 1.0.16以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:provider&gt; </td>
<td class='confluenceTd'> host </td>
<td class='confluenceTd'> &lt;host&gt; </td>
<td class='confluenceTd'> string </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> 自动查找本机IP </td>
<td class='confluenceTd'> 服务发现 </td>
<td class='confluenceTd'> 服务主机名,多网卡选择或指定VIP及域名时使用,为空则自动查找本机IP,<font color="red">建议不要配置,让Dubbo自动获取本机IP</font> </td>
<td class='confluenceTd'> 1.0.16以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:provider&gt; </td>
<td class='confluenceTd'> threads </td>
<td class='confluenceTd'> threads </td>
<td class='confluenceTd'> int </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> 100 </td>
<td class='confluenceTd'> 性能调优 </td>
<td class='confluenceTd'> 服务线程池大小(固定大小) </td>
<td class='confluenceTd'> 1.0.16以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:provider&gt; </td>
<td class='confluenceTd'> payload </td>
<td class='confluenceTd'> payload </td>
<td class='confluenceTd'> int </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> 88388608(=8M) </td>
<td class='confluenceTd'> 性能调优 </td>
<td class='confluenceTd'> 请求及响应数据包大小限制,单位:字节 </td>
<td class='confluenceTd'> 2.0.0以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:provider&gt; </td>
<td class='confluenceTd'> path </td>
<td class='confluenceTd'> &lt;path&gt; </td>
<td class='confluenceTd'> string </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> 服务发现 </td>
<td class='confluenceTd'> 提供者上下文路径,为服务path的前缀 </td>
<td class='confluenceTd'> 2.0.0以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:provider&gt; </td>
<td class='confluenceTd'> server </td>
<td class='confluenceTd'> server </td>
<td class='confluenceTd'> string </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> dubbo协议缺省为netty,http协议缺省为servlet </td>
<td class='confluenceTd'> 性能调优 </td>
<td class='confluenceTd'> 协议的服务器端实现类型,比如:dubbo协议的mina,netty等,http协议的jetty,servlet等 </td>
<td class='confluenceTd'> 2.0.0以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:provider&gt; </td>
<td class='confluenceTd'> client </td>
<td class='confluenceTd'> client </td>
<td class='confluenceTd'> string </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> dubbo协议缺省为netty </td>
<td class='confluenceTd'> 性能调优 </td>
<td class='confluenceTd'> 协议的客户端实现类型,比如:dubbo协议的mina,netty等 </td>
<td class='confluenceTd'> 2.0.0以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:provider&gt; </td>
<td class='confluenceTd'> codec </td>
<td class='confluenceTd'> codec </td>
<td class='confluenceTd'> string </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> dubbo </td>
<td class='confluenceTd'> 性能调优 </td>
<td class='confluenceTd'> 协议编码方式 </td>
<td class='confluenceTd'> 2.0.0以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:provider&gt; </td>
<td class='confluenceTd'> serialization </td>
<td class='confluenceTd'> serialization </td>
<td class='confluenceTd'> string </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> dubbo协议缺省为hessian2,rmi协议缺省为java,http协议缺省为json </td>
<td class='confluenceTd'> 性能调优 </td>
<td class='confluenceTd'> 协议序列化方式,当协议支持多种序列化方式时使用,比如:dubbo协议的dubbo,hessian2,java,compactedjava,以及http协议的json,xml等 </td>
<td class='confluenceTd'> 2.0.5以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:provider&gt; </td>
<td class='confluenceTd'> default </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> boolean </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> false </td>
<td class='confluenceTd'> 配置关联 </td>
<td class='confluenceTd'> 是否为缺省协议,用于多协议 </td>
<td class='confluenceTd'> 1.0.16以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:provider&gt; </td>
<td class='confluenceTd'> filter </td>
<td class='confluenceTd'> service.filter </td>
<td class='confluenceTd'> string </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> 性能调优 </td>
<td class='confluenceTd'> 服务提供方远程调用过程拦截器名称,多个名称用逗号分隔 </td>
<td class='confluenceTd'> 2.0.5以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:provider&gt; </td>
<td class='confluenceTd'> listener </td>
<td class='confluenceTd'> exporter.listener </td>
<td class='confluenceTd'> string </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> 性能调优 </td>
<td class='confluenceTd'> 服务提供方导出服务监听器名称,多个名称用逗号分隔 </td>
<td class='confluenceTd'> 2.0.5以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:provider&gt; </td>
<td class='confluenceTd'> threadpool </td>
<td class='confluenceTd'> threadpool </td>
<td class='confluenceTd'> string </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> fixed </td>
<td class='confluenceTd'> 性能调优 </td>
<td class='confluenceTd'> 线程池类型,可选:fixed/cached </td>
<td class='confluenceTd'> 2.0.5以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:provider&gt; </td>
<td class='confluenceTd'> accepts </td>
<td class='confluenceTd'> accepts </td>
<td class='confluenceTd'> int </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> 0 </td>
<td class='confluenceTd'> 性能调优 </td>
<td class='confluenceTd'> 服务提供者最大可接受连接数 </td>
<td class='confluenceTd'> 2.0.5以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:provider&gt; </td>
<td class='confluenceTd'> version </td>
<td class='confluenceTd'> version </td>
<td class='confluenceTd'> string </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> 0.0.0 </td>
<td class='confluenceTd'> 服务发现 </td>
<td class='confluenceTd'> 服务版本,建议使用两位数字版本,如:1.0,通常在接口不兼容时版本号才需要升级 </td>
<td class='confluenceTd'> 2.0.5以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:provider&gt; </td>
<td class='confluenceTd'> group </td>
<td class='confluenceTd'> group </td>
<td class='confluenceTd'> string </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> &nbsp; </td>
<td class='confluenceTd'> 服务发现 </td>
<td class='confluenceTd'> 服务分组,当一个接口有多个实现,可以用分组区分 </td>
<td class='confluenceTd'> 2.0.5以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:provider&gt; </td>
<td class='confluenceTd'> delay </td>
<td class='confluenceTd'> delay </td>
<td class='confluenceTd'> int </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> 0 </td>
<td class='confluenceTd'> 性能调优 </td>
<td class='confluenceTd'> 延迟注册服务时间(毫秒)&#45; ,设为-1时,表示延迟到Spring容器初始化完成时暴露服务 </td>
<td class='confluenceTd'> 2.0.5以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:provider&gt; </td>
<td class='confluenceTd'> timeout </td>
<td class='confluenceTd'> default.timeout </td>
<td class='confluenceTd'> int </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> 1000 </td>
<td class='confluenceTd'> 性能调优 </td>
<td class='confluenceTd'> 远程服务调用超时时间(毫秒) </td>
<td class='confluenceTd'> 2.0.5以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:provider&gt; </td>
<td class='confluenceTd'> retries </td>
<td class='confluenceTd'> default.retries </td>
<td class='confluenceTd'> int </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> 2 </td>
<td class='confluenceTd'> 性能调优 </td>
<td class='confluenceTd'> 远程服务调用重试次数,不包括第一次调用,不需要重试请设为0 </td>
<td class='confluenceTd'> 2.0.5以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:provider&gt; </td>
<td class='confluenceTd'> connections </td>
<td class='confluenceTd'> default.connections </td>
<td class='confluenceTd'> int </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> 0 </td>
<td class='confluenceTd'> 性能调优 </td>
<td class='confluenceTd'> 对每个提供者的最大连接数,rmi、http、hessian等短连接协议表示限制连接数,dubbo等长连接协表示建立的长连接个数 </td>
<td class='confluenceTd'> 2.0.5以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:provider&gt; </td>
<td class='confluenceTd'> loadbalance </td>
<td class='confluenceTd'> default.loadbalance </td>
<td class='confluenceTd'> string </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> random </td>
<td class='confluenceTd'> 性能调优 </td>
<td class='confluenceTd'> 负载均衡策略,可选值:random,roundrobin,leastactive,分别表示:随机,轮循,最少活跃调用 </td>
<td class='confluenceTd'> 2.0.5以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:provider&gt; </td>
<td class='confluenceTd'> async </td>
<td class='confluenceTd'> default.async </td>
<td class='confluenceTd'> boolean </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> false </td>
<td class='confluenceTd'> 性能调优 </td>
<td class='confluenceTd'> 是否缺省异步执行,不可靠异步,只是忽略返回值,不阻塞执行线程 </td>
<td class='confluenceTd'> 2.0.5以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:provider&gt; </td>
<td class='confluenceTd'> stub </td>
<td class='confluenceTd'> stub </td>
<td class='confluenceTd'> boolean </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> false </td>
<td class='confluenceTd'> 服务治理 </td>
<td class='confluenceTd'> 设为true,表示使用缺省代理类名,即:接口名 + Local后缀。 </td>
<td class='confluenceTd'> 2.0.5以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:provider&gt; </td>
<td class='confluenceTd'> mock </td>
<td class='confluenceTd'> mock </td>
<td class='confluenceTd'> boolean </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> false </td>
<td class='confluenceTd'> 服务治理 </td>
<td class='confluenceTd'> 设为true,表示使用缺省Mock类名,即:接口名 + Mock后缀。 </td>
<td class='confluenceTd'> 2.0.5以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:provider&gt; </td>
<td class='confluenceTd'> token </td>
<td class='confluenceTd'> token </td>
<td class='confluenceTd'> boolean </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> false </td>
<td class='confluenceTd'> 服务治理 </td>
<td class='confluenceTd'> 令牌验证,为空表示不开启,如果为true,表示随机生成动态令牌 </td>
<td class='confluenceTd'> 2.0.5以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:provider&gt; </td>
<td class='confluenceTd'> registry </td>
<td class='confluenceTd'> registry </td>
<td class='confluenceTd'> string </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> 缺省向所有registry注册 </td>
<td class='confluenceTd'> 配置关联 </td>
<td class='confluenceTd'> 向指定注册中心注册,在多个注册中心时使用,值为&lt;dubbo:registry&gt;的id属性,多个注册中心ID用逗号分隔,如果不想将该服务注册到任何registry,可将值设为N/A </td>
<td class='confluenceTd'> 2.0.5以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:provider&gt; </td>
<td class='confluenceTd'> dynamic </td>
<td class='confluenceTd'> dynamic </td>
<td class='confluenceTd'> boolean </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> true </td>
<td class='confluenceTd'> 服务治理 </td>
<td class='confluenceTd'> 服务是否动态注册,如果设为false,注册后将显示后disable状态,需人工启用,并且服务提供者停止时,也不会自动取消册,需人工禁用。 </td>
<td class='confluenceTd'> 2.0.5以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:provider&gt; </td>
<td class='confluenceTd'> accesslog </td>
<td class='confluenceTd'> accesslog </td>
<td class='confluenceTd'> string/boolean </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> false </td>
<td class='confluenceTd'> 服务治理 </td>
<td class='confluenceTd'> 设为true,将向logger中输出访问日志,也可填写访问日志文件路径,直接把访问日志输出到指定文件 </td>
<td class='confluenceTd'> 2.0.5以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:provider&gt; </td>
<td class='confluenceTd'> owner </td>
<td class='confluenceTd'> owner </td>
<td class='confluenceTd'> string </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> 服务治理 </td>
<td class='confluenceTd'> 服务负责人,用于服务治理,请填写负责人公司邮箱前缀 </td>
<td class='confluenceTd'> 2.0.5以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:provider&gt; </td>
<td class='confluenceTd'> document </td>
<td class='confluenceTd'> document </td>
<td class='confluenceTd'> string </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> 服务治理 </td>
<td class='confluenceTd'> 服务文档URL </td>
<td class='confluenceTd'> 2.0.5以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:provider&gt; </td>
<td class='confluenceTd'> weight </td>
<td class='confluenceTd'> weight </td>
<td class='confluenceTd'> int </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> 性能调优 </td>
<td class='confluenceTd'> 服务权重 </td>
<td class='confluenceTd'> 2.0.5以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:provider&gt; </td>
<td class='confluenceTd'> executes </td>
<td class='confluenceTd'> executes </td>
<td class='confluenceTd'> int </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> 0 </td>
<td class='confluenceTd'> 性能调优 </td>
<td class='confluenceTd'> 服务提供者每服务每方法最大可并行执行请求数 </td>
<td class='confluenceTd'> 2.0.5以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:provider&gt; </td>
<td class='confluenceTd'> actives </td>
<td class='confluenceTd'> default.actives </td>
<td class='confluenceTd'> int </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> 0 </td>
<td class='confluenceTd'> 性能调优 </td>
<td class='confluenceTd'> 每服务消费者每服务每方法最大并发调用数 </td>
<td class='confluenceTd'> 2.0.5以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:provider&gt; </td>
<td class='confluenceTd'> proxy </td>
<td class='confluenceTd'> proxy </td>
<td class='confluenceTd'> string </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> javassist </td>
<td class='confluenceTd'> 性能调优 </td>
<td class='confluenceTd'> 生成动态代理方式,可选:jdk/javassist </td>
<td class='confluenceTd'> 2.0.5以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:provider&gt; </td>
<td class='confluenceTd'> cluster </td>
<td class='confluenceTd'> default.cluster </td>
<td class='confluenceTd'> string </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> failover </td>
<td class='confluenceTd'> 性能调优 </td>
<td class='confluenceTd'> 集群方式,可选:failover/failfast/failsafe/failback/forking </td>
<td class='confluenceTd'> 2.0.5以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:provider&gt; </td>
<td class='confluenceTd'> deprecated </td>
<td class='confluenceTd'> deprecated </td>
<td class='confluenceTd'> boolean </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> false </td>
<td class='confluenceTd'> 服务治理 </td>
<td class='confluenceTd'> 服务是否过时,如果设为true,消费方引用时将打印服务过时警告error日志 </td>
<td class='confluenceTd'> 2.0.5以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:provider&gt; </td>
<td class='confluenceTd'> queues </td>
<td class='confluenceTd'> queues </td>
<td class='confluenceTd'> int </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> 0 </td>
<td class='confluenceTd'> 性能调优 </td>
<td class='confluenceTd'> 线程池队列大小,当线程池满时,排队等待执行的队列大小,建议不要设置,当线程程池时应立即失败,重试其它服务提供机器,而不是排队,除非有特殊需求。 </td>
<td class='confluenceTd'> 2.0.5以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:provider&gt; </td>
<td class='confluenceTd'> charset </td>
<td class='confluenceTd'> charset </td>
<td class='confluenceTd'> string </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> UTF-8 </td>
<td class='confluenceTd'> 性能调优 </td>
<td class='confluenceTd'> 序列化编码 </td>
<td class='confluenceTd'> 2.0.5以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:provider&gt; </td>
<td class='confluenceTd'> buffer </td>
<td class='confluenceTd'> buffer </td>
<td class='confluenceTd'> int </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> 8192 </td>
<td class='confluenceTd'> 性能调优 </td>
<td class='confluenceTd'> 网络读写缓冲区大小 </td>
<td class='confluenceTd'> 2.0.5以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:provider&gt; </td>
<td class='confluenceTd'> iothreads </td>
<td class='confluenceTd'> iothreads </td>
<td class='confluenceTd'> int </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> CPU + 1 </td>
<td class='confluenceTd'> 性能调优 </td>
<td class='confluenceTd'> IO线程池,接收网络读写中断,以及序列化和反序列化,不处理业务,业务线程池参见threads配置,此线程池和CPU相关,不建议配置。 </td>
<td class='confluenceTd'> 2.0.5以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:provider&gt; </td>
<td class='confluenceTd'> telnet </td>
<td class='confluenceTd'> telnet </td>
<td class='confluenceTd'> string </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> 服务治理 </td>
<td class='confluenceTd'> 所支持的telnet命令,多个命令用逗号分隔 </td>
<td class='confluenceTd'> 2.0.5以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:service&gt; </td>
<td class='confluenceTd'> contextpath </td>
<td class='confluenceTd'> contextpath </td>
<td class='confluenceTd'> String </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> 缺省为空串 </td>
<td class='confluenceTd'> 服务治理 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> 2.0.6以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:provider&gt; </td>
<td class='confluenceTd'> layer </td>
<td class='confluenceTd'> layer </td>
<td class='confluenceTd'> string </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> 服务治理 </td>
<td class='confluenceTd'> 服务提供者所在的分层。如:biz、dao、intl:web、china:acton。 </td>
<td class='confluenceTd'> 2.0.7以上版本 </td>
</tr>
</tbody></table>
</div>
<h3><a name="UserGuide-%3Cdubbo%3Aconsumer%2F%3E"></a>&lt;dubbo:consumer/&gt;</h3>
<p>(<a href="Consumer+Config.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/Consumer+Config" title="Consumer Config">+</a>) (<a href="#UserGuide-%253Cdubbo%253Aconsumer%252F%253E">#</a>)</p>
<p>服务消费者缺省值配置:<br/>
配置类:com.alibaba.dubbo.config.ConsumerConfig<br/>
说明:该标签为&lt;dubbo:reference&gt;标签的缺省值设置。</p>
<div class='table-wrap'>
<table class='confluenceTable'><tbody>
<tr>
<th class='confluenceTh'> 标签 </th>
<th class='confluenceTh'> 属性 </th>
<th class='confluenceTh'> 对应URL参数 </th>
<th class='confluenceTh'> 类型 </th>
<th class='confluenceTh'> 是否必填 </th>
<th class='confluenceTh'> 缺省值 </th>
<th class='confluenceTh'> 作用 </th>
<th class='confluenceTh'> 描述 </th>
<th class='confluenceTh'> 兼容性 </th>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:consumer&gt; </td>
<td class='confluenceTd'> timeout </td>
<td class='confluenceTd'> default.timeout </td>
<td class='confluenceTd'> int </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> 1000 </td>
<td class='confluenceTd'> 性能调优 </td>
<td class='confluenceTd'> 远程服务调用超时时间(毫秒) </td>
<td class='confluenceTd'> 1.0.16以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:consumer&gt; </td>
<td class='confluenceTd'> retries </td>
<td class='confluenceTd'> default.retries </td>
<td class='confluenceTd'> int </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> 2 </td>
<td class='confluenceTd'> 性能调优 </td>
<td class='confluenceTd'> 远程服务调用重试次数,不包括第一次调用,不需要重试请设为0 </td>
<td class='confluenceTd'> 1.0.16以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:consumer&gt; </td>
<td class='confluenceTd'> loadbalance </td>
<td class='confluenceTd'> default.loadbalance </td>
<td class='confluenceTd'> string </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> random </td>
<td class='confluenceTd'> 性能调优 </td>
<td class='confluenceTd'> 负载均衡策略,可选值:random,roundrobin,leastactive,分别表示:随机,轮循,最少活跃调用 </td>
<td class='confluenceTd'> 1.0.16以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:consumer&gt; </td>
<td class='confluenceTd'> async </td>
<td class='confluenceTd'> default.async </td>
<td class='confluenceTd'> boolean </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> false </td>
<td class='confluenceTd'> 性能调优 </td>
<td class='confluenceTd'> 是否缺省异步执行,不可靠异步,只是忽略返回值,不阻塞执行线程 </td>
<td class='confluenceTd'> 2.0.0以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:consumer&gt; </td>
<td class='confluenceTd'> connections </td>
<td class='confluenceTd'> default.connections </td>
<td class='confluenceTd'> int </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> 100 </td>
<td class='confluenceTd'> 性能调优 </td>
<td class='confluenceTd'> 每个服务对每个提供者的最大连接数,rmi、http、hessian等短连接协议支持此配置,dubbo协议长连接不支持此配置 </td>
<td class='confluenceTd'> 1.0.16以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:consumer&gt; </td>
<td class='confluenceTd'> generic </td>
<td class='confluenceTd'> generic </td>
<td class='confluenceTd'> boolean </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> false </td>
<td class='confluenceTd'> 服务治理 </td>
<td class='confluenceTd'> 是否缺省泛化接口,如果为泛化接口,将返回GenericService </td>
<td class='confluenceTd'> 2.0.0以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:consumer&gt; </td>
<td class='confluenceTd'> check </td>
<td class='confluenceTd'> check </td>
<td class='confluenceTd'> boolean </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> true </td>
<td class='confluenceTd'> 服务治理 </td>
<td class='confluenceTd'> 启动时检查提供者是否存在,true报错,false忽略 </td>
<td class='confluenceTd'> 1.0.16以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:consumer&gt; </td>
<td class='confluenceTd'> proxy </td>
<td class='confluenceTd'> proxy </td>
<td class='confluenceTd'> string </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> javassist </td>
<td class='confluenceTd'> 性能调优 </td>
<td class='confluenceTd'> 生成动态代理方式,可选:jdk/javassist </td>
<td class='confluenceTd'> 2.0.5以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:consumer&gt; </td>
<td class='confluenceTd'> owner </td>
<td class='confluenceTd'> owner </td>
<td class='confluenceTd'> string </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> 服务治理 </td>
<td class='confluenceTd'> 调用服务负责人,用于服务治理,请填写负责人公司邮箱前缀 </td>
<td class='confluenceTd'> 2.0.5以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:consumer&gt; </td>
<td class='confluenceTd'> actives </td>
<td class='confluenceTd'> default.actives </td>
<td class='confluenceTd'> int </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> 0 </td>
<td class='confluenceTd'> 性能调优 </td>
<td class='confluenceTd'> 每服务消费者每服务每方法最大并发调用数 </td>
<td class='confluenceTd'> 2.0.5以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:consumer&gt; </td>
<td class='confluenceTd'> cluster </td>
<td class='confluenceTd'> default.cluster </td>
<td class='confluenceTd'> string </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> failover </td>
<td class='confluenceTd'> 性能调优 </td>
<td class='confluenceTd'> 集群方式,可选:failover/failfast/failsafe/failback/forking </td>
<td class='confluenceTd'> 2.0.5以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:consumer&gt; </td>
<td class='confluenceTd'> filter </td>
<td class='confluenceTd'> reference.filter </td>
<td class='confluenceTd'> string </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> &nbsp; </td>
<td class='confluenceTd'> 性能调优 </td>
<td class='confluenceTd'> 服务消费方远程调用过程拦截器名称,多个名称用逗号分隔 </td>
<td class='confluenceTd'> 2.0.5以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:consumer&gt; </td>
<td class='confluenceTd'> listener </td>
<td class='confluenceTd'> invoker.listener </td>
<td class='confluenceTd'> string </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> 性能调优 </td>
<td class='confluenceTd'> 服务消费方引用服务监听器名称,多个名称用逗号分隔 </td>
<td class='confluenceTd'> 2.0.5以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:consumer&gt; </td>
<td class='confluenceTd'> registry </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> string </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> 缺省向所有registry注册 </td>
<td class='confluenceTd'> 配置关联 </td>
<td class='confluenceTd'> 向指定注册中心注册,在多个注册中心时使用,值为&lt;dubbo:registry&gt;的id属性,多个注册中心ID用逗号分隔,如果不想将该服务注册到任何registry,可将值设为N/A </td>
<td class='confluenceTd'> 2.0.5以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:consumer&gt; </td>
<td class='confluenceTd'> layer </td>
<td class='confluenceTd'> layer </td>
<td class='confluenceTd'> string </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> 服务治理 </td>
<td class='confluenceTd'> 服务调用者所在的分层。如:biz、dao、intl:web、china:acton。 </td>
<td class='confluenceTd'> 2.0.7以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:consumer&gt; </td>
<td class='confluenceTd'> init </td>
<td class='confluenceTd'> init </td>
<td class='confluenceTd'> boolean </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> false </td>
<td class='confluenceTd'> 性能调优 </td>
<td class='confluenceTd'> 是否在afterPropertiesSet()时饥饿初始化引用,否则等到有人注入或引用该实例时再初始化。 </td>
<td class='confluenceTd'> 2.0.10以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:consumer&gt; </td>
<td class='confluenceTd'> cache </td>
<td class='confluenceTd'> cache </td>
<td class='confluenceTd'> string/boolean </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> 服务治理 </td>
<td class='confluenceTd'> 以调用参数为key,缓存返回结果,可选:lru, threadlocal, jcache等 </td>
<td class='confluenceTd'> Dubbo2.1.0及其以上版本支持 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:consumer&gt; </td>
<td class='confluenceTd'> validation </td>
<td class='confluenceTd'> validation </td>
<td class='confluenceTd'> boolean </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> 服务治理 </td>
<td class='confluenceTd'> 是否启用JSR303标准注解验证,如果启用,将对方法参数上的注解进行校验 </td>
<td class='confluenceTd'> Dubbo2.1.0及其以上版本支持 </td>
</tr>
</tbody></table>
</div>
<h3><a name="UserGuide-%3Cdubbo%3Amethod%2F%3E"></a>&lt;dubbo:method/&gt;</h3>
<p>(<a href="Method+Config.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/Method+Config" title="Method Config">+</a>) (<a href="#UserGuide-%253Cdubbo%253Amethod%252F%253E">#</a>)</p>
<p>方法级配置:<br/>
配置类:com.alibaba.dubbo.config.MethodConfig<br/>
说明:该标签为&lt;dubbo:service&gt;或&lt;dubbo:reference&gt;的子标签,用于控制到方法级,</p>
<div class='table-wrap'>
<table class='confluenceTable'><tbody>
<tr>
<th class='confluenceTh'> 标签 </th>
<th class='confluenceTh'> 属性 </th>
<th class='confluenceTh'> 对应URL参数 </th>
<th class='confluenceTh'> 类型 </th>
<th class='confluenceTh'> 是否必填 </th>
<th class='confluenceTh'> 缺省值 </th>
<th class='confluenceTh'> 作用 </th>
<th class='confluenceTh'> 描述 </th>
<th class='confluenceTh'> 兼容性 </th>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:method&gt; </td>
<td class='confluenceTd'> name </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> string </td>
<td class='confluenceTd'> <b>必填</b> </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> 标识 </td>
<td class='confluenceTd'> 方法名 </td>
<td class='confluenceTd'> 1.0.8以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:method&gt; </td>
<td class='confluenceTd'> timeout </td>
<td class='confluenceTd'> &lt;metodName&gt;.timeout </td>
<td class='confluenceTd'> int </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> 缺省为的timeout </td>
<td class='confluenceTd'> 性能调优 </td>
<td class='confluenceTd'> 方法调用超时时间(毫秒) </td>
<td class='confluenceTd'> 1.0.8以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:method&gt; </td>
<td class='confluenceTd'> retries </td>
<td class='confluenceTd'> &lt;metodName&gt;.retries </td>
<td class='confluenceTd'> int </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> 缺省为&lt;dubbo:reference&gt;的retries </td>
<td class='confluenceTd'> 性能调优 </td>
<td class='confluenceTd'> 远程服务调用重试次数,不包括第一次调用,不需要重试请设为0 </td>
<td class='confluenceTd'> 2.0.0以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:method&gt; </td>
<td class='confluenceTd'> loadbalance </td>
<td class='confluenceTd'> &lt;metodName&gt;.loadbalance </td>
<td class='confluenceTd'> string </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> 缺省为的loadbalance </td>
<td class='confluenceTd'> 性能调优 </td>
<td class='confluenceTd'> 负载均衡策略,可选值:random,roundrobin,leastactive,分别表示:随机,轮循,最少活跃调用 </td>
<td class='confluenceTd'> 2.0.0以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:method&gt; </td>
<td class='confluenceTd'> async </td>
<td class='confluenceTd'> &lt;metodName&gt;.async </td>
<td class='confluenceTd'> boolean </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> 缺省为&lt;dubbo:reference&gt;的async </td>
<td class='confluenceTd'> 性能调优 </td>
<td class='confluenceTd'> 是否异步执行,不可靠异步,只是忽略返回值,不阻塞执行线程 </td>
<td class='confluenceTd'> 1.0.9以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:method&gt; </td>
<td class='confluenceTd'> sent </td>
<td class='confluenceTd'> &lt;methodName&gt;.sent </td>
<td class='confluenceTd'> boolean </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> true </td>
<td class='confluenceTd'> 性能调优 </td>
<td class='confluenceTd'> 异步调用时,标记sent=true时,表示网络已发出数据 </td>
<td class='confluenceTd'> 2.0.6以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:method&gt; </td>
<td class='confluenceTd'> actives </td>
<td class='confluenceTd'> &lt;metodName&gt;.actives </td>
<td class='confluenceTd'> int </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> 0 </td>
<td class='confluenceTd'> 性能调优 </td>
<td class='confluenceTd'> 每服务消费者最大并发调用限制 </td>
<td class='confluenceTd'> 2.0.5以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:method&gt; </td>
<td class='confluenceTd'> executes </td>
<td class='confluenceTd'> &lt;metodName&gt;.executes </td>
<td class='confluenceTd'> int </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> 0 </td>
<td class='confluenceTd'> 性能调优 </td>
<td class='confluenceTd'> 每服务每方法最大使用线程数限制&#45; &#45;,此属性只在&lt;dubbo:method&gt;作为&lt;dubbo:service&gt;子标签时有效 </td>
<td class='confluenceTd'> 2.0.5以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:method&gt; </td>
<td class='confluenceTd'> deprecated </td>
<td class='confluenceTd'> &lt;methodName&gt;.deprecated </td>
<td class='confluenceTd'> boolean </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> false </td>
<td class='confluenceTd'> 服务治理 </td>
<td class='confluenceTd'> 服务方法是否过时,此属性只在&lt;dubbo:method&gt;作为&lt;dubbo:service&gt;子标签时有效 </td>
<td class='confluenceTd'> 2.0.5以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:method&gt; </td>
<td class='confluenceTd'> sticky </td>
<td class='confluenceTd'> &lt;methodName&gt;.sticky </td>
<td class='confluenceTd'> boolean </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> false </td>
<td class='confluenceTd'> 服务治理 </td>
<td class='confluenceTd'> 设置true 该接口上的所有方法使用同一个provider.如果需要更复杂的规则,请使用用路由 </td>
<td class='confluenceTd'> 2.0.6以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:method&gt; </td>
<td class='confluenceTd'> return </td>
<td class='confluenceTd'> &lt;methodName&gt;.return </td>
<td class='confluenceTd'> boolean </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'> true </td>
<td class='confluenceTd'> 性能调优 </td>
<td class='confluenceTd'> 方法调用是否需要返回值,async设置为true时才生效,如果设置为true,则返回future,或回调onreturn等方法,如果设置为false,则请求发送成功后直接返回Null </td>
<td class='confluenceTd'> 2.0.6以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:method&gt; </td>
<td class='confluenceTd'> oninvoke </td>
<td class='confluenceTd'> attribute属性,不在URL中体现 </td>
<td class='confluenceTd'> String </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> 性能调优 </td>
<td class='confluenceTd'> 方法执行前拦截 </td>
<td class='confluenceTd'> 2.0.6以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:method&gt; </td>
<td class='confluenceTd'> onreturn </td>
<td class='confluenceTd'> attribute属性,不在URL中体现 </td>
<td class='confluenceTd'> String </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> 性能调优 </td>
<td class='confluenceTd'> 方法执行返回后拦截 </td>
<td class='confluenceTd'> 2.0.6以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:method&gt; </td>
<td class='confluenceTd'> onthrow </td>
<td class='confluenceTd'> attribute属性,不在URL中体现 </td>
<td class='confluenceTd'> String </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> 性能调优 </td>
<td class='confluenceTd'> 方法执行有异常拦截 </td>
<td class='confluenceTd'> 2.0.6以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:method&gt; </td>
<td class='confluenceTd'> cache </td>
<td class='confluenceTd'> &lt;methodName&gt;.cache </td>
<td class='confluenceTd'> string/boolean </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> 服务治理 </td>
<td class='confluenceTd'> 以调用参数为key,缓存返回结果,可选:lru, threadlocal, jcache等 </td>
<td class='confluenceTd'> Dubbo2.1.0及其以上版本支持 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:method&gt; </td>
<td class='confluenceTd'> validation </td>
<td class='confluenceTd'> &lt;methodName&gt;.validation </td>
<td class='confluenceTd'> boolean </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> 服务治理 </td>
<td class='confluenceTd'> 是否启用JSR303标准注解验证,如果启用,将对方法参数上的注解进行校验 </td>
<td class='confluenceTd'> Dubbo2.1.0及其以上版本支持 </td>
</tr>
</tbody></table>
</div>
<p>比如:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:reference interface="com.xxx.XxxService"&gt;
&lt;dubbo:method name="findXxx" timeout="3000" retries="2" /&gt;
&lt;/dubbo:reference&gt;]]></script>
</div></div>
<h3><a name="UserGuide-%3Cdubbo%3Aargument%2F%3E"></a>&lt;dubbo:argument/&gt;</h3>
<p>(<a href="Argument+Config.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/Argument+Config" title="Argument Config">+</a>) (<a href="#UserGuide-%253Cdubbo%253Aargumentn%252F%253E">#</a>)</p>
<p>方法参数配置:<br/>
配置类:com.alibaba.dubbo.config.ArgumentConfig<br/>
说明:该标签为&lt;dubbo:method&gt;的子标签,用于方法参数的特征描述,比如:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:method name="findXxx" timeout="3000" retries="2"&gt;
&lt;dubbo:argument index="0" callback="true" /&gt;
&lt;dubbo:method&gt;]]></script>
</div></div>
<div class='table-wrap'>
<table class='confluenceTable'><tbody>
<tr>
<th class='confluenceTh'> 标签 </th>
<th class='confluenceTh'> 属性 </th>
<th class='confluenceTh'> 对应URL参数 </th>
<th class='confluenceTh'> 类型 </th>
<th class='confluenceTh'> 是否必填 </th>
<th class='confluenceTh'> 缺省值 </th>
<th class='confluenceTh'> 作用 </th>
<th class='confluenceTh'> 描述 </th>
<th class='confluenceTh'> 兼容性 </th>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:argument&gt; </td>
<td class='confluenceTd'> index </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> int </td>
<td class='confluenceTd'> <b>必填</b> </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> 标识 </td>
<td class='confluenceTd'> 方法名 </td>
<td class='confluenceTd'> 2.0.6以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:argument&gt; </td>
<td class='confluenceTd'> type </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> String </td>
<td class='confluenceTd'> 与index二选一 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> 标识 </td>
<td class='confluenceTd'> 通过参数类型查找参数的index </td>
<td class='confluenceTd'> 2.0.6以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:argument&gt; </td>
<td class='confluenceTd'> callback </td>
<td class='confluenceTd'> &lt;metodName&gt;&lt;index&gt;.retries </td>
<td class='confluenceTd'> boolean </td>
<td class='confluenceTd'> 可选 </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> 服务治理 </td>
<td class='confluenceTd'> 参数是否为callback接口,如果为callback,服务提供方将生成反向代理,可以从服务提供方反向调用消费方,通常用于事件推送. </td>
<td class='confluenceTd'> 2.0.6以上版本 </td>
</tr>
</tbody></table>
</div>
<h3><a name="UserGuide-%3Cdubbo%3Aparameter%2F%3E"></a>&lt;dubbo:parameter/&gt;</h3>
<p>(<a href="Parameter+Config.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/Parameter+Config" title="Parameter Config">+</a>) (<a href="#UserGuide-%253Cdubbo%253Aparameter%252F%253E">#</a>)</p>
<p>选项参数配置:<br/>
配置类:java.util.Map<br/>
说明:该标签为&lt;dubbo:protocol&gt;或&lt;dubbo:service&gt;或&lt;dubbo:provider&gt;或&lt;dubbo:reference&gt;或&lt;dubbo:consumer&gt;的子标签,用于配置自定义参数,该配置项将作为扩展点设置自定义参数使用。</p>
<div class='table-wrap'>
<table class='confluenceTable'><tbody>
<tr>
<th class='confluenceTh'> 标签 </th>
<th class='confluenceTh'> 属性 </th>
<th class='confluenceTh'> 对应URL参数 </th>
<th class='confluenceTh'> 类型 </th>
<th class='confluenceTh'> 是否必填 </th>
<th class='confluenceTh'> 缺省值 </th>
<th class='confluenceTh'> 作用 </th>
<th class='confluenceTh'> 描述 </th>
<th class='confluenceTh'> 兼容性 </th>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:parameter&gt; </td>
<td class='confluenceTd'> key </td>
<td class='confluenceTd'> key </td>
<td class='confluenceTd'> string </td>
<td class='confluenceTd'> <b>必填</b> </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> 服务治理 </td>
<td class='confluenceTd'> 路由参数键 </td>
<td class='confluenceTd'> 2.0.0以上版本 </td>
</tr>
<tr>
<td class='confluenceTd'> &lt;dubbo:parameter&gt; </td>
<td class='confluenceTd'> value </td>
<td class='confluenceTd'> value </td>
<td class='confluenceTd'> string </td>
<td class='confluenceTd'> <b>必填</b> </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> 服务治理 </td>
<td class='confluenceTd'> 路由参数值 </td>
<td class='confluenceTd'> 2.0.0以上版本 </td>
</tr>
</tbody></table>
</div>
<p>比如:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:protocol name="jms"&gt;
&lt;dubbo:parameter key="queue" value="xxx" /&gt;
&lt;/dubbo:protocol&gt;]]></script>
</div></div>
<p>也可以:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:protocol name="jms" p:queue="xxx" /&gt;]]></script>
</div></div>
<p>详细参见:<a href="User+Guide.htm#UserGuide-CustomParameter" tppabs="http://10.20.160.198/wiki/display/dubbo/User+Guide#UserGuide-CustomParameter">Custom Parameter</a></p>
<h2><a name="UserGuide-ProtocolReference"></a>Protocol Reference</h2>
<p>(<a href="Protocol+Reference.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/Protocol+Reference" title="Protocol Reference">+</a>) (<a href="#UserGuide-ProtocolReference">#</a>)</p>
<div class='panelMacro'><table class='tipMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="check.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/check.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>推荐使用Dubbo协议</td></tr></table></div>
<div class='panelMacro'><table class='tipMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="check.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/check.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td><b>性能测试报告</b><br />各协议的性能情况,请参见:<a href="#UserGuide-PerformanceTestReport">Performance Test Report</a> (<a href="Performance+Test+Report.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/Performance+Test+Report" title="Performance Test Report">+</a>)</td></tr></table></div>
<h3><a name="UserGuide-dubbo%3A%2F%2F"></a>dubbo://</h3>
<p>(<a href="Dubbo+Protocol.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/Dubbo+Protocol" title="Dubbo Protocol">+</a>) (<a href="#UserGuide-dubbo%253A%252F%252F">#</a>)</p>
<div class='panelMacro'><table class='tipMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="check.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/check.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>Dubbo缺省协议采用单一长连接和NIO异步通讯,适合于小数据量大并发的服务调用,以及服务消费者机器数远大于服务提供者机器数的情况。</td></tr></table></div>
<div class='panelMacro'><table class='noteMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="warning-3.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/warning.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>Dubbo缺省协议不适合传送大数据量的服务,比如传文件,传视频等,除非请求量很低。</td></tr></table></div>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:protocol name="dubbo" port="20880" /&gt;]]></script>
</div></div>
<p>Set default protocol:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:provider protocol="dubbo" /&gt;]]></script>
</div></div>
<p>Set service protocol:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:service protocol="dubbo" /&gt;]]></script>
</div></div>
<p>Multi port:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:protocol id="dubbo1" name="dubbo" port="20880" /&gt;
&lt;dubbo:protocol id="dubbo2" name="dubbo" port="20881" /&gt;]]></script>
</div></div>
<p>Dubbo protocol options: </p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:protocol name=“dubbo port=“9090 server=“netty client=“netty codec=“dubbo serialization=“hessian2 charset=“UTF-8 threadpool=“fixed threads=“100 queues=“0 iothreads=“9 buffer=“8192 accepts=“1000 payload=“8388608 /&gt;]]></script>
</div></div>
<p><span class="image-wrap" style=""><img src="dubbo-protocol.jpg-version=1&modificationDate=1331068241000.jpg" tppabs="http://10.20.160.198/wiki/download/attachments/6949458/dubbo-protocol.jpg?version=1&modificationDate=1331068241000" style="border: 0px solid black" /></span></p>
<ul>
<li>Transporter
<ul>
<li>mina, netty, grizzy</li>
</ul>
</li>
<li>Serialization
<ul>
<li>dubbo, hessian2, java, json</li>
</ul>
</li>
<li>Dispatcher
<ul>
<li>all, direct, message, execution, connection</li>
</ul>
</li>
<li>ThreadPool
<ul>
<li>fixed, cached</li>
</ul>
</li>
</ul>
<div class='panelMacro'><table class='tipMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="check.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/check.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>Dubbo协议缺省每服务每提供者每消费者使用单一长连接,如果数据量较大,可以使用多个连接。</td></tr></table></div>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:protocol name="dubbo" connections="2" /&gt;]]></script>
</div></div>
<ul>
<li>&lt;dubbo:service connections=”0”&gt;或&lt;dubbo:reference connections=”0”&gt;表示该服务使用JVM共享长连接。(缺省)</li>
<li>&lt;dubbo:service connections=”1”&gt;或&lt;dubbo:reference connections=”1”&gt;表示该服务使用独立长连接。</li>
<li>&lt;dubbo:service connections=”2”&gt;或&lt;dubbo:reference connections=”2”&gt;表示该服务使用独立两条长连接。</li>
</ul>
<div class='panelMacro'><table class='tipMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="check.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/check.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>为防止被大量连接撑挂,可在服务提供方限制大接收连接数,以实现服务提供方自我保护。</td></tr></table></div>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:protocol name="dubbo" accepts="1000" /&gt;]]></script>
</div></div>
<p>缺省协议,使用基于netty3.2.2+hessian3.2.1交互。</p>
<ul>
<li>连接个数:单连接</li>
<li>连接方式:长连接</li>
<li>传输协议:TCP</li>
<li>传输方式:NIO异步传输</li>
<li>序列化:Hessian二进制序列化</li>
<li>适用范围:传入传出参数数据包较小(建议小于100K),消费者比提供者个数多,单一消费者无法压满提供者,<font color="red">尽量不要用dubbo协议传输大文件或超大字符串</font></li>
<li>适用场景:常规远程服务方法调用</li>
</ul>
<p>为什么要消费者比提供者个数多:<br/>
因dubbo协议采用单一长连接,<br/>
假设网络为千兆网卡(1024Mbit=128MByte),<br/>
根据测试经验数据每条连接最多只能压满7MByte(不同的环境可能不一样,供参考),<br/>
理论上1个服务提供者需要20个服务消费者才能压满网卡。</p>
<p>为什么不能传大包:<br/>
因dubbo协议采用单一长连接,<br/>
如果每次请求的数据包大小为500KByte,假设网络为千兆网卡(1024Mbit=128MByte),每条连接最大7MByte(不同的环境可能不一样,供参考),<br/>
单个服务提供者的TPS(每秒处理事务数)最大为:128MByte / 500KByte = 262。<br/>
单个消费者调用单个服务提供者的TPS(每秒处理事务数)最大为:7MByte / 500KByte = 14。<br/>
如果能接受,可以考虑使用,否则网络将成为瓶颈。</p>
<p>为什么采用异步单一长连接:<br/>
因为服务的现状大都是服务提供者少,通常只有几台机器,<br/>
而服务的消费者多,可能整个网站都在访问该服务,<br/>
比如Morgan的提供者只有6台提供者,却有上百台消费者,每天有1.5亿次调用,<br/>
如果采用常规的hessian服务,服务提供者很容易就被压跨,<br/>
通过单一连接,保证单一消费者不会压死提供者,<br/>
长连接,减少连接握手验证等,<br/>
并使用异步IO,复用线程池,防止C10K问题。</p>
<p>(1) 约束:</p>
<ul>
<li>参数及返回值需实现Serializable接口</li>
<li>参数及返回值需有无参构造函数(可以是private的)或者有参构造所有函数允许传入null值。</li>
<li>参数及返回值不能自定义实现List, Map, Number, Date, Calendar等接口,只能用JDK自带的实现,因为hessian会做特殊处理,自定义实现类中的属性值都会丢失。</li>
<li>Hessian序列化,只传成员属性值和值的类型,不传方法或静态变量,兼容情况:(由吴亚军提供)
<div class='table-wrap'>
<table class='confluenceTable'><tbody>
<tr>
<th class='confluenceTh'> 数据通讯 </th>
<th class='confluenceTh'> 情况 </th>
<th class='confluenceTh'> 结果 </th>
</tr>
<tr>
<td class='confluenceTd'> A-&gt;B </td>
<td class='confluenceTd'> 类A多一种 属性(或者说类B少一种 属性) </td>
<td class='confluenceTd'> 不抛异常,A多的那 个属性的值,B没有, 其他正常 </td>
</tr>
<tr>
<td class='confluenceTd'> A-&gt;B </td>
<td class='confluenceTd'> 枚举A多一种 枚举(或者说B少一种 枚举),A使用多 出来的枚举进行传输 </td>
<td class='confluenceTd'> 抛异常 </td>
</tr>
<tr>
<td class='confluenceTd'> A-&gt;B </td>
<td class='confluenceTd'> 枚举A多一种 枚举(或者说B少一种 枚举),A不使用 多出来的枚举进行传输 </td>
<td class='confluenceTd'> 不抛异常,B正常接 收数据 </td>
</tr>
<tr>
<td class='confluenceTd'> A-&gt;B </td>
<td class='confluenceTd'> A和B的属性 名相同,但类型不相同 </td>
<td class='confluenceTd'> 抛异常 </td>
</tr>
<tr>
<td class='confluenceTd'> A-&gt;B </td>
<td class='confluenceTd'> serialId 不相同 </td>
<td class='confluenceTd'> 正常传输 </td>
</tr>
</tbody></table>
</div>
<p>总结:会抛异常的情况:枚 举值一边多一种,一边少一种,正好使用了差别的那种,或者属性名相同,类型不同</p></li>
</ul>
<p>接口增加方法,对客户端无影响,如果该方法不是客户端需要的,客户端不需要重新部署;<br/>
输入参数和结果集中增加属性,对客户端无影响,如果客户端并不需要新属性,不用重新<br/>
部署;<br/>
输入参数和结果集属性名变化,对客户端序列化无影响,但是如果客户端不重新部署,不管输入还是输出,属性名变化的属性值是获取不到的。<br/>
总结:服务器端和客户端对领域对象并不需要完全一致,而是按照最大匹配原则。</p>
<p>(2) 配置:<br/>
dubbo.xml:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: java; gutter: false"><![CDATA[&lt;dubbo:protocol name="dubbo" port="20880" /&gt;]]></script>
</div></div>
<h3><a name="UserGuide-rmi%3A%2F%2F"></a>rmi://</h3>
<p>(<a href="Rmi+Protocol.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/Rmi+Protocol" title="Rmi Protocol">+</a>) (<a href="#UserGuide-rmi%253A%252F%252F">#</a>)</p>
<div class='panelMacro'><table class='tipMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="check.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/check.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>RMI协议采用JDK标准的java.rmi.*实现,采用阻塞式短连接和JDK标准序列化方式。</td></tr></table></div>
<ul>
<li>如果服务接口继承了java.rmi.Remote接口,可以和原生RMI互操作,即:
<ul>
<li>提供者用Dubbo的RMI协议暴露服务,消费者直接用标准RMI接口调用,</li>
<li>或者提供方用标准RMI暴露服务,消费方用Dubbo的RMI协议调用。</li>
</ul>
</li>
<li>如果服务接口<font color="red">没有</font>继承java.rmi.Remote接口,
<ul>
<li>缺省Dubbo将自动生成一个com.xxx.XxxService$Remote的接口,并继承java.rmi.Remote接口,并以此接口暴露服务,</li>
<li>但如果设置了&lt;dubbo:protocol name="rmi" codec="spring" /&gt;,将不生成$Remote接口,而使用Spring的RmiInvocationHandler接口暴露服务,和Spring兼容。</li>
</ul>
</li>
</ul>
<p>Define rmi protocol:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:protocol name="rmi" port="1099" /&gt;]]></script>
</div></div>
<p>Set default protocol:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:provider protocol="rmi" /&gt;]]></script>
</div></div>
<p>Set service protocol:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:service protocol="rmi" /&gt;]]></script>
</div></div>
<p>Multi port:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:protocol id="rmi1" name="rmi" port="1099" /&gt;
&lt;dubbo:protocol id="rmi2" name="rmi" port="2099" /&gt;
&lt;dubbo:service protocol="rmi1" /&gt;]]></script>
</div></div>
<p>Spring compatible:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:protocol name="rmi" codec="spring" /&gt;]]></script>
</div></div>
<p>Java标准的远程调用协议。</p>
<ul>
<li>连接个数:多连接</li>
<li>连接方式:短连接</li>
<li>传输协议:TCP</li>
<li>传输方式:同步传输</li>
<li>序列化:Java标准二进制序列化</li>
<li>适用范围:传入传出参数数据包大小混合,消费者与提供者个数差不多,可传文件。</li>
<li>适用场景:常规远程服务方法调用,与原生RMI服务互操作</li>
</ul>
<p>(1) 约束:</p>
<ul>
<li>参数及返回值需实现Serializable接口</li>
<li>dubbo配置中的超时时间对rmi无效,需使用java启动参数设置:-Dsun.rmi.transport.tcp.responseTimeout=3000,参见下面的RMI配置。</li>
</ul>
<p>(2) 配置:<br/>
dubbo.xml:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: java; gutter: false"><![CDATA[&lt;dubbo:protocol name="rmi" port="1099" /&gt;]]></script>
</div></div>
<p>(3) RMI配置:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: java; gutter: false"><![CDATA[java -Dsun.rmi.transport.tcp.responseTimeout=3000]]></script>
</div></div>
<p>更多RMI优化参数请查看:<br/>
<a href="javascript:if(confirm(%27http://download.oracle.com/docs/cd/E17409_01/javase/6/docs/technotes/guides/rmi/sunrmiproperties.html \n\nThis file was not retrieved by Teleport Ultra, because it is addressed on a domain or path outside the boundaries set for its Starting Address. \n\nDo you want to open it from the server?%27))window.location=%27http://download.oracle.com/docs/cd/E17409_01/javase/6/docs/technotes/guides/rmi/sunrmiproperties.html%27" tppabs="http://download.oracle.com/docs/cd/E17409_01/javase/6/docs/technotes/guides/rmi/sunrmiproperties.html" class="external-link" rel="nofollow">http://download.oracle.com/docs/cd/E17409_01/javase/6/docs/technotes/guides/rmi/sunrmiproperties.html</a></p>
<h3><a name="UserGuide-hessian%3A%2F%2F"></a>hessian://</h3>
<p>(<a href="Hessian+Protocol.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/Hessian+Protocol" title="Hessian Protocol">+</a>) (<a href="#UserGuide-hessian%253A%252F%252F">#</a>)</p>
<div class='panelMacro'><table class='tipMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="check.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/check.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>Hessian协议用于集成Hessian的服务,Hessian底层采用Http通讯,采用Servlet暴露服务,Dubbo缺省内嵌Jetty作为服务器实现。</td></tr></table></div>
<div class='panelMacro'><table class='tipMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="check.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/check.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>Hessian是Caucho开源的一个RPC框架:<a href="javascript:if(confirm(%27http://hessian.caucho.com/ \n\nThis file was not retrieved by Teleport Ultra, because it is addressed on a domain or path outside the boundaries set for its Starting Address. \n\nDo you want to open it from the server?%27))window.location=%27http://hessian.caucho.com/%27" tppabs="http://hessian.caucho.com/" class="external-link" rel="nofollow">http://hessian.caucho.com</a>,其通讯效率高于WebService和Java自带的序列化。</td></tr></table></div>
<p>依赖:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dependency&gt;
&lt;groupId&gt;com.caucho&lt;/groupId&gt;
&lt;artifactId&gt;hessian&lt;/artifactId&gt;
&lt;version&gt;4.0.7&lt;/version&gt;
&lt;/dependency&gt;]]></script>
</div></div>
<p>可以和原生Hessian服务互操作,即:</p>
<ul>
<li>提供者用Dubbo的Hessian协议暴露服务,消费者直接用标准Hessian接口调用,</li>
<li>或者提供方用标准Hessian暴露服务,消费方用Dubbo的Hessian协议调用。</li>
</ul>
<p>基于Hessian的远程调用协议。</p>
<ul>
<li>连接个数:多连接</li>
<li>连接方式:短连接</li>
<li>传输协议:HTTP</li>
<li>传输方式:同步传输</li>
<li>序列化:Hessian二进制序列化</li>
<li>适用范围:传入传出参数数据包较大,提供者比消费者个数多,提供者压力较大,可传文件。</li>
<li>适用场景:页面传输,文件传输,或与原生hessian服务互操作</li>
</ul>
<p>(1) 约束:</p>
<ul>
<li>参数及返回值需实现Serializable接口</li>
<li>参数及返回值不能自定义实现List, Map, Number, Date, Calendar等接口,只能用JDK自带的实现,因为hessian会做特殊处理,自定义实现类中的属性值都会丢失。</li>
</ul>
<p>(2) 配置:<br/>
Define hessian protocol:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:protocol name="hessian" port="8080" server="jetty" /&gt;]]></script>
</div></div>
<p>Set default protocol:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:provider protocol="hessian" /&gt;]]></script>
</div></div>
<p>Set service protocol:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:service protocol="hessian" /&gt;]]></script>
</div></div>
<p>Multi port:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:protocol id="hessian1" name="hessian" port="8080" /&gt;
&lt;dubbo:protocol id="hessian2" name="hessian" port="8081" /&gt;]]></script>
</div></div>
<p>Directly provider:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:reference id="helloService" interface="HelloWorld" url="hessian://10.20.153.10:8080/helloWorld" /&gt;]]></script>
</div></div>
<h4><a name="UserGuide-JettyServer%3A%28default%29"></a>h4. Jetty Server: (default)</h4>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:protocol ... server="jetty" /&gt;]]></script>
</div></div>
<h4><a name="UserGuide-ServletBridgeServer%3A%28%29"></a>h4. Servlet Bridge Server: (<font color="brown">recommend</font>)</h4>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:protocol ... server="servlet" /&gt;]]></script>
</div></div>
<p>web.xml:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;servlet&gt;
&lt;servlet-name&gt;dubbo&lt;/servlet-name&gt;
&lt;servlet-class&gt;com.alibaba.dubbo.remoting.http.servlet.DispatcherServlet&lt;/servlet-class&gt;
&lt;load-on-startup&gt;1&lt;/load-on-startup&gt;
&lt;/servlet&gt;
&lt;servlet-mapping&gt;
&lt;servlet-name&gt;dubbo&lt;/servlet-name&gt;
&lt;url-pattern&gt;/*&lt;/url-pattern&gt;
&lt;/servlet-mapping&gt;]]></script>
</div></div>
<p>注意,如果使用servlet派发请求:</p>
<ul>
<li>协议的端口&lt;dubbo:protocol port="8080" /&gt;必须与servlet容器的端口相同,</li>
<li>协议的上下文路径&lt;dubbo:protocol contextpath="foo" /&gt;必须与servlet应用的上下文路径相同。</li>
</ul>
<h3><a name="UserGuide-http%3A%2F%2F"></a>http://</h3>
<p>(<a href="Http+Protocol.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/Http+Protocol" title="Http Protocol">+</a>) (<a href="#UserGuide-http%253A%252F%252F">#</a>)</p>
<div class='panelMacro'><table class='tipMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="check.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/check.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>采用Spring的HttpInvoker实现</td></tr></table></div>
<div class='panelMacro'><table class='noteMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="warning-3.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/warning.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>2.3.0以上版本支持</td></tr></table></div>
<p>基于http表单的远程调用协议。</p>
<ul>
<li>连接个数:多连接</li>
<li>连接方式:短连接</li>
<li>传输协议:HTTP</li>
<li>传输方式:同步传输</li>
<li>序列化:表单序列化</li>
<li>适用范围:传入传出参数数据包大小混合,提供者比消费者个数多,可用浏览器查看,可用表单或URL传入参数,暂不支持传文件。</li>
<li>适用场景:需同时给应用程序和浏览器JS使用的服务。</li>
</ul>
<p>(1) 约束:</p>
<ul>
<li>参数及返回值需符合Bean规范</li>
</ul>
<p>(2) 配置:<br/>
dubbo.xml:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: java; gutter: false"><![CDATA[&lt;dubbo:protocol name="http" port="8080" /&gt;]]></script>
</div></div>
<h4><a name="UserGuide-JettyServer%3A%28default%29"></a>h4. Jetty Server: (default)</h4>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:protocol ... server="jetty" /&gt;]]></script>
</div></div>
<h4><a name="UserGuide-ServletBridgeServer%3A%28%29"></a>h4. Servlet Bridge Server: (<font color="brown">recommend</font>)</h4>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:protocol ... server="servlet" /&gt;]]></script>
</div></div>
<p>web.xml:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;servlet&gt;
&lt;servlet-name&gt;dubbo&lt;/servlet-name&gt;
&lt;servlet-class&gt;com.alibaba.dubbo.remoting.http.servlet.DispatcherServlet&lt;/servlet-class&gt;
&lt;load-on-startup&gt;1&lt;/load-on-startup&gt;
&lt;/servlet&gt;
&lt;servlet-mapping&gt;
&lt;servlet-name&gt;dubbo&lt;/servlet-name&gt;
&lt;url-pattern&gt;/*&lt;/url-pattern&gt;
&lt;/servlet-mapping&gt;]]></script>
</div></div>
<p>注意,如果使用servlet派发请求:</p>
<ul>
<li>协议的端口&lt;dubbo:protocol port="8080" /&gt;必须与servlet容器的端口相同,</li>
<li>协议的上下文路径&lt;dubbo:protocol contextpath="foo" /&gt;必须与servlet应用的上下文路径相同。</li>
</ul>
<h3><a name="UserGuide-webservice%3A%2F%2F"></a>webservice://</h3>
<p>(<a href="WebService+Protocol.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/WebService+Protocol" title="WebService Protocol">+</a>) (<a href="#UserGuide-webservice%253A%252F%252F">#</a>)</p>
<div class='panelMacro'><table class='noteMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="warning-3.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/warning.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>2.3.0以上版本支持。</td></tr></table></div>
<div class='panelMacro'><table class='tipMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="check.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/check.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>基于CXF的<a href="javascript:if(confirm(%27http://search.maven.org/ \n\nThis file was not retrieved by Teleport Ultra, because it is addressed on a domain or path outside the boundaries set for its Starting Address. \n\nDo you want to open it from the server?%27))window.location=%27http://search.maven.org/#search%7Cga%7C1%7Ca%3A%22cxf-rt-frontend-simple%22%27" tppabs="http://search.maven.org/#search%7Cga%7C1%7Ca%3A%22cxf-rt-frontend-simple%22" class="external-link" rel="nofollow">frontend-simple</a><a href="javascript:if(confirm(%27http://search.maven.org/ \n\nThis file was not retrieved by Teleport Ultra, because it is addressed on a domain or path outside the boundaries set for its Starting Address. \n\nDo you want to open it from the server?%27))window.location=%27http://search.maven.org/#search%7Cga%7C1%7Ca%3A%22cxf-rt-transports-http%22%27" tppabs="http://search.maven.org/#search%7Cga%7C1%7Ca%3A%22cxf-rt-transports-http%22" class="external-link" rel="nofollow">transports-http</a>实现。</td></tr></table></div>
<div class='panelMacro'><table class='tipMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="check.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/check.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>CXF是Apache开源的一个RPC框架:<a href="javascript:if(confirm(%27http://cxf.apache.org/ \n\nThis file was not retrieved by Teleport Ultra, because it is addressed on a domain or path outside the boundaries set for its Starting Address. \n\nDo you want to open it from the server?%27))window.location=%27http://cxf.apache.org/%27" tppabs="http://cxf.apache.org/" class="external-link" rel="nofollow">http://cxf.apache.org</a>,由Xfire和Celtix合并而来 。</td></tr></table></div>
<p>依赖:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dependency&gt;
&lt;groupId&gt;org.apache.cxf&lt;/groupId&gt;
&lt;artifactId&gt;cxf-rt-frontend-simple&lt;/artifactId&gt;
&lt;version&gt;2.6.1&lt;/version&gt;
&lt;/dependency&gt;
&lt;dependency&gt;
&lt;groupId&gt;org.apache.cxf&lt;/groupId&gt;
&lt;artifactId&gt;cxf-rt-transports-http&lt;/artifactId&gt;
&lt;version&gt;2.6.1&lt;/version&gt;
&lt;/dependency&gt;]]></script>
</div></div>
<p>可以和原生WebService服务互操作,即:</p>
<ul>
<li>提供者用Dubbo的WebService协议暴露服务,消费者直接用标准WebService接口调用,</li>
<li>或者提供方用标准WebService暴露服务,消费方用Dubbo的WebService协议调用。</li>
</ul>
<p>基于WebService的远程调用协议。</p>
<ul>
<li>连接个数:多连接</li>
<li>连接方式:短连接</li>
<li>传输协议:HTTP</li>
<li>传输方式:同步传输</li>
<li>序列化:SOAP文本序列化</li>
<li>适用场景:系统集成,跨语言调用。</li>
</ul>
<p>(1) 约束:</p>
<ul>
<li>参数及返回值需实现Serializable接口</li>
<li>参数尽量使用基本类型和POJO。</li>
</ul>
<p>(2) 配置:<br/>
Define hessian protocol:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:protocol name="webservice" port="8080" server="jetty" /&gt;]]></script>
</div></div>
<p>Set default protocol:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:provider protocol="webservice" /&gt;]]></script>
</div></div>
<p>Set service protocol:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:service protocol="webservice" /&gt;]]></script>
</div></div>
<p>Multi port:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:protocol id="webservice1" name="webservice" port="8080" /&gt;
&lt;dubbo:protocol id="webservice2" name="webservice" port="8081" /&gt;]]></script>
</div></div>
<p>Directly provider:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:reference id="helloService" interface="HelloWorld" url="webservice://10.20.153.10:8080/com.foo.HelloWorld" /&gt;]]></script>
</div></div>
<p>WSDL:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: text; gutter: false"><![CDATA[http://10.20.153.10:8080/com.foo.HelloWorld?wsdl]]></script>
</div></div>
<h4><a name="UserGuide-JettyServer%3A%28default%29"></a>h4. Jetty Server: (default)</h4>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:protocol ... server="jetty" /&gt;]]></script>
</div></div>
<h4><a name="UserGuide-ServletBridgeServer%3A%28%29"></a>h4. Servlet Bridge Server: (<font color="brown">recommend</font>)</h4>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:protocol ... server="servlet" /&gt;]]></script>
</div></div>
<p>web.xml:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;servlet&gt;
&lt;servlet-name&gt;dubbo&lt;/servlet-name&gt;
&lt;servlet-class&gt;com.alibaba.dubbo.remoting.http.servlet.DispatcherServlet&lt;/servlet-class&gt;
&lt;load-on-startup&gt;1&lt;/load-on-startup&gt;
&lt;/servlet&gt;
&lt;servlet-mapping&gt;
&lt;servlet-name&gt;dubbo&lt;/servlet-name&gt;
&lt;url-pattern&gt;/*&lt;/url-pattern&gt;
&lt;/servlet-mapping&gt;]]></script>
</div></div>
<p>注意,如果使用servlet派发请求:</p>
<ul>
<li>协议的端口&lt;dubbo:protocol port="8080" /&gt;必须与servlet容器的端口相同,</li>
<li>协议的上下文路径&lt;dubbo:protocol contextpath="foo" /&gt;必须与servlet应用的上下文路径相同。</li>
</ul>
<h3><a name="UserGuide-thrift%3A%2F%2F"></a>thrift://</h3>
<p>(<a href="Thrift+Protocol.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/Thrift+Protocol" title="Thrift Protocol">+</a>) (<a href="#UserGuide-thrift%253A%252F%252F">#</a>)</p>
<div class='panelMacro'><table class='noteMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="warning-3.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/warning.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>2.3.0以上版本支持。</td></tr></table></div>
<div class='panelMacro'><table class='tipMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="check.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/check.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td><b>Thrift说明</b><br />Thrift是Facebook捐给Apache的一个RPC框架,参见:<a href="javascript:if(confirm(%27http://thrift.apache.org/ \n\nThis file was not retrieved by Teleport Ultra, because it is addressed on a domain or path outside the boundaries set for its Starting Address. \n\nDo you want to open it from the server?%27))window.location=%27http://thrift.apache.org/%27" tppabs="http://thrift.apache.org/" class="external-link" rel="nofollow">http://thrift.apache.org</a></td></tr></table></div>
<div class='panelMacro'><table class='tipMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="check.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/check.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td><b>dubbo thrift协议</b><br />当前 dubbo 支持的 thrift 协议是对 thrift 原生协议的扩展,在原生协议的基础上添加了一些额外的头信息,比如service name,magic number等。使用dubbo thrift协议同样需要使用thrift的idl compiler编译生成相应的java代码,后续版本中会在这方面做一些增强。</td></tr></table></div>
<p>示例:<a href="javascript:if(confirm(%27https://github.com/alibaba/dubbo/tree/master/dubbo-rpc/dubbo-rpc-thrift/src/test/java/com/alibaba/dubbo/rpc/protocol/thrift/examples \n\nThis file was not retrieved by Teleport Ultra, because it is addressed on a domain or path outside the boundaries set for its Starting Address. \n\nDo you want to open it from the server?%27))window.location=%27https://github.com/alibaba/dubbo/tree/master/dubbo-rpc/dubbo-rpc-thrift/src/test/java/com/alibaba/dubbo/rpc/protocol/thrift/examples%27" tppabs="https://github.com/alibaba/dubbo/tree/master/dubbo-rpc/dubbo-rpc-thrift/src/test/java/com/alibaba/dubbo/rpc/protocol/thrift/examples" class="external-link" rel="nofollow">https://github.com/alibaba/dubbo/tree/master/dubbo-rpc/dubbo-rpc-thrift/src/test/java/com/alibaba/dubbo/rpc/protocol/thrift/examples</a></p>
<p>依赖:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dependency&gt;
&lt;groupId&gt;org.apache.thrift&lt;/groupId&gt;
&lt;artifactId&gt;libthrift&lt;/artifactId&gt;
&lt;version&gt;0.8.0&lt;/version&gt;
&lt;/dependency&gt;]]></script>
</div></div>
<p>所有服务共用一个端口:(与原生Thrift不兼容)</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: java; gutter: false"><![CDATA[&lt;dubbo:protocol name="thrift" port="3030" /&gt;]]></script>
</div></div>
<p>Thrift<font color="red">不支持</font>数据类型:</p>
<ul>
<li>null值 (不能在协议中传递null值)</li>
</ul>
<h3><a name="UserGuide-memcached%3A%2F%2F"></a>memcached://</h3>
<p>(<a href="Memcached+Protocol.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/Memcached+Protocol" title="Memcached Protocol">+</a>) (<a href="#UserGuide-memcached%253A%252F%252F">#</a>)</p>
<div class='panelMacro'><table class='noteMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="warning-3.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/warning.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>2.3.0以上版本支持。</td></tr></table></div>
<div class='panelMacro'><table class='tipMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="check.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/check.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td><b>Memcached说明</b><br />Memcached是一个高效的KV缓存服务器,参见:<a href="javascript:if(confirm(%27http://memcached.org/ \n\nThis file was not retrieved by Teleport Ultra, because it is addressed on a domain or path outside the boundaries set for its Starting Address. \n\nDo you want to open it from the server?%27))window.location=%27http://memcached.org/%27" tppabs="http://memcached.org/" class="external-link" rel="nofollow">http://memcached.org/</a></td></tr></table></div>
<p>可以通过脚本或监控中心手工填写表单注册memcached服务的地址:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: java; gutter: false"><![CDATA[RegistryFactory registryFactory = ExtensionLoader.getExtensionLoader(RegistryFactory.class).getAdaptiveExtension();
Registry registry = registryFactory.getRegistry(URL.valueOf("zookeeper://10.20.153.10:2181"));
registry.register(URL.valueOf("memcached://10.20.153.11/com.foo.BarService?category=providers&amp;dynamic=false&amp;application=foo&amp;group=member&amp;loadbalance=consistenthash"));]]></script>
</div></div>
<p>然后在客户端使用时,不需要感知Memcached的地址:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:reference id="cache" interface="http://10.20.160.198/wiki/display/dubbo/java.util.Map" group="member" /&gt;]]></script>
</div></div>
<p>或者,点对点直连:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:reference id="cache" interface="http://10.20.160.198/wiki/display/dubbo/java.util.Map" url="memcached://10.20.153.10:11211" /&gt;]]></script>
</div></div>
<p>也可以使用自定义接口:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:reference id="cache" interface="com.foo.CacheService" url="memcached://10.20.153.10:11211" /&gt;]]></script>
</div></div>
<p>方法名建议和memcached的标准方法名相同,即:get(key), set(key, value), delete(key)。</p>
<p>如果方法名和memcached的标准方法名不相同,则需要配置映射关系:(其中"p:xxx"为spring的标准p标签)</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:reference id="cache" interface="com.foo.CacheService" url="memcached://10.20.153.10:11211" p:set="putFoo" p:get="getFoo" p:delete="removeFoo" /&gt;]]></script>
</div></div>
<h3><a name="UserGuide-redis%3A%2F%2F"></a>redis://</h3>
<p>(<a href="Redis+Protocol.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/Redis+Protocol" title="Redis Protocol">+</a>) (<a href="#UserGuide-redis%253A%252F%252F">#</a>)</p>
<div class='panelMacro'><table class='noteMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="warning-3.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/warning.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>2.3.0以上版本支持。</td></tr></table></div>
<div class='panelMacro'><table class='tipMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="check.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/check.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td><b>Redis说明</b><br />Redis是一个高效的KV存储服务器,参见:<a href="javascript:if(confirm(%27http://redis.io/ \n\nThis file was not retrieved by Teleport Ultra, because it is addressed on a domain or path outside the boundaries set for its Starting Address. \n\nDo you want to open it from the server?%27))window.location=%27http://redis.io/%27" tppabs="http://redis.io/" class="external-link" rel="nofollow">http://redis.io</a></td></tr></table></div>
<p>可以通过脚本或监控中心手工填写表单注册redis服务的地址:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: java; gutter: false"><![CDATA[RegistryFactory registryFactory = ExtensionLoader.getExtensionLoader(RegistryFactory.class).getAdaptiveExtension();
Registry registry = registryFactory.getRegistry(URL.valueOf("zookeeper://10.20.153.10:2181"));
registry.register(URL.valueOf("redis://10.20.153.11/com.foo.BarService?category=providers&amp;dynamic=false&amp;application=foo&amp;group=member&amp;loadbalance=consistenthash"));]]></script>
</div></div>
<p>然后在客户端使用时,不需要感知Redis的地址:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:reference id="store" interface="http://10.20.160.198/wiki/display/dubbo/java.util.Map" group="member" /&gt;]]></script>
</div></div>
<p>或者,点对点直连:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:reference id="store" interface="http://10.20.160.198/wiki/display/dubbo/java.util.Map" url="redis://10.20.153.10:6379" /&gt;]]></script>
</div></div>
<p>也可以使用自定义接口:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:reference id="store" interface="com.foo.StoreService" url="redis://10.20.153.10:6379" /&gt;]]></script>
</div></div>
<p>方法名建议和redis的标准方法名相同,即:get(key), set(key, value), delete(key)。</p>
<p>如果方法名和redis的标准方法名不相同,则需要配置映射关系:(其中"p:xxx"为spring的标准p标签)</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:reference id="cache" interface="com.foo.CacheService" url="memcached://10.20.153.10:11211" p:set="putFoo" p:get="getFoo" p:delete="removeFoo" /&gt;]]></script>
</div></div>
<h2><a name="UserGuide-RegistryReference"></a>Registry Reference</h2>
<p>(<a href="Registry+Reference.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/Registry+Reference" title="Registry Reference">+</a>) (<a href="#UserGuide-RegistryReference">#</a>)</p>
<div class='panelMacro'><table class='tipMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="check.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/check.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>推荐使用Zookeeper注册中心</td></tr></table></div>
<h3><a name="UserGuide-MulticastRegistry"></a>Multicast Registry</h3>
<p>(<a href="Multicast+Registry.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/Multicast+Registry" title="Multicast Registry">+</a>) (<a href="#UserGuide-MulticastRegistry">#</a>)</p>
<div class='panelMacro'><table class='tipMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="check.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/check.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>不需要启动任何中心节点,只要广播地址一样,就可以互相发现</td></tr></table></div>
<div class='panelMacro'><table class='noteMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="warning-3.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/warning.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>组播受网络结构限制,只适合小规模应用或开发阶段使用。</td></tr></table></div>
<div class='panelMacro'><table class='noteMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="warning-3.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/warning.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>组播地址段: 224.0.0.0 - 239.255.255.255</td></tr></table></div>
<p><span class="image-wrap" style=""><img src="multicast.jpg-version=1&modificationDate=1320417810000.jpg" tppabs="http://10.20.160.198/wiki/download/attachments/6949468/multicast.jpg?version=1&modificationDate=1320417810000" style="border: 0px solid black" /></span></p>
<ol>
<li>提供方启动时广播自己的地址。</li>
<li>消费方启动时广播订阅请求。</li>
<li>提供方收到订阅请求时,单播自己的地址给订阅者,如果设置了unicast=false,则广播给订阅者。</li>
<li>消费方收到提供方地址时,连接该地址进行RPC调用。</li>
</ol>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:registry address="multicast://224.5.6.7:1234" /&gt;]]></script>
</div></div>
<p>Or:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:registry protocol="multicast" address="224.5.6.7:1234" /&gt;]]></script>
</div></div>
<p>为了减少广播量,Dubbo缺省使用单播发送提供者地址信息给消费者,<br/>
如果一个机器上同时启了多个消费者进程,消费者需声明unicast=false,否则只会有一个消费者能收到消息:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:registry address="multicast://224.5.6.7:1234?unicast=false" /&gt;]]></script>
</div></div>
<p>Or:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:registry protocol="multicast" address="224.5.6.7:1234"&gt;
&lt;dubbo:parameter key="unicast" value="false" /&gt;
&lt;/dubbo:registry&gt;]]></script>
</div></div>
<h3><a name="UserGuide-ZookeeperRegistry"></a>Zookeeper Registry</h3>
<p>(<a href="Zookeeper+Registry.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/Zookeeper+Registry" title="Zookeeper Registry">+</a>) (<a href="#UserGuide-ZookeeperRegistry">#</a>)</p>
<div class='panelMacro'><table class='tipMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="check.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/check.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>建议使用dubbo-2.3.3以上版本的zookeeper注册中心客户端</td></tr></table></div>
<div class='panelMacro'><table class='tipMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="check.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/check.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td><b>Zookeeper说明</b><br />Zookeeper是Apacahe Hadoop的子项目,是一个树型的目录服务,支持变更推送,适合作为Dubbo服务的注册中心,工业强度较高,可用于生产环境,并推荐使用,参见:<a href="javascript:if(confirm(%27http://zookeeper.apache.org/ \n\nThis file was not retrieved by Teleport Ultra, because it is addressed on a domain or path outside the boundaries set for its Starting Address. \n\nDo you want to open it from the server?%27))window.location=%27http://zookeeper.apache.org/%27" tppabs="http://zookeeper.apache.org/" class="external-link" rel="nofollow">http://zookeeper.apache.org</a></td></tr></table></div>
<div class='panelMacro'><table class='tipMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="check.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/check.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td><b>Zookeeper安装</b><br />安装方式参见: <a href="Administrator+Guide.htm#AdministratorGuide-ZookeeperRegistryInstallation" tppabs="http://10.20.160.198/wiki/display/dubbo/Administrator+Guide#AdministratorGuide-ZookeeperRegistryInstallation">Zookeeper安装手册</a>,只需搭一个原生的Zookeeper服务器,并将<a href="#UserGuide-QuickStart">Quick Start</a>中Provider和Consumer里的conf/dubbo.properties中的dubbo.registry.addrss的值改为zookeeper://127.0.0.1:2181即可使用</td></tr></table></div>
<div class='panelMacro'><table class='noteMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="warning-3.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/warning.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td><b>可靠性声明</b><br />阿里内部并没有采用Zookeeper做为注册中心,而是使用自己实现的基于数据库的注册中心,即:Zookeeper注册中心并没有在阿里内部长时间运行的可靠性保障,此Zookeeper桥接实现只为开源版本提供,其可靠性依赖于Zookeeper本身的可靠性。</td></tr></table></div>
<div class='panelMacro'><table class='noteMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="warning-3.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/warning.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td><b>兼容性声明</b><br />因2.0.8最初设计的zookeeper存储结构不能扩充不同类型的数据,2.0.9版本做了调整,所以不兼容,需全部改用2.0.9版本才行,以后的版本会保持兼容2.0.9。<br/>
2.2.0版本改为基于zkclient实现,需增加zkclient的依赖包,2.3.0版本增加了基于curator的实现,作为可选实现策略。</td></tr></table></div>
<p><span class="image-wrap" style=""><img src="zookeeper.jpg-version=1&modificationDate=1323255359000.jpg" tppabs="http://10.20.160.198/wiki/download/attachments/6949466/zookeeper.jpg?version=1&modificationDate=1323255359000" style="border: 0px solid black" /></span></p>
<p>流程说明:</p>
<ul>
<li>服务提供者启动时
<ul>
<li>向/dubbo/com.foo.BarService/providers目录下写入自己的URL地址。</li>
</ul>
</li>
<li>服务消费者启动时
<ul>
<li>订阅/dubbo/com.foo.BarService/providers目录下的提供者URL地址。</li>
<li>并向/dubbo/com.foo.BarService/consumers目录下写入自己的URL地址。</li>
</ul>
</li>
<li>监控中心启动时
<ul>
<li>订阅/dubbo/com.foo.BarService目录下的所有提供者和消费者URL地址。</li>
</ul>
</li>
</ul>
<p>支持以下功能:</p>
<ul>
<li>当提供者出现断电等异常停机时,注册中心能自动删除提供者信息。</li>
<li>当注册中心重启时,能自动恢复注册数据,以及订阅请求。</li>
<li>当会话过期时,能自动恢复注册数据,以及订阅请求。</li>
<li>当设置&lt;dubbo:registry check="false" /&gt;时,记录失败注册和订阅请求,后台定时重试。</li>
<li>可通过&lt;dubbo:registry username="admin" password="1234" /&gt;设置zookeeper登录信息。</li>
<li>可通过&lt;dubbo:registry group="dubbo" /&gt;设置zookeeper的根节点,缺省为dubbo。</li>
<li>支持&#42;号通配符&lt;dubbo:reference group="&#42;" version="&#42;" /&gt;,可订阅服务的所有分组和所有版本的提供者。</li>
</ul>
<p>在provider和consumer中增加zookeeper客户端jar包依赖:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dependency&gt;
&lt;groupId&gt;org.apache.zookeeper&lt;/groupId&gt;
&lt;artifactId&gt;zookeeper&lt;/artifactId&gt;
&lt;version&gt;3.3.3&lt;/version&gt;
&lt;/dependency&gt;]]></script>
</div></div>
<p>或直接下载:<a href="javascript:if(confirm(%27http://repo1.maven.org/maven2/org/apache/zookeeper/zookeeper \n\nThis file was not retrieved by Teleport Ultra, because it is addressed on a domain or path outside the boundaries set for its Starting Address. \n\nDo you want to open it from the server?%27))window.location=%27http://repo1.maven.org/maven2/org/apache/zookeeper/zookeeper%27" tppabs="http://repo1.maven.org/maven2/org/apache/zookeeper/zookeeper" class="external-link" rel="nofollow">http://repo1.maven.org/maven2/org/apache/zookeeper/zookeeper</a></p>
<p>支持zkclient和curator两种Zookeeper客户端实现:</p>
<h4><a name="UserGuide-ZKClientZookeeperRegistry"></a>ZKClient Zookeeper Registry</h4>
<p>从2.2.0版本开始缺省为zkclient实现,以提升zookeeper客户端的健状性。</p>
<div class='panelMacro'><table class='tipMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="check.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/check.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>ZKClient是Datameer开源的一个Zookeeper客户端实现,开源比较早,参见:<a href="javascript:if(confirm(%27https://github.com/sgroschupf/zkclient \n\nThis file was not retrieved by Teleport Ultra, because it is addressed on a domain or path outside the boundaries set for its Starting Address. \n\nDo you want to open it from the server?%27))window.location=%27https://github.com/sgroschupf/zkclient%27" tppabs="https://github.com/sgroschupf/zkclient" class="external-link" rel="nofollow">https://github.com/sgroschupf/zkclient</a></td></tr></table></div>
<p>缺省配置:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:registry ... client="zkclient" /&gt;]]></script>
</div></div>
<p>或:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[dubbo.registry.client=zkclient]]></script>
</div></div>
<p>或:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[zookeeper://10.20.153.10:2181?client=zkclient]]></script>
</div></div>
<p>需依赖:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dependency&gt;
&lt;groupId&gt;com.github.sgroschupf&lt;/groupId&gt;
&lt;artifactId&gt;zkclient&lt;/artifactId&gt;
&lt;version&gt;0.1&lt;/version&gt;
&lt;/dependency&gt;]]></script>
</div></div>
<p>或直接下载:<a href="javascript:if(confirm(%27http://repo1.maven.org/maven2/com/github/sgroschupf/zkclient \n\nThis file was not retrieved by Teleport Ultra, because it is addressed on a domain or path outside the boundaries set for its Starting Address. \n\nDo you want to open it from the server?%27))window.location=%27http://repo1.maven.org/maven2/com/github/sgroschupf/zkclient%27" tppabs="http://repo1.maven.org/maven2/com/github/sgroschupf/zkclient" class="external-link" rel="nofollow">http://repo1.maven.org/maven2/com/github/sgroschupf/zkclient</a></p>
<h4><a name="UserGuide-CuratorZookeeperRegistry"></a>Curator Zookeeper Registry</h4>
<p>从2.3.0版本开始支持可选curator实现。</p>
<div class='panelMacro'><table class='tipMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="check.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/check.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>Curator是Netflix开源的一个Zookeeper客户端实现,比较活跃,参见:<a href="javascript:if(confirm(%27https://github.com/Netflix/curator \n\nThis file was not retrieved by Teleport Ultra, because it is addressed on a domain or path outside the boundaries set for its Starting Address. \n\nDo you want to open it from the server?%27))window.location=%27https://github.com/Netflix/curator%27" tppabs="https://github.com/Netflix/curator" class="external-link" rel="nofollow">https://github.com/Netflix/curator</a></td></tr></table></div>
<p>如果需要改为curator实现,请配置:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:registry ... client="curator" /&gt;]]></script>
</div></div>
<p>或:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[dubbo.registry.client=curator]]></script>
</div></div>
<p>或:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[zookeeper://10.20.153.10:2181?client=curator]]></script>
</div></div>
<p>需依赖:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dependency&gt;
&lt;groupId&gt;com.netflix.curator&lt;/groupId&gt;
&lt;artifactId&gt;curator-framework&lt;/artifactId&gt;
&lt;version&gt;1.1.10&lt;/version&gt;
&lt;/dependency&gt;]]></script>
</div></div>
<p>或直接下载:<a href="javascript:if(confirm(%27http://repo1.maven.org/maven2/com/netflix/curator/curator-framework \n\nThis file was not retrieved by Teleport Ultra, because it is addressed on a domain or path outside the boundaries set for its Starting Address. \n\nDo you want to open it from the server?%27))window.location=%27http://repo1.maven.org/maven2/com/netflix/curator/curator-framework%27" tppabs="http://repo1.maven.org/maven2/com/netflix/curator/curator-framework" class="external-link" rel="nofollow">http://repo1.maven.org/maven2/com/netflix/curator/curator-framework</a></p>
<p>Zookeeper单机配置:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:registry address="zookeeper://10.20.153.10:2181" /&gt;]]></script>
</div></div>
<p>Or:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:registry protocol="zookeeper" address="10.20.153.10:2181" /&gt;]]></script>
</div></div>
<p>Zookeeper集群配置:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:registry address="zookeeper://10.20.153.10:2181?backup=10.20.153.11:2181,10.20.153.12:2181" /&gt;]]></script>
</div></div>
<p>Or:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:registry protocol="zookeeper" address="10.20.153.10:2181,10.20.153.11:2181,10.20.153.12:2181" /&gt;]]></script>
</div></div>
<p>同一Zookeeper,分成多组注册中心:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:registry id="chinaRegistry" protocol="zookeeper" address="10.20.153.10:2181" group="china" /&gt;
&lt;dubbo:registry id="intlRegistry" protocol="zookeeper" address="10.20.153.10:2181" group="intl" /&gt;]]></script>
</div></div>
<h3><a name="UserGuide-RedisRegistry"></a>Redis Registry</h3>
<p>(<a href="Redis+Registry.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/Redis+Registry" title="Redis Registry">+</a>) (<a href="#UserGuide-RedisRegistry">#</a>)</p>
<div class='panelMacro'><table class='tipMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="check.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/check.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td><b>Redis说明</b><br />Redis是一个高效的KV存储服务器,参见:<a href="javascript:if(confirm(%27http://redis.io/ \n\nThis file was not retrieved by Teleport Ultra, because it is addressed on a domain or path outside the boundaries set for its Starting Address. \n\nDo you want to open it from the server?%27))window.location=%27http://redis.io/%27" tppabs="http://redis.io/" class="external-link" rel="nofollow">http://redis.io</a></td></tr></table></div>
<div class='panelMacro'><table class='tipMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="check.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/check.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td><b>Redis安装</b><br />安装方式参见: <a href="Administrator+Guide.htm#AdministratorGuide-RedisRegistryInstallation" tppabs="http://10.20.160.198/wiki/display/dubbo/Administrator+Guide#AdministratorGuide-RedisRegistryInstallation">Redis安装手册</a>,只需搭一个原生的Redis服务器,并将<a href="#UserGuide-QuickStart">Quick Start</a>中Provider和Consumer里的conf/dubbo.properties中的dubbo.registry.addrss的值改为redis://127.0.0.1:6379即可使用</td></tr></table></div>
<div class='panelMacro'><table class='noteMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="warning-3.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/warning.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td><b>Redis过期数据</b><br />通过心跳的方式检测脏数据,服务器时间必须相同,并且对服务器有一定压力。</td></tr></table></div>
<div class='panelMacro'><table class='noteMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="warning-3.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/warning.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td><b>可靠性声明</b><br />阿里内部并没有采用Redis做为注册中心,而是使用自己实现的基于数据库的注册中心,即:Redis注册中心并没有在阿里内部长时间运行的可靠性保障,此Redis桥接实现只为开源版本提供,其可靠性依赖于Redis本身的可靠性。</td></tr></table></div>
<div class='panelMacro'><table class='noteMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="warning-3.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/warning.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>从2.1.0版本开始支持</td></tr></table></div>
<p><span class="image-wrap" style=""><img src="dubbo-redis-registry.jpg-version=1&modificationDate=1331396413000.jpg" tppabs="http://10.20.160.198/wiki/download/attachments/7668007/dubbo-redis-registry.jpg?version=1&modificationDate=1331396413000" style="border: 0px solid black" /></span></p>
<p>数据结构:</p>
<ul>
<li>使用Redis的Key/Map结构存储数据。
<ul>
<li>主Key为服务名和类型。</li>
<li>Map中的Key为URL地址。</li>
<li>Map中的Value为过期时间,用于判断脏数据,脏数据由监控中心删除。<font color="red">(注意:服务器时间必需同步,否则过期检测会不准确)</font></li>
</ul>
</li>
<li>使用Redis的Publish/Subscribe事件通知数据变更。
<ul>
<li>通过事件的值区分事件类型:register, unregister, subscribe, unsubscribe。</li>
<li>普通消费者直接订阅指定服务提供者的Key,只会收到指定服务的register, unregister事件。</li>
<li>监控中心通过psubscribe功能订阅/dubbo/*,会收到所有服务的所有变更事件。</li>
</ul>
</li>
</ul>
<p>调用过程:</p>
<ol>
<li>服务提供方启动时,向Key:/dubbo/com.foo.BarService/providers下,添加当前提供者的地址。</li>
<li>并向Channel:/dubbo/com.foo.BarService/providers发送register事件。</li>
<li>服务消费方启动时,从Channel:/dubbo/com.foo.BarService/providers订阅register和unregister事件。</li>
<li>并向Key:/dubbo/com.foo.BarService/providers下,添加当前消费者的地址。</li>
<li>服务消费方收到register和unregister事件后,从Key:/dubbo/com.foo.BarService/providers下获取提供者地址列表。</li>
<li>服务监控中心启动时,从Channel:/dubbo/*订阅register和unregister,以及subscribe和unsubsribe事件。</li>
<li>服务监控中心收到register和unregister事件后,从Key:/dubbo/com.foo.BarService/providers下获取提供者地址列表。</li>
<li>服务监控中心收到subscribe和unsubsribe事件后,从Key:/dubbo/com.foo.BarService/consumers下获取消费者地址列表。</li>
</ol>
<p>选项:</p>
<ul>
<li>可通过&lt;dubbo:registry group="dubbo" /&gt;设置redis中key的前缀,缺省为dubbo。</li>
<li>可通过&lt;dubbo:registry cluster="replicate" /&gt;设置redis集群策略,缺省为failover。
<ul>
<li>failover: 只写入和读取任意一台,失败时重试另一台,需要服务器端自行配置数据同步。</li>
<li>replicate: 在客户端同时写入所有服务器,只读取单台,服务器端不需要同步,注册中心集群增大,性能压力也会更大。</li>
</ul>
</li>
</ul>
<p>Config redis registry:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:registry address="redis://10.20.153.10:6379" /&gt;]]></script>
</div></div>
<p>Or:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:registry address="redis://10.20.153.10:6379?backup=10.20.153.11:6379,10.20.153.12:6379" /&gt;]]></script>
</div></div>
<p>Or:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:registry protocol="redis" address="10.20.153.10:6379" /&gt;]]></script>
</div></div>
<p>Or:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:registry protocol="redis" address="10.20.153.10:6379,10.20.153.11:6379,10.20.153.12:6379" /&gt;]]></script>
</div></div>
<h3><a name="UserGuide-SimpleRegistry"></a>Simple Registry</h3>
<p>(<a href="Simple+Registry.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/Simple+Registry" title="Simple Registry">+</a>) (<a href="#UserGuide-SimpleRegistry">#</a>)</p>
<div class='panelMacro'><table class='tipMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="check.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/check.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td><b>Dogfooding</b><br />注册中心本身就是一个普通的Dubbo服务,可以减少第三方依赖,使整体通讯方式一致。</td></tr></table></div>
<div class='panelMacro'><table class='noteMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="warning-3.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/warning.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td><b>适用性说明</b><br />此SimpleRegistryService只是简单实现,不支持集群,可作为自定义注册中心的参考,但不适合直接用于生产环境。</td></tr></table></div>
<p>Export simple registry service:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsdhttp://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"&gt;
&lt;!-- 当前应用信息配置 --&gt;
&lt;dubbo:application name="simple-registry" /&gt;
&lt;!-- 暴露服务协议配置 --&gt;
&lt;dubbo:protocol port="9090" /&gt;
&lt;!-- 暴露服务配置 --&gt;
&lt;dubbo:service interface="com.alibaba.dubbo.registry.RegistryService" ref="registryService" registry="N/A" ondisconnect="disconnect" callbacks="1000"&gt;
&lt;dubbo:method name="subscribe"&gt;&lt;dubbo:argument index="1" callback="true" /&gt;&lt;/dubbo:method&gt;
&lt;dubbo:method name="unsubscribe"&gt;&lt;dubbo:argument index="1" callback="false" /&gt;&lt;/dubbo:method&gt;
&lt;/dubbo:service&gt;
&lt;!-- 简单注册中心实现,可自行扩展实现集群和状态同步 --&gt;
&lt;bean id="registryService" class="com.alibaba.dubbo.registry.simple.SimpleRegistryService" /&gt;
&lt;/beans&gt;]]></script>
</div></div>
<p>Reference the simple registry service:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:registry address="127.0.0.1:9090" /&gt;]]></script>
</div></div>
<p>Or:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:service interface="com.alibaba.dubbo.registry.RegistryService" group="simple" version="1.0.0" ... &gt;]]></script>
</div></div>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:registry address="127.0.0.1:9090" group="simple" version="1.0.0" /&gt;]]></script>
</div></div>
<h3><a name="UserGuide-SimpleMonitor"></a>Simple Monitor</h3>
<p>(<a href="Simple+Monitor.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/Simple+Monitor" title="Simple Monitor">+</a>) (<a href="#UserGuide-SimpleMonitor">#</a>)</p>
<p>1.1 Export simple monitor service to registry:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsdhttp://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"&gt;
&lt;!-- 当前应用信息配置 --&gt;
&lt;dubbo:application name="simple-monitor" /&gt;
&lt;!-- 连接注册中心配置 --&gt;
&lt;dubbo:registry address="127.0.0.1:9090" /&gt;
&lt;!-- 暴露服务协议配置 --&gt;
&lt;dubbo:protocol port="7070" /&gt;
&lt;!-- 暴露服务配置 --&gt;
&lt;dubbo:service interface="com.alibaba.dubbo.monitor.MonitorService" ref="monitorService" /&gt;
&lt;bean id="monitorService" class="com.alibaba.dubbo.monitor.simple.SimpleMonitorService" /&gt;
&lt;/beans&gt;]]></script>
</div></div>
<p>1.2 Reference the simple monitor service from registry:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:monitor protocol="registry" /&gt;]]></script>
</div></div>
<p>2.1 Export simple monitor service without registry:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsdhttp://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"&gt;
&lt;!-- 当前应用信息配置 --&gt;
&lt;dubbo:application name="simple-monitor" /&gt;
&lt;!-- 暴露服务协议配置 --&gt;
&lt;dubbo:protocol port="7070" /&gt;
&lt;!-- 暴露服务配置 --&gt;
&lt;dubbo:service interface="com.alibaba.dubbo.monitor.MonitorService" ref="monitorService" registry="N/A" /&gt;
&lt;bean id="monitorService" class="com.alibaba.dubbo.monitor.simple.SimpleMonitorService" /&gt;
&lt;/beans&gt;]]></script>
</div></div>
<p>2.2 Reference the simple monitor service directly:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:monitor address="dubbo://127.0.0.1:7070/com.alibaba.dubbo.monitor.MonitorService" /&gt;]]></script>
</div></div>
<h2><a name="UserGuide-TelnetCommandReference"></a>Telnet Command Reference</h2>
<p>(<a href="Telnet+Command+Reference.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/Telnet+Command+Reference" title="Telnet Command Reference">+</a>) (<a href="#UserGuide-TelnetCommandReference">&#35;</a>)</p>
<p>Dubbo2.0.5以上版本服务提供端口支持telnet命令,<br/>
使用如:</p>
<div class="panel" style="background-color: black;border-width: 1px;"><div class="panelContent" style="background-color: black;">
<p><font color="white">telnet localhost 20880</font></p>
</div></div>
<p>或者:</p>
<div class="panel" style="background-color: black;border-width: 1px;"><div class="panelContent" style="background-color: black;">
<p><font color="white">echo status &#124; nc &#45;i 1 localhost 20880</font></p>
</div></div>
<p>telnet命令可以扩展,参见:<a href="Developer+Guide.htm#DeveloperGuide-TelnetHandler" tppabs="http://10.20.160.198/wiki/display/dubbo/Developer+Guide#DeveloperGuide-TelnetHandler">TelnetHandler扩展</a><br/>
status命令所检查的资源也可以扩展,参见:<a href="Developer+Guide.htm#DeveloperGuide-StatusChecker" tppabs="http://10.20.160.198/wiki/display/dubbo/Developer+Guide#DeveloperGuide-StatusChecker">StatusChecker扩展</a></p>
<h3><a name="UserGuide-ls"></a>ls</h3>
<p>(list services and methods)</p>
<p>ls</p>
<p>显示服务列表。</p>
<p>ls &#45;l</p>
<p>显示服务详细信息列表。</p>
<p>ls XxxService</p>
<p>显示服务的方法列表。</p>
<p>ls &#45;l XxxService</p>
<p>显示服务的方法详细信息列表。</p>
<h3><a name="UserGuide-ps"></a>ps</h3>
<p>(print server ports and connections)</p>
<p>ps</p>
<p>显示服务端口列表。</p>
<p>ps &#45;l</p>
<p>显示服务地址列表。</p>
<p>ps 20880</p>
<p>显示端口上的连接信息。</p>
<p>ps &#45;l 20880</p>
<p>显示端口上的连接详细信息。</p>
<h3><a name="UserGuide-cd"></a>cd</h3>
<p>(change default service)</p>
<p>cd XxxService</p>
<p>改变缺省服务,当设置了缺省服务,凡是需要输入服务名作为参数的命令,都可以省略服务参数。</p>
<p>cd /</p>
<p>取消缺省服务。</p>
<h3><a name="UserGuide-pwd"></a>pwd</h3>
<p>(print working default service)</p>
<p>pwd</p>
<p>显示当前缺省服务。</p>
<h3><a name="UserGuide-trace"></a>trace</h3>
<p>trace XxxService</p>
<p>跟踪1次服务任意方法的调用情况。</p>
<p>trace XxxService 10</p>
<p>跟踪10次服务任意方法的调用情况。</p>
<p>trace XxxService xxxMethod</p>
<p>跟踪1次服务方法的调用情况</p>
<p>trace XxxService xxxMethod 10</p>
<p>跟踪10次服务方法的调用情况。</p>
<h3><a name="UserGuide-count"></a>count</h3>
<p>count XxxService</p>
<p>统计1次服务任意方法的调用情况。</p>
<p>count XxxService 10</p>
<p>统计10次服务任意方法的调用情况。</p>
<p>count XxxService xxxMethod</p>
<p>统计1次服务方法的调用情况。</p>
<p>count XxxService xxxMethod 10</p>
<p>统计10次服务方法的调用情况。</p>
<h3><a name="UserGuide-invoke"></a>invoke</h3>
<p>invoke XxxService.xxxMethod(para1,para...);</p>
<p>调用服务的方法。</p>
<p>invoke xxxMethod(para1,para...)</p>
<div class='panelMacro'><table class='tipMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="check.gif" tppabs="http://10.20.160.198/wiki/images/icons/emoticons/check.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>如果参数为pojo对象,可采用json的方式:
<p>invoke XxxService.xxxMethod({"prop": "value"})</p></td></tr></table></div>
<h3><a name="UserGuide-status"></a>status</h3>
<p>status</p>
<p>显示汇总状态,该状态将汇总所有资源的状态,当全部OK时则显示OK,只要有一个ERROR则显示ERROR,只要有一个WARN则显示WARN。</p>
<p>status &#45;l</p>
<p>显示状态列表。</p>
<h3><a name="UserGuide-log"></a>log</h3>
<p><em>2.0.6以上版本支持</em></p>
<p>log debug<br/>
修改dubbo logger的日志级别</p>
<p>log 100<br/>
查看file logger的最后100字符的日志</p>
<h3><a name="UserGuide-help"></a>help</h3>
<p>help</p>
<p>显示telnet命帮助信息。</p>
<p>help xxx</p>
<p>显示xxx命令的详细帮助信息。</p>
<h3><a name="UserGuide-clear"></a>clear</h3>
<p>clear</p>
<p>清除屏幕上的内容。</p>
<p>clear 100</p>
<p>清除屏幕上的指定行数的内容。</p>
<h3><a name="UserGuide-exit"></a>exit</h3>
<p>exit</p>
<p>退出当前telnet命令行。</p>
<h2><a name="UserGuide-MavenPluginReference"></a>Maven Plugin Reference</h2>
<p>(<a href="Maven+Plugin+Reference.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/Maven+Plugin+Reference" title="Maven Plugin Reference">+</a>) (<a href="#UserGuide-MavenPluginReference">#</a>)</p>
<h3><a name="UserGuide-mvndubbo%3Aregistry"></a>mvn dubbo:registry</h3>
<p>mvn dubbo:registry<br/>
以缺省的9090端口启动一个简易注册中心</p>
<p>mvn dubbo:registry &#45;Dport=9099<br/>
以指定的9099端口启动一个简易注册中心</p>
<h3><a name="UserGuide-mvndubbo%3Acreate"></a>mvn dubbo:create</h3>
<p><font color="red">(尚未发布)</font></p>
<p>mvn dubbo:create<br/>
生成demo服务提供者应用</p>
<p>mvn dubbo:create &#45;Dapplication=xxx &#45;Dpackage=com.alibaba.xxx &#45;Dservice=XxxService,YyyService &#45;Dversion=1.0.0<br/>
生成指定接口和版本的服务提供者应用</p>
<h2><a name="UserGuide-ServiceBestPractices"></a>Service Best Practices</h2>
<p>(<a href="Service+Best+Practices.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/Service+Best+Practices" title="Service Best Practices">+</a>) (<a href="#UserGuide-ServiceBestPractices">#</a>)</p>
<h3><a name="UserGuide-Package"></a>Package</h3>
<ul>
<li>建议将服务接口,服务模型,服务异常等均放在API包中,因为服务模型及异常也是API的一部分,<br/>
同时,这样做也符合分包原则:重用发布等价原则(REP),共同重用原则(CRP)</li>
<li>如果需要,也可以考虑在API包中放置一份spring的引用配置,这样使用方,只需在Spring加载过程中引用此配置即可,<br/>
配置建议放在模块的包目录下,以免冲突,如:com/alibaba/china/xxx/dubbo-reference.xml</li>
</ul>
<h3><a name="UserGuide-Interface"></a>Interface</h3>
<ul>
<li>服务接口尽可能大粒度,每个服务方法应代表一个功能,而不是某功能的一个步骤,否则将面临分布式事务问题,Dubbo暂未提供分布式事务支持。</li>
<li>服务接口建议以业务场景为单位划分,并对相近业务做抽象,防止接口数量爆炸</li>
<li>不建议使用过于抽象的通用接口,如:Map query(Map),这样的接口没有明确语义,会给后期维护带来不便。</li>
</ul>
<h3><a name="UserGuide-Version"></a>Version</h3>
<ul>
<li>每个接口都应定义版本号,为后续不兼容升级提供可能,如:&lt;dubbo:service interface="com.xxx.XxxService" version="1.0" /&gt;</li>
<li>建议使用两位版本号,因为第三位版本号通常表示兼容升级,只有不兼容时才需要变更服务版本。</li>
<li>当不兼容时,先升级一半提供者为新版本,再将消费者全部升为新版本,然后将剩下的一半提供者升为新版本。</li>
</ul>
<h3><a name="UserGuide-Compatibility"></a>Compatibility</h3>
<ul>
<li>服务接口增加方法,或服务模型增加字段,可向后兼容,删除方法或删除字段,将不兼容,枚举类型新增字段也不兼容,需通过变更版本号升级。</li>
<li>各协议的兼容性不同,参见:<a href="javascript:if(confirm(%27http://b2b-doc.alibaba-inc.com/pages/viewpage.action?pageId=41106935 \n\nThis file was not retrieved by Teleport Ultra, because it is addressed on a domain or path outside the boundaries set for its Starting Address. \n\nDo you want to open it from the server?%27))window.location=%27http://b2b-doc.alibaba-inc.com/pages/viewpage.action?pageId=41106935%27" tppabs="http://b2b-doc.alibaba-inc.com/pages/viewpage.action?pageId=41106935" class="external-link" rel="nofollow">服务协议</a></li>
</ul>
<h3><a name="UserGuide-Enum"></a>Enum</h3>
<ul>
<li>如果是完备集,可以用Enum,比如:ENABLE, DISABLE。</li>
<li>如果是业务种类,以后明显会有类型增加,不建议用Enum,可以用String代替。</li>
<li>如果是在返回值中用了Enum,并新增了Enum值,建议先升级服务消费方,这样服务提供方不会返回新值。</li>
<li>如果是在传入参数中用了Enum,并新增了Enum值,建议先升级服务提供方,这样服务消费方不会传入新值。</li>
</ul>
<h3><a name="UserGuide-Serialization"></a>Serialization</h3>
<ul>
<li>服务参数及返回值建议使用POJO对象,即通过set,get方法表示属性的对象。</li>
<li>服务参数及返回值不建议使用接口,因为数据模型抽象的意义不大,并且序列化需要接口实现类的元信息,并不能起到隐藏实现的意图。</li>
<li>服务参数及返回值都必需是byValue的,而不能是byRef的,消费方和提供方的参数或返回值引用并不是同一个,只是值相同,Dubbo不支持引用远程对象。</li>
</ul>
<h3><a name="UserGuide-Exception"></a>Exception</h3>
<ul>
<li>建议使用异常汇报错误,而不是返回错误码,异常信息能携带更多信息,以及语义更友好,</li>
<li>如果担心性能问题,在必要时,可以通过override掉异常类的fillInStackTrace()方法为空方法,使其不拷贝栈信息,</li>
<li>查询方法不建议抛出checked异常,否则调用方在查询时将过多的try...catch,并且不能进行有效处理,</li>
<li>服务提供方不应将DAO或SQL等异常抛给消费方,应在服务实现中对消费方不关心的异常进行包装,否则可能出现消费方无法反序列化相应异常。</li>
</ul>
<h3><a name="UserGuide-Invocation"></a>Invocation</h3>
<ul>
<li>不要只是因为是Dubbo调用,而把调用Try-Catch起来。Try-Catch应该加上合适的回滚边界上。</li>
<li>对于输入参数的校验逻辑在Provider端要有。如有性能上的考虑,服务实现者可以考虑在API包上加上服务Stub类来完成检验。</li>
</ul>
<h2><a name="UserGuide-RecommendedUsage"></a>Recommended Usage</h2>
<p>(<a href="Recommended+Usage.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/Recommended+Usage" title="Recommended Usage">+</a>) (<a href="#UserGuide-RecommendedUsage">#</a>)</p>
<h4><a name="UserGuide-%E5%9C%A8Provider%E4%B8%8A%E5%B0%BD%E9%87%8F%E5%A4%9A%E9%85%8D%E7%BD%AEConsumer%E7%AB%AF%E5%B1%9E%E6%80%A7"></a>在Provider上尽量多配置Consumer端属性</h4>
<p>原因如下:</p>
<ol>
<li>作服务的提供者,比服务使用方<font color="red">更清楚</font>服务性能参数,如调用的超时时间,合理的重试次数,等等</li>
<li>在Provider配置后,Consumer不配置则会使用Provider的配置值,即Provider配置可以作为Consumer的缺省值。<br/>
否则,Consumer会使用<font color="brown">Consumer端的全局设置</font>,这对于Provider<font color="red"><b>不可控的</b></font>,并且往往是<font color="red"><b>不合理的</b></font><br/>
PS: 配置的覆盖规则:1) 方法级配置别优于接口级别,即小Scope优先 2) Consumer端配置 优于 Provider配置 优于 全局配置,最后是Dubbo Hard Code的配置值(见配置文档)<br/>
配置的覆盖规则详见: <a href="#UserGuide-ConfigurationReference">Dubbo配置参考手册</a></li>
</ol>
<p>Provider上尽量多配置Consumer端的属性,让Provider实现者一开始就思考Provider服务特点、服务质量的问题。</p>
<p>示例:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:service interface="com.alibaba.hello.api.HelloService" version="1.0.0" ref="helloService"
timeout="300" retries="2" loadbalance="random" actives="0"
/&gt;
&lt;dubbo:service interface="com.alibaba.hello.api.WorldService" version="1.0.0" ref="helloService"
timeout="300" retries="2" loadbalance="random" actives="0" &gt;
&lt;dubbo:method name="findAllPerson" timeout="10000" retries="9" loadbalance="leastactive" actives="5" /&gt;
&lt;dubbo:service/&gt;]]></script>
</div></div>
<p>在Provider可以配置的Consumer端属性有:</p>
<ol>
<li><b>timeout</b>,方法调用超时</li>
<li><b>retries</b>,失败重试次数,缺省是2(表示加上第一次调用,会调用3次)</li>
<li><b>loadbalance</b>,负载均衡算法(有多个Provider时,如何挑选Provider调用),缺省是随机(random)。<br/>
还可以有轮训(roundrobin)、最不活跃优先(leastactive,指从Consumer端并发调用最好的Provider,可以减少的反应慢的Provider的调用,因为反应更容易累积并发的调用)</li>
<li><b>actives</b>,消费者端,最大并发调用限制,即当Consumer对一个服务的并发调用到上限后,新调用会Wait直到超时。<br/>
在方法上配置(dubbo:method )则并发限制针对方法,在接口上配置(dubbo:service),则并发限制针对服务。</li>
</ol>
<p>详细配置说明参见:<a href="#UserGuide-ConfigurationReference">Dubbo配置参考手册</a>&nbsp;</p>
<h4><a name="UserGuide-Provider%E4%B8%8A%E9%85%8D%E7%BD%AE%E5%90%88%E7%90%86%E7%9A%84Provider%E7%AB%AF%E5%B1%9E%E6%80%A7"></a>Provider上配置合理的Provider端属性</h4>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:protocol threads="200" /&gt;
&lt;dubbo:service interface="com.alibaba.hello.api.HelloService" version="1.0.0" ref="helloService"
executes="200" &gt;
&lt;dubbo:method name="findAllPerson" executes="50" /&gt;
&lt;/dubbo:service&gt;]]></script>
</div></div>
<p>Provider上可以配置的Provider端属性有:</p>
<ol>
<li><b>threads</b>,服务线程池大小</li>
<li><b>executes</b>,一个服务提供者并行执行请求上限,即当Provider对一个服务的并发调用到上限后,新调用会Wait(Consumer可能到超时)。在方法上配置(dubbo:method )则并发限制针对方法,在接口上配置(dubbo:service),则并发限制针对服务。</li>
</ol>
<h4><a name="UserGuide-%E9%85%8D%E7%BD%AE%E4%B8%8A%E7%AE%A1%E7%90%86%E4%BF%A1%E6%81%AF"></a>配置上管理信息</h4>
<p>目前有<font color="red"><b>负责人</b></font>信息和<font color="red"><b>组织</b></font>信息(用于区分站点)。</p>
<p>有问题时便于的找到服务的负责人,至少写<b>两个人</b>以便备份。</p>
<p>负责人和组织的信息可以在注册中心的上看到。</p>
<p>示例:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeHeader panelHeader" style="border-bottom-width: 1px;"><b>应用配置负责人、组织</b></div><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:application owner=”ding.lid,william.liangf organization=”intl /&gt;]]></script>
</div></div>
<div class="code panel" style="border-width: 1px;"><div class="codeHeader panelHeader" style="border-bottom-width: 1px;"><b>service配置负责人</b></div><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:service owner=”ding.lid,william.liangf /&gt;]]></script>
</div></div>
<div class="code panel" style="border-width: 1px;"><div class="codeHeader panelHeader" style="border-bottom-width: 1px;"><b>reference配置负责人</b></div><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:reference owner=”ding.lid,william.liangf /&gt;]]></script>
</div></div>
<p>dubbo:service、dubbo:reference没有配置负责人,则使用dubbo:application设置的负责人。</p>
<h4><a name="UserGuide-%E9%85%8D%E7%BD%AE%E4%B8%8ADubbo%E7%BC%93%E5%AD%98%E6%96%87%E4%BB%B6"></a>配置上Dubbo缓存文件</h4>
<p>配置方法如下:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeHeader panelHeader" style="border-bottom-width: 1px;"><b>提供者列表缓存文件</b></div><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: xml; gutter: false"><![CDATA[&lt;dubbo:registry file=”${user.home}/output/dubbo.cache /&gt;]]></script>
</div></div>
<p>注意:</p>
<ol>
<li>文件的路径,应用可以根据需要调整,保证这个文件<font color="red">不会</font>在发布过程中被清除。</li>
<li>如果有多个应用进程注意不要使用同一个文件,避免内容被<font color="red">覆盖</font></li>
</ol>
<p>这个文件会缓存:</p>
<ol>
<li>注册中心的列表</li>
<li>服务提供者列表</li>
</ol>
<p>有了这项配置后,当应用重启过程中,Dubbo注册中心不可用时则应用会从这个缓存文件读取服务提供者列表的信息,进一步保证应用可靠性。</p>
<h4><a name="UserGuide-%E7%9B%91%E6%8E%A7%E9%85%8D%E7%BD%AE"></a>监控配置</h4>
<h5><a name="UserGuide-1.%E4%BD%BF%E7%94%A8%E5%9B%BA%E5%AE%9A%E7%AB%AF%E5%8F%A3%E6%9A%B4%E9%9C%B2%E6%9C%8D%E5%8A%A1%EF%BC%8C%E8%80%8C%E4%B8%8D%E8%A6%81%E4%BD%BF%E7%94%A8%E9%9A%8F%E6%9C%BA%E7%AB%AF%E5%8F%A3"></a>1. 使用固定端口暴露服务,而不要使用随机端口</h5>
<p>这样在注册中心推送有延迟的情况下,消费者通过缓存列表也能调用到原地址,保证调用成功。</p>
<h5><a name="UserGuide-3.%E4%BD%BF%E7%94%A8Dragoon%E7%9A%84http%E7%9B%91%E6%8E%A7%E9%A1%B9%E7%9B%91%E6%8E%A7%E6%B3%A8%E5%86%8C%E4%B8%AD%E5%BF%83%E4%B8%8A%E6%9C%8D%E5%8A%A1%E6%8F%90%E4%BE%9B%E6%96%B9"></a>3. 使用Dragoon的http监控项监控注册中心上服务提供方</h5>
<p>Dragoon监控服务在注册中心上的状态:<a href="javascript:if(confirm(%27http://dubbo-reg1.hst.xyi.cn.alidc.net:8080/status/com.alibaba.morgan.member.MemberService:1.0.5 \n\nThis file was not retrieved by Teleport Ultra, because it is addressed on a domain or path outside the boundaries set for its Starting Address. \n\nDo you want to open it from the server?%27))window.location=%27http://dubbo-reg1.hst.xyi.cn.alidc.net:8080/status/com.alibaba.morgan.member.MemberService:1.0.5%27" tppabs="http://dubbo-reg1.hst.xyi.cn.alidc.net:8080/status/com.alibaba.morgan.member.MemberService:1.0.5" class="external-link" rel="nofollow">http://dubbo-reg1.hst.xyi.cn.alidc.net:8080/status/com.alibaba.morgan.member.MemberService:1.0.5</a>,确保注册中心上有该服务的存在。</p>
<h5><a name="UserGuide-4.%E6%9C%8D%E5%8A%A1%E6%8F%90%E4%BE%9B%E6%96%B9%EF%BC%8C%E4%BD%BF%E7%94%A8Dragoon%E7%9A%84telnet%E6%88%96shell%E7%9B%91%E6%8E%A7%E9%A1%B9"></a>4. 服务提供方,使用Dragoon的telnet或shell监控项</h5>
<p>监控服务提供者端口状态:echo status &#124; nc &#45;-i 1 20880 &#124; grep OK &#124; wc &#45;-l,其中的20880为服务端口</p>
<h5><a name="UserGuide-5.%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E6%96%B9%EF%BC%8C%E9%80%9A%E8%BF%87%E5%B0%86%E6%9C%8D%E5%8A%A1%E5%BC%BA%E5%88%B6%E8%BD%AC%E5%9E%8B%E4%B8%BAEchoService%EF%BC%8C%E5%B9%B6%E8%B0%83%E7%94%A8%24echo%28%29%E6%B5%8B%E8%AF%95%E8%AF%A5%E6%9C%8D%E5%8A%A1%E7%9A%84%E6%8F%90%E4%BE%9B%E8%80%85%E6%98%AF%E5%8F%AF%E7%94%A8"></a>5. 服务消费方,通过将服务强制转型为EchoService,并调用$echo()测试该服务的提供者是可用</h5>
<p>如 assertEqauls(“OK”, ((EchoService)memberService).$echo(“OK”));</p>
<h4><a name="UserGuide-%E4%B8%8D%E8%A6%81%E4%BD%BF%E7%94%A8dubbo.properties%E6%96%87%E4%BB%B6%E9%85%8D%E7%BD%AE%EF%BC%8C%E6%8E%A8%E8%8D%90%E4%BD%BF%E7%94%A8%E5%AF%B9%E5%BA%94XML%E9%85%8D%E7%BD%AE"></a>不要使用dubbo.properties文件配置,推荐使用对应XML配置</h4>
<p>Dubbo2中所有的配置项都可以Spring配置中,并且可以针对单个服务配置。</p>
<p>&#35; 如完全不配置使用Dubbo缺省值,参见<a href="#UserGuide-ConfigurationReference">Dubbo配置参考手册</a>中的说明。</p>
<p>在Dubbo1中需要在dubbo.properties文件中的配置项,Dubbo2中配置示例如下:</p>
<h5><a name="UserGuide-1.%E5%BA%94%E7%94%A8%E5%90%8D%26nbsp%3B"></a>1. 应用名&nbsp;</h5>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: java; gutter: false"><![CDATA[&lt;dubbo:application name="myalibaba" &gt;]]></script>
</div></div>
<p>对应dubbo.properties中的Key名dubbo.application.name</p>
<h5><a name="UserGuide-2.%26nbsp%3B%E6%B3%A8%E5%86%8C%E4%B8%AD%E5%BF%83%E5%9C%B0%E5%9D%80"></a>2.&nbsp;注册中心地址</h5>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: java; gutter: false"><![CDATA[&lt;dubbo:registry address="11.22.33.44:9090" &gt;]]></script>
</div></div>
<p>对应dubbo.properties中的Key名dubbo.registry.address</p>
<h5><a name="UserGuide-3.%E8%B0%83%E7%94%A8%E8%B6%85%E6%97%B6"></a>3. 调用超时</h5>
<p>可以在多个配置项设置超时,由上至下<font color="#ff0000"><b>覆盖</b></font>(即上面的优先),示例如下:</p>
<p>&#35; 其它的参数(retries、loadbalance、actives等)的覆盖策略也一样。</p>
<p>提供者端特定方法的配置</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: java; gutter: false"><![CDATA[&lt;dubbo:service interface="com.alibaba.xxx.XxxService" &gt;
&lt;dubbo:method name="findPerson" timeout="1000" /&gt;
&lt;/dubbo:service&gt;]]></script>
</div></div>
<p>提供者端特定接口的配置</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: java; gutter: false"><![CDATA[&lt;dubbo:service interface="com.alibaba.xxx.XxxService" timeout="200" /&gt;]]></script>
</div></div>
<p>&#35; timeout可以在多处设置,配置项及覆盖规则详见:&nbsp;<a href="#UserGuide-ConfigurationReference">Dubbo配置参考手册</a></p>
<p>全局配置项值,对应dubbo.properties中的Key名dubbo.service.invoke.timeout</p>
<h5><a name="UserGuide-5.%E6%9C%8D%E5%8A%A1%E6%8F%90%E4%BE%9B%E8%80%85%E5%8D%8F%E8%AE%AE%E3%80%81%E6%9C%8D%E5%8A%A1%E7%9A%84%E7%9B%91%E5%90%AC%E7%AB%AF%E5%8F%A3"></a>5. 服务提供者协议、服务的监听端口</h5>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: java; gutter: false"><![CDATA[&lt;dubbo:protocol name="dubbo" port="20880" /&gt;]]></script>
</div></div>
<p>对应dubbo.properties中的Key名dubbo.service.protocol、dubbo.service.server.port</p>
<h5><a name="UserGuide-4.%26nbsp%3B%E6%9C%8D%E5%8A%A1%E7%BA%BF%E7%A8%8B%E6%B1%A0%E5%A4%A7%E5%B0%8F"></a>4.&nbsp;服务线程池大小</h5>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: java; gutter: false"><![CDATA[&lt;dubbo:protocol threads="100" /&gt;]]></script>
</div></div>
<p>对应dubbo.properties中的Key名dubbo.service.max.thread.threads.size</p>
<h5><a name="UserGuide-6.%E6%B6%88%E8%B4%B9%E8%80%85%E5%90%AF%E5%8A%A8%E6%97%B6%EF%BC%8C%E6%B2%A1%E6%9C%89%E6%8F%90%E4%BE%9B%E8%80%85%E6%98%AF%E5%90%A6%E6%8A%9B%E5%BC%82%E5%B8%B8FastFail"></a>6. 消费者启动时,没有提供者是否抛异常Fast-Fail</h5>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: java; gutter: false"><![CDATA[&lt;dubbo:reference interface="com.alibaba.xxx.XxxService" check="false" /&gt;]]></script>
</div></div>
<p>对应dubbo.properties中的Key名alibaba.intl.commons.dubbo.service.allow.no.provider</p>
<h2><a name="UserGuide-CapacityEstimated"></a>Capacity Estimated</h2>
<p>(<a href="Capacity+Estimated.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/Capacity+Estimated" title="Capacity Estimated">+</a>) (<a href="#UserGuide-CapacityEstimated">#</a>)</p>
<p>以下数据供参考:</p>
<h4><a name="UserGuide-%E4%BD%BF%E7%94%A8Dubbo%E7%9A%84%E4%BC%9A%E5%91%98%E6%9C%8D%E5%8A%A1%E9%A1%B9%E7%9B%AE"></a>使用Dubbo的会员服务项目</h4>
<ul>
<li>每天接收4亿次远程调用</li>
<li>使用12台网站标配机器提供服务(8核CPU,8G内存)</li>
<li>平均负载在1以下(对于8核CPU负载很低)</li>
<li>平均响应时间2.3到2.5毫秒,网络开销约占1.5到1.6毫秒(和数据包大小有关)</li>
</ul>
<h4><a name="UserGuide-%E4%BD%BF%E7%94%A8Dubbo%E7%9A%84%E4%BA%A7%E5%93%81%E6%8E%88%E6%9D%83%E6%9C%8D%E5%8A%A1%E9%A1%B9%E7%9B%AE"></a>使用Dubbo的产品授权服务项目</h4>
<ul>
<li>每天接收3亿次远程调用</li>
<li>使用8台网站标配机器提供服务(8核CPU,8G内存)</li>
<li>平均负载在1以下(对于8核CPU负载很低)</li>
<li>平均响应时间1.4到2.8毫秒,网络开销约占1.0到1.1毫秒(和数据包大小有关)</li>
</ul>
<h2><a name="UserGuide-BenchmarkTestToolkit"></a>Benchmark Test Toolkit</h2>
<p>(<a href="Benchmark+Test+Toolkit.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/Benchmark+Test+Toolkit" title="Benchmark Test Toolkit">+</a>) (<a href="#UserGuide-BenchmarkTestToolkit">#</a>)</p>
<h4><a name="UserGuide-%E4%B8%8B%E8%BD%BDbenchmark%E5%8E%8B%E7%BC%A9%E5%8C%85%EF%BC%8C%E5%B9%B6%E8%A7%A3%E5%8E%8B"></a>下载benchmark压缩包,并解压</h4>
<p><a href="javascript:if(confirm(%27http://code.alibabatech.com/wiki/download/attachments/7669075/dubbo.benchmark-2.0.14.tar.gz \n\nThis file was not retrieved by Teleport Ultra, because it is addressed on a domain or path outside the boundaries set for its Starting Address. \n\nDo you want to open it from the server?%27))window.location=%27http://code.alibabatech.com/wiki/download/attachments/7669075/dubbo.benchmark-2.0.14.tar.gz%27" tppabs="http://code.alibabatech.com/wiki/download/attachments/7669075/dubbo.benchmark-2.0.14.tar.gz" class="external-link" rel="nofollow">dubbo.benchmark-2.0.14.tar.gz</a></p>
<h4><a name="UserGuide-%E9%98%85%E8%AF%BBReadMe.txt%EF%BC%88%E5%86%85%E5%AE%B9%E5%A6%82%E4%B8%8B%EF%BC%8C%E8%AF%B7%E4%BB%A5%E5%8E%8B%E7%BC%A9%E5%8C%85%E5%86%85%E7%9A%84%E4%B8%BA%E5%87%86%EF%BC%89"></a>阅读ReadMe.txt(内容如下,请以压缩包内的为准)</h4>
<p>一、新建一个benchmark工程,如demo.benchmark<br/>
二、导入自己服务的接口api包和dubbo.benchmark.jar(解压dubbo.benchmark.tar.gz,在lib目录下)<br/>
三、新建一个类,实现AbstractClientRunnable<br/>
a、实现父类的构造函数<br/>
b、实现invoke方法,通过serviceFactory创建本地接口代理,并实现自己的业务逻辑,如下</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Confluence; brush: java; gutter: false"><![CDATA[public Object invoke(ServiceFactory serviceFactory) {
DemoService demoService = (DemoService) serviceFactory.get(DemoService.class);
return demoService.sendRequest("hello");
}]]></script>
</div></div>
<p>四、将自己的benchmark工程打成jar包,如demo.benchmark.jar<br/>
五、将demo.benchmark.jar 和服务的api包放到dubbo.benchmark/lib目录下<br/>
六、配置duubo.properties<br/>
七、运行run.bat(windows)或run.sh(linux)</p>
<p>如想测试dubbo的不同版本,直接替换lib下的dubbo的jar包即可。</p>
<h2><a name="UserGuide-PerformanceTestReport"></a>Performance Test Report</h2>
<p>(<a href="Performance+Test+Report.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/Performance+Test+Report" title="Performance Test Report">+</a>) (<a href="#UserGuide-PerformanceTestReport">#</a>)</p>
<h3><a name="UserGuide-Scene"></a>Scene</h3>
<p>a、本次性能测试,测试了dubbo2.0所有支持的协议在不同大小和数据类型下的表现,并与dubbo1.0进行了对比。</p>
<p>b、整体性能相比1.0有了提升,平均提升10%,使用dubbo2.0新增的dubbo序列化还能获得10%~50%的性能提升,详见下面的性能数据。</p>
<p>c、稳定性测试中由于将底层通信框架从mina换成netty,old区对象的增长大大减少,50小时运行,增长不到200m,无fullgc。(可以确认为mina在高并发下的设计缺陷)</p>
<p>d、存在的问题:在50k数据的时候2.0性能不如1.0,怀疑可能是缓冲区设置的问题,下版本会进一步确认。
<br class="atl-forced-newline" /></p>
<h3><a name="UserGuide-Environment"></a>Environment</h3>
<h4><a name="UserGuide-"></a><font color="#000000">2.1</font> <font color="#000000">硬件部署与参数调整</font></h4>
<p>主机/ip<br/>
硬件配置<br/>
操作系统及参数调整</p>
<div class='table-wrap'>
<table class='confluenceTable'><tbody>
<tr>
<td class='confluenceTd'> <font color="black">10.20.153.11</font> </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> <font color="black">机型</font> </td>
<td class='confluenceTd'> <font color="black">Tecal&nbsp;BH620</font> </td>
</tr>
<tr>
<td class='confluenceTd'> <font color="black">CPU</font> </td>
<td class='confluenceTd'> <font color="black">model&nbsp;name :&nbsp;Intel(R)&nbsp;Xeon(R)&nbsp;CPU&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;E5520&nbsp;&nbsp;@&nbsp;2.27GHz cache&nbsp;size :&nbsp;8192&nbsp;KB processor_count&nbsp;:&nbsp;16</font> </td>
</tr>
<tr>
<td class='confluenceTd'> <font color="black">内存</font> </td>
<td class='confluenceTd'> <font color="black">Total&nbsp;System&nbsp;Memory:&nbsp;6G Hardware&nbsp;Memory&nbsp;Info:&nbsp; Size:&nbsp;4096MB,&nbsp;1066MHz(0.9ns) Size:&nbsp;NoModule,&nbsp;Unknown Size:&nbsp;4096MB,&nbsp;1066MHz(0.9ns) Size:&nbsp;NoModule,&nbsp;Unknown Size:&nbsp;4096MB,&nbsp;1066MHz(0.9ns) Size:&nbsp;NoModule,&nbsp;Unknown Size:&nbsp;4096MB,&nbsp;1066MHz(0.9ns) Size:&nbsp;NoModule,&nbsp;Unknown Size:&nbsp;4096MB,&nbsp;1066MHz(0.9ns) Size:&nbsp;NoModule,&nbsp;Unknown Size:&nbsp;4096MB,&nbsp;1066MHz(0.9ns) Size:&nbsp;NoModule,&nbsp;Unknown</font> </td>
</tr>
<tr>
<td class='confluenceTd'> <font color="black">网络</font> </td>
<td class='confluenceTd'> <font color="black">Total&nbsp;System&nbsp;Memory:&nbsp;6G Hardware&nbsp;Memory&nbsp;Info:&nbsp; Size:&nbsp;4096MB,&nbsp;1066MHz(0.9ns) Size:&nbsp;NoModule,&nbsp;Unknown Size:&nbsp;4096MB,&nbsp;1066MHz(0.9ns) Size:&nbsp;NoModule,&nbsp;Unknown Size:&nbsp;4096MB,&nbsp;1066MHz(0.9ns) Size:&nbsp;NoModule,&nbsp;Unknown Size:&nbsp;4096MB,&nbsp;1066MHz(0.9ns) Size:&nbsp;NoModule,&nbsp;Unknown Size:&nbsp;4096MB,&nbsp;1066MHz(0.9ns) Size:&nbsp;NoModule,&nbsp;Unknown Size:&nbsp;4096MB,&nbsp;1066MHz(0.9ns) Size:&nbsp;NoModule,&nbsp;Unknown</font> </td>
</tr>
<tr>
<td class='confluenceTd'> <font color="black">磁盘</font> </td>
<td class='confluenceTd'> <font color="black">/dev/sda:&nbsp;597.9&nbsp;GB,</font> </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> <font color="black">2.6.18-128.el5xen&nbsp;x86_64</font> </td>
</tr>
<tr>
<td class='confluenceTd'> <font color="black">10.20.153.10</font> </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> <font color="black">机型</font> </td>
<td class='confluenceTd'> <font color="black">Tecal&nbsp;BH620</font> </td>
</tr>
<tr>
<td class='confluenceTd'> <font color="black">CPU</font> </td>
<td class='confluenceTd'> <font color="black">model&nbsp;name :&nbsp;Intel(R)&nbsp;Xeon(R)&nbsp;CPU&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;E5520&nbsp;&nbsp;@&nbsp;2.27GHz cache&nbsp;size :&nbsp;8192&nbsp;KB processor_count&nbsp;:&nbsp;16</font> </td>
</tr>
<tr>
<td class='confluenceTd'> <font color="black">内存</font> </td>
<td class='confluenceTd'> <font color="black">Total&nbsp;System&nbsp;Memory:&nbsp;6G Hardware&nbsp;Memory&nbsp;Info:&nbsp; Size:&nbsp;4096MB,&nbsp;1066MHz(0.9ns) Size:&nbsp;NoModule,&nbsp;Unknown Size:&nbsp;4096MB,&nbsp;1066MHz(0.9ns) Size:&nbsp;NoModule,&nbsp;Unknown Size:&nbsp;4096MB,&nbsp;1066MHz(0.9ns) Size:&nbsp;NoModule,&nbsp;Unknown Size:&nbsp;4096MB,&nbsp;1066MHz(0.9ns) Size:&nbsp;NoModule,&nbsp;Unknown Size:&nbsp;4096MB,&nbsp;1066MHz(0.9ns) Size:&nbsp;NoModule,&nbsp;Unknown Size:&nbsp;4096MB,&nbsp;1066MHz(0.9ns) Size:&nbsp;NoModule,&nbsp;Unknown</font> </td>
</tr>
<tr>
<td class='confluenceTd'> <font color="black">网络</font> </td>
<td class='confluenceTd'> <font color="black">eth0:&nbsp;Link&nbsp;is&nbsp;up&nbsp;at&nbsp;1000&nbsp;Mbps,&nbsp;full&nbsp;duplex.&nbsp;peth0:&nbsp;Link&nbsp;is&nbsp;up&nbsp;at&nbsp;1000&nbsp;Mbps,&nbsp;full&nbsp;duplex.</font> </td>
</tr>
<tr>
<td class='confluenceTd'> <font color="black">磁盘</font> </td>
<td class='confluenceTd'> <font color="black">/dev/sda:&nbsp;597.9&nbsp;GB,</font> </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> <font color="black">2.6.18-128.el5xen&nbsp;x86_64</font> </td>
</tr>
</tbody></table>
</div>
<p><br class="atl-forced-newline" /></p>
<h4><a name="UserGuide-"></a><font color="#000000">2.2</font> <font color="#000000">软件架构</font></h4>
<p>主机/ip<br/>
软件名称及版本<br/>
关键参数</p>
<div class='table-wrap'>
<table class='confluenceTable'><tbody>
<tr>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> <font color="black">java&nbsp;version&nbsp;"1.6.0_18" Java(TM)&nbsp;SE&nbsp;Runtime&nbsp;Environment&nbsp;(build&nbsp;1.6.0_18-b07) Java&nbsp;HotSpot(TM)&nbsp;64-Bit&nbsp;Server&nbsp;VM&nbsp;(build&nbsp;16.0-b13,&nbsp;mixed&nbsp;mode)</font> </td>
<td class='confluenceTd'> <font color="black">&#45;server&nbsp;-Xmx2g&nbsp;-Xms2g&nbsp;-Xmn256m&nbsp;-XX:PermSize=128m&nbsp;-Xss256k&nbsp;-XX:+DisableExplicitGC&nbsp;-XX:+UseConcMarkSweepGC&nbsp;-XX:+CMSParallelRemarkEnabled&nbsp;-XX:+UseCMSCompactAtFullCollection&nbsp;-XX:LargePageSizeInBytes=128m&nbsp;-XX:+UseFastAccessorMethods&nbsp;-XX:+UseCMSInitiatingOccupancyOnly&nbsp;-XX:CMSInitiatingOccupancyFraction=70</font> </td>
</tr>
<tr>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> <font color="black">jboss-4.0.5.GA</font> </td>
<td class='confluenceTd'>&nbsp;</td>
</tr>
<tr>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> <font color="black">httpd-2.0.61</font> </td>
<td class='confluenceTd'> <font color="black">KeepAlive&nbsp;On MaxKeepAliveRequests&nbsp;100000 KeepAliveTimeout&nbsp;180 MaxRequestsPerChild&nbsp;1000000 &lt;IfModule&nbsp;worker.c&gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StartServers&nbsp;5 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MaxClients&nbsp;1024 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MinSpareThreads&nbsp;25 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MaxSpareThreads&nbsp;75 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ThreadsPerChild&nbsp;64 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ThreadLimit&nbsp;128 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ServerLimit&nbsp;16 &lt;/IfModule&gt;</font> </td>
</tr>
</tbody></table>
</div>
<p><br class="atl-forced-newline" /></p>
<h3><a name="UserGuide-Purpose"></a>Purpose</h3>
<p><br class="atl-forced-newline" /></p>
<h4><a name="UserGuide-"></a><font color="#000000">3.1</font> <font color="#000000">期望性能指标</font><font color="#000000">(</font><font color="#000000">量化</font><font color="#000000">)</font></h4>
<p>场景名称<br/>
对应指标名称<br/>
期望值范围<br/>
实际值<br/>
是否满足期望(是/否)</p>
<div class='table-wrap'>
<table class='confluenceTable'><tbody>
<tr>
<td class='confluenceTd'> 1k数据 <br class="atl-forced-newline" /> </td>
<td class='confluenceTd'> 响应时间 <br class="atl-forced-newline" /> </td>
<td class='confluenceTd'> 0.9ms <br class="atl-forced-newline" /> </td>
<td class='confluenceTd'> 0.79ms <br class="atl-forced-newline" /> </td>
<td class='confluenceTd'><br class="atl-forced-newline" /> </td>
</tr>
<tr>
<td class='confluenceTd'> 1k数据 <br class="atl-forced-newline" /> </td>
<td class='confluenceTd'> TPS <br class="atl-forced-newline" /> </td>
<td class='confluenceTd'> 10000 <br class="atl-forced-newline" /> </td>
<td class='confluenceTd'> 11994 <br class="atl-forced-newline" /> </td>
<td class='confluenceTd'><br class="atl-forced-newline" /> </td>
</tr>
</tbody></table>
</div>
<p><br class="atl-forced-newline" /></p>
<h4><a name="UserGuide-"></a><font color="#000000">3.2</font> <font color="#000000">期望运行状况</font><font color="#000000">(</font><font color="#000000">非量化,可选</font><font color="#000000">)</font></h4>
<p>2.0性能不低于1.0,2.0和1.0互调用的性能无明显下降。 除了50k string其余皆通过<br/>
JVM内存运行稳定,无OOM,堆内存中无不合理的大对象的占用。通过<br/>
CPU、内存、网络、磁盘、文件句柄占用平稳。通过<br/>
无频繁线程锁,线程数平稳。通过<br/>
业务线程负载均衡。通过<br/>
&nbsp;</p>
<h3><a name="UserGuide-Script"></a>Script</h3>
<p>1、性能测试场景(10并发)</p>
<p>a、传入1kString,不做任何处理,原样返回</p>
<p>b、传入50kString,不做任何处理,原样返回</p>
<p>c、传入200kString,不做任何处理,原样返回</p>
<p>d、传入1k pojo(嵌套的复杂person对象),不做任何处理,原样返回</p>
<p>上述场景在dubbo1.0\dubbo2.0(hessian2序列化)\dubbo2.0(dubbo序列化)\rmi\hessian3.2.0\http(json序列化)进行10分钟的性能测试。 主要考察序列化和网络IO的性能,因此服务端无任何业务逻辑。取10并发是考虑到http协议在高并发下对CPU的使用率较高可能会先打到瓶颈。
<br class="atl-forced-newline" /></p>
<p>2、并发场景(20并发)</p>
<p>传入1kString,在服务器段循环1w次,每次重新生成一个随机数然后进行拼装。</p>
<p>考察业务线程是否能够分配到每个CPU上。
<br class="atl-forced-newline" /></p>
<p>3、稳定性场景(20并发)</p>
<p>同时调用1个参数为String(5k)方法,1个参数为person对象的方法,1个参数为map(值为3个person)的方法,持续运行50小时。
<br class="atl-forced-newline" /></p>
<p>4、高压力场景(20并发)</p>
<p>在稳定性场景的基础上,将提供者和消费者布置成均为2台(一台机器2个实例),且String的参数从20byte到200k,每隔10分钟随机变换。
<br class="atl-forced-newline" /></p>
<h3><a name="UserGuide-Result"></a>Result</h3>
<h4><a name="UserGuide-"></a><font color="#000000">5.1</font> <font color="#000000">场景名称:</font><font color="#000000">pojo</font> <font color="#000000">场景</font></h4>
<div class='table-wrap'>
<table class='confluenceTable'><tbody>
<tr>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> TPS成功平均值 <br class="atl-forced-newline" /> </td>
<td class='confluenceTd'> 响应时间成功平均值(ms) <br class="atl-forced-newline" /> </td>
</tr>
<tr>
<td class='confluenceTd'> dubbo1 <br class="atl-forced-newline" />
(hessian2序列化+mina) <br class="atl-forced-newline" /> </td>
<td class='confluenceTd'> 10813.5 <br class="atl-forced-newline" /> </td>
<td class='confluenceTd'> 0.9 <br class="atl-forced-newline" /> </td>
</tr>
<tr>
<td class='confluenceTd'> dubbo2 <br class="atl-forced-newline" />
(hessian2序列化+netty) <br class="atl-forced-newline" /> </td>
<td class='confluenceTd'> 11994 <br class="atl-forced-newline" /> </td>
<td class='confluenceTd'> 0.79 <br class="atl-forced-newline" /> </td>
</tr>
<tr>
<td class='confluenceTd'> dubbo2 <br class="atl-forced-newline" />
(dubbo序列化+netty) <br class="atl-forced-newline" /> </td>
<td class='confluenceTd'> 13620 <br class="atl-forced-newline" /> </td>
<td class='confluenceTd'> 0.67 <br class="atl-forced-newline" /> </td>
</tr>
<tr>
<td class='confluenceTd'> rmi <br class="atl-forced-newline" /> </td>
<td class='confluenceTd'> 2461.79 <br class="atl-forced-newline" /> </td>
<td class='confluenceTd'> 4 <br class="atl-forced-newline" /> </td>
</tr>
<tr>
<td class='confluenceTd'> hessian <br class="atl-forced-newline" /> </td>
<td class='confluenceTd'> 2417.7 <br class="atl-forced-newline" /> </td>
<td class='confluenceTd'> 4.1 <br class="atl-forced-newline" /> </td>
</tr>
<tr>
<td class='confluenceTd'> http(json序列化) <br class="atl-forced-newline" /> </td>
<td class='confluenceTd'> 8179.08 <br class="atl-forced-newline" /> </td>
<td class='confluenceTd'> 1.15 <br class="atl-forced-newline" /> </td>
</tr>
<tr>
<td class='confluenceTd'> 2.0和1.0默认 <br class="atl-forced-newline" />
对比百分比 <br class="atl-forced-newline" /> </td>
<td class='confluenceTd'> 10.92 <br class="atl-forced-newline" /> </td>
<td class='confluenceTd'> &#45;12.22 <br class="atl-forced-newline" /> </td>
</tr>
<tr>
<td class='confluenceTd'> dubbo序列化相比hessian2序列化百分比 <br class="atl-forced-newline" /> </td>
<td class='confluenceTd'> 13.56 <br class="atl-forced-newline" /> </td>
<td class='confluenceTd'> &#45;15.19 <br class="atl-forced-newline" /> </td>
</tr>
</tbody></table>
</div>
<p><span class="image-wrap" style=""><img src="pojotps.png-version=1&modificationDate=1317388356000.png" tppabs="http://10.20.160.198/wiki/download/attachments/6947356/pojotps.png?version=1&modificationDate=1317388356000" style="border: 0px solid black" /></span> <span class="image-wrap" style=""><img src="pojores.png-version=1&modificationDate=1317388349000.png" tppabs="http://10.20.160.198/wiki/download/attachments/6947356/pojores.png?version=1&modificationDate=1317388349000" style="border: 0px solid black" /></span></p>
<h4><a name="UserGuide-%5C"></a><font color="#000000">5.2</font> <font color="#000000">场景名称:</font><font color="#000000">1k string</font> <font color="#000000">场景</font><font color="#000000">&nbsp;</font> &#124;</h4>
<div class='table-wrap'>
<table class='confluenceTable'><tbody>
<tr>
<td class='confluenceTd'>   <br class="atl-forced-newline" /> </td>
<td class='confluenceTd'> TPS成功平均值 <br class="atl-forced-newline" /> </td>
<td class='confluenceTd'> 响应时间成功平均值(ms) <br class="atl-forced-newline" /> </td>
</tr>
<tr>
<td class='confluenceTd'> dubbo1 <br class="atl-forced-newline" />
(hessian2序列化+mina) <br class="atl-forced-newline" /> </td>
<td class='confluenceTd'> 11940 <br class="atl-forced-newline" /> </td>
<td class='confluenceTd'> 0.8 <br class="atl-forced-newline" /> </td>
</tr>
<tr>
<td class='confluenceTd'> dubbo2 <br class="atl-forced-newline" />
(hessian2序列化+netty) <br class="atl-forced-newline" /> </td>
<td class='confluenceTd'> 14402 <br class="atl-forced-newline" /> </td>
<td class='confluenceTd'> 0.64 <br class="atl-forced-newline" /> </td>
</tr>
<tr>
<td class='confluenceTd'> dubbo2 <br class="atl-forced-newline" />
(dubbo序列化+netty) <br class="atl-forced-newline" /> </td>
<td class='confluenceTd'> 15096 <br class="atl-forced-newline" /> </td>
<td class='confluenceTd'> 0.6 <br class="atl-forced-newline" /> </td>
</tr>
<tr>
<td class='confluenceTd'> rmi <br class="atl-forced-newline" /> </td>
<td class='confluenceTd'> 11136.02 <br class="atl-forced-newline" /> </td>
<td class='confluenceTd'> 0.81 <br class="atl-forced-newline" /> </td>
</tr>
<tr>
<td class='confluenceTd'> hessian <br class="atl-forced-newline" /> </td>
<td class='confluenceTd'> 11426.83 <br class="atl-forced-newline" /> </td>
<td class='confluenceTd'> 0.79 <br class="atl-forced-newline" /> </td>
</tr>
<tr>
<td class='confluenceTd'> http(json序列化) <br class="atl-forced-newline" /> </td>
<td class='confluenceTd'> 8919.27 <br class="atl-forced-newline" /> </td>
<td class='confluenceTd'> 1.04 <br class="atl-forced-newline" /> </td>
</tr>
<tr>
<td class='confluenceTd'> 2.0和1.0默认 <br class="atl-forced-newline" />
对比百分比 <br class="atl-forced-newline" /> </td>
<td class='confluenceTd'> 20.62 <br class="atl-forced-newline" /> </td>
<td class='confluenceTd'> &#45;20.00 <br class="atl-forced-newline" /> </td>
</tr>
<tr>
<td class='confluenceTd'> dubbo序列化相比hessian2序列化百分比 <br class="atl-forced-newline" /> </td>
<td class='confluenceTd'> 4.82 <br class="atl-forced-newline" /> </td>
<td class='confluenceTd'> &#45;6.25 <br class="atl-forced-newline" /> </td>
</tr>
</tbody></table>
</div>
<p><span class="image-wrap" style=""><img src="1ktps.png-version=1&modificationDate=1317388345000.png" tppabs="http://10.20.160.198/wiki/download/attachments/6947356/1ktps.png?version=1&modificationDate=1317388345000" style="border: 0px solid black" /></span> <span class="image-wrap" style=""><img src="1kres.png-version=1&modificationDate=1317388329000.png" tppabs="http://10.20.160.198/wiki/download/attachments/6947356/1kres.png?version=1&modificationDate=1317388329000" style="border: 0px solid black" /></span></p>
<h4><a name="UserGuide-%5C"></a><font color="#000000">5.3</font> <font color="#000000">场景名称:</font><font color="#000000">50k string</font><font color="#000000">场景</font><font color="#000000">&nbsp;</font> &#124;</h4>
<div class='table-wrap'>
<table class='confluenceTable'><tbody>
<tr>
<td class='confluenceTd'>   <br class="atl-forced-newline" /> </td>
<td class='confluenceTd'> TPS成功平均值 <br class="atl-forced-newline" /> </td>
<td class='confluenceTd'> 响应时间成功平均值(ms) <br class="atl-forced-newline" /> </td>
</tr>
<tr>
<td class='confluenceTd'> dubbo1 <br class="atl-forced-newline" />
(hessian2序列化+mina) <br class="atl-forced-newline" /> </td>
<td class='confluenceTd'> 1962.7 <br class="atl-forced-newline" /> </td>
<td class='confluenceTd'> 5.1 <br class="atl-forced-newline" /> </td>
</tr>
<tr>
<td class='confluenceTd'> dubbo2 <br class="atl-forced-newline" />
(hessian2序列化+netty) <br class="atl-forced-newline" /> </td>
<td class='confluenceTd'> 1293 <br class="atl-forced-newline" /> </td>
<td class='confluenceTd'> 5.03 <br class="atl-forced-newline" /> </td>
</tr>
<tr>
<td class='confluenceTd'> dubbo2 <br class="atl-forced-newline" />
(dubbo序列化+netty) <br class="atl-forced-newline" /> </td>
<td class='confluenceTd'> 1966 <br class="atl-forced-newline" /> </td>
<td class='confluenceTd'> 7.68 <br class="atl-forced-newline" /> </td>
</tr>
<tr>
<td class='confluenceTd'> rmi <br class="atl-forced-newline" /> </td>
<td class='confluenceTd'> 3349.88 <br class="atl-forced-newline" /> </td>
<td class='confluenceTd'> 2.9 <br class="atl-forced-newline" /> </td>
</tr>
<tr>
<td class='confluenceTd'> hessian <br class="atl-forced-newline" /> </td>
<td class='confluenceTd'> 1925.33 <br class="atl-forced-newline" /> </td>
<td class='confluenceTd'> 5.13 <br class="atl-forced-newline" /> </td>
</tr>
<tr>
<td class='confluenceTd'> http(json序列化) <br class="atl-forced-newline" /> </td>
<td class='confluenceTd'> 3247.1 <br class="atl-forced-newline" /> </td>
<td class='confluenceTd'> 3 <br class="atl-forced-newline" /> </td>
</tr>
<tr>
<td class='confluenceTd'> 2.0和1.0默认 <br class="atl-forced-newline" />
对比百分比 <br class="atl-forced-newline" /> </td>
<td class='confluenceTd'> &#45;34.12 <br class="atl-forced-newline" /> </td>
<td class='confluenceTd'> &#45;1.37 <br class="atl-forced-newline" /> </td>
</tr>
<tr>
<td class='confluenceTd'> dubbo序列化相比hessian2序列化百分比 <br class="atl-forced-newline" /> </td>
<td class='confluenceTd'> 52.05 <br class="atl-forced-newline" /> </td>
<td class='confluenceTd'> 52.68 <br class="atl-forced-newline" /> </td>
</tr>
</tbody></table>
</div>
<p><span class="image-wrap" style=""><img src="50ktps.png-version=1&modificationDate=1317388345000.png" tppabs="http://10.20.160.198/wiki/download/attachments/6947356/50ktps.png?version=1&modificationDate=1317388345000" style="border: 0px solid black" /></span> <span class="image-wrap" style=""><img src="50kres.png-version=1&modificationDate=1317388345000.png" tppabs="http://10.20.160.198/wiki/download/attachments/6947356/50kres.png?version=1&modificationDate=1317388345000" style="border: 0px solid black" /></span></p>
<h4><a name="UserGuide-%5C"></a><font color="#000000">5.4</font> <font color="#000000">场景名称:</font><font color="#000000">200k string</font> <font color="#000000">场景</font><font color="#000000">&nbsp;</font> &#124;</h4>
<div class='table-wrap'>
<table class='confluenceTable'><tbody>
<tr>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> TPS成功平均值 <br class="atl-forced-newline" /> </td>
<td class='confluenceTd'> 响应时间成功平均值(ms) <br class="atl-forced-newline" /> </td>
</tr>
<tr>
<td class='confluenceTd'> dubbo1 <br class="atl-forced-newline" />
(hessian2序列化+mina) <br class="atl-forced-newline" /> </td>
<td class='confluenceTd'> 324.2 <br class="atl-forced-newline" /> </td>
<td class='confluenceTd'> 30.8 <br class="atl-forced-newline" /> </td>
</tr>
<tr>
<td class='confluenceTd'> dubbo2 <br class="atl-forced-newline" />
(hessian2序列化+netty) <br class="atl-forced-newline" /> </td>
<td class='confluenceTd'> 362.92 <br class="atl-forced-newline" /> </td>
<td class='confluenceTd'> 27.49 <br class="atl-forced-newline" /> </td>
</tr>
<tr>
<td class='confluenceTd'> dubbo2 <br class="atl-forced-newline" />
(dubbo序列化+netty) <br class="atl-forced-newline" /> </td>
<td class='confluenceTd'> 569.5 <br class="atl-forced-newline" /> </td>
<td class='confluenceTd'> 17.51 <br class="atl-forced-newline" /> </td>
</tr>
<tr>
<td class='confluenceTd'> rmi <br class="atl-forced-newline" /> </td>
<td class='confluenceTd'> 1031.28 <br class="atl-forced-newline" /> </td>
<td class='confluenceTd'> 9.61 <br class="atl-forced-newline" /> </td>
</tr>
<tr>
<td class='confluenceTd'> hessian <br class="atl-forced-newline" /> </td>
<td class='confluenceTd'> 628.06 <br class="atl-forced-newline" /> </td>
<td class='confluenceTd'> 15.83 <br class="atl-forced-newline" /> </td>
</tr>
<tr>
<td class='confluenceTd'> http(json序列化) <br class="atl-forced-newline" /> </td>
<td class='confluenceTd'> 1011.97 <br class="atl-forced-newline" /> </td>
<td class='confluenceTd'> 9.79 <br class="atl-forced-newline" /> </td>
</tr>
<tr>
<td class='confluenceTd'> 2.0和1.0默认 <br class="atl-forced-newline" />
对比百分比 <br class="atl-forced-newline" /> </td>
<td class='confluenceTd'> 11.94 <br class="atl-forced-newline" /> </td>
<td class='confluenceTd'> &#45;10.75 <br class="atl-forced-newline" /> </td>
</tr>
<tr>
<td class='confluenceTd'> dubbo序列化相比hessian2序列化百分比 <br class="atl-forced-newline" /> </td>
<td class='confluenceTd'> 56.92 <br class="atl-forced-newline" /> </td>
<td class='confluenceTd'> &#45;36.30 <br class="atl-forced-newline" /> </td>
</tr>
</tbody></table>
</div>
<p><span class="image-wrap" style=""><img src="200ktps.png-version=1&modificationDate=1317388345000.png" tppabs="http://10.20.160.198/wiki/download/attachments/6947356/200ktps.png?version=1&modificationDate=1317388345000" style="border: 0px solid black" /></span> <span class="image-wrap" style=""><img src="200kres.png-version=1&modificationDate=1317388345000.png" tppabs="http://10.20.160.198/wiki/download/attachments/6947356/200kres.png?version=1&modificationDate=1317388345000" style="border: 0px solid black" /></span></p>
<h3><a name="UserGuide-Analysis"></a>Analysis</h3>
<p><br class="atl-forced-newline" /></p>
<h4><a name="UserGuide-"></a><font color="#000000">6.1</font> <font color="#000000">性能分析评估</font></h4>
<p>&nbsp; Dubbo2.0的性能测试结论为通过,从性能、内存占用和稳定性上都有了提高和改进。由其是内存管理由于将mina换成netty,大大减少了1.0版本在高并发大数据下的内存大锯齿。如下图:</p>
<h4><a name="UserGuide-"></a><font color="#000000">6.2</font> <font color="#000000">性能对比分析</font><font color="#000000">(</font><font color="#000000">新旧环境、不同数据量级等</font><font color="#000000">)</font></h4>
<p>Dubbo2.0相比较Dubbo1.0(默认使用的都是hessian2序列化)性能均有提升(除了50k String),详见第五章的性能数据。</p>
<p>出于兼容性考虑默认的序列化方式和1.0保持一致使用hessian2,如对性能有更高要求可以使用dubbo序列化,由其是在处理复杂对象时,在大数据量下能获得50%的提升(但此时已不建议使用Dubbo协议)。</p>
<p>Dubbo的设计目的是为了满足高并发小数据量的rpc调用,在大数据量下的性能表现并不好,建议使用rmi或http协议。</p>
<h4><a name="UserGuide-"></a><font color="#000000">6.3</font> <font color="#000000">测试局限性分析(可选)</font></h4>
<p><font color="#000000">本次性能测试考察的是</font><font color="#000000">dubbo</font><font color="#000000">本身的性能,实际使用过程中的性能有待应用来验证。</font></p>
<p><font color="#000000">由于</font><font color="#000000">dubbo</font><font color="#000000">本身的性能占用都在毫秒级,占的基数很小,</font>性能提升可能对应用整体的性能变化不大<font color="#000000"></font></p>
<p><font color="#000000">由于邮件篇幅所限没有列出所有的监控图,如需获得可在大力神平台上查询。</font></p>
<h2><a name="UserGuide-CodeCoverageReport"></a>Code Coverage Report</h2>
<p>(<a href="Code+Coverage+Report.htm" tppabs="http://10.20.160.198/wiki/display/dubbo/Code+Coverage+Report" title="Code Coverage Report">+</a>) (<a href="#UserGuide-CodeCoverageReport">#</a>)</p>
<p>Stats for 2012-02-03 (2.0.12)</p>
<p><span class="image-wrap" style=""><img src="code-quality1.jpg-version=1&modificationDate=1328239751000.jpg" tppabs="http://10.20.160.198/wiki/download/attachments/6947669/code-quality1.jpg?version=1&modificationDate=1328239751000" style="border: 0px solid black" /></span><br/>
<span class="image-wrap" style=""><img src="code-quality2.jpg-version=1&modificationDate=1328239559000.jpg" tppabs="http://10.20.160.198/wiki/download/attachments/6947669/code-quality2.jpg?version=1&modificationDate=1328239559000" style="border: 0px solid black" /></span><br/>
<span class="image-wrap" style=""><img src="code-coverage.jpg-version=1&modificationDate=1328239005000.jpg" tppabs="http://10.20.160.198/wiki/download/attachments/6947669/code-coverage.jpg?version=1&modificationDate=1328239005000" style="border: 0px solid black" /></span><br/>
<span class="image-wrap" style=""><img src="code-tendency.jpg-version=1&modificationDate=1328239564000.jpg" tppabs="http://10.20.160.198/wiki/download/attachments/6947669/code-tendency.jpg?version=1&modificationDate=1328239564000" style="border: 0px solid black" /></span><br/>
<span class="image-wrap" style=""><img src="code-dependency.jpg-version=1&modificationDate=1328239550000.jpg" tppabs="http://10.20.160.198/wiki/download/attachments/6947669/code-dependency.jpg?version=1&modificationDate=1328239550000" style="border: 0px solid black" /></span></p>
</div>
<!--
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
<rdf:Description
rdf:about="http://code.alibabatech.com/wiki/display/dubbo/User+Guide"
dc:identifier="http://code.alibabatech.com/wiki/display/dubbo/User+Guide"
dc:title="User Guide"
trackback:ping="http://code.alibabatech.com/wiki/rpc/trackback/6324288"/>
</rdf:RDF>
-->
<fieldset class="hidden parameters">
<legend>Labels parameters</legend>
<input type="hidden" id="domainName" value="http://code.alibabatech.com/wiki">
<input type="hidden" id="pageId" value="6324288">
<input type="hidden" id="spaceKey" value="dubbo">
</fieldset>
<div id="labels-section" class="pageSection">
<div class="labels-editor">
<span id="labels-section-title" class="label-title">
<b>Labels:</b>
</span>
<div id="labels-section-content" class="content-column">
<span id="labels-section-title-none" class="label-title none hidden ">
None
</span>
<div id="labelsList" class="label-list">
<div id="label-7307267" class="confluence-label">
<a class="label" rel="nofollow" href="javascript:if(confirm(%27http://10.20.160.198/wiki/label/dubbo/dubbo \n\nThis file was not retrieved by Teleport Ultra, because it is addressed on a domain or path outside the boundaries set for its Starting Address. \n\nDo you want to open it from the server?%27))window.location=%27http://10.20.160.198/wiki/label/dubbo/dubbo%27" tppabs="http://10.20.160.198/wiki/label/dubbo/dubbo">dubbo</a> <span class="remove-label-caption">dubbo</span>
<a class="remove-label" href="#">Delete</a>
</div>
<div id="label-7307269" class="confluence-label">
<a class="label" rel="nofollow" href="javascript:if(confirm(%27http://10.20.160.198/wiki/label/dubbo/user \n\nThis file was not retrieved by Teleport Ultra, because it is addressed on a domain or path outside the boundaries set for its Starting Address. \n\nDo you want to open it from the server?%27))window.location=%27http://10.20.160.198/wiki/label/dubbo/user%27" tppabs="http://10.20.160.198/wiki/label/dubbo/user">user</a> <span class="remove-label-caption">user</span>
<a class="remove-label" href="#">Delete</a>
</div>
<div id="label-7307270" class="confluence-label">
<a class="label" rel="nofollow" href="javascript:if(confirm(%27http://10.20.160.198/wiki/label/dubbo/guide \n\nThis file was not retrieved by Teleport Ultra, because it is addressed on a domain or path outside the boundaries set for its Starting Address. \n\nDo you want to open it from the server?%27))window.location=%27http://10.20.160.198/wiki/label/dubbo/guide%27" tppabs="http://10.20.160.198/wiki/label/dubbo/guide">guide</a> <span class="remove-label-caption">guide</span>
<a class="remove-label" href="#">Delete</a>
</div>
</div>
</div>
<span class="errorMessage error" id="errorSpan"></span>
<form method="GET" action="" id="add-labels-form">
<div id="labelInputSpan" class="labels-input">
<div id="labelOperationErrorContainer" class="hidden">
<span class="error"><span class="errorMessage" id="labelOperationErrorMessage"></span></span>
</div>
<div class="caption">Enter labels to add to this page:</div>
<div id="label-input-fields">
<input autocomplete="off" id="labelsString" name="labelsString" value="" size="40">
<input id="add-labels-editor-button" type="submit" class="add-labels" value="Add">
<input id="close-labels-editor-button" type="submit" class="hide-labels-editor" value="Done">
</div>
<div id="waitImageAndStatus">
<img class="waiting" alt="Please wait" src="wait.gif" tppabs="http://10.20.160.198/wiki/s/en/2166/34/_/images/icons/wait.gif">&nbsp;
<span id="labelOperationStatus" class="smalltext"></span>
</div>
<div id="labelsAutocompleteList" class="aui-dd-parent"></div>
<div class="labels-tip">
<div id="suggestedLabelsSpan"></div>
Looking for a label? Just start typing.
</div>
</div>
</form>
</div>
</div>
<div id="children-section" class="pageSection children-hidden">
<div class="section-header summary">
<h2 id="children-section-title" class="section-title">
<a href="User+Guide-showChildren=true.htm#children" tppabs="http://10.20.160.198/wiki/display/dubbo/User+Guide?showChildren=true#children" class="children-show-hide">
19 Child Pages
</a>
</h2>
<a href="User+Guide-showChildren=true.htm#children" tppabs="http://10.20.160.198/wiki/display/dubbo/User+Guide?showChildren=true#children" class="children-show-hide icon"></a>
<span class="noprint grey">
<a class="children-subtitle" href="javascript:if(confirm(%27http://10.20.160.198/wiki/pages/listpages-dirview.action?key=dubbo&openId=6324288 \n\nThis file was not retrieved by Teleport Ultra, because it is addressed on a domain or path outside the boundaries set for its Starting Address. \n\nDo you want to open it from the server?%27))window.location=%27http://10.20.160.198/wiki/pages/listpages-dirview.action?key=dubbo&openId=6324288#selectedPageInHierarchy%27" tppabs="http://10.20.160.198/wiki/pages/listpages-dirview.action?key=dubbo&openId=6324288#selectedPageInHierarchy">Reorder Pages</a>
</span>
</div>
<div id="page-children" class="pageSectionBody">
</div>
</div>
<fieldset class="parameters hidden">
<input type="hidden" id="deleteCommentConfirmMessage" value="Are you sure you want to remove the comment?">
<input type="hidden" id="collapseTooltip" value="Click to toggle the display of this comment.">
</fieldset>
<fieldset class="hidden parameters i18n">
<input type="hidden" title="i18n.cancel.name" value="Cancel">
</fieldset>
<div id="comments-section" class="pageSection">
<div class="section-header ">
<h2 id="comments-section-title" class="section-title">
<a href="#" class="comments-show-hide comments-showing" name="comments">
6 Comments
</a>
</h2>
<a title="comments.show.hide" href="#"
class="comments-show-hide icon comments-showing icon-section-opened">
comments.show.hide
</a>
</div>
<ol class="comment-threads top-level " id="page-comments">
<li id="comment-thread-7674007" class="comment-thread">
<div class="comment " id="comment-7674007">
<p class="comment-user-logo">
<img class="userLogo logo anonymous" src="anonymous.png" tppabs="http://10.20.160.198/wiki/s/en/2166/34/_/images/icons/profilepics/anonymous.png"
alt="User icon: Anonymous" title="Anonymous"> </p>
<p class="date" title="九月 12, 2012 18:05">
九月 12, 2012
</p>
<div class="comment-header">
<h4 class="author">Anonymous</h4>
</div>
<div class="comment-body">
<div class="comment-content wiki-content">
<p>将Dubbo放入到tomcat容器中运行的是否只要定义以下服务,则会报错,如下,但是使用App方式启动,则能健康运行,配置文件没有重复打包,不知道哪儿加载的时候出现问题,求帮忙分析</p>
<p>&lt;dubbo:service interface="com.xxx.mc.t2.token.service.ITokenService"<br/>
ref="tokenService" /&gt;</p>
<p>org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'com.xxx.mc.t2.token.service.ITokenService': Invocation of init method failed; nested exception is java.lang.IllegalStateException: Duplicate application configs: &lt;dubbo:application name="token-service" id="token-service" /&gt; and &lt;dubbo:application name="token-service" id="token-service2" /&gt;<br/>
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1338)<br/>
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:473)<br/>
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:409)<br/>
at java.security.AccessController.doPrivileged(Native Method)<br/>
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:380)<br/>
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:264)<br/>
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)<br/>
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:261)<br/>
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:185)<br/>
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:164)<br/>
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeansOfType(DefaultListableBeanFactory.java:308)<br/>
at org.springframework.context.support.AbstractApplicationContext.getBeansOfType(AbstractApplicationContext.java:947)<br/>
at org.springframework.context.support.AbstractApplicationContext.registerListeners(AbstractApplicationContext.java:701)<br/>
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:377)<br/>
at net.paoding.rose.RoseFilter.prepareRootApplicationContext(RoseFilter.java:425)<br/>
at net.paoding.rose.RoseFilter.initFilterBean(RoseFilter.java:268)<br/>
at org.springframework.web.filter.GenericFilterBean.init(GenericFilterBean.java:179)<br/>
at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:221)<br/>
at org.apache.catalina.core.ApplicationFilterConfig.setFilterDef(ApplicationFilterConfig.java:302)<br/>
at org.apache.catalina.core.ApplicationFilterConfig.&lt;init&gt;(ApplicationFilterConfig.java:78)<br/>
at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:3666)<br/>
at org.apache.catalina.core.StandardContext.start(StandardContext.java:4258)<br/>
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:760)<br/>
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:740)<br/>
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:544)<br/>
at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:980)<br/>
at org.apache.catalina.startup.HostConfig.deployDirectories(HostConfig.java:943)<br/>
at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:500)<br/>
at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1203)<br/>
at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:319)<br/>
at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:120)<br/>
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1022)<br/>
at org.apache.catalina.core.StandardHost.start(StandardHost.java:736)<br/>
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1014)<br/>
at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)<br/>
at org.apache.catalina.core.StandardService.start(StandardService.java:448)<br/>
at org.apache.catalina.core.StandardServer.start(StandardServer.java:700)<br/>
at org.apache.catalina.startup.Catalina.start(Catalina.java:552)<br/>
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)<br/>
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)<br/>
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)<br/>
at java.lang.reflect.Method.invoke(Method.java:597)<br/>
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:295)<br/>
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:433)<br/>
Caused by: java.lang.IllegalStateException: Duplicate application configs: &lt;dubbo:application name="token-service" id="token-service" /&gt; and &lt;dubbo:application name="token-service" id="token-service2" /&gt;<br/>
at com.alibaba.dubbo.config.spring.ServiceBean.afterPropertiesSet(ServiceBean.java:164)<br/>
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1369)<br/>
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1335)<br/>
... 43 more</p>
</div>
<div class="comment-actions">
<ul id="comment-actions-secondary">
<li class="first comment-permalink">
<a title="Permanent link to this comment" href="User+Guide-focusedCommentId=7674007.htm#comment-7674007" tppabs="http://10.20.160.198/wiki/display/dubbo/User+Guide?focusedCommentId=7674007#comment-7674007"
id="comment-permalink-7674007" ><span>Permalink</span></a></li>
</ul>
<ul id="comment-actions-primary">
<li class="first action-reply-comment">
<a href="javascript:if(confirm(%27http://10.20.160.198/wiki/pages/replycomment.action?commentId=7674007&pageId=6324288 \n\nThis file was not retrieved by Teleport Ultra, because it is addressed on a domain or path outside the boundaries set for its Starting Address. \n\nDo you want to open it from the server?%27))window.location=%27http://10.20.160.198/wiki/pages/replycomment.action?commentId=7674007&pageId=6324288%27" tppabs="http://10.20.160.198/wiki/pages/replycomment.action?commentId=7674007&pageId=6324288"
id="reply-comment-7674007" ><span>Reply</span></a></li>
</ul>
</div>
</div>
</div>
<!--
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
<rdf:Description
rdf:about="http://code.alibabatech.com/wiki/display/dubbo/User+Guide?focusedCommentId=7674007#comment-7674007"
dc:identifier="http://code.alibabatech.com/wiki/display/dubbo/User+Guide?focusedCommentId=7674007#comment-7674007"
dc:title="User Guide"
trackback:ping="http://code.alibabatech.com/wiki/rpc/trackback/7674007"/>
</rdf:RDF>
-->
<ol class="comment-threads">
<li id="comment-thread-7674017" class="comment-thread">
<div class="comment " id="comment-7674017">
<p class="comment-user-logo">
<img class="userLogo logo anonymous" src="anonymous.png" tppabs="http://10.20.160.198/wiki/s/en/2166/34/_/images/icons/profilepics/anonymous.png"
alt="User icon: Anonymous" title="Anonymous"> </p>
<p class="date" title="九月 13, 2012 13:08">
九月 13, 2012
</p>
<div class="comment-header">
<h4 class="author">Anonymous</h4>
</div>
<div class="comment-body">
<div class="comment-content wiki-content">
<p>好像提交的问题,发错地方了,麻烦管理员帮忙删除一下,该问题已经修复,属于上层框架的配置问题</p>
</div>
<div class="comment-actions">
<ul id="comment-actions-secondary">
<li class="first comment-permalink">
<a title="Permanent link to this comment" href="User+Guide-focusedCommentId=7674017.htm#comment-7674017" tppabs="http://10.20.160.198/wiki/display/dubbo/User+Guide?focusedCommentId=7674017#comment-7674017"
id="comment-permalink-7674017" ><span>Permalink</span></a></li>
</ul>
<ul id="comment-actions-primary">
<li class="first action-reply-comment">
<a href="javascript:if(confirm(%27http://10.20.160.198/wiki/pages/replycomment.action?commentId=7674017&pageId=6324288 \n\nThis file was not retrieved by Teleport Ultra, because it is addressed on a domain or path outside the boundaries set for its Starting Address. \n\nDo you want to open it from the server?%27))window.location=%27http://10.20.160.198/wiki/pages/replycomment.action?commentId=7674017&pageId=6324288%27" tppabs="http://10.20.160.198/wiki/pages/replycomment.action?commentId=7674017&pageId=6324288"
id="reply-comment-7674017" ><span>Reply</span></a></li>
</ul>
</div>
</div>
</div>
<!--
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
<rdf:Description
rdf:about="http://code.alibabatech.com/wiki/display/dubbo/User+Guide?focusedCommentId=7674017#comment-7674017"
dc:identifier="http://code.alibabatech.com/wiki/display/dubbo/User+Guide?focusedCommentId=7674017#comment-7674017"
dc:title="User Guide"
trackback:ping="http://code.alibabatech.com/wiki/rpc/trackback/7674017"/>
</rdf:RDF>
-->
</li>
</ol>
</li>
<li id="comment-thread-8781908" class="comment-thread">
<div class="comment " id="comment-8781908">
<p class="comment-user-logo">
<img class="userLogo logo anonymous" src="anonymous.png" tppabs="http://10.20.160.198/wiki/s/en/2166/34/_/images/icons/profilepics/anonymous.png"
alt="User icon: Anonymous" title="Anonymous"> </p>
<p class="date" title="三月 07, 2013 12:11">
三月 07, 2013
</p>
<div class="comment-header">
<h4 class="author">Anonymous</h4>
</div>
<div class="comment-body">
<div class="comment-content wiki-content">
<p>log4j:WARN No appenders could be found for logger (com.alibaba.dubbo.common.logger.LoggerFactory).<br/>
log4j:WARN Please initialize the log4j system properly.<br/>
log4j:WARN See <a href="javascript:if(confirm(%27http://logging.apache.org/log4j/1.2/faq.html \n\nThis file was not retrieved by Teleport Ultra, because it is addressed on a domain or path outside the boundaries set for its Starting Address. \n\nDo you want to open it from the server?%27))window.location=%27http://logging.apache.org/log4j/1.2/faq.html#noconfig%27" tppabs="http://logging.apache.org/log4j/1.2/faq.html#noconfig" class="external-link" rel="nofollow">http://logging.apache.org/log4j/1.2/faq.html#noconfig</a> for more info.<br/>
Exception in thread "main" java.lang.UnsupportedClassVersionError: Bad version number in .class fil</p>
<p> at java.lang.ClassLoader.defineClass1(Native Method)<br/>
at java.lang.ClassLoader.defineClass(ClassLoader.java:620)<br/>
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124)<br/>
at java.net.URLClassLoader.defineClass(URLClassLoader.java:260)<br/>
at java.net.URLClassLoader.access$100(URLClassLoader.java:56)<br/>
at java.net.URLClassLoader$1.run(URLClassLoader.java:195)<br/>
at java.security.AccessController.doPrivileged(Native Method)<br/>
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)<br/>
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)<br/>
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:268)<br/>
at java.lang.ClassLoader.loadClass(ClassLoader.java:251)<br/>
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)<br/>
at com.alibaba.dubbo.registry.zookeeper.ZookeeperRegistryFactory.createRegistry(ZookeeperRe<br/>
istryFactory.java:37)<br/>
at com.alibaba.dubbo.registry.support.AbstractRegistryFactory.getRegistry(AbstractRegistryF<br/>
ctory.java:92)<br/>
at com.alibaba.dubbo.registry.RegistryFactory$Adpative.getRegistry(RegistryFactory$Adpative<br/>
java)<br/>
at com.alibaba.dubbo.registry.integration.RegistryProtocol.getRegistry(RegistryProtocol.jav<br/>
:190)<br/>
at com.alibaba.dubbo.registry.integration.RegistryProtocol.export(RegistryProtocol.java:109</p>
<p> at com.alibaba.dubbo.rpc.protocol.ProtocolListenerWrapper.export(ProtocolListenerWrapper.ja<br/>
a:54)<br/>
at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper.export(ProtocolFilterWrapper.java:5<br/>
)<br/>
at com.alibaba.dubbo.rpc.Protocol$Adpative.export(Protocol$Adpative.java)<br/>
at com.alibaba.dubbo.config.ServiceConfig.doExportUrls(ServiceConfig.java:463)<br/>
at com.alibaba.dubbo.config.ServiceConfig.doExport(ServiceConfig.java:239)<br/>
at com.alibaba.dubbo.config.ServiceConfig.export(ServiceConfig.java:141)<br/>
at com.alibaba.dubbo.config.spring.ServiceBean.onApplicationEvent(ServiceBean.java:109)<br/>
at org.springframework.context.event.SimpleApplicationEventMulticaster$1.run(SimpleApplicat<br/>
onEventMulticaster.java:78)<br/>
at org.springframework.core.task.SyncTaskExecutor.execute(SyncTaskExecutor.java:49)<br/>
at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(Simpl<br/>
ApplicationEventMulticaster.java:76)</p>
<p>为什么用这个ZookerRegist启动Provider和Consumer的时候就会有这个错误,说JDK版本问题,但是查了几天查不出来,可以分析一下吗。 谢谢。</p>
</div>
<div class="comment-actions">
<ul id="comment-actions-secondary">
<li class="first comment-permalink">
<a title="Permanent link to this comment" href="User+Guide-focusedCommentId=8781908.htm#comment-8781908" tppabs="http://10.20.160.198/wiki/display/dubbo/User+Guide?focusedCommentId=8781908#comment-8781908"
id="comment-permalink-8781908" ><span>Permalink</span></a></li>
</ul>
<ul id="comment-actions-primary">
<li class="first action-reply-comment">
<a href="javascript:if(confirm(%27http://10.20.160.198/wiki/pages/replycomment.action?commentId=8781908&pageId=6324288 \n\nThis file was not retrieved by Teleport Ultra, because it is addressed on a domain or path outside the boundaries set for its Starting Address. \n\nDo you want to open it from the server?%27))window.location=%27http://10.20.160.198/wiki/pages/replycomment.action?commentId=8781908&pageId=6324288%27" tppabs="http://10.20.160.198/wiki/pages/replycomment.action?commentId=8781908&pageId=6324288"
id="reply-comment-8781908" ><span>Reply</span></a></li>
</ul>
</div>
</div>
</div>
<!--
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
<rdf:Description
rdf:about="http://code.alibabatech.com/wiki/display/dubbo/User+Guide?focusedCommentId=8781908#comment-8781908"
dc:identifier="http://code.alibabatech.com/wiki/display/dubbo/User+Guide?focusedCommentId=8781908#comment-8781908"
dc:title="User Guide"
trackback:ping="http://code.alibabatech.com/wiki/rpc/trackback/8781908"/>
</rdf:RDF>
-->
</li>
<li id="comment-thread-8782453" class="comment-thread">
<div class="comment " id="comment-8782453">
<p class="comment-user-logo">
<img class="userLogo logo anonymous" src="anonymous.png" tppabs="http://10.20.160.198/wiki/s/en/2166/34/_/images/icons/profilepics/anonymous.png"
alt="User icon: Anonymous" title="Anonymous"> </p>
<p class="date" title="十一月 04, 2013 17:46">
十一月 04, 2013
</p>
<div class="comment-header">
<h4 class="author">Anonymous</h4>
</div>
<div class="comment-body">
<div class="comment-content wiki-content">
<p>log4j:WARN No appenders could be found for logger (com.alibaba.dubbo.common.logger.LoggerFactory).<br/>
log4j:WARN Please initialize the log4j system properly.<br/>
log4j:WARN See <a href="javascript:if(confirm(%27http://logging.apache.org/log4j/1.2/faq.html \n\nThis file was not retrieved by Teleport Ultra, because it is addressed on a domain or path outside the boundaries set for its Starting Address. \n\nDo you want to open it from the server?%27))window.location=%27http://logging.apache.org/log4j/1.2/faq.html#noconfig%27" tppabs="http://logging.apache.org/log4j/1.2/faq.html#noconfig" class="external-link" rel="nofollow">http://logging.apache.org/log4j/1.2/faq.html#noconfig</a> for more info.</p>
<p>I using logback,but errors occur</p>
</div>
<div class="comment-actions">
<ul id="comment-actions-secondary">
<li class="first comment-permalink">
<a title="Permanent link to this comment" href="User+Guide-focusedCommentId=8782453.htm#comment-8782453" tppabs="http://10.20.160.198/wiki/display/dubbo/User+Guide?focusedCommentId=8782453#comment-8782453"
id="comment-permalink-8782453" ><span>Permalink</span></a></li>
</ul>
<ul id="comment-actions-primary">
<li class="first action-reply-comment">
<a href="javascript:if(confirm(%27http://10.20.160.198/wiki/pages/replycomment.action?commentId=8782453&pageId=6324288 \n\nThis file was not retrieved by Teleport Ultra, because it is addressed on a domain or path outside the boundaries set for its Starting Address. \n\nDo you want to open it from the server?%27))window.location=%27http://10.20.160.198/wiki/pages/replycomment.action?commentId=8782453&pageId=6324288%27" tppabs="http://10.20.160.198/wiki/pages/replycomment.action?commentId=8782453&pageId=6324288"
id="reply-comment-8782453" ><span>Reply</span></a></li>
</ul>
</div>
</div>
</div>
<!--
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
<rdf:Description
rdf:about="http://code.alibabatech.com/wiki/display/dubbo/User+Guide?focusedCommentId=8782453#comment-8782453"
dc:identifier="http://code.alibabatech.com/wiki/display/dubbo/User+Guide?focusedCommentId=8782453#comment-8782453"
dc:title="User Guide"
trackback:ping="http://code.alibabatech.com/wiki/rpc/trackback/8782453"/>
</rdf:RDF>
-->
</li>
<li id="comment-thread-9633804" class="comment-thread">
<div class="comment " id="comment-9633804">
<p class="comment-user-logo">
<img class="userLogo logo anonymous" src="anonymous.png" tppabs="http://10.20.160.198/wiki/s/en/2166/34/_/images/icons/profilepics/anonymous.png"
alt="User icon: Anonymous" title="Anonymous"> </p>
<p class="date" title="十二月 21, 2013 00:00">
十二月 21, 2013
</p>
<div class="comment-header">
<h4 class="author">Anonymous</h4>
</div>
<div class="comment-body">
<div class="comment-content wiki-content">
<p>请问下你们的性能测试工具是什么呢?文中的图表是什么工具生成的?</p>
</div>
<div class="comment-actions">
<ul id="comment-actions-secondary">
<li class="first comment-permalink">
<a title="Permanent link to this comment" href="User+Guide-focusedCommentId=9633804.htm#comment-9633804" tppabs="http://10.20.160.198/wiki/display/dubbo/User+Guide?focusedCommentId=9633804#comment-9633804"
id="comment-permalink-9633804" ><span>Permalink</span></a></li>
</ul>
<ul id="comment-actions-primary">
<li class="first action-reply-comment">
<a href="javascript:if(confirm(%27http://10.20.160.198/wiki/pages/replycomment.action?commentId=9633804&pageId=6324288 \n\nThis file was not retrieved by Teleport Ultra, because it is addressed on a domain or path outside the boundaries set for its Starting Address. \n\nDo you want to open it from the server?%27))window.location=%27http://10.20.160.198/wiki/pages/replycomment.action?commentId=9633804&pageId=6324288%27" tppabs="http://10.20.160.198/wiki/pages/replycomment.action?commentId=9633804&pageId=6324288"
id="reply-comment-9633804" ><span>Reply</span></a></li>
</ul>
</div>
</div>
</div>
<!--
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
<rdf:Description
rdf:about="http://code.alibabatech.com/wiki/display/dubbo/User+Guide?focusedCommentId=9633804#comment-9633804"
dc:identifier="http://code.alibabatech.com/wiki/display/dubbo/User+Guide?focusedCommentId=9633804#comment-9633804"
dc:title="User Guide"
trackback:ping="http://code.alibabatech.com/wiki/rpc/trackback/9633804"/>
</rdf:RDF>
-->
</li>
<li id="comment-thread-9633844" class="comment-thread">
<div class="comment " id="comment-9633844">
<p class="comment-user-logo">
<img class="userLogo logo anonymous" src="anonymous.png" tppabs="http://10.20.160.198/wiki/s/en/2166/34/_/images/icons/profilepics/anonymous.png"
alt="User icon: Anonymous" title="Anonymous"> </p>
<p class="date" title="一月 09, 2014 21:23">
一月 09, 2014
</p>
<div class="comment-header">
<h4 class="author">Anonymous</h4>
</div>
<div class="comment-body">
<div class="comment-content wiki-content">
<p>麻烦问一下,dubbo协议时,不论是用netty还是mina,client端连接provider的时候都会使用一个随机端口。因为线上环境防火墙策略严格不让随便开端口,所以想问一下,有没有可能使用固定端口?配置或者硬编码都可以</p>
</div>
<div class="comment-actions">
<ul id="comment-actions-secondary">
<li class="first comment-permalink">
<a title="Permanent link to this comment" href="User+Guide-focusedCommentId=9633844.htm#comment-9633844" tppabs="http://10.20.160.198/wiki/display/dubbo/User+Guide?focusedCommentId=9633844#comment-9633844"
id="comment-permalink-9633844" ><span>Permalink</span></a></li>
</ul>
<ul id="comment-actions-primary">
<li class="first action-reply-comment">
<a href="javascript:if(confirm(%27http://10.20.160.198/wiki/pages/replycomment.action?commentId=9633844&pageId=6324288 \n\nThis file was not retrieved by Teleport Ultra, because it is addressed on a domain or path outside the boundaries set for its Starting Address. \n\nDo you want to open it from the server?%27))window.location=%27http://10.20.160.198/wiki/pages/replycomment.action?commentId=9633844&pageId=6324288%27" tppabs="http://10.20.160.198/wiki/pages/replycomment.action?commentId=9633844&pageId=6324288"
id="reply-comment-9633844" ><span>Reply</span></a></li>
</ul>
</div>
</div>
</div>
<!--
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
<rdf:Description
rdf:about="http://code.alibabatech.com/wiki/display/dubbo/User+Guide?focusedCommentId=9633844#comment-9633844"
dc:identifier="http://code.alibabatech.com/wiki/display/dubbo/User+Guide?focusedCommentId=9633844#comment-9633844"
dc:title="User Guide"
trackback:ping="http://code.alibabatech.com/wiki/rpc/trackback/9633844"/>
</rdf:RDF>
-->
</li>
</ol>
<a id="add-comment-bottom" href="User+Guide-showComments=true&showCommentArea=true.htm#addcomment" tppabs="http://10.20.160.198/wiki/display/dubbo/User+Guide?showComments=true&showCommentArea=true#addcomment">
Add Comment
</a>
</div>
</div>
<script type="text/x-template" title="manage-watchers-dialog">
<div class="dialog-content">
<div class="column page-watchers">
<h3>Watching this page</h3>
<p class="description">These people are notified when the page is changed. You can add or remove people from this list.</p>
<form action="/wiki/json/addwatch.action" method="POST">
<input type="hidden" name="atl_token" value="c116db80711201b36e2067aa83f3b044c2d5a30e">
<input type="hidden" name="pageId" value="6324288"/>
<input type="hidden" id="add-watcher-username" name="username" value=""/>
<label for="add-watcher-user">User</label>
<input id="add-watcher-user" name="userFullName" type="search" class="autocomplete-user"
value="" placeholder="Full name or username" autocomplete="off"
data-max="10" data-target="#add-watcher-username" data-dropdown-target="#add-watcher-dropdown"
data-template="{title}" data-none-message="No matching users found.">
<input id="add-watcher-submit" type="submit" name="add" value="Add">
<div id="add-watcher-dropdown" class="aui-dd-parent autocomplete"></div>
<div class="status hidden"></div>
</form>
<ul class="user-list">
<li class="loading">Loading&hellip;</li>
<li class="no-users hidden">No page watchers</li>
</ul>
</div>
<div class="column space-watchers">
<h3>Watching this space</h3>
<p class="description">These people are notified when any content in the space is changed. You cannot modify this list.</p>
<ul class="user-list">
<li class="loading">Loading&hellip;</li>
<li class="no-users hidden">No space watchers</li>
</ul>
</div>
</div>
</script>
<script type="text/x-template" title="manage-watchers-user">
<li class="watch-user">
<img class="profile-picture confluence-userlink" src="{iconUrl}" data-username="{username}">
<a class="confluence-userlink" href="{url}" data-username="{username}">{fullName} <span class="username">({username})</span></a>
<span class="remove-watch" title="Remove"
data-username="{username}">Remove</span>
</li>
</script>
<script type="text/x-template" title="manage-watchers-help-link">
<div class="dialog-help-link">
<a href="http://docs.atlassian.com/confluence/docs-35/Managing+Watchers" target="_blank">Help</a>
</div>
</script>
<br class="clear">
</div><!-- \#main -->
<div id="footer">
<p class="license license-opensource">
Powered by a free <b>Atlassian Confluence Open Source Project License</b> granted to Alibaba Tech. <a href="javascript:if(confirm(%27http://www.atlassian.com/c/conf/11461 \n\nThis file was not retrieved by Teleport Ultra, because it is addressed on a domain or path outside the boundaries set for its Starting Address. \n\nDo you want to open it from the server?%27))window.location=%27http://www.atlassian.com/c/conf/11461%27" tppabs="http://www.atlassian.com/c/conf/11461">Evaluate Confluence today</a>.<br>
</p>
<ul id="poweredby">
<li class="noprint">Powered by <a href="javascript:if(confirm(%27http://www.atlassian.com/software/confluence \n\nThis file was not retrieved by Teleport Ultra, because it is addressed on a domain or path outside the boundaries set for its Starting Address. \n\nDo you want to open it from the server?%27))window.location=%27http://www.atlassian.com/software/confluence%27" tppabs="http://www.atlassian.com/software/confluence" class="hover-footer-link">Atlassian Confluence</a> 3.5.9, the <a href="javascript:if(confirm(%27http://www.atlassian.com/software/confluence/tour/enterprise-wiki.jsp \n\nThis file was not retrieved by Teleport Ultra, because it is addressed on a domain or path outside the boundaries set for its Starting Address. \n\nDo you want to open it from the server?%27))window.location=%27http://www.atlassian.com/software/confluence/tour/enterprise-wiki.jsp%27" tppabs="http://www.atlassian.com/software/confluence/tour/enterprise-wiki.jsp" class="hover-footer-link">Enterprise Wiki</a></li>
<li class="print-only">Printed by Atlassian Confluence 3.5.9, the Enterprise Wiki.</li>
<li class="noprint"> &nbsp; |&nbsp; <a href="javascript:if(confirm(%27http://jira.atlassian.com/secure/BrowseProject.jspa?id=10470 \n\nThis file was not retrieved by Teleport Ultra, because it is addressed on a domain or path outside the boundaries set for its Starting Address. \n\nDo you want to open it from the server?%27))window.location=%27http://jira.atlassian.com/secure/BrowseProject.jspa?id=10470%27" tppabs="http://jira.atlassian.com/secure/BrowseProject.jspa?id=10470" class="hover-footer-link">Report a bug</a></li>
<li class="noprint"> &nbsp;|&nbsp; <a href="javascript:if(confirm(%27http://www.atlassian.com/about/connected.jsp?s_kwcid=Confluence-stayintouch \n\nThis file was not retrieved by Teleport Ultra, because it is addressed on a domain or path outside the boundaries set for its Starting Address. \n\nDo you want to open it from the server?%27))window.location=%27http://www.atlassian.com/about/connected.jsp?s_kwcid=Confluence-stayintouch%27" tppabs="http://www.atlassian.com/about/connected.jsp?s_kwcid=Confluence-stayintouch" class="hover-footer-link">Atlassian News</a></li>
</ul>
友情链接:<a href="javascript:if(confirm(%27http://code.taobao.org/ \n\nThis file was not retrieved by Teleport Ultra, because it is addressed on a domain or path outside the boundaries set for its Starting Address. \n\nDo you want to open it from the server?%27))window.location=%27http://code.taobao.org/%27" tppabs="http://code.taobao.org/">Taocode</a>
<script type="text/javascript">
var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-31474478-1']);
_gaq.push(['_trackPageview']);
(function() {
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www/') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();
</script>
</div></div><!-- \#full-height-container -->
</div><!-- \#page -->
</body>
</html>