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