You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dubbo.apache.org by hu...@apache.org on 2018/07/15 13:31:46 UTC
[incubator-dubbo-website] branch asf-site updated (8f31bb1 ->
ad3cf35)
This is an automated email from the ASF dual-hosted git repository.
huxing pushed a change to branch asf-site
in repository https://gitbox.apache.org/repos/asf/incubator-dubbo-website.git.
from 8f31bb1 Post pinpoint to blog (#47)
new 6b30a0c Polish quick start English guide.
new ad3cf35 Docsite build.
The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
Summary of changes:
build/4d064980eca0b316837d.js | 6 -
...3226daea7d0ed5a5.js => 9f45e1982c8f486600e8.js} | 4 +-
build/b8d937a84db658d5df7b.js | 6 +
...64fc4da0611e9cdc.js => bb38166074ece67dec52.js} | 4 +-
build/page.js | 2 +-
docs/en-us/user/quick-start.md | 232 ++++++++++++++++-----
md_json/docs.json | 2 +-
7 files changed, 188 insertions(+), 68 deletions(-)
delete mode 100644 build/4d064980eca0b316837d.js
rename build/{00e53226daea7d0ed5a5.js => 9f45e1982c8f486600e8.js} (87%)
create mode 100644 build/b8d937a84db658d5df7b.js
rename build/{dc0e64fc4da0611e9cdc.js => bb38166074ece67dec52.js} (70%)
[incubator-dubbo-website] 02/02: Docsite build.
Posted by hu...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
huxing pushed a commit to branch asf-site
in repository https://gitbox.apache.org/repos/asf/incubator-dubbo-website.git
commit ad3cf35da452a22dd4e1c51d8b09d78438dd6f77
Author: Huxing Zhang <hu...@gmail.com>
AuthorDate: Sun Jul 15 21:31:03 2018 +0800
Docsite build.
---
build/4d064980eca0b316837d.js | 6 ------
build/{00e53226daea7d0ed5a5.js => 9f45e1982c8f486600e8.js} | 4 ++--
build/b8d937a84db658d5df7b.js | 6 ++++++
build/{dc0e64fc4da0611e9cdc.js => bb38166074ece67dec52.js} | 4 ++--
build/page.js | 2 +-
5 files changed, 11 insertions(+), 11 deletions(-)
diff --git a/build/4d064980eca0b316837d.js b/build/4d064980eca0b316837d.js
deleted file mode 100644
index 5f66fd5..0000000
--- a/build/4d064980eca0b316837d.js
+++ /dev/null
@@ -1,6 +0,0 @@
-webpackJsonp([1],[,,,,,,,function(n,e,t){"use strict";function a(n){return n&&n.__esModule?n:{default:n}}function s(n,e){if(!(n instanceof e))throw new TypeError("Cannot call a class as a function")}function o(n,e){if(!n)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?n:e}function r(n,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+t [...]
- Copyright (c) 2016 Jed Watson.
- Licensed under the MIT License (MIT), see
- http://jedwatson.github.io/classnames
-*/
-!function(){"use strict";function t(){for(var n=[],e=0;e<arguments.length;e++){var a=arguments[e];if(a){var s=typeof a;if("string"===s||"number"===s)n.push(a);else if(Array.isArray(a))n.push(t.apply(null,a));else if("object"===s)for(var r in a)o.call(a,r)&&a[r]&&n.push(r)}}return n.join(" ")}var o={}.hasOwnProperty;void 0!==n&&n.exports?n.exports=t:(a=[],void 0!==(s=function(){return t}.apply(e,a))&&(n.exports=s))}()},function(n,e,t){"use strict";function a(n,e,a){var s=a.configurable,l= [...]
\ No newline at end of file
diff --git a/build/00e53226daea7d0ed5a5.js b/build/9f45e1982c8f486600e8.js
similarity index 87%
rename from build/00e53226daea7d0ed5a5.js
rename to build/9f45e1982c8f486600e8.js
index f027c38..6741857 100644
--- a/build/00e53226daea7d0ed5a5.js
+++ b/build/9f45e1982c8f486600e8.js
@@ -1,6 +1,6 @@
-webpackJsonp([0],[,,,,,,,,,function(s,n,a){"use strict";function e(s){return s&&s.__esModule?s:{default:s}}function t(s,n){if(!(s instanceof n))throw new TypeError("Cannot call a class as a function")}function l(s,n){if(!s)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!n||"object"!=typeof n&&"function"!=typeof n?s:n}function o(s,n){if("function"!=typeof n&&null!==n)throw new TypeError("Super expression must either be null or a function, not " [...]
+webpackJsonp([0],[,,,,,,,,,function(s,n,a){"use strict";function e(s){return s&&s.__esModule?s:{default:s}}function t(s,n){if(!(s instanceof n))throw new TypeError("Cannot call a class as a function")}function l(s,n){if(!s)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!n||"object"!=typeof n&&"function"!=typeof n?s:n}function o(s,n){if("function"!=typeof n&&null!==n)throw new TypeError("Super expression must either be null or a function, not " [...]
Copyright (c) 2016 Jed Watson.
Licensed under the MIT License (MIT), see
http://jedwatson.github.io/classnames
*/
-!function(){"use strict";function a(){for(var s=[],n=0;n<arguments.length;n++){var e=arguments[n];if(e){var t=typeof e;if("string"===t||"number"===t)s.push(e);else if(Array.isArray(e))s.push(a.apply(null,e));else if("object"===t)for(var o in e)l.call(e,o)&&e[o]&&s.push(o)}}return s.join(" ")}var l={}.hasOwnProperty;void 0!==s&&s.exports?s.exports=a:(e=[],void 0!==(t=function(){return a}.apply(n,e))&&(s.exports=t))}()},function(s,n,a){"use strict";function e(s,n,e){var t=e.configurable,r= [...]
\ No newline at end of file
+!function(){"use strict";function a(){for(var s=[],n=0;n<arguments.length;n++){var e=arguments[n];if(e){var t=typeof e;if("string"===t||"number"===t)s.push(e);else if(Array.isArray(e))s.push(a.apply(null,e));else if("object"===t)for(var o in e)l.call(e,o)&&e[o]&&s.push(o)}}return s.join(" ")}var l={}.hasOwnProperty;void 0!==s&&s.exports?s.exports=a:(e=[],void 0!==(t=function(){return a}.apply(n,e))&&(s.exports=t))}()},function(s,n,a){"use strict";function e(s,n,e){var t=e.configurable,r= [...]
\ No newline at end of file
diff --git a/build/b8d937a84db658d5df7b.js b/build/b8d937a84db658d5df7b.js
new file mode 100644
index 0000000..275c3fb
--- /dev/null
+++ b/build/b8d937a84db658d5df7b.js
@@ -0,0 +1,6 @@
+webpackJsonp([1],[,,,,,,,function(n,s,a){"use strict";function e(n){return n&&n.__esModule?n:{default:n}}function t(n,s){if(!(n instanceof s))throw new TypeError("Cannot call a class as a function")}function l(n,s){if(!n)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!s||"object"!=typeof s&&"function"!=typeof s?n:s}function o(n,s){if("function"!=typeof s&&null!==s)throw new TypeError("Super expression must either be null or a function, not "+t [...]
+ Copyright (c) 2016 Jed Watson.
+ Licensed under the MIT License (MIT), see
+ http://jedwatson.github.io/classnames
+*/
+!function(){"use strict";function a(){for(var n=[],s=0;s<arguments.length;s++){var e=arguments[s];if(e){var t=typeof e;if("string"===t||"number"===t)n.push(e);else if(Array.isArray(e))n.push(a.apply(null,e));else if("object"===t)for(var o in e)l.call(e,o)&&e[o]&&n.push(o)}}return n.join(" ")}var l={}.hasOwnProperty;void 0!==n&&n.exports?n.exports=a:(e=[],void 0!==(t=function(){return a}.apply(s,e))&&(n.exports=t))}()},function(n,s,a){"use strict";function e(n,s,e){var t=e.configurable,r= [...]
\ No newline at end of file
diff --git a/build/dc0e64fc4da0611e9cdc.js b/build/bb38166074ece67dec52.js
similarity index 70%
rename from build/dc0e64fc4da0611e9cdc.js
rename to build/bb38166074ece67dec52.js
index b34b5c5..6508b05 100644
--- a/build/dc0e64fc4da0611e9cdc.js
+++ b/build/bb38166074ece67dec52.js
@@ -1,6 +1,6 @@
-webpackJsonp([3],[,,,,,,function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+ty [...]
+webpackJsonp([3],[,,,,,,function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+ty [...]
Copyright (c) 2016 Jed Watson.
Licensed under the MIT License (MIT), see
http://jedwatson.github.io/classnames
*/
-!function(){"use strict";function n(){for(var e=[],t=0;t<arguments.length;t++){var r=arguments[t];if(r){var o=typeof r;if("string"===o||"number"===o)e.push(r);else if(Array.isArray(r))e.push(n.apply(null,r));else if("object"===o)for(var a in r)i.call(r,a)&&r[a]&&e.push(a)}}return e.join(" ")}var i={}.hasOwnProperty;void 0!==e&&e.exports?e.exports=n:(r=[],void 0!==(o=function(){return n}.apply(t,r))&&(e.exports=o))}()},function(e,t,n){"use strict";function r(e,t,r){var o=r.configurable,l= [...]
\ No newline at end of file
+!function(){"use strict";function n(){for(var e=[],t=0;t<arguments.length;t++){var r=arguments[t];if(r){var o=typeof r;if("string"===o||"number"===o)e.push(r);else if(Array.isArray(r))e.push(n.apply(null,r));else if("object"===o)for(var a in r)i.call(r,a)&&r[a]&&e.push(a)}}return e.join(" ")}var i={}.hasOwnProperty;void 0!==e&&e.exports?e.exports=n:(r=[],void 0!==(o=function(){return n}.apply(t,r))&&(e.exports=o))}()},function(e,t,n){"use strict";function r(e,t,r){var o=r.configurable,l= [...]
\ No newline at end of file
diff --git a/build/page.js b/build/page.js
index d9e3e87..ab09504 100644
--- a/build/page.js
+++ b/build/page.js
@@ -1 +1 @@
-!function(t){function e(r){if(n[r])return n[r].exports;var o=n[r]={i:r,l:!1,exports:{}};return t[r].call(o.exports,o,o.exports,e),o.l=!0,o.exports}var r=window.webpackJsonp;window.webpackJsonp=function(e,n,i){for(var a,u,c=0,f=[];c<e.length;c++)u=e[c],o[u]&&f.push(o[u][0]),o[u]=0;for(a in n)Object.prototype.hasOwnProperty.call(n,a)&&(t[a]=n[a]);for(r&&r(e,n,i);f.length;)f.shift()()};var n={},o={5:0};e.e=function(t){function r(){u.onerror=u.onload=null,clearTimeout(c);var e=o[t];0!==e&&(e [...]
\ No newline at end of file
+!function(t){function e(r){if(n[r])return n[r].exports;var o=n[r]={i:r,l:!1,exports:{}};return t[r].call(o.exports,o,o.exports,e),o.l=!0,o.exports}var r=window.webpackJsonp;window.webpackJsonp=function(e,n,i){for(var a,u,c=0,f=[];c<e.length;c++)u=e[c],o[u]&&f.push(o[u][0]),o[u]=0;for(a in n)Object.prototype.hasOwnProperty.call(n,a)&&(t[a]=n[a]);for(r&&r(e,n,i);f.length;)f.shift()()};var n={},o={5:0};e.e=function(t){function r(){u.onerror=u.onload=null,clearTimeout(c);var e=o[t];0!==e&&(e [...]
\ No newline at end of file
[incubator-dubbo-website] 01/02: Polish quick start English guide.
Posted by hu...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
huxing pushed a commit to branch asf-site
in repository https://gitbox.apache.org/repos/asf/incubator-dubbo-website.git
commit 6b30a0ceca241173ac8ead2414ece7193f8f1bbe
Author: Huxing Zhang <hu...@gmail.com>
AuthorDate: Sun Jul 15 21:28:22 2018 +0800
Polish quick start English guide.
---
docs/en-us/user/quick-start.md | 232 +++++++++++++++++++++++++++++++----------
md_json/docs.json | 2 +-
2 files changed, 177 insertions(+), 57 deletions(-)
diff --git a/docs/en-us/user/quick-start.md b/docs/en-us/user/quick-start.md
index 4e3764b..6025dea 100644
--- a/docs/en-us/user/quick-start.md
+++ b/docs/en-us/user/quick-start.md
@@ -1,36 +1,63 @@
# Quick start
-Dubbo uses a full Spring configuration, transparent access application,No API intrusion to your application,Just load the Dubbo configuration with Spring,Dubbo is loaded on the spring based schema extension.
+The most common way to configure Dubbo is to use Spring.
+If you don't want to use the Spring configuration, you can try using [API configuration](./configuration/api.md).
-If you don't want to use the Spring configuration, you can call it by [the way of API](./configuration/api.md).
+The following content will guide you to start dubbo using Spring configuration.
-## Service provider
+First let's create a root directory called dubbo-demo:
+
+```
+mkdir dubbo-demo
+cd dubbo-demo
+```
-Complete installation steps, see:[Provider demo installation](../admin/install/provider-demo.md)
+Next, we are going to create 3 sub-directories under root directory:
+
+* dubbo-demo-api: the common service api
+* dubbo-demo-provider: the demo provider codes
+* dubbo-demo-consumer: the demo consumer codes
+
+## Service provider
### Defining service interfaces
DemoService.java [^1]:
```java
-package com.alibaba.dubbo.demo;
+package org.apache.dubbo.demo;
public interface DemoService {
String sayHello(String name);
+
}
```
+The proejct structure should look like this:
+
+```
+.
+├── dubbo-demo-api
+│ ├── pom.xml
+│ └── src
+│ └── main
+│ └── java
+│ └── org
+│ └── apache
+│ └── dubbo
+│ └── demo
+│ └── DemoService.java
+```
+
### Implement interface in service provider
DemoServiceImpl.java [^2]:
```java
+package org.apache.dubbo.demo.provider;
+import org.apache.dubbo.demo.DemoService;
-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;
@@ -38,53 +65,97 @@ public class DemoServiceImpl implements DemoService {
}
```
-### Declaring exposure services with Spring configuration
+### Exposing service with Spring configuration
provider.xml:
```xml
-<?xml version="1.0" encoding="UTF-8"?>
-<beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
- xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
-
- <!-- Provider application information for computing dependencies -->
- <dubbo:application name="hello-world-app" />
-
- <!-- Using the multicast broadcast registry to expose service addresses -->
- <dubbo:registry address="multicast://224.5.6.7:1234" />
-
- <!-- Exposing service at port 20880 with Dubbo protocol -->
- <dubbo:protocol name="dubbo" port="20880" />
-
- <!-- Declaration of service interfaces that need to be exposed -->
- <dubbo:service interface="com.alibaba.dubbo.demo.DemoService" ref="demoService" />
-
- <!-- Implement services like local bean -->
- <bean id="demoService" class="com.alibaba.dubbo.demo.provider.DemoServiceImpl" />
+<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
+ xmlns="http://www.springframework.org/schema/beans"
+ xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
+ http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
+
+ <!-- provider's application name, used for tracing dependency relationship -->
+ <dubbo:application name="demo-provider"/>
+ <!-- use multicast registry center to export service -->
+ <dubbo:registry address="multicast://224.5.6.7:1234"/>
+ <!-- use dubbo protocol to export service on port 20880 -->
+ <dubbo:protocol name="dubbo" port="20880"/>
+ <!-- service implementation, as same as regular local bean -->
+ <bean id="demoService" class="org.apache.dubbo.demo.provider.DemoServiceImpl"/>
+ <!-- declare the service interface to be exported -->
+ <dubbo:service interface="org.apache.dubbo.demo.DemoService" ref="demoService"/>
</beans>
```
-### Loading Spring Configuration
+The demo uses multicast as the registry since it is simple and does not require to extra installation.
+If you prefer a registiry like zookeeper, please check out examples [here](https://github.com/dubbo/dubbo-samples).
+
+### Configure the logging system
+
+Dubbo use log4j as logging system by default, it also support slf4j, Apache Commons Logging, and JUL logging.
+
+Following is a sample configuration:
+
+log4j.properties
+
+```
+###set log levels###
+log4j.rootLogger=info, stdout
+###output to the console###
+log4j.appender.stdout=org.apache.log4j.ConsoleAppender
+log4j.appender.stdout.Target=System.out
+log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
+log4j.appender.stdout.layout.ConversionPattern=[%d{dd/MM/yy hh:mm:ss:sss z}] %t %5p %c{2}: %m%n
+```
+
+### Bootstrap the service provider
-Provider.java:
+Provider.java
```java
+package org.apache.dubbo.demo.provider;
+
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"});
+ System.setProperty("java.net.preferIPv4Stack", "true");
+ ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"META-INF/spring/dubbo-demo-provider.xml"});
context.start();
- System.in.read(); // Press any key to exit
+ System.out.println("Provider started.");
+ System.in.read(); // press any key to exit
}
}
```
+Finally, the project structure should look like this:
+
+```
+├── dubbo-demo-provider
+│ ├── pom.xml
+│ └── src
+│ └── main
+│ ├── java
+│ │ └── org
+│ │ └── apache
+│ │ └── dubbo
+│ │ └── demo
+│ │ └── provider
+│ │ ├── DemoServiceImpl.java
+│ │ └── Provider.java
+│ └── resources
+│ ├── META-INF
+│ │ └── spring
+│ │ └── dubbo-demo-provider.xml
+│ └── log4j.properties
+```
+
## Service consumer
-Complete installation steps, see : [Consumer demo installation](http://dubbo.apache.org/books/dubbo-admin-book-en/install/consumer-demo.html)
+Complete installation steps, see:[Consumer demo installation](../admin/install/consumer-demo.md)
### Using the Spring configuration to reference a remote service
@@ -92,42 +163,91 @@ consumer.xml:
```xml
<?xml version="1.0" encoding="UTF-8"?>
-<beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
- xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
-
- <!-- Consumer application names, used to calculate dependencies,not matching conditions, do not be the same as the provider -->
- <dubbo:application name="consumer-of-helloworld-app" />
-
- <!-- Using the multicast broadcast registry to discovery the exposed services -->
- <dubbo:registry address="multicast://224.5.6.7:1234" />
-
- <!-- Generate a remote service proxy that can be used as demoService as local bean -->
- <dubbo:reference id="demoService" interface="com.alibaba.dubbo.demo.DemoService" />
+<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
+ xmlns="http://www.springframework.org/schema/beans"
+ xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
+ http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
+
+ <!-- consumer's application name, used for tracing dependency relationship (not a matching criterion),
+ don't set it same as provider -->
+ <dubbo:application name="demo-consumer"/>
+ <!-- use multicast registry center to discover service -->
+ <dubbo:registry address="multicast://224.5.6.7:1234"/>
+ <!-- generate proxy for the remote service, then demoService can be used in the same way as the
+ local regular interface -->
+ <dubbo:reference id="demoService" check="false" interface="org.apache.dubbo.demo.DemoService"/>
</beans>
```
-### Load the Spring configuration and call a remote service
+### Bootstrap the consumer
Consumer.java [^3]:
```java
import org.springframework.context.support.ClassPathXmlApplicationContext;
-import com.alibaba.dubbo.demo.DemoService;
+import org.apache.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"});
+ ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"META-INF/spring/dubbo-demo-consumer.xml"});
context.start();
- DemoService demoService = (DemoService)context.getBean("demoService"); //Obtaining a remote service proxy
- String hello = demoService.sayHello("world"); // Executing remote methods
- System.out.println( hello ); // Display the call result
+ // Obtaining a remote service proxy
+ DemoService demoService = (DemoService)context.getBean("demoService");
+ // Executing remote methods
+ String hello = demoService.sayHello("world");
+ // Display the call result
+ System.out.println(hello);
}
}
```
+### Config the logging system
+
+This is the same as how to config it on provider side.
+
+Finally, the project structure should be look like this:
+
+```
+├── dubbo-demo-consumer
+│ ├── pom.xml
+│ └── src
+│ └── main
+│ ├── java
+│ │ └── org
+│ │ └── apache
+│ │ └── dubbo
+│ │ └── demo
+│ │ └── consumer
+│ │ └── Consumer.java
+│ └── resources
+│ ├── META-INF
+│ │ └── spring
+│ │ └── dubbo-demo-consumer.xml
+│ └── log4j.properties
+```
+
+## Start the demo
+
+### Start service provider
+
+Run the `org.apache.dubbo.demo.provider.Provider` class to start the provider.
+
+### Start service consumer
+
+Run the `org.apache.dubbo.demo.provider.Consumer` class to start the consumer, and you should be able to see the following result:
+
+```
+Hello world
+```
+
+## Complete example
+
+You can find the complete example code in the Github repository.
+
+* [Provider demo](../admin/install/provider-demo.md)
+* [Consumer demo](../admin/install/consumer-demo.md)
[^1]: The interface needs to be packaged separately, shared by the service provider and the consumer
[^2]: Hidden realization of service consumer
-[^3]: IoC injection can also be used
+[^3]: IoC injection can also be used
\ No newline at end of file
diff --git a/md_json/docs.json b/md_json/docs.json
index a5199af..98bca98 100644
--- a/md_json/docs.json
+++ b/md_json/docs.json
@@ -1140,7 +1140,7 @@
},
{
"filename": "user/quick-start.md",
- "__html": "<h1>Quick start</h1>\n<p>Dubbo uses a full Spring configuration, transparent access application,No API intrusion to your application,Just load the Dubbo configuration with Spring,Dubbo is loaded on the spring based schema extension.</p>\n<p>If you don't want to use the Spring configuration, you can call it by <a href=\"./configuration/api.md\">the way of API</a>.</p>\n<h2>Service provider</h2>\n<p>Complete installation steps, see:<a href=\"../admin/install/provider-demo. [...]
+ "__html": "<h1>Quick start</h1>\n<p>The most common way to configure Dubbo is to use Spring.\nIf you don't want to use the Spring configuration, you can try using <a href=\"./configuration/api.md\">API configuration</a>.</p>\n<p>The following content will guide you to start dubbo using Spring configuration.</p>\n<p>First let's create a root directory called dubbo-demo:</p>\n<pre><code>mkdir dubbo-demo\ncd dubbo-demo\n</code></pre>\n<p>Next, we are going to create 3 sub-directories [...]
},
{
"filename": "user/recommend.md",