本文主要介紹阿里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/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/dubbo http://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=28511
dubbo.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/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/dubbo http://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 { @Autowired private UserService userService; @RequestMapping("/hello.html") @ResponseBody public 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.xsd http://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.xsd http://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.xsd http://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管理后台部署的文章,后續整理了我會補發鏈接。