blob: 95001e97ddcd5a42ea11c24709bf7bc6359dea14 [file] [log] [blame]
<!doctype html><html lang=en class=no-js><head><meta name=ROBOTS content="INDEX, FOLLOW"><link rel=canonical href=https://cn.dubbo.apache.org/en/blog/2018/08/07/dubbo-101/><script>var _hmt=_hmt||[];(function(){var e,t=document.createElement("script");t.src="https://hm.baidu.com/hm.js?3b78f49ba47181e4d998a66b689446e9",e=document.getElementsByTagName("script")[0],e.parentNode.insertBefore(t,e)})()</script><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><meta http-equiv=Content-Security-Policy content="frame-src *"><meta name=generator content="Hugo 0.122.0"><link rel="shortcut icon" type=image/png href=/imgs/favicon.png><link rel=apple-touch-icon href=/favicons/apple-touch-icon-180x180.png sizes=180x180><link rel=manifest href=/manifest.webmanifest><title>Your First Dubbo Demo | Apache Dubbo</title><meta property="og:title" content="Your First Dubbo Demo">
<meta property="og:description" content="Modern distributed frameworks is similiar to RMI in terms of concepts. They both use Java interface as a service contract, archive service registry and discovery by a registry center, and Shield communication details by a proxy.
"><meta property="og:type" content="article"><meta property="og:url" content="https://cn.dubbo.apache.org/en/blog/2018/08/07/dubbo-101/"><meta property="article:section" content="blog"><meta property="article:published_time" content="2018-08-07T00:00:00+00:00"><meta property="article:modified_time" content="2022-12-16T10:30:28+08:00"><meta itemprop=name content="Your First Dubbo Demo"><meta itemprop=description content="Modern distributed frameworks is similiar to RMI in terms of concepts. They both use Java interface as a service contract, archive service registry and discovery by a registry center, and Shield communication details by a proxy.
"><meta itemprop=datePublished content="2018-08-07T00:00:00+00:00"><meta itemprop=dateModified content="2022-12-16T10:30:28+08:00"><meta itemprop=wordCount content="2182"><meta itemprop=keywords content><meta name=twitter:card content="summary"><meta name=twitter:title content="Your First Dubbo Demo"><meta name=twitter:description content="Modern distributed frameworks is similiar to RMI in terms of concepts. They both use Java interface as a service contract, archive service registry and discovery by a registry center, and Shield communication details by a proxy.
"><script async src="https://www.googletagmanager.com/gtag/js?id=G-NM6FFMT51J"></script><script>var doNotTrack=!1;if(!doNotTrack){window.dataLayer=window.dataLayer||[];function gtag(){dataLayer.push(arguments)}gtag("js",new Date),gtag("config","G-NM6FFMT51J",{anonymize_ip:!1})}</script><link rel=preload href=/scss/main.min.f77e221bcdbe0cadb996060fe82063c747b60c229a1f8bbf0ee529adbadd84fa.css as=style><link href=/scss/main.min.f77e221bcdbe0cadb996060fe82063c747b60c229a1f8bbf0ee529adbadd84fa.css rel=stylesheet integrity><script src=/js/jquery-3.5.1.min.js integrity="sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0=" crossorigin=anonymous></script><meta name=theme-color content="#326ce5"><link rel=stylesheet href=/css/feature-states.css><meta name=description content="Modern distributed frameworks is similiar to RMI in terms of concepts. They both use Java interface as a service contract, archive service registry and discovery by a registry center, and Shield communication details by a proxy.
"><meta property="og:description" content="Modern distributed frameworks is similiar to RMI in terms of concepts. They both use Java interface as a service contract, archive service registry and discovery by a registry center, and Shield communication details by a proxy.
"><meta name=twitter:description content="Modern distributed frameworks is similiar to RMI in terms of concepts. They both use Java interface as a service contract, archive service registry and discovery by a registry center, and Shield communication details by a proxy.
"><meta property="og:url" content="https://cn.dubbo.apache.org/en/blog/2018/08/07/dubbo-101/"><meta property="og:title" content="Your First Dubbo Demo"><meta name=twitter:title content="Your First Dubbo Demo"><meta name=twitter:image:alt content="Apache Dubbo"><meta property="og:image" content="/imgs/blog/rmi-flow.png"><meta property="og:type" content="article"><meta name=viewport content="width=device-width"><script async defer src=/js/github-buttons.js></script><link href=/css/community.css rel=stylesheet><link href=/css/contactus.css rel=stylesheet><link href=/css/language.css rel=stylesheet><script src=/js/script.js></script></head><body class="td-page td-documentation"><header><nav class="js-navbar-scroll navbar navbar-expand navbar-dark flex-column flex-md-row td-navbar" data-auto-burger=primary><a class=navbar-brand href=/en/><span class=navbar-logo></span><span class="text-uppercase font-weight-bold">Apache Dubbo</span></a><div class="td-navbar-nav-scroll ml-md-auto" id=main_navbar><ul class="navbar-nav mt-2 mt-lg-0"><li class="nav-item mr-4 mb-2 mb-lg-0"><a class=nav-link href=/en/overview/><span>Overview</span></a></li><li class="nav-item mr-4 mb-2 mb-lg-0"><a class=nav-link href=/en/docs3-v2/><span>SDK Manual</span></a></li><li class="nav-item mr-4 mb-2 mb-lg-0"><a class="nav-link active" href=/en/blog/><span class=active>Blog</span></a></li><li class="nav-item mr-4 mb-2 mb-lg-0"><a class=nav-link href=/en/download/><span>Download</span></a></li><li class="nav-item mr-4 mb-2 mb-lg-0"><a class=nav-link href=https://start.dubbo.apache.org/bootstrap.html target=_blank><span>Initializer</span><i class='fas fa-external-link-alt'></i></a></li><li class="nav-item dropdown d-lg-block"><a class="nav-link dropdown-toggle" href=# id=navbarDropdownMenuLink role=button data-toggle=dropdown aria-haspopup=true aria-expanded=false>English</a><div class="dropdown-menu dropdown-menu-right" aria-labelledby=navbarDropdownMenuLink><a class=dropdown-item href=/zh-cn/>中文</a></div></li><li class="nav-item dropdown d-lg-block"><div class="nav-item d-none d-lg-block"></div></li></ul></div></nav><section class="header-hero text-white pb-0 light-text"></section></header><div class="container-fluid td-outer"><div class=td-main><div class="row flex-md-nowrap"><div class="col-12 col-md-3 col-xl-2 td-sidebar d-print-none"><script>$(function(){$("#td-section-nav a").removeClass("active"),$("#td-section-nav #m-enblog20180807dubbo-101").addClass("active"),$("#td-section-nav #m-enblog20180807dubbo-101-li span").addClass("td-sidebar-nav-active-item"),$("#td-section-nav #m-enblog20180807dubbo-101").parents("li").addClass("active-path"),$("#td-section-nav li.active-path").addClass("show"),$("#td-section-nav li.active-path").children("input").prop("checked",!0),$("#td-section-nav #m-enblog20180807dubbo-101-li").siblings("li").addClass("show"),$("#td-section-nav #m-enblog20180807dubbo-101-li").children("ul").children("li").addClass("show"),$("#td-sidebar-menu").toggleClass("d-none")})</script><div id=td-sidebar-menu class="td-sidebar__inner d-none"><div id=content-mobile><form class="td-sidebar__search d-flex align-items-center"><button class="btn btn-link td-sidebar__toggle d-md-none p-0 ml-3 fas fa-bars" type=button data-toggle=collapse data-target=#td-section-nav aria-controls=td-docs-nav aria-expanded=false aria-label="Toggle section navigation"></button></form></div><div id=content-desktop></div><nav class="collapse td-sidebar-nav foldable-nav" id=td-section-nav><ul class="td-sidebar-nav__section pr-md-3 ul-0"><li class="td-sidebar-nav__section-title td-sidebar-nav__section with-child" id=m-enblog-li><ul class=ul-1><li class="td-sidebar-nav__section-title td-sidebar-nav__section with-child" id=m-enblognews-li><input type=checkbox id=m-enblognews-check>
<label for=m-enblognews-check><a href=/en/blog/news/ title="Articles About Apache Dubbo" class="align-left pl-0 td-sidebar-link td-sidebar-link__section" id=m-enblognews><span>Articles</span></a></label><ul class="ul-2 foldable"><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enblog20240131tracing-dubbo-with-opentelemetry-li><input type=checkbox id=m-enblog20240131tracing-dubbo-with-opentelemetry-check>
<label for=m-enblog20240131tracing-dubbo-with-opentelemetry-check><a href=/en/blog/2024/01/31/tracing-dubbo-with-opentelemetry/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enblog20240131tracing-dubbo-with-opentelemetry><span>Tracing Dubbo With OpenTelemetry</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enblog20231023introduction-to-apache-dubbo-plugin-for-intellij-idea-li><input type=checkbox id=m-enblog20231023introduction-to-apache-dubbo-plugin-for-intellij-idea-check>
<label for=m-enblog20231023introduction-to-apache-dubbo-plugin-for-intellij-idea-check><a href=/en/blog/2023/10/23/introduction-to-apache-dubbo-plugin-for-intellij-idea/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enblog20231023introduction-to-apache-dubbo-plugin-for-intellij-idea><span>Introduction to Apache Dubbo plugin for IntelliJ IDEA</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enblog20230415advanced-cloud-native-dubbo-32-officially-released-li><input type=checkbox id=m-enblog20230415advanced-cloud-native-dubbo-32-officially-released-check>
<label for=m-enblog20230415advanced-cloud-native-dubbo-32-officially-released-check><a href=/en/blog/2023/04/15/advanced-cloud-native-dubbo-3.2-officially-released/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enblog20230415advanced-cloud-native-dubbo-32-officially-released><span>Advanced cloud native - Dubbo 3.2 officially released</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enblog20220504how-to-proxy-dubbo-service-in-apache-shenyu-gateway-li><input type=checkbox id=m-enblog20220504how-to-proxy-dubbo-service-in-apache-shenyu-gateway-check>
<label for=m-enblog20220504how-to-proxy-dubbo-service-in-apache-shenyu-gateway-check><a href=/en/blog/2022/05/04/how-to-proxy-dubbo-service-in-apache-shenyu-gateway/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enblog20220504how-to-proxy-dubbo-service-in-apache-shenyu-gateway><span>How to proxy Dubbo service in Apache ShenYu Gateway</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enblog20220118makes-it-more-convenient-for-you-to-proxy-dubbo-services-in-apache-apisix-li><input type=checkbox id=m-enblog20220118makes-it-more-convenient-for-you-to-proxy-dubbo-services-in-apache-apisix-check>
<label for=m-enblog20220118makes-it-more-convenient-for-you-to-proxy-dubbo-services-in-apache-apisix-check><a href=/en/blog/2022/01/18/makes-it-more-convenient-for-you-to-proxy-dubbo-services-in-apache-apisix/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enblog20220118makes-it-more-convenient-for-you-to-proxy-dubbo-services-in-apache-apisix><span>Makes it More Convenient for You to Proxy Dubbo Services in Apache APISIX</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enblog20190826service-test-li><input type=checkbox id=m-enblog20190826service-test-check>
<label for=m-enblog20190826service-test-check><a href=/en/blog/2019/08/26/service-test/ title="Dubbo Admin service test" class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enblog20190826service-test><span>Service test in dubbo admin</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enblog20190811tracing-dubbo-service-with-apache-skywalking-li><input type=checkbox id=m-enblog20190811tracing-dubbo-service-with-apache-skywalking-check>
<label for=m-enblog20190811tracing-dubbo-service-with-apache-skywalking-check><a href=/en/blog/2019/08/11/tracing-dubbo-service-with-apache-skywalking/ title="Tracing Dubbo service with Apache Skywalking" class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enblog20190811tracing-dubbo-service-with-apache-skywalking><span>Use apache skywalking in dubbo</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enblog20190502dubbo-extensible-mechanism-source-code-analysis-part-2-li><input type=checkbox id=m-enblog20190502dubbo-extensible-mechanism-source-code-analysis-part-2-check>
<label for=m-enblog20190502dubbo-extensible-mechanism-source-code-analysis-part-2-check><a href=/en/blog/2019/05/02/dubbo-extensible-mechanism-source-code-analysis-part-2/ title="Dubbo extensible mechanism source code analysis - part 2" class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enblog20190502dubbo-extensible-mechanism-source-code-analysis-part-2><span>Dubbo extensible mechanism - part 2</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enblog20190425dubbo-extensible-mechanism-source-code-analysis-part-1-li><input type=checkbox id=m-enblog20190425dubbo-extensible-mechanism-source-code-analysis-part-1-check>
<label for=m-enblog20190425dubbo-extensible-mechanism-source-code-analysis-part-1-check><a href=/en/blog/2019/04/25/dubbo-extensible-mechanism-source-code-analysis-part-1/ title="Dubbo extensible mechanism source code analysis - part 1" class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enblog20190425dubbo-extensible-mechanism-source-code-analysis-part-1><span>Dubbo extensible mechanism - part 1</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enblog20190220implementation-background-and-practice-of-dubbo-client-asynchronous-interface-li><input type=checkbox id=m-enblog20190220implementation-background-and-practice-of-dubbo-client-asynchronous-interface-check>
<label for=m-enblog20190220implementation-background-and-practice-of-dubbo-client-asynchronous-interface-check><a href=/en/blog/2019/02/20/implementation-background-and-practice-of-dubbo-client-asynchronous-interface/ title="Implementation background and practice of Dubbo client asynchronous interface" class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enblog20190220implementation-background-and-practice-of-dubbo-client-asynchronous-interface><span>Dubbo Async Client</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enblog20190220implementation-background-and-practice-of-dubbo-server-asynchronous-interface-li><input type=checkbox id=m-enblog20190220implementation-background-and-practice-of-dubbo-server-asynchronous-interface-check>
<label for=m-enblog20190220implementation-background-and-practice-of-dubbo-server-asynchronous-interface-check><a href=/en/blog/2019/02/20/implementation-background-and-practice-of-dubbo-server-asynchronous-interface/ title="Implementation background and practice of Dubbo server asynchronous interface" class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enblog20190220implementation-background-and-practice-of-dubbo-server-asynchronous-interface><span>Dubbo Async Server</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enblog20190117how-to-use-seata-to-ensure-consistency-between-dubbo-microservices-li><input type=checkbox id=m-enblog20190117how-to-use-seata-to-ensure-consistency-between-dubbo-microservices-check>
<label for=m-enblog20190117how-to-use-seata-to-ensure-consistency-between-dubbo-microservices-check><a href=/en/blog/2019/01/17/how-to-use-seata-to-ensure-consistency-between-dubbo-microservices/ title="How to use Seata to ensure consistency between Dubbo Microservices" class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enblog20190117how-to-use-seata-to-ensure-consistency-between-dubbo-microservices><span>Use Seata in Dubbo</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enblog20181210the-fifth-dubbo-meetup-has-been-held-in-hangzhou-li><input type=checkbox id=m-enblog20181210the-fifth-dubbo-meetup-has-been-held-in-hangzhou-check>
<label for=m-enblog20181210the-fifth-dubbo-meetup-has-been-held-in-hangzhou-check><a href=/en/blog/2018/12/10/the-fifth-dubbo-meetup-has-been-held-in-hangzhou/ title="The fifth Dubbo meetup has been held in Hangzhou" class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enblog20181210the-fifth-dubbo-meetup-has-been-held-in-hangzhou><span>The fifth Dubbo meetup</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enblog20181107dubbo-integrates-with-nacos-to-become-a-registry-li><input type=checkbox id=m-enblog20181107dubbo-integrates-with-nacos-to-become-a-registry-check>
<label for=m-enblog20181107dubbo-integrates-with-nacos-to-become-a-registry-check><a href=/en/blog/2018/11/07/dubbo-integrates-with-nacos-to-become-a-registry/ title="Dubbo Integrates with Nacos to Become a Registry" class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enblog20181107dubbo-integrates-with-nacos-to-become-a-registry><span>Use Dubbo with Nacos</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enblog20181005introduction-to-the-dubbo-protocol-li><input type=checkbox id=m-enblog20181005introduction-to-the-dubbo-protocol-check>
<label for=m-enblog20181005introduction-to-the-dubbo-protocol-check><a href=/en/blog/2018/10/05/introduction-to-the-dubbo-protocol/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enblog20181005introduction-to-the-dubbo-protocol><span>Introduction to the Dubbo protocol</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enblog20180930integrate-dubbo-with-kubernetes-li><input type=checkbox id=m-enblog20180930integrate-dubbo-with-kubernetes-check>
<label for=m-enblog20180930integrate-dubbo-with-kubernetes-check><a href=/en/blog/2018/09/30/integrate-dubbo-with-kubernetes/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enblog20180930integrate-dubbo-with-kubernetes><span>Integrate Dubbo with Kubernetes</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enblog20180902how-to-prepare-an-apache-release-li><input type=checkbox id=m-enblog20180902how-to-prepare-an-apache-release-check>
<label for=m-enblog20180902how-to-prepare-an-apache-release-check><a href=/en/blog/2018/09/02/how-to-prepare-an-apache-release/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enblog20180902how-to-prepare-an-apache-release><span>How to prepare an Apache Release</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enblog20180902how-to-implement-a-fully-asynchronous-calls-chain-based-on-dubbo-li><input type=checkbox id=m-enblog20180902how-to-implement-a-fully-asynchronous-calls-chain-based-on-dubbo-check>
<label for=m-enblog20180902how-to-implement-a-fully-asynchronous-calls-chain-based-on-dubbo-check><a href=/en/blog/2018/09/02/how-to-implement-a-fully-asynchronous-calls-chain-based-on-dubbo/ title="How to implement a fully asynchronous calls chain based on Dubbo" class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enblog20180902how-to-implement-a-fully-asynchronous-calls-chain-based-on-dubbo><span>New Async Call</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enblog20180826the-fourth-dubbo-meetup-has-been-held-in-chengdu-li><input type=checkbox id=m-enblog20180826the-fourth-dubbo-meetup-has-been-held-in-chengdu-check>
<label for=m-enblog20180826the-fourth-dubbo-meetup-has-been-held-in-chengdu-check><a href=/en/blog/2018/08/26/the-fourth-dubbo-meetup-has-been-held-in-chengdu/ title="The fourth Dubbo meetup has been held in Chengdu" class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enblog20180826the-fourth-dubbo-meetup-has-been-held-in-chengdu><span>The fourth Dubbo meetup</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enblog20180814dubbo-basic-usage-dubbo-consumer-configuration-li><input type=checkbox id=m-enblog20180814dubbo-basic-usage-dubbo-consumer-configuration-check>
<label for=m-enblog20180814dubbo-basic-usage-dubbo-consumer-configuration-check><a href=/en/blog/2018/08/14/dubbo-basic-usage-dubbo-consumer-configuration/ title=" Dubbo Basic Usage - Dubbo Consumer Configuration" class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enblog20180814dubbo-basic-usage-dubbo-consumer-configuration><span>Dubbo Consumer Configuration</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enblog20180814dubbo-several-ways-about-synchronousasynchronous-invoke-li><input type=checkbox id=m-enblog20180814dubbo-several-ways-about-synchronousasynchronous-invoke-check>
<label for=m-enblog20180814dubbo-several-ways-about-synchronousasynchronous-invoke-check><a href=/en/blog/2018/08/14/dubbo-several-ways-about-synchronous/asynchronous-invoke/ title="Dubbo: Several ways about synchronous/asynchronous invoke" class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enblog20180814dubbo-several-ways-about-synchronousasynchronous-invoke><span>Dubbo Invoke</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enblog20180814dubbo-basic-usage--dubbo-provider-configuration-li><input type=checkbox id=m-enblog20180814dubbo-basic-usage--dubbo-provider-configuration-check>
<label for=m-enblog20180814dubbo-basic-usage--dubbo-provider-configuration-check><a href=/en/blog/2018/08/14/dubbo-basic-usage--dubbo-provider-configuration/ title="Dubbo Basic Usage -- Dubbo Provider Configuration" class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enblog20180814dubbo-basic-usage--dubbo-provider-configuration><span>Dubbo Provider Configuration</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enblog20180814manipulating-services-dynamically-via-qos-li><input type=checkbox id=m-enblog20180814manipulating-services-dynamically-via-qos-check>
<label for=m-enblog20180814manipulating-services-dynamically-via-qos-check><a href=/en/blog/2018/08/14/manipulating-services-dynamically-via-qos/ title="Manipulating Services Dynamically via QoS" class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enblog20180814manipulating-services-dynamically-via-qos><span>Dubbo QoS Introduction</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enblog20180814source-code-analysis-of-spring-boot-dubbo-app-start-and-stop-li><input type=checkbox id=m-enblog20180814source-code-analysis-of-spring-boot-dubbo-app-start-and-stop-check>
<label for=m-enblog20180814source-code-analysis-of-spring-boot-dubbo-app-start-and-stop-check><a href=/en/blog/2018/08/14/source-code-analysis-of-spring-boot-dubbo-app-start-and-stop/ title="Source code analysis of spring-boot+Dubbo App start and stop" class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enblog20180814source-code-analysis-of-spring-boot-dubbo-app-start-and-stop><span>Dubbo start/stop in spring boot</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enblog20180814implementation-of-cross-language-calls-by-dubbo2js-li><input type=checkbox id=m-enblog20180814implementation-of-cross-language-calls-by-dubbo2js-check>
<label for=m-enblog20180814implementation-of-cross-language-calls-by-dubbo2js-check><a href=/en/blog/2018/08/14/implementation-of-cross-language-calls-by-dubbo2.js/ title="Implementation of cross-language calls by Dubbo2.js" class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enblog20180814implementation-of-cross-language-calls-by-dubbo2js><span>dubbo2.js introduction</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enblog20180814generic-invoke-of-dubbo-li><input type=checkbox id=m-enblog20180814generic-invoke-of-dubbo-check>
<label for=m-enblog20180814generic-invoke-of-dubbo-check><a href=/en/blog/2018/08/14/generic-invoke-of-dubbo/ title="Generic invoke of Dubbo" class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enblog20180814generic-invoke-of-dubbo><span>Generic invoke</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enblog20180814native-image-using-graalvm-li><input type=checkbox id=m-enblog20180814native-image-using-graalvm-check>
<label for=m-enblog20180814native-image-using-graalvm-check><a href=/en/blog/2018/08/14/native-image-using-graalvm/ title="Native Image using GraalVM" class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enblog20180814native-image-using-graalvm><span>Native Image</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enblog20180810dubbos-load-balance-li><input type=checkbox id=m-enblog20180810dubbos-load-balance-check>
<label for=m-enblog20180810dubbos-load-balance-check><a href=/en/blog/2018/08/10/dubbos-load-balance/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enblog20180810dubbos-load-balance><span>Dubbo's Load Balance</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enblog20180807use-annotations-in-dubbo-li><input type=checkbox id=m-enblog20180807use-annotations-in-dubbo-check>
<label for=m-enblog20180807use-annotations-in-dubbo-check><a href=/en/blog/2018/08/07/use-annotations-in-dubbo/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enblog20180807use-annotations-in-dubbo><span>Use Annotations In Dubbo</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enblog20180807using-zookeeper-in-dubbo-li><input type=checkbox id=m-enblog20180807using-zookeeper-in-dubbo-check>
<label for=m-enblog20180807using-zookeeper-in-dubbo-check><a href=/en/blog/2018/08/07/using-zookeeper-in-dubbo/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enblog20180807using-zookeeper-in-dubbo><span>Using Zookeeper in Dubbo</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enblog20180807dubbo-101-li><input type=checkbox id=m-enblog20180807dubbo-101-check>
<label for=m-enblog20180807dubbo-101-check><a href=/en/blog/2018/08/07/dubbo-101/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enblog20180807dubbo-101><span>Your First Dubbo Demo</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enblog20180730the-third-dubbo-meetup-has-been-held-in-shenzhen-li><input type=checkbox id=m-enblog20180730the-third-dubbo-meetup-has-been-held-in-shenzhen-check>
<label for=m-enblog20180730the-third-dubbo-meetup-has-been-held-in-shenzhen-check><a href=/en/blog/2018/07/30/the-third-dubbo-meetup-has-been-held-in-shenzhen/ title="The third Dubbo meetup has been held in Shenzhen" class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enblog20180730the-third-dubbo-meetup-has-been-held-in-shenzhen><span>The third Dubbo meetup</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enblog20180727sentinel-the-flow-sentinel-of-dubbo-services-li><input type=checkbox id=m-enblog20180727sentinel-the-flow-sentinel-of-dubbo-services-check>
<label for=m-enblog20180727sentinel-the-flow-sentinel-of-dubbo-services-check><a href=/en/blog/2018/07/27/sentinel-the-flow-sentinel-of-dubbo-services/ title="Sentinel: The flow sentinel of Dubbo services" class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enblog20180727sentinel-the-flow-sentinel-of-dubbo-services><span>Introduce sentinel</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enblog20180712tracking-with-pinpoint-li><input type=checkbox id=m-enblog20180712tracking-with-pinpoint-check>
<label for=m-enblog20180712tracking-with-pinpoint-check><a href=/en/blog/2018/07/12/tracking-with-pinpoint/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enblog20180712tracking-with-pinpoint><span>Tracking with Pinpoint</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enblog20180701your-first-dubbo-filter-li><input type=checkbox id=m-enblog20180701your-first-dubbo-filter-check>
<label for=m-enblog20180701your-first-dubbo-filter-check><a href=/en/blog/2018/07/01/your-first-dubbo-filter/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enblog20180701your-first-dubbo-filter><span>Your First Dubbo Filter</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enblog20180623the-second-dubbo-shanghai-meetup-has-been-held-successfully-li><input type=checkbox id=m-enblog20180623the-second-dubbo-shanghai-meetup-has-been-held-successfully-check>
<label for=m-enblog20180623the-second-dubbo-shanghai-meetup-has-been-held-successfully-check><a href=/en/blog/2018/06/23/the-second-dubbo-shanghai-meetup-has-been-held-successfully/ title="The second Dubbo Shanghai meetup has been held successfully" class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enblog20180623the-second-dubbo-shanghai-meetup-has-been-held-successfully><span>The second Dubbo meetup</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enblog20180512the-first-dubbo-meetup-has-been-held-in-beijing-li><input type=checkbox id=m-enblog20180512the-first-dubbo-meetup-has-been-held-in-beijing-check>
<label for=m-enblog20180512the-first-dubbo-meetup-has-been-held-in-beijing-check><a href=/en/blog/2018/05/12/the-first-dubbo-meetup-has-been-held-in-beijing/ title="The first Dubbo meetup has been held in Beijing" class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enblog20180512the-first-dubbo-meetup-has-been-held-in-beijing><span>The first Dubbo meetup</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enblog20180502the-apachecon-na-schedule-has-been-announced-li><input type=checkbox id=m-enblog20180502the-apachecon-na-schedule-has-been-announced-check>
<label for=m-enblog20180502the-apachecon-na-schedule-has-been-announced-check><a href=/en/blog/2018/05/02/the-apachecon-na-schedule-has-been-announced/ title="The ApacheCon NA schedule has been announced" class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enblog20180502the-apachecon-na-schedule-has-been-announced><span>ApacheCon NA</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enblog20180425the-gsocgoogle-summer-of-code-2018-li><input type=checkbox id=m-enblog20180425the-gsocgoogle-summer-of-code-2018-check>
<label for=m-enblog20180425the-gsocgoogle-summer-of-code-2018-check><a href=/en/blog/2018/04/25/the-gsocgoogle-summer-of-code-2018/ title="The GSoC(Google Summer of Code) 2018" class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enblog20180425the-gsocgoogle-summer-of-code-2018><span>GSoC 2018</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enblog20180422dubbo-roadmap-is-announced-in-qcon-beijing-2018-li><input type=checkbox id=m-enblog20180422dubbo-roadmap-is-announced-in-qcon-beijing-2018-check>
<label for=m-enblog20180422dubbo-roadmap-is-announced-in-qcon-beijing-2018-check><a href=/en/blog/2018/04/22/dubbo-roadmap-is-announced-in-qcon-beijing-2018/ title="Dubbo roadmap is announced in QCon Beijing 2018" class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enblog20180422dubbo-roadmap-is-announced-in-qcon-beijing-2018><span>QCon Beijing 2018</span></a></label></li></ul></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section with-child" id=m-enblogproposals-li><input type=checkbox id=m-enblogproposals-check>
<label for=m-enblogproposals-check><a href=/en/blog/proposals/ title="Proposals About Apache Dubbo" class="align-left pl-0 td-sidebar-link td-sidebar-link__section" id=m-enblogproposals><span>Proposals</span></a></label><ul class="ul-2 foldable"><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enblog10101application-level-service-discovery-li><input type=checkbox id=m-enblog10101application-level-service-discovery-check>
<label for=m-enblog10101application-level-service-discovery-check><a href=/en/blog/1/01/01/application-level-service-discovery/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enblog10101application-level-service-discovery><span>Application-Level Service Discovery</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enblog10101enhanced-http-standard-capabilities-of-triple-protocol-li><input type=checkbox id=m-enblog10101enhanced-http-standard-capabilities-of-triple-protocol-check>
<label for=m-enblog10101enhanced-http-standard-capabilities-of-triple-protocol-check><a href=/en/blog/1/01/01/enhanced-http-standard-capabilities-of-triple-protocol/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enblog10101enhanced-http-standard-capabilities-of-triple-protocol><span>Enhanced HTTP Standard Capabilities of Triple Protocol</span></a></label></li></ul></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section with-child" id=m-enblogreleases-li><input type=checkbox id=m-enblogreleases-check>
<label for=m-enblogreleases-check><a href=/en/blog/releases/ title="New Releases" class="align-left pl-0 td-sidebar-link td-sidebar-link__section" id=m-enblogreleases><span>Releases</span></a></label><ul class="ul-2 foldable"><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enblog202109202714-release-note-li><input type=checkbox id=m-enblog202109202714-release-note-check>
<label for=m-enblog202109202714-release-note-check><a href=/en/blog/2021/09/20/2.7.14-release-note/ title="2.7.14 Release Note" class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enblog202109202714-release-note><span>2.7.14</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enblog202108233021-release-note-li><input type=checkbox id=m-enblog202108233021-release-note-check>
<label for=m-enblog202108233021-release-note-check><a href=/en/blog/2021/08/23/3.0.2.1-release-note/ title="3.0.2.1 Release Note" class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enblog202108233021-release-note><span>3.0.2.1</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enblog20210818302-release-note-li><input type=checkbox id=m-enblog20210818302-release-note-check>
<label for=m-enblog20210818302-release-note-check><a href=/en/blog/2021/08/18/3.0.2-release-note/ title="3.0.2 Release Note" class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enblog20210818302-release-note><span>3.0.2</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enblog20210702301-release-note-li><input type=checkbox id=m-enblog20210702301-release-note-check>
<label for=m-enblog20210702301-release-note-check><a href=/en/blog/2021/07/02/3.0.1-release-note/ title="3.0.1 Release Note" class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enblog20210702301-release-note><span>3.0.1</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-enblog20200518past-releases-li><input type=checkbox id=m-enblog20200518past-releases-check>
<label for=m-enblog20200518past-releases-check><a href=/en/blog/2020/05/18/past-releases/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-enblog20200518past-releases><span>Past Releases</span></a></label></li></ul></li></ul></li></ul></nav></div></div><main class="col-12 col-md-9 col-xl-8 pl-md-5" role=main><nav aria-label=breadcrumb class=td-breadcrumbs><ol class=breadcrumb><li class=breadcrumb-item><a href=https://cn.dubbo.apache.org/en/blog/>Blog</a></li><li class=breadcrumb-item><a href=https://cn.dubbo.apache.org/en/blog/news/>Articles</a></li><li class="breadcrumb-item active" aria-current=page><a href=https://cn.dubbo.apache.org/en/blog/2018/08/07/dubbo-101/ aria-disabled=true class="btn-link disabled">Your First Dubbo Demo</a></li></ol></nav><section id=deprecation-warning><div class="content deprecation-warning pageinfo outdated-blog"><p>This article is more than one year old. Older articles may contain outdated content. Check that the information in the page has not become incorrect since its publication.</p></div></section><div class=td-content><h1>Your First Dubbo Demo</h1><div class=lead>Modern distributed frameworks is similiar to RMI in terms of concepts. They both use Java interface as a service contract, archive service registry and discovery by a registry center, and Shield communication details by a proxy.</div><div class="td-byline mb-4"><time datetime=2018-08-07 class=text-muted>Tuesday, August 07, 2018</time></div><header class=article-meta></header><h2 id=java-rmi-introduction>Java RMI Introduction</h2><p>Java RMI (Remote Method Invocation) is a mechanism that allows users to access or invocate an object and a method running on another JVM (Java Virtual Machine). RMI is an implementation of RPC (Remote Procedure Call) in java with support of OOP (Object Oriented Paradigms). Instead of bothering IDL (Interface Define Language), users can build distributed applications by depending on interfaces in an easy and natural way.</p><h3 id=java-rmi-work-flow>Java RMI Work Flow</h3><p>Here is how a typical RMI invocation usually works:</p><ol><li>The server registers service from RMI and binds its address.</li><li>The client registers service from RMI and obtains target address.</li><li>The client invokes methods of local stub object in the same way of invoking other local objects.</li><li>Local stub object zips invoking information and send it to the server via network.</li><li>The Skeleton object of server receives the network request and unzips the information.</li><li>Server runs invocation on the target object based on the information and return the zipped results back to client via network.</li></ol><p><img src=/imgs/blog/rmi-flow.png alt="RMI Flow"></p><p>(source:https://www.cs.rutgers.edu/~pxk/417/notes/images/rpc-rmi_flow.png)</p><h3 id=java-rmi-concepts>Java RMI Concepts</h3><p>Java RMI is a technique foundation stone of creating distributed applications in Java. The following EJB techniques and current framework of distributed services still inherit the fundamental concepts of Java RMI. In RMI invocation, there are some core concepts:</p><ol><li>The invocation is run remotely on <strong>interface</strong>.</li><li>Disguise remote invocation as local invocation by <strong>Stub object</strong> on client and <strong>Skeleton object</strong> on server.</li><li>The service is registered and looked up by <strong>RMI</strong> registry service.</li></ol><p>For 1. users are dependent on interfaces which should be implemented by server.</p><p>For 2. In J2SE 1.5 version and before, it needs to pre-compile Stub on client and Skeleton on server by rmic. In the later versions there is no need to do so.</p><p>The following is a code example of registry and look-up in RMI.</p><h4 id=server-service-registry>Server service registry</h4><div class=highlight><pre tabindex=0 style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=display:flex><span>Hello obj <span style=color:#719e07>=</span> <span style=color:#719e07>new</span> HelloImpl(); <span style=color:#586e75>// #1</span>
</span></span><span style=display:flex><span>Hello stub <span style=color:#719e07>=</span> (Hello) UnicastRemoteObject.exportObject(obj, 0); <span style=color:#586e75>// #2</span>
</span></span><span style=display:flex><span>Registry registry <span style=color:#719e07>=</span> LocateRegistry.createRegistry(1099); <span style=color:#586e75>// #3</span>
</span></span><span style=display:flex><span>registry.rebind(<span style=color:#2aa198>&#34;Hello&#34;</span>, stub); <span style=color:#586e75>// #4</span>
</span></span></code></pre></div><p>Notes:</p><ol><li><p>Initiate service object instance.</p></li><li><p>Create stub object to communicate with the server by UnicastRemoteObject.exportObject.</p></li><li><p>Create a local RMI registry service on port 1099 which is run on server. It can also be registered as an independent process.</p></li><li><p>Bind stub object into registry so the client can find the remote object by looking up Hello.</p></li></ol><h4 id=client-service-look-up>Client service look-up</h4><div class=highlight><pre tabindex=0 style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=display:flex><span>Registry registry <span style=color:#719e07>=</span> LocateRegistry.getRegistry(); <span style=color:#586e75>// #1</span>
</span></span><span style=display:flex><span>Hello stub <span style=color:#719e07>=</span> (Hello) registry.lookup(<span style=color:#2aa198>&#34;Hello&#34;</span>); <span style=color:#586e75>// #2</span>
</span></span><span style=display:flex><span>String response <span style=color:#719e07>=</span> stub.sayHello(); <span style=color:#586e75>// #3</span>
</span></span></code></pre></div><p>Notes:</p><ol><li>Acquire registry service instances. In this case, there is no input parameters so it is assumed that the acquired instance is located on port 1099.</li><li>Look up the remote object named Hello in registry service.</li><li>Run a RMI invocation via acquired Stub object and get results.
Understand the work flow and basic concepts of RMI is helpful to handle current framework of distributed service. It is recommended to refer to RMI official documents for further information[^1].</li></ol><h2 id=basic-concepts-of-dubbo>Basic Concepts of Dubbo</h2><p>The basic concepts of current framework of distributed service is similar to the one of RMI. They both use Java interface as service contract, register and look up by registry center and use agency to block the details of remote communications. Specifically, Dubbo has following four types of roles to play when running:</p><ol><li>Serve the provider – Expose service at assigned ports at initialization and register the service address and ports at registry center</li><li>Serve the consumer – Subscribe the service of interests at registry center at initialization to acquire the list of addresses provided by the service provider.</li><li>Registry center – Register and look up service. Store the address provided by the service provider and send it to the consumer.</li><li>Monitor center – Collect and monitor running status of providers and consumers, e.g., times of invocations, delay of invocations, etc.</li><li>Running container – Initialize and load the provider and manage the lifecycle of running.</li></ol><p><img src=/imgs/blog/dubbo-architecture.png alt=dubbo-architecture></p><p><strong>Deploy stage</strong></p><ul><li>Service providers expose service at assigned ports and register information of service at registry center.</li><li>Service consumers subscribe the list of service addresses from registry center.</li></ul><p><strong>Run stage</strong></p><ul><li>Registry center sends the address to service consumers.</li><li>After receiving the list of addresses, service consumers select one of them and invoke an object service.</li><li>During invocation, the running status of service providers and consumers is reported to the monitor center.</li></ul><h2 id=dubbo-applications-based-on-api>Dubbo Applications Based on API</h2><p>The applications of Dubbo are usually assembled by Spring. To obtain an available Dubbo application quickly, the example shown here abandons complex configurations but to create service provider and consumer in Dubbo API oriented way. Additionally, the registry center and monitor center do not need installation or configuration in this example.</p><p>In production environment, the service of Dubbo usually requires cooperation with a distributed service registry center, such as ZooKeeper. For convenience, Dubbo offers two ways to avoid extra work of building registry center, namely direct connection [2] and assembled podcast [3] respectively. In this example, the latter way is applied to register and look up service.</p><h3 id=define-service-contract>Define Service Contract</h3><div class=highlight><pre tabindex=0 style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=display:flex><span><span style=color:#268bd2>public</span> <span style=color:#268bd2>interface</span> <span style=color:#268bd2>GreetingsService</span> {
</span></span><span style=display:flex><span> String <span style=color:#268bd2>sayHi</span>(String name); <span style=color:#586e75>// #1</span>
</span></span><span style=display:flex><span>}
</span></span></code></pre></div><p><strong>Notes</strong></p><ol><li>The codes define a simple service contract where there is only one function, sayHi, can be invoked. The type of input parameter and return value are both String.</li></ol><h3 id=provide-contract-implementation>Provide Contract Implementation</h3><div class=highlight><pre tabindex=0 style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=display:flex><span><span style=color:#268bd2>public</span> <span style=color:#268bd2>class</span> <span style=color:#268bd2>GreetingsServiceImpl</span> <span style=color:#268bd2>implements</span> GreetingsService { <span style=color:#586e75>// #1</span>
</span></span><span style=display:flex><span> <span style=color:#268bd2>@Override</span>
</span></span><span style=display:flex><span> <span style=color:#268bd2>public</span> String <span style=color:#268bd2>sayHi</span>(String name) {
</span></span><span style=display:flex><span> <span style=color:#719e07>return</span> <span style=color:#2aa198>&#34;hi, &#34;</span> <span style=color:#719e07>+</span> name; <span style=color:#586e75>// #2</span>
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span>}
</span></span></code></pre></div><p><strong>Notes</strong></p><ol><li>Service providers need to implement the interface of service contract, GreetingsService.</li><li>This function simply returns a welcome message. For example, if the input value is <em>dubbo</em>,it will return <em>hi, dubbo</em>.</li></ol><h3 id=implement-dubbo-service-provider>Implement Dubbo Service Provider</h3><div class=highlight><pre tabindex=0 style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=display:flex><span><span style=color:#268bd2>public</span> <span style=color:#268bd2>class</span> <span style=color:#268bd2>Application</span> {
</span></span><span style=display:flex><span> <span style=color:#268bd2>public</span> <span style=color:#268bd2>static</span> <span style=color:#dc322f>void</span> <span style=color:#268bd2>main</span>(String<span style=color:#719e07>[]</span> args) <span style=color:#268bd2>throws</span> IOException {
</span></span><span style=display:flex><span> ServiceConfig<span style=color:#719e07>&lt;</span>GreetingsService<span style=color:#719e07>&gt;</span> service <span style=color:#719e07>=</span> <span style=color:#719e07>new</span> ServiceConfig<span style=color:#719e07>&lt;&gt;</span>(); <span style=color:#586e75>// #1</span>
</span></span><span style=display:flex><span> service.setApplication(<span style=color:#719e07>new</span> ApplicationConfig(<span style=color:#2aa198>&#34;first-dubbo-provider&#34;</span>)); <span style=color:#586e75>// #2</span>
</span></span><span style=display:flex><span> service.setRegistry(<span style=color:#719e07>new</span> RegistryConfig(<span style=color:#2aa198>&#34;multicast://224.5.6.7:1234&#34;</span>)); <span style=color:#586e75>// #3</span>
</span></span><span style=display:flex><span> service.setInterface(GreetingsService.class); <span style=color:#586e75>// #4</span>
</span></span><span style=display:flex><span> service.setRef(<span style=color:#719e07>new</span> GreetingsServiceImpl()); <span style=color:#586e75>// #5</span>
</span></span><span style=display:flex><span> service.export(); <span style=color:#586e75>// #6</span>
</span></span><span style=display:flex><span> System.in.read(); <span style=color:#586e75>// #7</span>
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span>}
</span></span></code></pre></div><p><strong>Notes</strong></p><ol><li>Create an instance <em>ServiceConfig</em> with service interface type as generics parameters, which is <em>GreetingsService</em> in this example.</li><li>Generate an instance of <em>ApplicationConfig</em> and assemble it into <em>ServiceConfig</em>.</li><li>Generate an instance <em>RegistryConfig</em> and assemble it into <em>ServiceConfig</em>. Since the assembled way is applied here, the parameter should be <code>multicast://224.5.6.7:1234</code>. The valid range of assembled address is <em>224.0.0.0 - 239.255.255.255</em></li><li>Assemble the service contract <em>GreetingsService</em> into <em>ServiceConfig</em>.</li><li>Assemble the instance with implementation of <em>GreetingsServicelmpl</em> provided by service providers into <em>ServiceConfig</em>.</li><li><em>ServiceConfig</em> starts to expose itself at default ports <em>20880</em>. after being equipped with enough information.</li><li>Press any key or <em>ctrl-C</em> to exit to avoid server halt.</li></ol><h3 id=implement-dubbo-service-consumer>Implement Dubbo Service Consumer</h3><div class=highlight><pre tabindex=0 style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=display:flex><span><span style=color:#268bd2>public</span> <span style=color:#268bd2>class</span> <span style=color:#268bd2>Application</span> {
</span></span><span style=display:flex><span> <span style=color:#268bd2>public</span> <span style=color:#268bd2>static</span> <span style=color:#dc322f>void</span> <span style=color:#268bd2>main</span>(String<span style=color:#719e07>[]</span> args) {
</span></span><span style=display:flex><span> ReferenceConfig<span style=color:#719e07>&lt;</span>GreetingsService<span style=color:#719e07>&gt;</span> reference <span style=color:#719e07>=</span> <span style=color:#719e07>new</span> ReferenceConfig<span style=color:#719e07>&lt;&gt;</span>(); <span style=color:#586e75>// #1</span>
</span></span><span style=display:flex><span> reference.setApplication(<span style=color:#719e07>new</span> ApplicationConfig(<span style=color:#2aa198>&#34;first-dubbo-client&#34;</span>)); <span style=color:#586e75>// #2</span>
</span></span><span style=display:flex><span> reference.setRegistry(<span style=color:#719e07>new</span> RegistryConfig(<span style=color:#2aa198>&#34;multicast://224.5.6.7:1234&#34;</span>)); <span style=color:#586e75>// #3</span>
</span></span><span style=display:flex><span> reference.setInterface(GreetingsService.class); <span style=color:#586e75>// #4</span>
</span></span><span style=display:flex><span> GreetingsService greetingsService <span style=color:#719e07>=</span> reference.get(); <span style=color:#586e75>// #5</span>
</span></span><span style=display:flex><span> String message <span style=color:#719e07>=</span> greetingsService.sayHi(<span style=color:#2aa198>&#34;dubbo&#34;</span>); <span style=color:#586e75>// #6</span>
</span></span><span style=display:flex><span> System.out.println(message); <span style=color:#586e75>// #7</span>
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span>}
</span></span></code></pre></div><p><strong>Notes</strong></p><ol><li>Create an instance of <em>ReferenceConfig</em> with service interface type as generics parameters, which is <em>GreetingsService</em> in this example.</li><li>Create an instance of <em>ApplicationConfig</em>, and assemble it into <em>ReferenceConfig</em>.</li><li>Generate an instance <em>RegistryConfig</em>, and assemble it into <em>ReferenceConfig</em>. Note that the address information here should be the same as the one of the service provider.</li><li>Assemble the service contract <em>GreetingsService</em> into <em>ReferenceConfig</em>.</li><li>Obtain the agency of <em>GreetingsService</em> from <em>ReferenceConfig</em>.</li><li>Invoke a remote call through <em>GreetingsSerive</em>’s agency and pass in <code>dubbo</code> as input parameter.</li><li>Return and print results <code>hi, dubbo</code>.</li></ol><h3 id=run>Run</h3><p>The complete example can be found at <a href=https://github.com/apache/dubbo-samples/tree/master/1-basic/dubbo-samples-api>https://github.com/apache/dubbo-samples/tree/master/1-basic/dubbo-samples-api</a>. In the complete version, it is convenient to execute by maven in command line with the configuration of <em>exec-maven-plugin</em>. Of course, it can also be executed directly in IDE. However, there is one noteworthy thing that because of using assembled way to look up service, it needs to assign <em>-Djava.net.preferIPv4Stack=true</em> when running.</p><h4 id=build-example>Build Example</h4><p>Synchronize the example codes and build by the following command lines:</p><ol><li>Synchronize the example codes: git clone <a href=https://github.com/apache/dubbo-samples.git>https://github.com/apache/dubbo-samples.git</a></li><li>Build:mvn clean package</li></ol><div class=highlight><pre tabindex=0 style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-bash data-lang=bash><span style=display:flex><span>$ git clone https://github.com/apache/dubbo-samples.git
</span></span><span style=display:flex><span>$ <span style=color:#b58900>cd</span> dubbo-samples/java/dubbo-samples-api/
</span></span><span style=display:flex><span>$ mvn clean package
</span></span><span style=display:flex><span>INFO<span style=color:#719e07>]</span> Scanning <span style=color:#719e07>for</span> projects...
</span></span><span style=display:flex><span><span style=color:#719e07>[</span>INFO<span style=color:#719e07>]</span>
</span></span><span style=display:flex><span><span style=color:#719e07>[</span>INFO<span style=color:#719e07>]</span> ------------------------------------------------------------------------
</span></span><span style=display:flex><span><span style=color:#719e07>[</span>INFO<span style=color:#719e07>]</span> Building dubbo-samples-api 1.0-SNAPSHOT
</span></span><span style=display:flex><span><span style=color:#719e07>[</span>INFO<span style=color:#719e07>]</span> ------------------------------------------------------------------------
</span></span><span style=display:flex><span><span style=color:#719e07>[</span>INFO<span style=color:#719e07>]</span>
</span></span><span style=display:flex><span><span style=color:#719e07>[</span>INFO<span style=color:#719e07>]</span> --- maven-clean-plugin:2.5:clean <span style=color:#719e07>(</span>default-clean<span style=color:#719e07>)</span> @ dubbo-samples-api ---
</span></span><span style=display:flex><span>...
</span></span><span style=display:flex><span><span style=color:#719e07>[</span>INFO<span style=color:#719e07>]</span> ------------------------------------------------------------------------
</span></span><span style=display:flex><span><span style=color:#719e07>[</span>INFO<span style=color:#719e07>]</span> BUILD SUCCESS
</span></span><span style=display:flex><span><span style=color:#719e07>[</span>INFO<span style=color:#719e07>]</span> ------------------------------------------------------------------------
</span></span><span style=display:flex><span><span style=color:#719e07>[</span>INFO<span style=color:#719e07>]</span> Total time: 2.182 s
</span></span><span style=display:flex><span><span style=color:#719e07>[</span>INFO<span style=color:#719e07>]</span> Finished at: 2018-05-28T14:56:08+08:00
</span></span><span style=display:flex><span><span style=color:#719e07>[</span>INFO<span style=color:#719e07>]</span> Final Memory: 20M/353M
</span></span><span style=display:flex><span><span style=color:#719e07>[</span>INFO<span style=color:#719e07>]</span> ------------------------------------------------------------------------
</span></span></code></pre></div><p>The build is finished when it shows <code>BUILD SUCCESS</code>. Then comes the running stage.</p><h4 id=run-the-server>Run the server</h4><p>Run the service provider by the following maven command lines:</p><div class=highlight><pre tabindex=0 style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-bash data-lang=bash><span style=display:flex><span>$ mvn -Djava.net.preferIPv4Stack<span style=color:#719e07>=</span><span style=color:#b58900>true</span> -Dexec.mainClass<span style=color:#719e07>=</span>org.apache.dubbo.samples.provider.Application exec:java
</span></span><span style=display:flex><span><span style=color:#719e07>[</span>INFO<span style=color:#719e07>]</span> Scanning <span style=color:#719e07>for</span> projects...
</span></span><span style=display:flex><span><span style=color:#719e07>[</span>INFO<span style=color:#719e07>]</span>
</span></span><span style=display:flex><span><span style=color:#719e07>[</span>INFO<span style=color:#719e07>]</span> ------------------------------------------------------------------------
</span></span><span style=display:flex><span><span style=color:#719e07>[</span>INFO<span style=color:#719e07>]</span> Building dubbo-samples-api 1.0-SNAPSHOT
</span></span><span style=display:flex><span><span style=color:#719e07>[</span>INFO<span style=color:#719e07>]</span> ------------------------------------------------------------------------
</span></span><span style=display:flex><span><span style=color:#719e07>[</span>INFO<span style=color:#719e07>]</span>
</span></span><span style=display:flex><span><span style=color:#719e07>[</span>INFO<span style=color:#719e07>]</span> --- exec-maven-plugin:1.6.0:java <span style=color:#719e07>(</span>default-cli<span style=color:#719e07>)</span> @ dubbo-samples-api ---
</span></span><span style=display:flex><span>log4j:WARN No appenders could be found <span style=color:#719e07>for</span> logger <span style=color:#719e07>(</span>org.apache.dubbo.common.logger.LoggerFactory<span style=color:#719e07>)</span>.
</span></span><span style=display:flex><span>log4j:WARN Please initialize the log4j system properly.
</span></span><span style=display:flex><span>log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig <span style=color:#719e07>for</span> more info.
</span></span><span style=display:flex><span>first-dubbo-provider is running.
</span></span></code></pre></div><p>When <em>first-dubbo-provider is running</em> appears, the service provider is ready to be called by the client.</p><h4 id=run-the-client>Run the client</h4><p>Run the service consumer by the following maven command lines:</p><div class=highlight><pre tabindex=0 style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-bash data-lang=bash><span style=display:flex><span>$ mvn -Djava.net.preferIPv4Stack<span style=color:#719e07>=</span><span style=color:#b58900>true</span> -Dexec.mainClass<span style=color:#719e07>=</span>org.apache.dubbo.samples.consumer.Application exec:java
</span></span><span style=display:flex><span><span style=color:#719e07>[</span>INFO<span style=color:#719e07>]</span> Scanning <span style=color:#719e07>for</span> projects...
</span></span><span style=display:flex><span><span style=color:#719e07>[</span>INFO<span style=color:#719e07>]</span>
</span></span><span style=display:flex><span><span style=color:#719e07>[</span>INFO<span style=color:#719e07>]</span> ------------------------------------------------------------------------
</span></span><span style=display:flex><span><span style=color:#719e07>[</span>INFO<span style=color:#719e07>]</span> Building dubbo-samples-api 1.0-SNAPSHOT
</span></span><span style=display:flex><span><span style=color:#719e07>[</span>INFO<span style=color:#719e07>]</span> ------------------------------------------------------------------------
</span></span><span style=display:flex><span><span style=color:#719e07>[</span>INFO<span style=color:#719e07>]</span>
</span></span><span style=display:flex><span><span style=color:#719e07>[</span>INFO<span style=color:#719e07>]</span> --- exec-maven-plugin:1.6.0:java <span style=color:#719e07>(</span>default-cli<span style=color:#719e07>)</span> @ dubbo-samples-api ---
</span></span><span style=display:flex><span>log4j:WARN No appenders could be found <span style=color:#719e07>for</span> logger <span style=color:#719e07>(</span>org.apache.dubbo.common.logger.LoggerFactory<span style=color:#719e07>)</span>.
</span></span><span style=display:flex><span>log4j:WARN Please initialize the log4j system properly.
</span></span><span style=display:flex><span>log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig <span style=color:#719e07>for</span> more info.
</span></span><span style=display:flex><span>hi, dubbo
</span></span></code></pre></div><p><code>hi, dubbo</code> is the execution results from service provider.</p><h2 id=quick-creation-of-a-dubbo-application>Quick Creation of A Dubbo Application</h2><p>Dubbo also provides a public platform that can create a Dubbo application quickly based on Spring Boot. Visit <a href=http://start.dubbo.io>http://start.dubbo.io</a> and follow the figure below to create an example project:</p><p><img src=/imgs/blog/dubbo-initializr.png alt="dubbo initializr"></p><p><strong>Notes</strong></p><ol><li>Provide maven groupId in <em>Group</em> with default value <code>com.example</code>.</li><li>Provide maven artifactId in <em>Artifact</em> with default value <code>demo</code>.</li><li>Provide the name of service in <em>DubboServiceName</em> with default value <code>com.example.HelloService</code>.</li><li>Provide the version of service in <em>DubboServiceVersion</em> with default value <code>1.0.0</code>.</li><li>Choose server or client in <em>Client/Server</em> with default value <code>server</code>.</li><li><em>embeddedZookeeper</em> is selected by default as service registry look up.</li><li>qos ports activation is not selected by default but if it is, it can be accessed by port <em>22222</em>.</li><li>Click <em>Generate Project</em> to download the generated project.</li></ol><p>This example shows how to generate a server. Similarly, it can generate a <em>client</em> by selecting client on the generation interface.</p><h3 id=run-1>Run</h3><p>Open the generated project with an IDE and to see the application is a typical Spring Boot application with the following program entry:</p><div class=highlight><pre tabindex=0 style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=display:flex><span><span style=color:#268bd2>@SpringBootApplication</span>
</span></span><span style=display:flex><span><span style=color:#268bd2>public</span> <span style=color:#268bd2>class</span> <span style=color:#268bd2>DemoApplication</span> {
</span></span><span style=display:flex><span> <span style=color:#268bd2>public</span> <span style=color:#268bd2>static</span> <span style=color:#dc322f>void</span> <span style=color:#268bd2>main</span>(String<span style=color:#719e07>[]</span> args) {
</span></span><span style=display:flex><span> <span style=color:#719e07>new</span> EmbeddedZooKeeper(2181, <span style=color:#cb4b16>false</span>).start(); <span style=color:#586e75>// #1</span>
</span></span><span style=display:flex><span> SpringApplication.run(DemoApplication.class, args); <span style=color:#586e75>// #2</span>
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span>}
</span></span></code></pre></div><p><strong>Notes</strong></p><ol><li>Launch embedded <em>ZooKeeper</em> on port <em>2181</em>.</li><li>Launch the context of <em>Spring Boot</em>.</li></ol><p>Run it directly in IDE and here are the results:</p><div class=highlight><pre tabindex=0 style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-bash data-lang=bash><span style=display:flex><span>2018-05-28 16:59:38.072 INFO <span style=color:#2aa198>59943</span> --- <span style=color:#719e07>[</span> main<span style=color:#719e07>]</span> a.b.d.c.e.WelcomeLogoApplicationListener :
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> ████████▄ ███ █▄ ▀█████████▄ ▀█████████▄ ▄██████▄
</span></span><span style=display:flex><span> ███ ▀███ ███ ███ ███ ███ ███ ███ ███ ███
</span></span><span style=display:flex><span> ███ ███ ███ ███ ███ ███ ███ ███ ███ ███
</span></span><span style=display:flex><span> ███ ███ ███ ███ ▄███▄▄▄██▀ ▄███▄▄▄██▀ ███ ███
</span></span><span style=display:flex><span> ███ ███ ███ ███ ▀▀███▀▀▀██▄ ▀▀███▀▀▀██▄ ███ ███
</span></span><span style=display:flex><span> ███ ███ ███ ███ ███ ██▄ ███ ██▄ ███ ███
</span></span><span style=display:flex><span> ███ ▄███ ███ ███ ███ ███ ███ ███ ███ ███
</span></span><span style=display:flex><span> ████████▀ ████████▀ ▄█████████▀ ▄█████████▀ ▀██████▀
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> :: Dubbo Spring Boot <span style=color:#719e07>(</span>v0.1.0<span style=color:#719e07>)</span> : https://github.com/dubbo/dubbo-spring-boot-project
</span></span><span style=display:flex><span> :: Dubbo <span style=color:#719e07>(</span>v2.0.1<span style=color:#719e07>)</span> : https://github.com/alibaba/dubbo
</span></span><span style=display:flex><span> :: Google group : http://groups.google.com/group/dubbo
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span>2018-05-28 16:59:38.079 INFO <span style=color:#2aa198>59943</span> --- <span style=color:#719e07>[</span> main<span style=color:#719e07>]</span> e.OverrideDubboConfigApplicationListener : Dubbo Config was overridden by externalized configuration <span style=color:#719e07>{</span>dubbo.application.name<span style=color:#719e07>=</span>dubbo-demo-server, dubbo.application.qosAcceptForeignIp<span style=color:#719e07>=</span>false, dubbo.application.qosEnable<span style=color:#719e07>=</span>true, dubbo.application.qosPort<span style=color:#719e07>=</span>22222, dubbo.registry.address<span style=color:#719e07>=</span>zookeeper://localhost:2181?client<span style=color:#719e07>=</span>curator, dubbo.registry.id<span style=color:#719e07>=</span>my-registry, dubbo.scan.basePackages<span style=color:#719e07>=</span>com.example<span style=color:#719e07>}</span> <span style=color:#586e75>#1</span>
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span>...
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span>2018-05-28 16:59:39.624 INFO <span style=color:#2aa198>59943</span> --- <span style=color:#719e07>[</span> main<span style=color:#719e07>]</span> com.example.demo.DemoApplication : Started DemoApplication in 1.746 seconds <span style=color:#719e07>(</span>JVM running <span style=color:#719e07>for</span> 2.963<span style=color:#719e07>)</span>
</span></span></code></pre></div><p><strong>Notes</strong></p><ol><li>In the printouts, the configuration starting with <code>dubbo.</code> Is defined in <em>main/resources/application.properties</em>.</li></ol><h3 id=manage-service-by-telnet>Manage service by Telnet</h3><p>If <em>qos</em> is activated during generation, the service can be watched and managed by <em>telnet</em> or <em>nc</em>.</p><div class=highlight><pre tabindex=0 style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-bash data-lang=bash><span style=display:flex><span>$ telnet localhost <span style=color:#2aa198>22222</span>
</span></span><span style=display:flex><span>Trying 127.0.0.1...
</span></span><span style=display:flex><span>Connected to localhost.
</span></span><span style=display:flex><span>Escape character is <span style=color:#2aa198>&#39;^]&#39;</span>.
</span></span><span style=display:flex><span> ████████▄ ███ █▄ ▀█████████▄ ▀█████████▄ ▄██████▄
</span></span><span style=display:flex><span> ███ ▀███ ███ ███ ███ ███ ███ ███ ███ ███
</span></span><span style=display:flex><span> ███ ███ ███ ███ ███ ███ ███ ███ ███ ███
</span></span><span style=display:flex><span> ███ ███ ███ ███ ▄███▄▄▄██▀ ▄███▄▄▄██▀ ███ ███
</span></span><span style=display:flex><span> ███ ███ ███ ███ ▀▀███▀▀▀██▄ ▀▀███▀▀▀██▄ ███ ███
</span></span><span style=display:flex><span> ███ ███ ███ ███ ███ ██▄ ███ ██▄ ███ ███
</span></span><span style=display:flex><span> ███ ▄███ ███ ███ ███ ███ ███ ███ ███ ███
</span></span><span style=display:flex><span> ████████▀ ████████▀ ▄█████████▀ ▄█████████▀ ▀██████▀
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span>dubbo&gt;
</span></span><span style=display:flex><span>dubbo&gt;ls
</span></span><span style=display:flex><span>As Provider side:
</span></span><span style=display:flex><span>+------------------------------+---+
</span></span><span style=display:flex><span>| Provider Service Name |PUB|
</span></span><span style=display:flex><span>+------------------------------+---+
</span></span><span style=display:flex><span>|com.example.HelloService:1.0.0| Y |
</span></span><span style=display:flex><span>+------------------------------+---+
</span></span><span style=display:flex><span>As Consumer side:
</span></span><span style=display:flex><span>+---------------------+---+
</span></span><span style=display:flex><span>|Consumer Service Name|NUM|
</span></span><span style=display:flex><span>+---------------------+---+
</span></span></code></pre></div><p>Currently, <em>qos</em> supports following command lines. For more information please refer to the official document. [^4]:</p><ul><li><em>ls</em>:List the information of client and server.</li><li><em>online</em>:Bring the service online.</li><li><em>offline</em>:Bring the service offline.</li><li><em>help</em>:View online help.</li></ul><h2 id=summary>Summary</h2><p>In this tutorial, we start with RMI and introduce the basic concepts in Java distributed invocations. Based on interface programming, it disguises remote calls as local by agency and run the service registry and looking up by registry center.</p><p>Then for simplicity, we introduce how to develop a complete Dubbo demo in an easy way of assembled registry and direct Dubbo API oriented programming. Additionally, we look into the usage of <em>ServiceConfig</em> and <em>RefenceConfig</em>, which is of great help for further using Spring XML configuration and the programming pattern of Spring Boot.</p><p>Eventually, we give an outline of how to create a Dubbo application quickly based on Spring Boot using the public resources, start.dubbo.io, provided by the Dubbo development team and operate and maintain the Dubbo service by <em>qos</em>.</p><hr><ol><li><a href=https://docs.oracle.com/javase/6/docs/technotes/guides/rmi/hello/hello-world.html>Getting Started Using JavaTM RMI</a></li><li><a href=/en/docs/v2.7/user/examples/explicit-target/>Explicit target</a></li><li><a href=/en/docs/v2.7/user/references/registry/multicast/>Multicast Registry</a></li><li><a href=/en/docs/v2.7/user/references/qos/>Online QOS command</a></li></ol><ul class="list-unstyled d-flex justify-content-between align-items-center mb-0 pt-5"><li><a href=/en/blog/2018/07/30/the-third-dubbo-meetup-has-been-held-in-shenzhen/ aria-label="Previous - The third Dubbo meetup has been held in Shenzhen" class="btn btn-primary"><span class=mr-1></span>Previous</a></li><li><a href=/en/blog/2018/08/07/using-zookeeper-in-dubbo/ aria-label="Next - Using Zookeeper in Dubbo" class="btn btn-primary">Next<span class=ml-1></span></a></li></ul></div><div id=pre-footer><h2>Feedback</h2><p class=feedback--prompt>Was this page helpful?</p><button class="btn btn-primary mb-4 feedback--yes">Yes</button>
<button class="btn btn-primary mb-4 feedback--no">No</button></div><script>const yes=document.querySelector(".feedback--yes"),no=document.querySelector(".feedback--no");document.querySelectorAll(".feedback--link").forEach(e=>{e.href=e.href+window.location.pathname});const sendFeedback=e=>{gtag||console.log("!gtag"),gtag("event","click",{event_category:"Helpful",event_label:window.location.pathname,value:e})},disableButtons=()=>{yes.disabled=!0,yes.classList.add("feedback--button__disabled"),no.disabled=!0,no.classList.add("feedback--button__disabled")};yes.addEventListener("click",()=>{sendFeedback(1),disableButtons(),document.querySelector(".feedback--response").classList.remove("feedback--response__hidden")}),no.addEventListener("click",()=>{sendFeedback(0),disableButtons(),document.querySelector(".feedback--response").classList.remove("feedback--response__hidden")})</script></main><div class="d-none d-xl-block col-xl-2 td-toc d-print-none"><div class="td-page-meta ml-2 pb-1 pt-2 mb-0"><a href=https://github.com/apache/dubbo-website/edit/master/content/en/blog/news/dubbo-101.md target=_blank><i class="fa fa-edit fa-fw"></i> Edit this page</a>
<a href="https://github.com/apache/dubbo-website/new/master/content/en/blog/news/dubbo-101.md?filename=change-me.md&amp;value=---%0Atitle%3A+%22Long+Page+Title%22%0AlinkTitle%3A+%22Short+Nav+Title%22%0Aweight%3A+100%0Adescription%3A+%3E-%0A+++++Page+description+for+heading+and+indexes.%0A---%0A%0A%23%23+Heading%0A%0AEdit+this+template+to+create+your+new+page.%0A%0A%2A+Give+it+a+good+name%2C+ending+in+%60.md%60+-+e.g.+%60getting-started.md%60%0A%2A+Edit+the+%22front+matter%22+section+at+the+top+of+the+page+%28weight+controls+how+its+ordered+amongst+other+pages+in+the+same+directory%3B+lowest+number+first%29.%0A%2A+Add+a+good+commit+message+at+the+bottom+of+the+page+%28%3C80+characters%3B+use+the+extended+description+field+for+more+detail%29.%0A%2A+Create+a+new+branch+so+you+can+preview+your+new+file+and+request+a+review+via+Pull+Request.%0A" target=_blank><i class="fa fa-edit fa-fw"></i> Create child page</a>
<a href="https://github.com/apache/dubbo-website/issues/new?title=Your%20First%20Dubbo%20Demo" target=_blank><i class="fab fa-github fa-fw"></i> Create an issue</a>
<a href=https://github.com/apache/dubbo/issues/new target=_blank><i class="fas fa-tasks fa-fw"></i> Create project issue</a></div><nav id=TableOfContents><ul><li><a href=#java-rmi-introduction>Java RMI Introduction</a><ul><li><a href=#java-rmi-work-flow>Java RMI Work Flow</a></li><li><a href=#java-rmi-concepts>Java RMI Concepts</a></li></ul></li><li><a href=#basic-concepts-of-dubbo>Basic Concepts of Dubbo</a></li><li><a href=#dubbo-applications-based-on-api>Dubbo Applications Based on API</a><ul><li><a href=#define-service-contract>Define Service Contract</a></li><li><a href=#provide-contract-implementation>Provide Contract Implementation</a></li><li><a href=#implement-dubbo-service-provider>Implement Dubbo Service Provider</a></li><li><a href=#implement-dubbo-service-consumer>Implement Dubbo Service Consumer</a></li><li><a href=#run>Run</a></li></ul></li><li><a href=#quick-creation-of-a-dubbo-application>Quick Creation of A Dubbo Application</a><ul><li><a href=#run-1>Run</a></li><li><a href=#manage-service-by-telnet>Manage service by Telnet</a></li></ul></li><li><a href=#summary>Summary</a></li></ul></nav><div class="taxonomy taxonomy-terms-cloud taxo-tags"><h5 class=taxonomy-title>Tags</h5><ul class=taxonomy-terms><li><a class=taxonomy-term href=https://cn.dubbo.apache.org/en/tags/ecosystem/ data-taxonomy-term=ecosystem><span class=taxonomy-label>ecosystem</span><span class=taxonomy-count>1</span></a></li><li><a class=taxonomy-term href=https://cn.dubbo.apache.org/en/tags/news/ data-taxonomy-term=news><span class=taxonomy-label>news</span><span class=taxonomy-count>1</span></a></li><li><a class=taxonomy-term href=https://cn.dubbo.apache.org/en/tags/opentelemetry/ data-taxonomy-term=opentelemetry><span class=taxonomy-label>OpenTelemetry</span><span class=taxonomy-count>1</span></a></li><li><a class=taxonomy-term href=https://cn.dubbo.apache.org/en/tags/tracing/ data-taxonomy-term=tracing><span class=taxonomy-label>tracing</span><span class=taxonomy-count>1</span></a></li></ul></div></div></div></div></div><footer class="bg-dark py-5 row d-print-none footer-margin-0"><div class="container-fluid mx-sm-5"><div class=row><div class="col-6 col-sm-4 text-xs-center order-sm-2"><ul class="list-inline mb-0"><li class="list-inline-item mx-2 h3" data-toggle=tooltip data-placement=top title="Dubbo mailing list archive" aria-label="Dubbo mailing list archive"><a class=text-white target=_blank rel="noopener noreferrer" href=https://lists.apache.org/list.html?dev@dubbo.apache.org><i class="fa fa-envelope"></i></a></li></ul></div><div class="col-6 col-sm-4 text-right text-xs-center order-sm-3"><ul class="list-inline mb-0"><li class="list-inline-item mx-2 h3" data-toggle=tooltip data-placement=top title=GitHub aria-label=GitHub><a class=text-white target=_blank rel="noopener noreferrer" href=https://github.com/apache/dubbo><i class="fab fa-github"></i></a></li><li class="list-inline-item mx-2 h3" data-toggle=tooltip data-placement=top title="Subscribe to mailing list" aria-label="Subscribe to mailing list"><a class=text-white target=_blank rel="noopener noreferrer" href=mailto:dev-subscribe@dubbo.apache.org><i class="fa fa-envelope"></i></a></li></ul></div><div class="col-12 col-sm-4 text-center py-2 order-sm-2"><small class=text-white>&copy; 2024 The Apache Software Foundation. Apache and the Apache feather logo are trademarks of The Apache Software Foundation. All Rights Reserved</small></div></div></div></footer><div class="row pt-2 pb-2 footer-margin-0"><div class="container-fluid mx-sm-5"><div class=text-center id=my-footer><img alt=apache_logo src=/imgs/apache_logo.png><ul><li><a href=https://www.apache.org>Foundation</a></li><li><a href=https://www.apache.org/licenses/>License</a></li><li><a href=https://dubbo.apache.org/en/overview/notices/>Security</a></li><li><a href=https://www.apache.org/events/current-event>Events</a></li><li><a href=https://www.apache.org/foundation/sponsorship.html>Sponsorship</a></li><li><a href=https://privacy.apache.org/policies/privacy-policy-public.html>Privacy</a></li><li><a href=https://www.apache.org/foundation/thanks.html>Thanks</a></li></ul></div></div></div><script src=/js/popper.min.js integrity=sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49 crossorigin=anonymous></script><script src=/js/bootstrap.min.js integrity=sha384-ChfqqxuZUCnJSK3+MXmPNIyE6ZbWh2IMqE241rYiqJxyMiZ6OW/JmZQ5stwEULTy crossorigin=anonymous></script><script src=/js/main.min.b075178d232d3b0039b3cb6af2fc2e9d90071820167a60f4eea3a79169975ee8.js integrity="sha256-sHUXjSMtOwA5s8tq8vwunZAHGCAWemD07qOnkWmXXug=" crossorigin=anonymous></script><script async src=https://widget.kapa.ai/kapa-widget.bundle.js data-website-id=d763c4f2-f871-400b-aeca-d986c4af73c2 data-project-name="Apache Dubbo" data-project-color=#E8442E data-button-text="Ask AI" data-search-mode-enabled=true data-modal-open-on-command-k=true data-modal-disclaimer="The AI supports multiple languages, but it may not be accessible in China due to recaptcha, a proxy is required." data-project-logo=https://pbs.twimg.com/profile_images/1011849068283191302/FJbH5vbF_400x400.jpg data-modal-example-questions="What is Apache Dubbo?,How to run Apache Dubbo?" data-button-position-top data-button-position-right=20px data-button-position-bottom=200px data-button-position-left></script><script>(function(e,t,n,s){e[s]=e[s]||[];var a=t.getElementsByTagName(n)[0],i=t.createElement(n);i.async=!0,i.id="beacon-aplus",i.setAttribute("exparams","userid=&aplus&sidx=aplusSidex&ckx=aplusCkx"),i.src="//g.alicdn.com/alilog/mlog/aplus_v2.js",i.crossorigin="anonymous",a.parentNode.insertBefore(i,a)})(window,document,"script","aplus_queue"),function(e){var t=e.createElement("script");t.type="text/javascript",t.async=!0,t.src="//g.alicdn.com/aes/??tracker/3.3.4/index.js,tracker-plugin-pv/3.0.5/index.js,tracker-plugin-event/3.0.0/index.js,tracker-plugin-autolog/3.0.3/index.js,tracker-plugin-survey/3.0.3/index.js,tracker-plugin-jserror/3.0.3/index.js,tracker-plugin-resourceError/3.0.3/index.js",t.onload=function(){window.AES_CONFIG=window.AES_CONFIG||{env:"prod"},window.aes=new AES({pid:"zN245h",user_type:6}),window.AESPluginAutologConfig={exposure:"auto"},window.AEMPluginInstances=[aes.use(AESPluginPV,window.AESPluginPVConfig||{enableHistory:!0}),aes.use(AESPluginEvent,window.AESPluginEventConfig||{}),aes.use(AESPluginSurvey,window.AESPluginEventConfig||{}),aes.use(AESPluginAutolog,window.AESPluginAutologConfig||{}),aes.use(AESPluginJSError,window.AESPluginJSError||{}),aes.use(AESPluginResourceError,window.AESPluginResourceError||{})]},setTimeout(function(){e.getElementsByTagName("body")[0].appendChild(t)},800)}(document)</script></body></html>