1. 程式人生 > >idea下用maven建立並搭建dubbox微服務環境專案(二)——開發provider

idea下用maven建立並搭建dubbox微服務環境專案(二)——開發provider

         今天繼續Windows10系統下用idea工具建立maven多模組管理的dubbo(dubbox)+zookeeper中介軟體分散式架構SSM專案環境搭建,provider的開發。


1.  新建一個module  smbms-user-provider

    


2.  增加jar包依賴

 ----------------------------------以下是dubbo------------------------------------------
   1)zookeeper  jar包  (中介軟體的)
       和註冊中心通訊的公共基礎包。

<dependency>
    <groupId>org.apache.zookeeper</groupId>
    <artifactId>zookeeper</artifactId>
    <version>3.4.6</version>
</dependency>

  2)zkclient   jar包   (中介軟體的)
       和註冊中心通訊的客戶端包。

<dependency>
   <groupId>com.101tec</groupId>
   <artifactId>zkclient</artifactId>
   <version>0.8</version>
</dependency>

 3)dubbo      jar包
       dubbo 釋出服務與訂閱服務的包。

<dependency>
   <groupId>com.alibaba</groupId>
   <artifactId>dubbo</artifactId>
   <version>2.8.4</version>
</dependency>

 4)smbms-common  公共包
       公共的實體類與service介面。

<dependency>
   <groupId>cn.kgc1803</groupId>
   <artifactId>smbms-common</artifactId>
   <version>1.0-SNAPSHOT</version>
</dependency>

 5)hessian  jar包
       hesian 提供中間通訊協議(http ,dubbo等協議)

<dependency>
   <groupId>com.caucho</groupId>
   <artifactId>hessian</artifactId>
   <version>4.0.7</version>
</dependency>

--------------------------dubbox 的 jar 依賴------------------------------
   6)json 外掛 jar包  在smbms-common模組pom.xml引入

<!-- json 外掛 -->
<dependency>
    <groupId>org.codehaus.jackson</groupId>
    <artifactId>jackson-mapper-asl</artifactId>
    <version>1.9.12</version>
</dependency>

 該外掛的作用是在實體類上增加了@JsonProperty註解標籤的屬性會自動轉化為json物件屬性。
       示例:

 @JsonProperty
private Integer id;

按照這種方式,我們對smbms-common模組的order類進行了改造改造後需要再次打包釋出,直接覆蓋原來的檔案,如下:

package cn.kgc1803.smbms_common.pojo;

import org.codehaus.jackson.annotate.JsonProperty;

import java.io.Serializable;

public class Order implements Serializable {
    //@JsonProperty實體類可以自動轉化為  json  類物件資料的屬性
    @JsonProperty
    private Integer id;
    @JsonProperty
    private Integer ownerUserId;
    @JsonProperty
    private String productName;
    @JsonProperty
    private Double price;
    @JsonProperty
    private Integer amount;

    public Order(){
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public Integer getOwnerUserId() {
        return ownerUserId;
    }

    public void setOwnerUserId(Integer ownerUserId) {
        this.ownerUserId = ownerUserId;
    }

    public String getProductName() {
        return productName;
    }

    public void setProductName(String productName) {
        this.productName = productName;
    }

    public Double getPrice() {
        return price;
    }

    public void setPrice(Double price) {
        this.price = price;
    }

    public Integer getAmount() {
        return amount;
    }

    public void setAmount(Integer amount) {
        this.amount = amount;
    }
}

  7)rest 風格訪問dubbo(dubbox)  在smbms-user-provider模組pom.xml引入

<!--dubbox rest 風格包 -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>dubbo-rpc-rest</artifactId>
    <version>2.8.4</version>
</dependency>

3. 編寫smbms-user-provider模組的service

  配置 dubbox  rest 風格的訪問配置:

 //@Produces設定輸出結果集的資料型別
      @Path("/order")
      @Produces(ContentType.APPLICATION_JSON_UTF_8)
      public class OrderServiceImpl implements OrderService {
      //@Path訪問路徑
      @Path("/orderliset.html")
      //@GET請求方式
      @GET
      public List<Order> findList() {
    以上程式碼塊中的方法:public List<Order> findList() 在實際開發中會帶上引數,因此,為了靈活運用,方法上的@path後面應該靈活設定成從引數中獲取的引數欄位,例如後續貼出相應的改進後的程式碼。並且這兩種方式在啟動dubbox測試的時候會有細微區別如下面第7)步操作。
    改進後的OrderServiceImpl類:
package cn.kgc1803.smbms_user_provider.service;

import cn.kgc1803.smbms_common.pojo.Order;
import cn.kgc1803.smbms_common.service.OrderService;
import com.alibaba.dubbo.rpc.protocol.rest.support.ContentType;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import java.util.ArrayList;
import java.util.List;
//@Produces設定輸出結果集的 資料型別
@Path("/order")
@Produces(ContentType.APPLICATION_JSON_UTF_8)
public class OrderServiceImpl implements OrderService {
    //@Path訪問路徑
    //@GET請求方式
    @Path("/orderlist/{userId}")
    @GET
    public List<Order> findList(@PathParam("userId") Integer userId) {
        List<Order> orders = new ArrayList<Order>();
        Order o = new Order();
        o.setId(userId);
        o.setOwnerUserId(11);
        o.setAmount(33);
        o.setPrice(55.3);
        o.setProductName("華為p8");
        orders.add(o);
        return orders;
    }
}

4. 配置dubbo  釋出到服務(spring)

     用idea工具新建spring 配置檔案  dubbo_user_provider.xml,如下方式:

  1)在配置檔案中增加名稱空間dubbo

xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"

  2)注入service 配置到spring中

 <!--service 注入-->
    <bean id="userService" class="cn.kgc1803.smbms_user_provider.service.UserServiceImpl"/>
    <bean id="orderService" class="cn.kgc1803.smbms_user_provider.service.OrderServiceImpl"/>

  3)利用dubbo 名稱空間配置應用名稱(name:應用名稱;owner:擁有者;organization:組織)

<!-- 設定提供者本次釋出的應用名稱-->
<dubbo:application name="user_provider_app" owner="kgc" organization="kgc1803"/>

  4)配置註冊中心的地址

<!-- 配置註冊中心地址-->
<dubbo:registry address="zookeeper://localhost:2181"/>

  5)宣告一個釋出協議(選擇自己的協議風格 dubbo或者rest;rest風格有埠號)

    <!-- 配置一個協議(dubbo協議) -->
    <dubbo:protocol name="dubbo" contextpath="dubbo" />
    <!--rest 協議 -->
    <dubbo:protocol name="rest" port="20888"/>

   6)釋出服務----》兩種風格(通過第5步定義的協議):protocol:協議風格;interface:對應的介面;ref:物件,即第1)步service對應的 id 。

<!-- dubbo方式釋出服務 -->
<dubbo:service protocol="dubbo" interface="cn.kgc1803.smbms_common.service.UserService" ref="userService" />
<!-- rest 協議釋出風格 -->
<dubbo:service protocol="rest" interface="cn.kgc1803.smbms_common.service.OrderService" ref="orderService"/>

   7)編寫測試類TestProvider,載入spring配置檔案,頁面啟動bubbox測試:

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TestProvider {
    public static void main(String[] args){
        //載入spring配置檔案
        ApplicationContext ctx = new ClassPathXmlApplicationContext("dubbo_user_provider.xml");
        try {
            //執行緒休眠10分鐘,保證測試啟動後,dubbo服務可使用的時間
            Thread.sleep(10*60*1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

   8)為了啟動測試類能更好的在控制檯顯示日誌效果,方便我們對專案的報錯進行檢視和修改,這裡我添加了一個配置檔案,不需要你寫,只需要在之前解壓的zookeeper包裡面找到,並複製到smbms-user-provider模組的resource下即可:

  log4j.properties配置檔案:

# Define some default values that can be overridden by system properties
zookeeper.root.logger=INFO, CONSOLE
zookeeper.console.threshold=INFO
zookeeper.log.dir=.
zookeeper.log.file=zookeeper.log
zookeeper.log.threshold=DEBUG
zookeeper.tracelog.dir=.
zookeeper.tracelog.file=zookeeper_trace.log

#
# ZooKeeper Logging Configuration
#

# Format is "<default threshold> (, <appender>)+

# DEFAULT: console appender only
log4j.rootLogger=${zookeeper.root.logger}

# Example with rolling log file
#log4j.rootLogger=DEBUG, CONSOLE, ROLLINGFILE

# Example with rolling log file and tracing
#log4j.rootLogger=TRACE, CONSOLE, ROLLINGFILE, TRACEFILE

#
# Log INFO level and above messages to the console
#
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.Threshold=${zookeeper.console.threshold}
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} [myid:%X{myid}] - %-5p [%t:%C{1}@%L] - %m%n

#
# Add ROLLINGFILE to rootLogger to get log file output
#    Log DEBUG level and above messages to a log file
log4j.appender.ROLLINGFILE=org.apache.log4j.RollingFileAppender
log4j.appender.ROLLINGFILE.Threshold=${zookeeper.log.threshold}
log4j.appender.ROLLINGFILE.File=${zookeeper.log.dir}/${zookeeper.log.file}

# Max log file size of 10MB
log4j.appender.ROLLINGFILE.MaxFileSize=10MB
# uncomment the next line to limit number of backup files
#log4j.appender.ROLLINGFILE.MaxBackupIndex=10

log4j.appender.ROLLINGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.ROLLINGFILE.layout.ConversionPattern=%d{ISO8601} [myid:%X{myid}] - %-5p [%t:%C{1}@%L] - %m%n

#
# Add TRACEFILE to rootLogger to get log file output
#    Log DEBUG level and above messages to a log file
log4j.appender.TRACEFILE=org.apache.log4j.FileAppender
log4j.appender.TRACEFILE.Threshold=TRACE
log4j.appender.TRACEFILE.File=${zookeeper.tracelog.dir}/${zookeeper.tracelog.file}

log4j.appender.TRACEFILE.layout=org.apache.log4j.PatternLayout
### Notice we are including log4j's NDC here (%x)
log4j.appender.TRACEFILE.layout.ConversionPattern=%d{ISO8601} [myid:%X{myid}] - %-5p [%t:%C{1}@%L][%x] - %m%n

   9)同樣啟動:http://localhost:8080/dubbo-admin-2.8.4/ 網址,檢視首頁是否有釋出的監控中心:

   列表詳細資訊:

   10)啟動測試(啟動上面第7)步的測試即可進入網頁檢視服務是否釋出成功)

         dubbox測試:http://localhost:20888/order/orderlist.html (這種方式,每個系統都可以訪問;這裡的20888埠號是第5步的rest協議埠,order和orderlist.html是提供者實現類頭部的註解路徑,相當於controller的方式。)或者是帶引數的方式(即service類對應的@path路徑):http://localhost:20888/order/orderlist/{userId}

       測試通過,證明之前寫的OrderServiceImpl實現類的findList方法已通在smbms-common模組引入json 外掛(依賴架包),並在Order實體類屬性欄位上增加的@JsonProperty註解標籤會自動轉化為json物件屬性顯示在前端頁面上。這樣也好為後面頁面用Ajax請求後端資料做鋪墊。

       今天的任務就到此吧,有點疲憊了,還要繼續補充知識,後面再接著更新!