java 零基礎搭建dubbo運行環境

一:簡介

      之前作項目時,分佈式環境都是其它同事在搭建,本身也沒參與分佈式環境搭建,只負責開發,因爲近段時間工做重心轉到android,java後臺有一段時間沒有接觸了,恰好這幾天有空,決定本身動手親自搭建一次spring+dubbo+zookeeper的運行環境,方便之後在工做中使用,若有描述錯誤的地方,請指正,謝謝。html

     1 dubbo描述

   Dubbo是一個分佈式服務框架,若是是一個小的erp系統,一臺服務器足夠支撐項目運行,項目就不會用Dubbo,若是是一個大的商城項目,用戶訪問量比較大,一臺沒法器根本沒法支撐運行時,咱們能夠把訂單模塊,支付模塊,靜態頁面等獨立出來,放置在同一個局域網,不一樣服務器運行,這時咱們就須要使用Dubbo, Dubbo原理圖以下:java

     

    節點角色說明:android

Provider: 暴露服務的服務提供方,好比支付系統實現支付接口,供訂單系統調用git

Consumer: 調用遠程服務的服務消費方,好比訂單系統調用支付系統提供的服務進行付款操做。github

        Registry: 服務註冊與發現的註冊中心。算法

        Monitor: 統計服務的調用次調和調用時間的監控中心。spring

        Container: 服務運行容器。apache

    各個角色之間的調用關係:api

        1 服務容器負責啓動,加載,運行服務提供者。2 服務提供者在啓動時,向註冊中心註冊本身提供的服務。3 服務消費者在啓動時,向註冊中心訂閱本身所需的服務。4註冊中心返回服務提供者地址列表給消費者,若是有變動,註冊中心將基於長鏈接推送變動數據給消費者。5 服務消費者,從提供者地址列表中,基於軟負載均衡算法,選一臺提供者進行調用,若是調用失敗,再選另外一臺調用。6 服務消費者和提供者,在內存中累計調用次數和調用時間,定時每分鐘發送一次統計數據到監控中心(此段描述來自網絡)。瀏覽器

  2 zookeeper下載地址,http://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.3.6/   下載後直接解壓便可

二:環境搭建

  1 測試環境

         我本地測試環境是 Window 7 64,Eclipse 4.4,jdk1.8,tomcat 8,zookeeper-3.3.6,apache-maven-3.5.0

        2 建立項目

         如今咱們模擬一個商城環境,將支付模塊和訂單模塊獨立出來,在不一樣服務器上運行,而後相互以前調用,因爲兩個系統須要相互調用,即支付模塊是服務提供者,又是消費者,訂單模塊也是服務提供者,又是消費者.

        建立父工程shopping,建立完成後,設置父工程的Packaging爲pom

  

    建立子工程,shopping-api(用於定義公共接口,公共實體類等),shopping-order(訂單模塊,須要依賴shopping-api,實現訂單的service接口),shopping-pay(訂單模塊,須要依賴shopping-api,實現支付的service接口).

 

  3:service的定義及實現

  全部接口定義在shopping-api中,訂單接口定義以下:

//定義訂單讀接口
package com.service.order;

import java.util.List;
import com.bean.OrderBean;
/**
 * 訂單查詢
 * */
public interface OrderReadService {
    List<OrderBean> listQuery();
    OrderBean getOrder(long oId);
}

      支付接口定義以下:

package com.service.pay;

/**
 * 訂單支付
 * */
public interface PayService {
    String pay(long orderId); 
}

訂單接口須要在shopping-order項目中實現,代碼以下:
package com.order.impl;

import java.util.List;
import java.util.Random;
import java.util.Vector;

import com.bean.OrderBean;
import com.service.order.OrderReadService;
  
/**
 * 訂單查詢實現類
 * */
public class OrderReadServiceImpl implements OrderReadService {

    @Override
    public List<OrderBean> listQuery() {
        // TODO Auto-generated method stub
        List<OrderBean> list = new Vector<OrderBean>();
        for(int i=0;i<5;i++){
            OrderBean bean = new OrderBean();
            bean.setoId(i+10);
            bean.setoMoney(100+new Random().nextInt(50));
            bean.setoUserId(500+new Random().nextInt(50));
            list.add(bean);
        }
        return list;
    }

    @Override
    public OrderBean getOrder(long oId) {
        // TODO Auto-generated method stub
        OrderBean bean = new OrderBean();
        bean.setoId(oId);
        bean.setoMoney(100+new Random().nextInt(50));
        bean.setoUserId(500+new Random().nextInt(50));
        return bean;
    }

}

 支付接口須要在shopping-pay項目中實現,代碼以下:

package com.pay.impl;

import com.service.pay.PayService;
 

public class PayServiceImpl implements PayService {

    @Override
    public String pay(long orderId) {
        // TODO Auto-generated method stub
        return orderId + "支付成功.";
    }

}

  4:項目之間的依賴關係

  因爲shopping-api定義了完整的接口,shopping-order,shopping-pay實現了shopping-api項目下的接口,因此須要在shopping-order,shopping-pay項目中配置依賴關係,代碼以下:

<dependency>
        <groupId>shopping-api</groupId>
        <artifactId>shopping-api</artifactId>
        <version>0.0.1-SNAPSHOT</version>
</dependency>

  5:配置Dubbo提供者和消費者的xml

  因爲兩個項目以前須要相互調用,因此兩個項目都須要配置服務提供者,和消費者,代碼以下:

  shopping-order訂單項目的xml配置以下:

<!--定義了提供方應用信息,用於計算依賴關係;在 dubbo-admin 或 dubbo-monitor 會顯示這個名字,方便辨識 -->
<dubbo:application name="shopping-order" owner="programmer" organization="dubbox" />
<!--向 zookeeper 訂閱 provider 的地址,由 zookeeper 定時推送 -->
<dubbo:registry address="zookeeper://localhost:2181" check="false"/>
<!-- 用dubbo協議在20880端口暴露服務 -->
<dubbo:protocol name="dubbo" port="20880" />

<!-- (配置訂單服務提供者 )提供支付方的接口 -->
<dubbo:service ref="orderReadService" protocol="dubbo" interface="com.service.order.OrderReadService"></dubbo:service>
<bean id="orderReadService" class="com.order.impl.OrderReadServiceImpl"></bean>
<dubbo:service ref="orderWriterService" protocol="dubbo" interface="com.service.order.OrderWriterService"></dubbo:service>
<bean id="orderWriterService" class="com.order.impl.OrderWriterServiceImpl"></bean>

<!-- 配置消費者 --> 
<!--使用 dubbo 協議調用定義好的 api.PermissionService 接口 -->
<dubbo:reference id="payService" interface="com.service.pay.PayService" check="false"></dubbo:reference>

 

  shopping-pay支付項目的xml配置以下:

  <!--定義了提供方應用信息,用於計算依賴關係;在 dubbo-admin 或 dubbo-monitor 會顯示這個名字,方便辨識 -->
    <dubbo:application name="shopping-pay" owner="programmer" organization="dubbox" />
    <!--向 zookeeper 訂閱 provider 的地址,由 zookeeper 定時推送 -->
    <dubbo:registry address="zookeeper://localhost:2181"  check="false" />
    <!-- 用dubbo協議在20880端口暴露服務,因爲訂單設置的端口是20880,此處設置20881,否則tomcat啓動後,會衝突報錯 -->
    <dubbo:protocol name="dubbo" port="20881" />
    
    <!-- (配置支付服務提供者)提供給訂單項目調用 -->
    <dubbo:service interface="com.service.pay.PayService"  ref="payService" protocol="dubbo"></dubbo:service>
    <bean id="payService" class="com.pay.impl.PayServiceImpl"></bean>
    
    
    <!-- (配置消費者) -->
    <dubbo:reference interface="com.service.order.OrderReadService" id="orderReadService"></dubbo:reference>
    <dubbo:reference interface="com.service.order.OrderWriterService" id="orderWriterService"></dubbo:reference>

 

三:建立tomcat運行環境

      我將不一樣的項目,放置在不一樣的tomcat下,建立過程:File-new-Other,彈出以下窗體

    

 

    

 

  添加完成,將項目導入tomcat,效果圖以下

  shopping-pay將端口號設置爲:8081,

  

   shopping-order將端口號設置爲:8082

   

  

四:啓動項目,調用接口測試

  啓動tomcat前,須要先啓動zookeeper,先進入以前解壓的zookeeper/bin目錄,運行zkServer.cmd,而後再啓動tomcat,兩個項目不分前後啓動,但測試前,須要保證兩個項目正常啓動.

  直接在瀏覽器中輸入以下地址測試,控制層的代碼,沒有貼出來,完整代碼在文章最後有下載地址:

http://127.0.0.1:8081/shopping-pay/pay/orderList.do?id=10

http://127.0.0.1:8082/shopping-order/order/pay.do?id=123

五:注意事項

   由於兩個項目,須要相互調用,因此配置服務端口暴露服務時,記得將兩個端口設置爲不同,否則會出錯,此處配置我也不是很熟悉,如配置不對,請指正,謝謝,配置以下:

<!-- 用dubbo協議在20880端口暴露服務 -->
<dubbo:protocol name="dubbo" port="20880" />

<!-- 用dubbo協議在20880端口暴露服務,因爲訂單設置的端口是20880,此處設置20881,否則tomcat啓動後,會衝突報錯 -->
<dubbo:protocol name="dubbo" port="20881" />

  另外還須要注意:向 zookeeper 訂閱 provider 的地址,以及配置dubbo:service,須要把check設置爲false,否則項目沒法啓動,

  

<dubbo:registry address="zookeeper://localhost:2181"  check="false" />

<dubbo:service interface="com.service.pay.PayService"  ref="payService" protocol="dubbo"></dubbo:service>

        因爲兩個項目依賴於,shopping-api,雖然在pom.xml中引入了對shopping-api的依賴,我本地tomcat啓動時,仍然報錯,找不到shopping-api下的公共類,因此我將shopping-api打包成jar包,放置在shopping-order和shopping-pay項目中。

 

參考文獻:

分佈式系統架構實戰demo:SSM+Dubbo
https://my.oschina.net/liughDevelop/blog/1480061#0-sqq-1-469-9737f6f9e09dfaf5d3fd14d775bfee85

dubbo 既是提供方又是消費方的問題
https://blog.csdn.net/q596333033/article/details/78573741

Dubbo架構

http://dubbo.apache.org/books/dubbo-dev-book/design.html

 dubbo 知識總結 dubbo配置參考

https://blog.csdn.net/abcde474524573/article/details/53026110

 

 這是本人第一次搭建dubbo環境,本文可能有錯誤的地方,但願你們指正,謝謝,完整代碼下載地址:https://github.com/jlq023/dubbo-shopping

相關文章
相關標籤/搜索