什么是Dubbo框架?( 四 )


<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>2.12.0</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.46</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
在2.6之前监控中心都是以war包的形式部署(没错,它是作为一个单独项目存在的)
在2.6之后都是jar包的形式部署(自带tomcat)
我们开始打包项目
如果没有配置maven环境变量请参考这篇教程
http://www.cnntt.com/archives/780
cmd进入dubbo-admin目录
首先清空下包
mvn clean package
等待...然后会出现以下提示
BUILD SUCCESS
进入target文件夹,找到我们已经打好的jar包
(关于mvn是怎么打包的可以自己百度,package命令同样可以打包,IDEA同样也可以打包,类似于npm它会根据pom来打包)
得到dubbo-admin-0.0.1-SNAPSHOT.jar(以后可以跳过以上步骤直接使用我打好的jar包)
运行jar
java -jar dubbo-admin-0.0.1-SNAPSHOT.jar
如果报错是因为我们的电脑还没有启动zkServer
我们得到以下提示
Tomcat started on port(s): 7001
我们访问7001即可进入管理控制台
帐号密码都为root
这样我们的环境就搭建完成了
3. 创建提供者和消费者工程场景假设:
现在我们有两个服务器
订单服务器(独立数据库)
用户服务器(独立数据库)
现在订单服务器要创建一个订单,这时候需要向用户服务器索要用户信息(用户姓名,收货地址等)
在本例中,用户服务器是提供者,订单服务器是消费者

  • 1. 创建提供者工程
首先打开IDEA,然后创建一个空项目(单项目多module的模式,便于开发)
然后在空项目里面创建user-service module
创建方式同SpringBoot
创建时勾选所有DevTools
为了简化开发,我们的User实体类设计如下
@Data
publicclassUser {
privateInteger id;
privateString name;
privateString addr;
}
设计一个Service接口,用于返回用户信息
publicinterfaceUserService {
/*根据id查询用户信息*/
publicUser getUser(Integer id);
}
实现接口,这里没有连接数据库,我们直接构建一个User
publicclassUserServiceImpl implements UserService {
@Override
publicUser getUser(Integer id) {
User user = new User();
user.setId(1);
user.setName("老覃");
user.setAddr("大连");
returnuser;
}
}
  • 2. 创建消费者工程
创建方式同上
新建一个创建订单服务(只有一个userId参数)
publicinterfaceOrderService {
/*创建订单*/
publicvoid createOrder(Integer userId);
}
实现方法
publicclassOrderServiceImpl implements OrderService {
@Override
publicvoid createOrder(Integer userId) {
/*查询用户信息*/
}
}
到这里我们就需要进行远程调用了,怎么远程调用?不可能把接口和实现全部拷贝过来,这个就不叫远程调用了,这个叫拷贝代码
所以我们只用把接口拷贝过来,告诉我们有这个方法,具体实现的细节被屏蔽,这个才是分布式开发
  • 3. 改造工程以实现远程调用
首先我们要把pojo和接口(不包含实现类)拷贝到我们的Order项目中
接下来改造我们上面的订单实现方法
publicclassOrderServiceImpl implements OrderService {
UserService userService;
@Override
publicvoid createOrder(Integer userId) {
/*查询用户信息*/
Logger logger = LoggerFactory.getLogger(getClass());
logger.info(userService.getUser(1)+"");
}
}
本次调用必然是失败的
原因有二
方法的实现不在我们的项目中(Order)
即使成功,难道每个调用他的项目都需要拷贝接口和pojo吗
对于以上两个问题,有对应的两个解决方案
RPC(不然讲Dubbo干啥,它就是干这个的)
创建一个工程来统一管理接口和pojo,参考dubbo官网最佳实践
摘取dubbo官方一小部分原文
建议将服务接口、服务模型、服务异常等均放在 API 包中,因为服务模型和异常也是 API 的一部分,这样做也符合分包原则:重用发布等价原则(REP),共同重用原则(CRP) 。


推荐阅读