程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> 分布式開發系列(一)—— 構建分布式項目與服務模塊,開發系列構建模塊

分布式開發系列(一)—— 構建分布式項目與服務模塊,開發系列構建模塊

編輯:JAVA綜合教程

分布式開發系列(一)—— 構建分布式項目與服務模塊,開發系列構建模塊


 

關於分布式服務架構的背景和需求可查閱http://dubbo.io/。不同於傳統的單工程項目,本文主要學習如何通過maven和dubbo將構建分布項目以及服務模塊,下面直接開始。

創建項目以及模塊

創建Maven Project —— mcweb,這個是所有模塊的父模塊,packaging類型為pom

創建Maven Module —— mcweb-api,這個模塊是服務接口層,packaging類型為jar

創建Maven Module —— mcweb-logic,這個是服務實現層或者服務提供者,packaging類型為jar

創建Maven Module —— mcweb-web,這個是web層或者服務消費者,packaging類型為war

 

 

 

如果你還不是很清楚多模塊應用的創建過程,可參考這篇文章

http://www.cnblogs.com/quanyongan/archive/2013/05/28/3103243.html

我們將以這個簡單的樣例工程開啟分布式開發學習之旅。

配置模塊依賴關系

mcweb-service依賴mcweb-api

/mcweb-service/pom.xml

 

<dependencies>

<dependency>

  <groupId>com.edu.mcweb.api</groupId>

  <artifactId>mcweb-api</artifactId>

  <version>0.0.1-SNAPSHOT</version>

</dependency>

</dependencies>

 

mcweb-web 依賴mcweb-api

/mcweb-web/pom.xml

<dependencies>

<dependency>

   <groupId>com.edu.mcweb.api</groupId>

   <artifactId>mcweb-api</artifactId>

   <version>0.0.1-SNAPSHOT</version>

</dependency>

<dependency>

  <groupId>com.edu.mcweb.service</groupId>

  <artifactId>mcweb-service</artifactId>

  <version>0.0.1-SNAPSHOT</version>

</dependency>

</dependencies>

 

模塊配置與實現

mcweb-api

mcweb-api層是服務接口層,它的作用是向其他層暴露接口,不需要做其他配置,只需編寫我們需要的接口即可,這是面向接口編程的很好例子。

 

\mcweb\mcweb-api\src\main\java\com\mcweb\api\dao\IUserDao.java

 

public interface IUserDao {

  public User query(Class<User> clazz,Object userId);

}

 

\mcweb\mcweb-api\src\main\java\com\mcweb\api\service\IUserService.java

 

public interface IUserService {

  public User query(String userId);

}

 

\mcweb\mcweb-api\src\main\java\com\mcweb\api\entity\User.java

 

public class User2 implements Serializable{

  private String id;

  private String userName;

  private String userChName;

  //省略getter,setter

}

mcweb-logic

模塊配置

 

 

整個服務模塊就是一個web工程,其配置和普通web工程一樣,就多了一個dubbo-provider.xml,在applicationContext.xml引入即可(下面將介紹)。這些配置可以根據自己所采用的整合技術進行配置,在此略。

 

編寫代碼

\mcweb\mcweb-logic\src\main\java\com\mcweb\logic\dao\UserDao.java

 

@Repository

public class UserDao implements IUserDao {

  @PersistenceContext

  protected EntityManager em;

 

public User query(Class<User> clazz,Object userId) {

   //連接數據方式

    //return em.find(clazz, userId);

 

  User u = new User();

  u.setUserName("zhansan");

  u.setUserChName("張三");

  return u;

}

}

 

\mcweb\mcweb-logic\src\main\java\com\mcweb\logic\service\UserService.java

 

@Service

@Transactional

public class UserService implements IUserService {

  @Autowired

  private IUserDao userDao;

  public User query(String userId) {

     return userDao.query(User.class, userId);

}

}

 

部署啟動測試

mcweb-logic也是web項目,可以先部署到tomcat運行看是否能正常啟動。

mcweb-web

模塊配置

 

 

同理,整個消費模塊也是一個web工程,其配置和普通web工程一樣,就多了一個dubbo-consumer.xml,在applicationContext.xml引入即可(下面將介紹)。這些配置可以根據自己所采用的整合技術進行配置,在此略。

編寫代碼

\mcweb\mcweb-web\src\main\java\com\mcweb\web\controller\UserController.java

 

@Controller

@RequestMapping(value="/user")

public class UserController {

  @Autowired

  private IUserService userService;

  @RequestMapping(value="/query",method = RequestMethod.GET)

  public String query(@RequestParam("userId") String userId,Model model) {

      User user = userService.query(userId);

      model.addAttribute("user", user);

      return "/user.jsp";

}

}

 

\mcweb\mcweb-web\src\main\webapp\WEB-INF\pages\user.jsp

 

<body>

${user.userName}

</body>

部署啟動測試

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.mcweb.api.service.IUserService] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency.

 

現在,mcweb-logic和mcweb-web已經配置完成,mcweb-logic能正常啟動,mcweb-web依賴mcweb-logic中的IUserService服務,如何讓mcweb-web能夠引用mcweb-logic中的服務將是下面我們要學習的內容。

 

模塊服務化

服務提供者和服務消費者是dubbo架構中兩個主要角色,在上面的項目中,mcweb-logic就相當於服務提供者,mcweb-web相當於服務消費者。Dubbo 建議使用 Zookeeper 作為服務的注冊中心,所以我們先安裝Zookeeper。只要mcweb-logic向Zookeeper注冊了服務之後,它就可以向mcweb-web提供依賴服務;同理,mcweb-web需要向Zookeeper申請需要引用mcweb-logic服務。

安裝Zookeeper

參考《zookeeper安裝(單節點)》

配置服務提供者

引入相關jar

需要引入dubbo和zookeeper相關jar,\mcweb\pom.xml

 

<!-- dubbo start -->

<dependency>

   <groupId>com.alibaba</groupId>

   <artifactId>dubbo</artifactId>

   <version>2.5.3</version>

</dependency>

 

<dependency>

   <groupId>org.apache.zookeeper</groupId>

   <artifactId>zookeeper</artifactId>

   <version>3.4.9</version>

</dependency>

<dependency>

   <groupId>com.101tec</groupId>

   <artifactId>zkclient</artifactId>

   <version>0.7</version>

</dependency>

<dependency>

   <groupId>org.jboss.netty</groupId>

   <artifactId>netty</artifactId>

   <version>3.2.5.Final</version>

</dependency>

<!-- dubbo end -->

 

\mcweb\mcweb-logic\pom.xml

 

<dependency>

   <groupId>org.jboss.netty</groupId>

   <artifactId>netty</artifactId>

   <version>3.2.5.Final</version>

</dependency>

<dependency>

   <groupId>com.alibaba</groupId>

   <artifactId>dubbo</artifactId>

   <version>2.5.3</version>

   <exclusions>

   <exclusion>

   <groupId>org.springframework</groupId>

   <artifactId>spring</artifactId>

   </exclusion>

   </exclusions>

</dependency>

 

<dependency>

   <groupId>org.apache.zookeeper</groupId>

   <artifactId>zookeeper</artifactId>

   <version>3.4.9</version>

</dependency>

 

<dependency>

   <groupId>com.101tec</groupId>

   <artifactId>zkclient</artifactId>

    <version>0.7</version>

</dependency>

新建dubbo-provider.xml

\mcweb\mcweb-logic\src\main\resources\spring\dubbo-provider.xml

 

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

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

xsi:schemaLocation="http://www.springframework.org/schema/beans 

            http://www.springframework.org/schema/beans/spring-beans.xsd 

            http://code.alibabatech.com/schema/dubbo 

            http://code.alibabatech.com/schema/dubbo/dubbo.xsd">

 

<!-- 提供方應用信息,用於計算依賴關系 -->

<dubbo:application name="mcweb-logic" />

 

<!-- zookeeper注冊中心地址 -->

<dubbo:registry protocol="zookeeper" address="192.168.2.129:2181" />

 

<!-- 用dubbo協議在20880端口暴露服務 -->

<dubbo:protocol name="dubbo" port="20880" />

<!-- 服務接口 -->

<dubbo:service interface="com.mcweb.api.service.IUserService" ref="userService" />

 

</beans> 

 

在\mcweb\mcweb-logic\src\main\resources\spring\applicationContext.xml引入

dubbo-provider.xml

 

<import resource="dubbo-provider.xml" />

使用tomcat運行服務提供者

將mcweb-logic部署到tomcat中測試運行,可以看到tomcat控制台輸出信息

 

11:14:06 [localhost-startStop-1-SendThread(192.168.2.129:2181)]

INFO <org.apache.zookeeper.ClientCnxn> Opening socket connection to server

192.168.2.129/192.168.2.129:2181.

Will not attempt to authenticate using SASL (unknown error)

11:14:06 [localhost-startStop-1-SendThread(192.168.2.129:2181)]

INFO <org.apache.zookeeper.ClientCnxn>

Socket connection established to 192.168.2.129/192.168.2.129:2181, initiating session

11:14:06 [localhost-startStop-1-SendThread(192.168.2.129:2181)]

INFO <org.apache.zookeeper.ClientCnxn>

Session establishment complete on server 192.168.2.129/192.168.2.129:2181, sessionid =

0x1572b87bcd30000, negotiated timeout = 30000

11:14:06 [localhost-startStop-1-EventThread]

INFO <org.I0Itec.zkclient.ZkClient> zookeeper state changed (SyncConnected)

 

而在zookeeper的後台日志信息中可以看到

 

[myid:] - INFO  [ProcessThread(sid:0 cport:2181)::PrepRequestProcessor@649]

- Got user-level KeeperException when processing sessionid:0x1572b87bcd30000

type:create cxid:0x6 zxid:0x7 txntype:-1 reqpath:n/a Error

Path:/dubbo/com.mcweb.api.service.IUserService Error:KeeperErrorCode =

NodeExists for /dubbo/com.mcweb.api.service.IUserService

 

可見,mcweb-logic的IUserService服務已經注冊到了zookeeper中。

 

 

配置服務消費者

引入相關jar

mcweb\mcweb-web\pom.xml 和mcweb-logic引入的一樣

新建dubbo-consumer.xml

\mcweb\mcweb-web\src\main\resources\spring\dubbo-consumer.xml

 

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

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

xsi:schemaLocation="http://www.springframework.org/schema/beans 

        http://www.springframework.org/schema/beans/spring-beans.xsd 

        http://code.alibabatech.com/schema/dubbo 

        http://code.alibabatech.com/schema/dubbo/dubbo.xsd">

 

<!-- 消費者應用名,不要與提供者一樣 -->

<dubbo:application name="mcweb-web" />

 

<!-- 注冊中心地址 -->

<dubbo:registry protocol="zookeeper" address="192.168.2.129:2181" />

<!-- 用戶服務接口,check=false表示服務不啟動消費者照樣能啟動 -->

<dubbo:reference interface="com.mcweb.api.service.IUserService" id="userService"

check="false" />

 

</beans> 

 

在\mcweb\mcweb-web\src\main\resources\spring\applicationContext.xml

中引入dubbo-consumer.xml

 

<import resource="dubbo-consumer.xml" />

使用tomcat運行服務消費者

再次將mcweb-web部署到tomcat中測試運行,可以看到tomcat控制台輸出信息

 

INFO <org.apache.zookeeper.ClientCnxn>

Opening socket connection to server 192.168.2.129/192.168.2.129:2181.

Will not attempt to authenticate using SASL (unknown error)

INFO <org.apache.zookeeper.ClientCnxn>

Socket connection established to 192.168.2.129/192.168.2.129:2181, initiating session

INFO <org.apache.zookeeper.ClientCnxn>

Session establishment complete on server 192.168.2.129/192.168.2.129:2181,

sessionid = 0x1572b87bcd30001, negotiated timeout = 30000

INFO <org.I0Itec.zkclient.ZkClient> zookeeper state changed (SyncConnected)

 

可見mcweb-web能正常引用IUserService服務了。

 

部署測試

http://localhost:8090/mcweb-web/user/query.html?userId=aaaa

 

可見訪問成功,至此,服務提供者和服務消費者已經配置成功。

 

dubbo管控台的安裝

參考《dubbo管理控制台的安裝》

服務管理

Dubbo 管控台可以對注冊到 zookeeper 注冊中心的服務或服務消費者進行管理,但 管控台是否正常對 Dubbo 服務沒有影響。在dubbo的“首頁 > 服務治理 > 服務”中可以看到已經注冊到 zookeeper 注冊中心的服務的相關情況。

 

 

 

小結

(1)通過maven構建分布式應用的基礎模塊並配置模塊之間的依賴關系,大型的分布式應用通常根據業務需求劃分很多模塊,每一個模塊就是一個工程。這樣劃分好處很多,比如,抽象出系統的基礎服務模塊,基礎配置模塊,基礎服務模塊,基礎配置模為其他模塊提供支撐;模塊與模塊之間獨立開發測試,上線維護等等。可見,分布式架構給系統帶來了很多靈活性。

(2)通過引入dubbo,將模塊服務化。模塊服務化通常將模塊配置成服務提供者服務消費者,需要注意的是,服務提供者也可以作為服務消費者,因為服務提供者還有可能依賴於其他服務。記住下面這幾個容易混淆服務化的標簽

 

--將模塊配置成服務提供者

<dubbo:service interface="com.mcweb.api.service.IUserService" ref="userService" />

--將模塊配置成服務消費者,check="false" 表示不檢查服務是否啟動

<dubbo:reference interface="com.mcweb.api.service.IUserService" id="userService"

check="false" />

--服務提供者缺省值配置

<dubbo:provider>

--服務消費者缺省值配置

<dubbo:consumer>

 

(3)zookeeper作為第三方服務協調中心,服務提供者向其注冊服務,服務消費者向其申請引用服務。

(4)本文中采用tomcat容器運行dubbo服務,實際上運行與部署服務有多種方式,後面我們會進一步學習。

參考文檔

http://dubbo.io/User+Guide-zh.htm

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved