天天看點

Dubbo 學習筆記(2)—— 快速入門

一、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 學習筆記(2)—— 快速入門

三、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();
	}

}
           

測試通過 !

繼續閱讀