<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. 创建提供者工程
然后在空项目里面创建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. 改造工程以实现远程调用
接下来改造我们上面的订单实现方法
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) 。
推荐阅读
- Dubbo框架的一些很好用的点,80%程序员还不知道
- C 语言和 C++、C# 的区别在什么地方?
- 20万元罐天价茶惊现西安
- 如何煮安化黑茶好喝,安化黑茶是煮还是泡
- 花洒关了为什么会滴一些水,花洒关了还滴水解决小妙招
- 空调一会漏水一会不漏水是什么原因,空调一会漏水一会不漏是什么情况
- 太阳能热水器怎么上水,太阳能热水器什么时候上水好
- 空调管路杀菌怎么操作,空调管路杀菌多久一次
- 面霜|什么面霜抗衰老紧致效果好
- 客厅挂灰色的窗帘好吗,客厅适合什么材质的窗帘