學習一門新技術的時候,我們不僅要學會怎樣運用這門技術,同時還必須明白這項技術是爲了解決什麼樣的問題而產生的,真正做到知其然並知其所以然。
- dubbo 是什麼
Dubbo是阿里巴巴公司開源的一個高性能優秀的服務框架,
使得應用可通過高性能的 RPC 實現服務的輸出和輸入功能,
可以和Spring框架無縫集成。
- dubbo的作用
Dubbo是一款高性能、輕量級的開源Java RPC框架,
它提供了三大核心能力:面向接口的遠程方法調用,
智能容錯和負載均衡,以及服務自動註冊和發現。
- 準備工作
1、選擇dubbo的註冊中心:目前主流的幾種註冊中心主要有zookeeper、redis、Multicast、Simple
(本案列中選擇zookeeper充當註冊中心,版本爲3.4.13)
2、dubbo的版本爲2.6.2
3、jdk版本爲jdk8
4、maven版本爲3.5.4
5、idea爲開發工具
- 工程的架構
dubbo-project
|dubbo-provider
|src
|main
|java
|com.kkcl.gmall
|service
|impl
UserServiceImpl.java
|MainApplication.java
|resources
|provider.xml
|dubbo-consumer
|src
|main
|java
|com.kkcl.gmall
|service
|impl
OrderServiceImpl.java
|MainApplication.java
|resources
|consumer.xml
|gmall-interface
|src
|main
|java
|com.kkcl.gmall
|bean
|UserAddress.java
|service
|UserService.java
|OrderService.java
- 工程的搭建
本示例工程主要分爲以下幾個module:dubob-project爲父工程;
gmall-interface、dubbo-provider、dubbo-consumer爲子module,
gmall-interface主要的主要是集成接口與實體類供dubbo-provider和dubbo-consumer調用,dubbo-provider充當生產者的角色,爲消費者提供服務,dubbo-consumer充當消費者的角色,
主要消費生產者提供的服務。
- 實戰案列
UserAddress.java
public class UserAddress implements Serializable {
private Integer id;
private String userAddress; //用戶地址
private String userId; //用戶id
private String consignee; //收貨人
private String phoneNum; //電話號碼
private String isDefault; //是否爲默認地址 Y-是 N-否
constructor...
getter and setter....
}
UserService.java
public interface UserService {
public List<UserAddress> getUserAddressList(String userId);
}
UserServiceImpl.java
public class UserServiceImpl implements UserService {
@Override
public List<UserAddress> getUserAddressList(String userId) {
UserAddress address1 = new UserAddress(1, "北京市", "1", "李老師", "010-56253898", "Y");
UserAddress address2 = new UserAddress(2, "西安市)", "1", "王老師", "010-56253809", "N");
return Arrays.asList(address1,address2);
}
}
Order.service
public interface OrderService {
public List<UserAddress> initOrder(String userId);
}
OrderServiceImpl.java
@Service
public class OrderServiceImpl implements OrderService {
@Autowired
UserService userService;
@Override
public List<UserAddress> initOrder(String userId) {
// TODO Auto-generated method stub
System.out.println("用戶id:"+userId);
//1、查詢用戶的收貨地址
List<UserAddress> addressList = userService.getUserAddressList(userId);
for (UserAddress userAddress : addressList) {
System.out.println(userAddress.getUserAddress());
}
return addressList;
}
}
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://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.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:registry protocol="zookeeper" address="127.0.0.1:2181"/>
<!---指定通信的規則(通信協議,通信端口)-->
<dubbo:protocol name="dubbo" port="20880"/>
<!--暴露的服務-->
<dubbo:service interface="com.kkcl.gmall.service.UserService" ref="userServiceImpl"/>
<!--服務實現-->
<bean id="userServiceImpl" class="com.kkcl.gmall.service.impl.UserServiceImpl"/>
</beans>
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"
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://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd
http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="com.kkcl.gmall.service.impl"/>
<!--應用的名稱-->
<dubbo:application name="dubbo-consumer"/>
<!--註冊中心-->
<dubbo:registry address="zookeeper://127.0.0.1:2181"/>
<!--聲明需要調用的遠程服務的名稱:生成遠程服務代理-->
<dubbo:reference interface="com.kkcl.gmall.service.UserService" id="userService"/>
</beans>
MainApplication.java
public class MainApplication {
public static void main(String[] args) throws IOException {
ClassPathXmlApplicationContext ioc = new ClassPathXmlApplicationContext("provider.xml或者consumer.xml");
ioc.start();
System.in.read();
}
}
- 項目部署
1、到zookeeper官網下載zookeeper,這裏下載的版本爲3.4.13,下載完成後到zookeeper的conf目錄下將zoo_simple.cfg複製重命名爲zoo.cfg並配置對應的data存儲的目錄
dataDir=../data
2、分別啓動dubbo-provider中的MainApplication.java
3、進入到dubbo的admin後臺服務管理頁面查看服務的啓用情況
- 源碼地址
https://github.com/kkcl/kkcl-learning-example/tree/master/dubbo-project