java 零基礎搭建dubbo運行環境


一:簡介

      以前做項目時,分布式環境都是其它同事在搭建,自己也沒參與分布式環境搭建,只負責開發,由於近段時間工作重心轉到android,java后台有一段時間沒有接觸了,剛好這幾天有空,決定自己動手親自搭建一次spring+dubbo+zookeeper的運行環境,方便以后在工作中使用,如有描述錯誤的地方,請指正,謝謝。

     1 dubbo描述

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

     

    節點角色說明:

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

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

        Registry: 服務注冊與發現的注冊中心。

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

        Container: 服務運行容器。

    各個角色之間的調用關系:

        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

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM