Dubbo是Alibaba開源的分佈式服務框架,它最大的特色是按照分層的方式來架構,使用這種方式可使各個層之間解耦合(或者最大限度地鬆耦合)。從服務模型的角度來看,Dubbo採用的是一種很是簡單的模型,要麼是提供方提供服務,要麼是消費方消費服務,因此基於這一點能夠抽象出服務提供方(Provider)和服務消費方(Consumer)兩個角色。html
咱們來看一下Dubbo 的RPC 調用流程,這裏主要涉及到4個模塊:git
從上圖中咱們能夠了解到整個RPC 服務調用的過程主要爲:github
開發環境主要涉及如下幾個方面:web
項目構建經過: http://start.spring.io/ 快速構建web 項目,具體操做能夠參考《Spring-Boot:6分鐘掌握SpringBoot開發》。spring
因爲Dubbo 中須要使用到服務註冊中心,咱們這裏將使用Zookeeper 做爲服務註冊中心,具體安裝配置,能夠參考《Zookeeper-5分鐘快速掌握分佈式應用程序協調服》apache
在基礎環境肯定好了以後,咱們項目的目錄結構以下:springboot
上圖所示,咱們項目主要分爲了兩個模塊,一部分是生產者:spring-boot-dubbo ,一部分是:spring-boot-consumer。架構
整個項目的結構很是簡單,這很符合Spring-Boot 的特性,簡單便捷,下面咱們開始一步步的剖析整個項目的結構app
項目依賴這一塊主要使用到了基本的Spring-Boot-Web 依賴,而後咱們須要額外引入Dubbo 與Zookeeper的依賴(詳細依賴可參考源碼,博文底部會有項目Github 地址):框架
<dependency> <groupId>io.dubbo.springboot</groupId> <artifactId>spring-boot-starter-dubbo</artifactId> <version>1.0.0</version> </dependency> <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3.4.6</version> <exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> </exclusion> <exclusion> <groupId>log4j</groupId> <artifactId>log4j</artifactId> </exclusion> </exclusions> </dependency>
因爲咱們底層使用的是Spring-Boot 進行開發,那麼咱們就應該善於利用Spring-Boot 給咱們帶來的優點,所以咱們能夠直接在Application.properties 文件中配置Dubbo 服務:
## Dubbo 服務提供者配置 spring.dubbo.application.name=provider --服務名稱 spring.dubbo.registry.address=zookeeper://127.0.0.1:2181 -- 註冊中心地址 spring.dubbo.protocol.name=dubbo -- dubbo 協議 spring.dubbo.protocol.port=20880 spring.dubbo.scan=com.jaycekon.dubbo.service --聲明須要暴露的服務接口
若是不採用Spring-Boot 進行自動配置,你們能夠參考一下的配置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="provider" /> <!-- 註冊中心服務地址 --> <dubbo:registry protocol="zookeeper" address="127.0.0.1" check="false" /> <!-- 用dubbo協議--> <dubbo:protocol name="dubbo" port="-1" dispather="all" check="false" /> <dubbo:provider timeout="10000" threads="10" threadpool="fixed" loadbalance="roundrobin"/> <!-- 聲明須要暴露的服務接口 --> <dubbo:service interface="com.jaycekon.dubbo.service" ref="userService"/> </beans>
在服務提供主要包括兩部分,一個是暴露服務,一個是服務實現
暴露服務:即咱們日常開發中所使用的的接口,這裏咱們建立一個 UserService 的接口,主要包括一個保存用戶的方法。
import com.jaycekon.dubbo.domain.User; /** * Created by Jaycekon on 2017/9/19. */ public interface UserService { User saveUser(User user); }
服務實現:服務實現,與咱們日常的服務同樣,對接口進行實現,比較特別的是,咱們這裏須要使用到Dubbo 的 @Service 註解
import com.alibaba.dubbo.config.annotation.Service; import com.jaycekon.dubbo.domain.User; import com.jaycekon.dubbo.service.UserService; /** * Created by Jaycekon on 2017/9/19. */ @Service public class UserServiceImpl implements UserService { @Override public User saveUser(User user) { user.setId(1); System.out.println(user.toString()); return user; } }
Dubbo 的服務提供端,已經整體開發完成,很是簡單,整體的目錄結構以下:
消費者的相關依賴,與生產者的依賴一致。
配置文件與生產者稍有區別:
## 避免和 server 工程端口衝突 server.port=8081 ## Dubbo 服務消費者配置 spring.dubbo.application.name=consumer spring.dubbo.registry.address=zookeeper://127.0.0.1:2181 spring.dubbo.scan=com.jaycekon.dubbo.service
基於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="provider" /> <!-- 註冊中心服務地址 --> <dubbo:registry protocol="zookeeper" address="${dubbo.registry.address}" check="false" /> <!-- 用dubbo協議--> <dubbo:protocol name="dubbo" port="-1" dispather="all" check="false" /> <dubbo:provider timeout="10000" threads="10" threadpool="fixed" loadbalance="roundrobin"/> <!-- 聲明須要暴露的服務接口 --> <dubbo:service interface="com.jaycekon.dubbo.service" ref="userService"/> </beans>
在這裏,若是咱們須要調用註冊服務中的相關服務,則須要實現相關的接口。
import com.jaycekon.dubbo.domain.User; /** * Created by Jaycekon on 2017/9/19. */ public interface UserService { User saveUser(User user); }
例如,在這裏咱們須要使用到生產者中的 saveUser(User user) 方法,則須要建立一個接口,而後再調用時,使用 @Reference 註解進行引用:
import com.alibaba.dubbo.config.annotation.Reference; import com.jaycekon.dubbo.domain.City; import com.jaycekon.dubbo.domain.User; import org.springframework.stereotype.Component; /** * 城市 Dubbo 服務消費者 * <p> * Created by Jaycekon on 20/09/2017. */ @Component public class CityDubboConsumerService { @Reference CityDubboService cityDubboService; @Reference UserService userService; public void printCity() { String cityName = "廣州"; City city = cityDubboService.findCityByName(cityName); System.out.println(city.toString()); } public User saveUser() { User user = new User(); user.setUsername("jaycekon") .setPassword("jaycekong824"); return userService.saveUser(user); } }
最後,咱們須要實現一個RESTful 接口,提供給用戶調用:
import com.jaycekon.dubbo.service.CityDubboConsumerService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * Created by Jaycekon on 2017/9/19. */ @RestController public class UserController { @Autowired private CityDubboConsumerService service; @RequestMapping("/save") public Object saveUser() { return service.saveUser(); } }
本篇博客主要是博主在學習Spring-boot 的時候,總結下來的。在通過一些列的對比後,感受Dubbo 與Spring-Cloud 仍是有點差距的,不論是從服務提供,仍是社區活躍來講,Spring-Cloud 仍是會強一點。可是因爲公司內部使用的是Dubbo,所以仍是須要學習一下,後續的話,會對Spring-Cloud 進行學習以及分項。
本文中出現的代碼,你們能夠到個人 GitHub :多啦A夢 的傳送門-https://github.com/jaycekon/SpringBoot
但願你們不要吝嗇本身的Star 和 Fork ,謝謝。
文章來自:https://www.cnblogs.com/jaycekon/p/SpringBootDubbo.html#4249441