1. 程式人生 > 實用技巧 >Dubbo入門微服務框架學習

Dubbo入門微服務框架學習

Dubbo入門筆記

Dubbo官網:http://dubbo.apache.org/zh-cn/

Dubbo官方推薦使用Zookeeper作為服務註冊中心,Zookeeper 是 Apache Hadoop 的子專案,是一個樹型的目錄服務,支援變更推送,適合作為 Dubbo 服務的註冊中心,工業強度較高,可用於生產環境,並推薦使用 。

安裝Zookeeper

下載地址:http://archive.apache.org/dist/zookeeper/

安裝步驟:

第一步:安裝 jdk(略)
第二步:把 zookeeper 的壓縮包(zookeeper-3.4.6.tar.gz)上傳到 linux 系統
第三步:解壓縮壓縮包
​ tar -zxvf zookeeper-3.4.6.tar.gz
第四步:進入zookeeper-3.4.6目錄,建立data目錄
​ mkdir data
第五步:進入conf目錄 ,把zoo_sample.cfg 改名為zoo.cfg
​ cd conf
​ mv zoo_sample.cfg zoo.cfg
第六步:開啟zoo.cfg檔案, 修改data屬性:dataDir=/root/zookeeper-3.4.6/data

啟動、停止Zookeeper

進入Zookeeper的bin目錄,啟動服務命令
./zkServer.sh start

停止服務命令
./zkServer.sh stop

檢視服務狀態:
./zkServer.sh status

Dubbo快速入門

Dubbo作為一個RPC框架,其最核心的功能就是要實現跨網路的遠端呼叫。本小節就是要建立兩個應用,一個作為服務的提供方,一個作為服務的消費方。通過Dubbo來實現服務消費方遠端呼叫服務提供方的方法。

服務提供方開發

開發步驟:

(1)建立maven工程(打包方式為war)dubbodemo_provider,在pom.xml檔案中匯入如下座標

<properties>
  <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  <maven.compiler.source>1.8</maven.compiler.source>
  <maven.compiler.target>1.8</maven.compiler.target>
  <spring.version>5.0.5.RELEASE</spring.version>
</properties>
<dependencies>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>${spring.version}</version>
  </dependency>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-beans</artifactId>
    <version>${spring.version}</version>
  </dependency>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>${spring.version}</version>
  </dependency>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>${spring.version}</version>
  </dependency>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-aspects</artifactId>
    <version>${spring.version}</version>
  </dependency>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jms</artifactId>
    <version>${spring.version}</version>
  </dependency>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context-support</artifactId>
    <version>${spring.version}</version>
  </dependency>
  <!-- dubbo相關 -->
  <dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>dubbo</artifactId>
    <version>2.6.0</version>
  </dependency>
  <dependency>
    <groupId>org.apache.zookeeper</groupId>
    <artifactId>zookeeper</artifactId>
    <version>3.4.7</version>
  </dependency>
  <dependency>
    <groupId>com.github.sgroschupf</groupId>
    <artifactId>zkclient</artifactId>
    <version>0.1</version>
  </dependency>
  <dependency>
    <groupId>javassist</groupId>
    <artifactId>javassist</artifactId>
    <version>3.12.1.GA</version>
  </dependency>
  <dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.47</version>
  </dependency>
</dependencies>
<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-compiler-plugin</artifactId>
      <version>2.3.2</version>
      <configuration>
        <source>1.8</source>
        <target>1.8</target>
      </configuration>
    </plugin>
    <plugin>
      <groupId>org.apache.tomcat.maven</groupId>
      <artifactId>tomcat7-maven-plugin</artifactId>
      <configuration>
        <!-- 指定埠 -->
        <port>8081</port>
        <!-- 請求路徑 -->
        <path>/</path>
      </configuration>
    </plugin>
  </plugins>
</build>

(2)配置web.xml檔案

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
  <display-name>Archetype Created Web Application</display-name>
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:applicationContext*.xml</param-value>
  </context-param>
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
</web-app>

(3)建立服務介面

package cn.blogsx.service;
public interface HelloService {
    public String sayHello(String name);
}

(4)建立服務實現類

packagecn.blogsx.service.impl;
import com.alibaba.dubbo.config.annotation.Service;
import cn.blogsx.service.HelloService;

@Service
public class HelloServiceImpl implements HelloService {
    public String sayHello(String name) {
        return "hello " + name;
    }
}

注意:服務實現類上使用的Service註解是Dubbo提供的,用於對外發布服務

(5)在src/main/resources下建立applicationContext-service.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:p="http://www.springframework.org/schema/p"
		xmlns:context="http://www.springframework.org/schema/context"
		xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
	    xmlns:mvc="http://www.springframework.org/schema/mvc"
		xsi:schemaLocation="http://www.springframework.org/schema/beans
		http://www.springframework.org/schema/beans/spring-beans.xsd
         http://www.springframework.org/schema/mvc
         http://www.springframework.org/schema/mvc/spring-mvc.xsd
         http://code.alibabatech.com/schema/dubbo
         http://code.alibabatech.com/schema/dubbo/dubbo.xsd
         http://www.springframework.org/schema/context
         http://www.springframework.org/schema/context/spring-context.xsd">
	<!-- 當前應用名稱,用於註冊中心計算應用間依賴關係,注意:消費者和提供者應用名不要一樣 -->
	<dubbo:application name="dubbodemo_provider" />
	<!-- 連線服務註冊中心zookeeper ip為zookeeper所在伺服器的ip地址-->
	<dubbo:registry address="zookeeper://192.168.134.129:2181"/>
	<!-- 註冊  協議和port   埠預設是20880 -->
	<dubbo:protocol name="dubbo" port="20881" />
	<!-- 掃描指定包,加入@Service註解的類會被髮布為服務  -->
	<dubbo:annotation package="cn.blogsx.service.impl" />
</beans>

(6)啟動服務

tomcat7:run

服務消費方開發

開發步驟:

(1)建立maven工程(打包方式為war)dubbodemo_consumer,pom.xml配置和上面服務提供者相同,只需要將Tomcat外掛的埠號改為8082即可

(2)配置web.xml檔案

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
  <display-name>Archetype Created Web Application</display-name>
  <servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!-- 指定載入的配置檔案 ,通過引數contextConfigLocation載入 -->
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:applicationContext-web.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>*.do</url-pattern>
  </servlet-mapping>
</web-app>

(3)將服務提供者工程中的HelloService介面複製到當前工程

(4)編寫Controller

package cn.blogsx.controller;
import com.alibaba.dubbo.config.annotation.Reference;
import cn.blogsx.service.HelloService;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
@RequestMapping("/demo")
public class HelloController {
    @Reference
    private HelloService helloService;

    @RequestMapping("/hello")
    @ResponseBody
    public String getName(String name){
        //遠端呼叫
        String result = helloService.sayHello(name);
        System.out.println(result);
        return result;
    }
}

注意:Controller中注入HelloService使用的是Dubbo提供的@Reference註解

(5)在src/main/resources下建立applicationContext-web.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:p="http://www.springframework.org/schema/p"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
	xmlns:mvc="http://www.springframework.org/schema/mvc"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
			http://www.springframework.org/schema/beans/spring-beans.xsd
			http://www.springframework.org/schema/mvc
			http://www.springframework.org/schema/mvc/spring-mvc.xsd
			http://code.alibabatech.com/schema/dubbo
			http://code.alibabatech.com/schema/dubbo/dubbo.xsd
			http://www.springframework.org/schema/context
			http://www.springframework.org/schema/context/spring-context.xsd">

	<!-- 當前應用名稱,用於註冊中心計算應用間依賴關係,注意:消費者和提供者應用名不要一樣 -->
	<dubbo:application name="dubbodemo-consumer" />
	<!-- 連線服務註冊中心zookeeper ip為zookeeper所在伺服器的ip地址-->
	<dubbo:registry address="zookeeper://192.168.134.129:2181"/>
	<!-- 掃描的方式暴露介面  -->
	<dubbo:annotation package="cn.blogsx.controller" />
</beans>

(6)執行測試

tomcat7:run啟動

在瀏覽器輸入http://localhost:8082/demo/hello.do?name=Jack,檢視瀏覽器輸出結果

Dubbo管理控制檯

我們在開發時,需要知道Zookeeper註冊中心都註冊了哪些服務,有哪些消費者來消費這些服務。我們可以通過部署一個管理中心來實現。其實管理中心就是一個web應用,部署到tomcat即可。

安裝

安裝步驟:

(1)將資料中的dubbo-admin-2.6.0.war檔案複製到tomcat的webapps目錄下

(2)啟動tomcat,此war檔案會自動解壓

(3)修改WEB-INF下的dubbo.properties檔案,注意dubbo.registry.address對應的值需要對應當前使用的Zookeeper的ip地址和埠號

​ dubbo.registry.address=zookeeper://192.168.134.129:2181
​ dubbo.admin.root.password=root
​ dubbo.admin.guest.password=guest

(4)重啟tomcat

使用

操作步驟:

(1)訪問http://localhost:8080/dubbo-admin-2.6.0/,輸入使用者名稱(root)和密碼(root)

程式碼倉庫: https://gitee.com/sixudev/dubbo_demo