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請求後端資料做鋪墊。
今天的任務就到此吧,有點疲憊了,還要繼續補充知識,後面再接著更新!