dubbo入门示例
本文主要介紹阿里dubbo的基本使用,關于dubbo的相關基礎概念請自行參考dubbo官網:http://www.dubbo.io
dubbo是一個服務治理的框架,在如今大規模的分布式應用和SOA架構中,服務治理的問題顯的尤為的重要。
以我個人使用dubbo的場景來總結,dubbo主要解決如下問題:
1.項目服務化后,項目之間的高性能通訊問題。(項目被拆分成多個服務模塊后必然會涉及模塊之間的通訊)
2.服務的URL管理,當項目拆分為N個服務并且不斷增加時,如何有效的管理的服務URL
3.服務發現和服務移除,動態的管理服務
帶著以上三個問題開始dubbo的學習和入門demo的開發。
示例項目分為三個,分別是:
1. dubbo-api:提供統一的接口,最終會打為jar包,供consumer和provider引用
2.dubbo-provider:服務提供者,包含api接口的實現類,提供服務的實現邏輯
3.dubbo-consumer:該項目是一個web項目,有幾個作用,首先該項目以http的形式提供前端和瀏覽器訪問的接口,
其次,該項目也是dubbo消費者,用來消費dubbo-provider項目提供的服務。所以該項目可以通過瀏覽器調用接口測試,
也可以使用postman或者前端js來調用進行測試,比較接近真實環境的使用場景。
首先開發dubbo-api:
項目結構如下圖:
該項目只有一個文件,是一個接口,他定義了統一的接口讓provider和consumer來引用,接口文件內容如下:
public interface UserService {String sayHi(String name); }
?
很純粹的一個java接口,不再多解釋什么了。
在該項目的classpath路徑下提供了一個xml配置,該配置文件其實就是dubbo消費者的相關配置,后邊消費者項目引入api之后可以直接使用該文件。
文件內容如下:
<?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://code.alibabatech.com/schema/dubbo"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://code.alibabatech.com/schema/dubbohttp://code.alibabatech.com/schema/dubbo/dubbo.xsd"><!-- 引用服務配置 --><dubbo:reference id="userService" interface="com.dubbo.api.UserService" cluster="failfast" check="false"/> </beans>?
拋開xml頭文件,該文件的內容也只有一行而已,通過<dubbo:reference>標簽來引用服務配置。
其次是該項目的pom文件:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.demo.dubbo</groupId><artifactId>dubbo-api</artifactId><version>1.0-SNAPSHOT</version><dependencies><dependency><groupId>com.alibaba</groupId><artifactId>dubbo</artifactId><version>2.5.3</version><exclusions><exclusion><groupId>org.springframework</groupId><artifactId>spring</artifactId></exclusion></exclusions><scope>provided</scope></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><version>4.2.5.RELEASE</version><scope>provided</scope></dependency></dependencies></project>?
pom文件中在引入dubbo包時,排除掉了dubbo自帶的spring引用,因為dubbo自帶的spring依賴版本過低,我們使用自己導入的spring版本
到此位置dubbo-api項目已開發完成。
通過maven將其打成jar包,一會consumer和provider需要引入該包。
?
接著我們開發dubbo-provider,項目結構如下:
該項目只有兩個類,一個是服務實現類UserServiceImpl,代碼如下:
public class UserServiceImpl implements UserService {public String sayHi(String s) {return "hello " + s + "!";} }另外一個Main文件是啟動dubbo服務的,內容如下:
public class Main {public static void main(String[] args) {com.alibaba.dubbo.container.Main.main(args);} }該類是dubbo框架提供,作用是啟動dubbo服務,dubbo會在啟動服務時,讀取classpath下一個名為dubbo.properties文件的屬性值。
并指定了屬性key,只要按照dubbo的規則配置相關參數即可。有興趣的可以去查看下dubbo的源碼。
dubbo.properties文件配置如下:
dubbo.container=spring #set dubbo Sping load setting xmls dubbo.spring.config=classpath:dubbo-provider.xml dubbo.protocol.name=dubbo dubbo.protocol.port=28511dubbo.container指定了dubbo的容器使用spring,dubbo內部有四種容器實現,SpringContainer是其中一種,也是默認的容器
dubbo.spring.config指定了dubbo在啟動服務時加載的spring配置文件。
dubbo.protocol.name和dubbo.protocol.port分別指定使用的協議名和端口
貼一下dubbo的源碼,SpringContainer類中定義了兩個常量,SPRING_CONFIG和DEFAULT_SPRING_CONFIG,
大概讀一下代碼就可以知道,start方法在執行時,會讀取dubbo.spring.config屬性值,該值指定的就是spring的配置文件,如果沒讀到,則使用默認的配置
默認配置為classpath下META-INF/spring/*.xml,意思是讀取classpath下META-INF文件夾下的spring文件夾中的所有xml文件。
所以我們也可以不配置dubbo.spring.config,但是要遵循dubbo默認的讀取路徑,將spring配置文件放置在META-INF/spring文件夾下。
?
接下來看dubbo-provider.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://code.alibabatech.com/schema/dubbo"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://code.alibabatech.com/schema/dubbohttp://code.alibabatech.com/schema/dubbo/dubbo.xsd"><dubbo:application name="dubbo-provider"/><dubbo:registry address="zookeeper://127.0.0.1:2181"/><dubbo:provider cluster="failfast"/><bean id="userService" class="com.dubbo.provider.UserServiceImpl"/><dubbo:service interface="com.dubbo.api.UserService" ref="userService"/> </beans>該文件其實就是一個spring配置文件,只不過引入了dubbo相關的配置。
<dubbo:application>指定了程序名稱,我們可以在dubbo管理后臺中通過該名稱更清晰的區分服務
<dubbo:registry>指定了注冊中心的地址
<dubbo:provider>指定了集群容錯模式,此處為快速失敗
<bean> 普通的spring依賴注入
<dubbo:service>服務導出,引用<bean>標簽注入的類
最后來看下provider項目的pom文件:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.yinyuetai.dubbo</groupId><artifactId>dubbo-provider</artifactId><version>1.0-SNAPSHOT</version><dependencies><dependency><groupId>com.alibaba</groupId><artifactId>dubbo</artifactId><version>2.5.3</version><exclusions><exclusion><groupId>org.springframework</groupId><artifactId>spring</artifactId></exclusion></exclusions></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><version>4.2.5.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context-support</artifactId><version>4.2.5.RELEASE</version></dependency><dependency><groupId>com.demo.dubbo</groupId><artifactId>dubbo-api</artifactId><version>1.0-SNAPSHOT</version></dependency><dependency><groupId>org.apache.zookeeper</groupId><artifactId>zookeeper</artifactId><version>3.4.10</version></dependency><dependency><groupId>com.github.sgroschupf</groupId><artifactId>zkclient</artifactId><version>0.1</version></dependency></dependencies></project>此處引入了zk相關的包,因為服務提供者在啟動時會向注冊中心注冊服務。
此處的provider引入了dubbo-api的jar包。
到此位置,provider項目的開發已經完成。
?
最后來看dubbo-consumer這個web項目,相對來說也是三個項目中最為負責的一個。
項目結構:
UserController類就是個控制器,使用requestMapping注解提供http接口服務,內容如下:
@RestController public class UserController {@Autowiredprivate UserService userService;@RequestMapping("/hello.html")@ResponseBodypublic String sayHello(String name) {String welcome = userService.sayHi(name);return welcome;} }接下來看配置文件,首先看web.xml:
<?xml version="1.0" encoding="utf-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://java.sun.com/xml/ns/javaee"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"id="WebApp_ID" version="3.0"><!-- 配置Spring配置文件路徑 --><context-param><param-name>contextConfigLocation</param-name><param-value>classpath*:spring-config.xml</param-value></context-param><!-- 配置Spring上下文監聽器 --><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener><servlet><servlet-name>dispatcher</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>classpath*:spring-mvc.xml</param-value></init-param><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>dispatcher</servlet-name><url-pattern>*.html</url-pattern></servlet-mapping></web-app><context-param>配置了spring配置文件的位置
下邊servlet中配置spring-mvc配置文件的位置,都是spring開發的基本配置。不多解釋了
spring-config.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:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"default-autowire="byName"><!-- 開啟注解配置 --><context:annotation-config/><import resource="classpath:dubbo-consumer.xml"/></beans>開啟了注解支持,并且通過import導入了另一份配置文件
dubbo-consumer.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://code.alibabatech.com/schema/dubbo"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"><dubbo:application name="dubbo-consumer"/><dubbo:registry address="zookeeper://127.0.0.1:2181"/><dubbo:consumer check="false"/><!-- 導入dubbo配置 --><import resource="classpath*:user-reference.xml"/> </beans>該配置指定了應用程序的名稱,注冊中心地址,以及dubbo-api項目中定義的dubbo配置文件。
spring-mvc.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:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"><!-- 配置自動掃描的包路徑 --><context:component-scan base-package="com.dubbo.consumer.web"/> </beans>僅僅定義了自動掃描的包路徑而已
最后看下pom文件:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.yinyuetai.dubbo</groupId><artifactId>dubbo-consumer</artifactId><packaging>war</packaging><version>1.0-SNAPSHOT</version><name>dubbo-consumer Maven Webapp</name><url>http://maven.apache.org</url><dependencies><dependency><groupId>com.alibaba</groupId><artifactId>dubbo</artifactId><version>2.5.3</version><exclusions><exclusion><groupId>org.springframework</groupId><artifactId>spring</artifactId></exclusion></exclusions></dependency><!-- spring --><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><version>4.2.5.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>4.2.5.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>4.2.5.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>4.2.5.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>4.2.5.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context-support</artifactId><version>4.2.5.RELEASE</version></dependency><dependency><groupId>com.demo.dubbo</groupId><artifactId>dubbo-api</artifactId><version>1.0-SNAPSHOT</version></dependency><dependency><groupId>org.apache.zookeeper</groupId><artifactId>zookeeper</artifactId><version>3.4.10</version></dependency><dependency><groupId>com.github.sgroschupf</groupId><artifactId>zkclient</artifactId><version>0.1</version></dependency></dependencies><build><finalName>dubbo-consumer</finalName></build> </project>到此。dubbo的入門demo已經全部開發完成。
先通過Main.java中的main方法 啟動dubbo-provider項目。
然后將dubbo-consumer項目打成war包,部署到tomcat或其他web容器中。
在瀏覽器中訪問:localhost:tomcatport/dubbo-consumer/hello.html?name=test
tomcatport換成你本地的tomcat端口號
可以看到瀏覽器輸出:
?
說明我們的項目已經成功部署,可以成功調用了。
此時觀察dubbo管理后臺,可以看到如圖所示:
兩個應用分別對應我們開發的provider和consumer,而名字則是由<dubbo:application name>指定的。
一個消費者,一個服務提供者,和我們開發的東西完全吻合。到此為止dubbo的入門示例已經全部完成。
相關的代碼放在了碼云,懶的動手的可以直接下載運行看看效果。
碼云地址:
dubbo-api:https://git.oschina.net/li_mingzhu/dubbo-api.git
dubbo-provider:https://git.oschina.net/li_mingzhu/dubbo-provider.git
dubbo-consumer:https://git.oschina.net/li_mingzhu/dubbo-consumer.git
?
關于dubbo管理后臺,其實就是一個war包,只要部署在web容器運行即可。
暫時還沒有整理關于dubbo管理后臺部署的文章,后續整理了我會補發鏈接。
?
from:?https://www.cnblogs.com/leemz-coding/p/7113530.html
總結
- 上一篇: Dubbo的使用及原理浅析
- 下一篇: 分布式服务框架 dubbo/dubbox