一、windows安裝Zookeeper
1.下載下傳 zookeeper
位址:https://archive.apache.org/dist/zookeeper/zookeeper-3.4.13/
2.解壓 zookeeper
解壓運作 zkServer.cmd, 初次運作會報錯,沒有zoo.cfg配置檔案
3.修改zoo.cfg配置檔案
将conf下的zoo_sample.cfg複制一份改名為zoo.cfg即可。
注意幾個重要位置:
dataDir=./ :臨時資料存儲的目錄(可寫相對路徑)
clientPort=2181 : zookeeper的端口号
修改完成後再次啟動zookeeper
4、使用zkCli.cmd測試
ls /:列出zookeeper根下儲存的所有節點
create –e /atguigu 123:建立一個atguigu節點,值為123
get /atguigu:擷取/atguigu節點的值
二、安裝dubbo-admin管理控制台
dubbo本身并不是一個服務軟體。它其實就是一個jar包能夠幫你的java程式連接配接到zookeeper,并利用zookeeper消費、提供服務。是以你不用在Linux上啟動什麼dubbo服務。
但是為了讓使用者更好的管理監控衆多的dubbo服務,官方提供了一個可視化的監控程式,不過這個監控即使不裝也不影響使用。
1.下載下傳dubbo-admin
位址:https://github.com/apache/incubator-dubbo-ops
2、進入目錄,修改dubbo-admin配置
修改 src\main\resources\application.properties 指定zookeeper位址
3.打包dubbo-admin
mvn clean package -Dmaven.test.skip=true
4.運作dubbo-admin
java -jar dubbo-admin-0.0.1-SNAPSHOT.jar

三、dubbo-hello world
需求:某個系統,訂單服務需要調用使用者服務擷取某個使用者的所有位址:
我們需要建立兩個服務子產品進行測試。
訂單服務web子產品、使用者服務service子產品.
1.公共接口
- Bean 模型
package com.atguigu.gmall.bean;
import java.io.Serializable;
/**
* 使用者位址
* @author lfy
*
*/
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-否
public UserAddress() {
super();
// TODO Auto-generated constructor stub
}
public UserAddress(Integer id, String userAddress, String userId, String consignee, String phoneNum,
String isDefault) {
super();
this.id = id;
this.userAddress = userAddress;
this.userId = userId;
this.consignee = consignee;
this.phoneNum = phoneNum;
this.isDefault = isDefault;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUserAddress() {
return userAddress;
}
public void setUserAddress(String userAddress) {
this.userAddress = userAddress;
}
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getConsignee() {
return consignee;
}
public void setConsignee(String consignee) {
this.consignee = consignee;
}
public String getPhoneNum() {
return phoneNum;
}
public void setPhoneNum(String phoneNum) {
this.phoneNum = phoneNum;
}
public String getIsDefault() {
return isDefault;
}
public void setIsDefault(String isDefault) {
this.isDefault = isDefault;
}
}
- service 層
public interface OrderService {
/**
* 初始化訂單
* @param userId
*/
public List<UserAddress> initOrder(String userId);
}
public interface UserService {
/**
* 按照使用者id傳回所有的收貨位址
* @param userId
* @return
*/
public List<UserAddress> getUserAddressList(String userId);
}
2.服務提供者
- 引入依賴
<dependency>
<groupId>com.gtguigu.dubbo</groupId>
<artifactId>gmall-interface</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
<!-- 引入dubbo -->
<!-- https://mvnrepository.com/artifact/com.alibaba/dubbo -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.6.2</version>
</dependency>
<!-- 注冊中心使用的是zookeeper,引入操作zookeeper的用戶端端 -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>2.12.0</version>
</dependency>
- ServiceImpl
public class UserServiceImpl implements UserService {
@Override
public List<UserAddress> getUserAddressList(String userId) {
System.out.println("UserServiceImpl.....old...");
// TODO Auto-generated method stub
UserAddress address1 = new UserAddress(1, "北京市昌平區宏福科技園綜合樓3層", "1", "李老師", "010-56253825", "Y");
UserAddress address2 = new UserAddress(2, "深圳市寶安區西部矽谷大廈B座3層(深圳分校)", "1", "王老師", "010-56253825", "N");
/*try {
Thread.sleep(4000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}*/
return Arrays.asList(address1,address2);
}
}
- 配置檔案 provider.xml
<!-- 1、指定目前服務/應用的名字(同樣的服務名字相同,不要和别的服務同名) -->
<dubbo:application name="user-service-provider"></dubbo:application>
<!-- 2、指定注冊中心的位置 -->
<!-- <dubbo:registry address="zookeeper://127.0.0.1:2181"></dubbo:registry> -->
<dubbo:registry protocol="zookeeper" address="127.0.0.1:2181"></dubbo:registry>
<!-- 3、指定通信規則(通信協定?通信端口) -->
<dubbo:protocol name="dubbo" port="20882"></dubbo:protocol>
<!-- 4、暴露服務 ref:指向服務的真正的實作對象 -->
<dubbo:service inter
ref="userServiceImpl01" timeout="1000" version="1.0.0">
<dubbo:method name="getUserAddressList" timeout="1000"></dubbo:method>
</dubbo:service>
<!--統一設定服務提供方的規則 -->
<dubbo:provider timeout="1000"></dubbo:provider>
<!-- 服務的實作 -->
<bean id="userServiceImpl01" class="gmall.service.impl.UserServiceImpl"></bean>
- 啟動服務提供者
public class MainApplication {
public static void main(String[] args) throws IOException {
ClassPathXmlApplicationContext ioc = new ClassPathXmlApplicationContext("provider.xml");
ioc.start();
System.in.read();
}
}
3.服務消費者
- 引入依賴
<dependency>
<groupId>com.gtguigu.dubbo</groupId>
<artifactId>gmall-interface</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!-- 引入dubbo -->
<!-- https://mvnrepository.com/artifact/com.alibaba/dubbo -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.6.2</version>
</dependency>
<!-- 注冊中心使用的是zookeeper,引入操作zookeeper的用戶端端 -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>2.12.0</version>
</dependency>
- ServiceImpl
@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;
}
- 配置檔案
<context:component-scan base-package="com.atguigu.gmall.service.impl"></context:component-scan>
<dubbo:application name="order-service-consumer"></dubbo:application>
<dubbo:registry address="zookeeper://127.0.0.1:2181"></dubbo:registry>
<!-- 配置本地存根-->
<!--聲明需要調用的遠端服務的接口;生成遠端服務代理 -->
<!--
1)、精确優先 (方法級優先,接口級次之,全局配置再次之)
2)、消費者設定優先(如果級别一樣,則消費方優先,提供方次之)
-->
<!-- timeout="0" 預設是1000ms-->
<!-- retries="":重試次數,不包含第一次調用,0代表不重試-->
<!-- 幂等(設定重試次數)【查詢、删除、修改】、非幂等(不能設定重試次數)【新增】 -->
<dubbo:reference inter
id="userService" timeout="5000" retries="3" version="*">
<!-- <dubbo:method name="getUserAddressList" timeout="1000"></dubbo:method> -->
</dubbo:reference>
<!-- 配置目前消費者的統一規則:所有的服務都不檢查 -->
<dubbo:consumer check="false" timeout="5000"></dubbo:consumer>
<dubbo:monitor protocol="registry"></dubbo:monitor>
- 啟動服務
public class MainApplication {
@SuppressWarnings("resource")
public static void main(String[] args) throws IOException {
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("consumer.xml");
OrderService orderService = applicationContext.getBean(OrderService.class);
orderService.initOrder("1");
System.out.println("調用完成....");
System.in.read();
}
}
測試通過 !