(二).Dubbo入門示例

1.Dubbo簡介

Dubbo是一個分佈式服務框架,致力於提供高性能和透明化的RPC遠程服務調用方案,以及SOA服務治理方案
Dubbo是阿里巴巴SOA服務化治理方案的核心框架,每天爲2,000+個服務提供3,000,000,000+次訪問量支持,並被廣泛應用於阿里巴巴集團的各成員站點。

1.1、Dubbo是什麼

Dubbo是一個分佈式服務框架,致力於提供高性能和透明化的RPC遠程服務調用方案,以及SOA服務治理方案。
其核心部分包含:
         遠程通訊: 提供對多種基於長連接的NIO框架抽象封裝,包括多種線程模型,序列化,以及“請求-響應”模式的信息交換方式。
        集羣容錯: 提供基於接口方法的透明遠程過程調用,包括多協議支持,以及軟負載均衡,失敗容錯,地址路由,動態配置等集羣支持。
        自動發現: 基於註冊中心目錄服務,使服務消費方能動態的查找服務提供方,使地址透明,使服務提供方可以平滑增加或減少機器。

1.2、Dubbo能做什麼

       透明化的遠程方法調用,就像調用本地方法一樣調用遠程方法,只需簡單配置,沒有任何API侵入。
       軟負載均衡及容錯機制,可在內網替代F5等硬件負載均衡器,降低成本,減少單點。
       服務自動註冊與發現,不再需要寫死服務提供方地址,註冊中心基於接口名查詢服務提供者的IP地址,並且能夠平滑添加或刪除服務提供者。

1.3、Dubbo的核心部件

           Remoting: 網絡通信框架,實現了sync-over-async 和 request-response 消息機制.
           RPC: 一個遠程過程調用的抽象,支持負載均衡、容災和集羣功能
           Registry: 服務目錄框架用於服務的註冊和服務事件發佈和訂閱。

2.簡單入門示例

2.1示例截圖


使用SpringMVC。示例中有4個項目。分爲解釋一下:
dubbo01-HelloWorld是這個項目的父工程,負責管理整個項目中jar包的版本。
Hello-Consumer:消費者
HelloWorld-API:生產者的API接口定義,集中管理接口。
HelloWord-Provide:生產者實現
父工程的pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.lyh.dubbo</groupId>
  <artifactId>dubbo01-HelloWorld</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>pom</packaging>
  
  <properties>
  	  <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  	  <poi.version>3.14</poi.version>
  	  <servlet-api.version>2.5</servlet-api.version>
  	  <jsp-api.version>6.0.45</jsp-api.version>
  	  <jstl.version>1.2</jstl.version>
  	  <log4j-api.version>2.6.2</log4j-api.version>
  	  <slf4j.version>1.7.7</slf4j.version>
  	  <commons-lang.version>2.6</commons-lang.version>
  	  <commons-fileuplad.version>1.3.2</commons-fileuplad.version>
  	  <hibernate-core.version>3.5.6-Final</hibernate-core.version>
  	  <spring.version>3.2.16.RELEASE</spring.version>
      <jdom.version>1.1</jdom.version>
  	  <mysql.version>5.1.30</mysql.version>
  	  <oscache.version>2.4.1</oscache.version>
  	  <tea.version>0.0.1-SNAPSHOT</tea.version>
  	  <javassit.version>3.20.0-GA</javassit.version>
  	  
  	  
  	  <dubbo.version>2.5.4-SNAPSHOT</dubbo.version>
  	  <zookeeper.version>3.4.6</zookeeper.version>
  	  <zkclient.version>0.1</zkclient.version>
  	  <jetty.version>6.1.26</jetty.version>
  </properties>
  
  
  <build>
    <plugins>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
          <source>1.6</source>
          <target>1.6</target>
        </configuration>
      </plugin>
    </plugins>
  </build>
  <modules>
  	<module>HelloWorld-API</module>
  	<module>HelloWorld-Provide</module>
  	<module>HelloWold-Consumer</module>
  </modules>
</project>


2.2生產者

2.2.1生產者API

只是定義接口而已.
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <artifactId>dubbo01-HelloWorld</artifactId>
    <groupId>com.lyh.dubbo</groupId>
    <version>0.0.1-SNAPSHOT</version>
    <relativePath>..</relativePath>
  </parent>
  <artifactId>HelloWorld-API</artifactId>
  <build />
</project>


IHelloWordAPI.java
package com.lyh.dubbo.api;

public interface IHelloWorldAPI {

	public String sayHello(String name);
	
	public String sayWord(String name);
}


2.2.2生產者實現

生產API實現,對外暴露方法。
1.pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <artifactId>dubbo01-HelloWorld</artifactId>
    <groupId>com.lyh.dubbo</groupId>
    <version>0.0.1-SNAPSHOT</version>
    <relativePath>..</relativePath>
  </parent>
  <artifactId>HelloWorld-Provide</artifactId>
  <packaging>war</packaging>
  
  <dependencies>
  		<dependency>
  				<artifactId>HelloWorld-API</artifactId>
			    <groupId>com.lyh.dubbo</groupId>
			    <version>0.0.1-SNAPSHOT</version>
  		</dependency>
  		
  		<!-- Servlet Start -->
	    <dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>servlet-api</artifactId>
			<version>${servlet-api.version}</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>org.apache.tomcat</groupId>
			<artifactId>jsp-api</artifactId>
			<version>${jsp-api.version}</version>
			<scope>provided</scope>
		</dependency>
	    <dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>jstl</artifactId>
			<version>${jstl.version}</version>
			<type>jar</type>
		</dependency>
		<!-- Servlet end -->
		
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-core</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-tx</artifactId>
	    	<version>${spring.version}</version>
	    </dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context-support</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-web</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-aop</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-jdbc</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-tx</artifactId>
			<version>${spring.version}</version>
		</dependency>
		
		<dependency>
		    <groupId>opensymphony</groupId>
		    <artifactId>oscache</artifactId>
		    <version>${oscache.version}</version>
		    <exclusions>
		    	<exclusion>
		    		<groupId>javax.jms</groupId>
		    		<artifactId>jms</artifactId>
		    	</exclusion>
		    </exclusions>
		</dependency>
		
		<dependency>
		    <groupId>commons-fileupload</groupId>
		    <artifactId>commons-fileupload</artifactId>
		    <version>${commons-fileuplad.version}</version>
		</dependency>
		
		<dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
            <version>${dubbo.version}</version>
        </dependency>
        
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>${zookeeper.version}</version>
        </dependency>
        
        <dependency>
            <groupId>com.github.sgroschupf</groupId>
            <artifactId>zkclient</artifactId>
            <version>${zkclient.version}</version>
        </dependency>
        
        <dependency>
            <groupId>org.mortbay.jetty</groupId>
            <artifactId>jetty</artifactId>
            <version>${jetty.version}</version>
            <exclusions>
                <exclusion>
                    <groupId>org.mortbay.jetty</groupId>
                    <artifactId>servlet-api</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        
        <dependency>
		    <groupId>org.springframework.integration</groupId>
		    <artifactId>spring-integration-httpinvoker</artifactId>
		    <version>2.0.6.RELEASE</version>
		</dependency>
		
		<dependency>
		    <groupId>org.apache.httpcomponents</groupId>
		    <artifactId>httpclient</artifactId>
		    <version>4.0</version>
		</dependency>
  </dependencies>
  
  <build>
    <plugins>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
          <source>1.6</source>
          <target>1.6</target>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>


2.HelloWorldAPIService
package com.lyh.dubbo.api.service;
import com.lyh.dubbo.api.IHelloWorldAPI;
public class HelloWordAPIService implements IHelloWorldAPI{

	
	@Override
	public String sayHello(String name) {
		System.out.println("進入提供者sayHello方法!!!!");
		return "Provide sayHello Return:Hello World!!!";
	}

	@Override
	public String sayWord(String name) {
		System.out.println("進入提供者sayWord方法!!!!");
		return "Provide sayWord Return:Hello World!!!";
	}

}


3.spring-dubbo-provide.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:context="http://www.springframework.org/schema/context"
    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://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://code.alibabatech.com/schema/dubbo  
        http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
   
   <!-- 啓動註解 -->
   <context:component-scan base-package="com.lyh.dubbo.*" />
   
   <dubbo:registry protocol="zookeeper" address="127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183"/>
   
   <!-- 提供方應用信息,用於計算依賴關係 -->  
   <dubbo:application name="provide"  /> 
   
   <!-- 用dubbo協議在20880端口暴露服務 --> 
   <dubbo:protocol id="dubbo" name="dubbo" port="20880" />
   <dubbo:protocol id="http" name="http" port="8080" server="servlet" 
   		contextpath="provide/dubbo"/>
   
   <!-- 聲明需要暴露的服務接口 -->
   <bean id="helloWorldAPI" class="com.lyh.dubbo.api.service.HelloWordAPIService"></bean>
   <dubbo:service interface="com.lyh.dubbo.api.IHelloWorldAPI" ref="helloWorldAPI" protocol="dubbo" />
   
   <bean id="httpAPI" class="com.lyh.dubbo.api.service.HttpAPIImpl" />
   <dubbo:service id="httpProviderAPI" interface="com.lyh.dubbo.api.IHttpAPI" ref="httpAPI" 
   		protocol="http" />
</beans>

4.spring-context.xml
簡單示例,只是在Spring-context中導入spring-dubbo-privode.xml
<!-- dubbo生產者 -->
    <import resource="classpath:spring-dubbo-provide.xml"/>
4.web.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<web-app 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xmlns="http://java.sun.com/xml/ns/javaee" 
	xmlns:web="http://java.sun.com/xml/ns/javaee" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
			http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
	version="2.5">
  <display-name>tea-portal-web</display-name>

	<context-param>
	    <param-name>contextConfigLocation</param-name>
	    <param-value>
	    	classpath:spring-context.xml
	    </param-value>
	</context-param>
	<listener>
    	<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    
    <servlet>
	    <servlet-name>springmvc</servlet-name>
	    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
	    <init-param>
	      <param-name>encoding</param-name>
	      <param-value>UTF-8</param-value>
	    </init-param>
	    <init-param>
	      <param-name>contextConfigLocation</param-name>
	      <param-value>classpath:spring-mvc.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>

2.3消費者

1.關聯API的工程
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <artifactId>dubbo01-HelloWorld</artifactId>
    <groupId>com.lyh.dubbo</groupId>
    <version>0.0.1-SNAPSHOT</version>
    <relativePath>..</relativePath>
  </parent>
  <artifactId>HelloWold-Consumer</artifactId>
  <packaging>war</packaging>
  
  <dependencies>
  		<dependency>
	  		<artifactId>HelloWorld-API</artifactId>
		    <groupId>com.lyh.dubbo</groupId>
		    <version>0.0.1-SNAPSHOT</version>
  		</dependency>
  		
  		<!-- Servlet Start -->
	    <dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>servlet-api</artifactId>
			<version>${servlet-api.version}</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>org.apache.tomcat</groupId>
			<artifactId>jsp-api</artifactId>
			<version>${jsp-api.version}</version>
			<scope>provided</scope>
		</dependency>
	    <dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>jstl</artifactId>
			<version>${jstl.version}</version>
			<type>jar</type>
		</dependency>
		<!-- Servlet end -->
		
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-core</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-tx</artifactId>
	    	<version>${spring.version}</version>
	    </dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context-support</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-web</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-aop</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-jdbc</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-tx</artifactId>
			<version>${spring.version}</version>
		</dependency>
		
		<dependency>
		    <groupId>opensymphony</groupId>
		    <artifactId>oscache</artifactId>
		    <version>${oscache.version}</version>
		    <exclusions>
		    	<exclusion>
		    		<groupId>javax.jms</groupId>
		    		<artifactId>jms</artifactId>
		    	</exclusion>
		    </exclusions>
		</dependency>
		
		<dependency>
		    <groupId>commons-fileupload</groupId>
		    <artifactId>commons-fileupload</artifactId>
		    <version>${commons-fileuplad.version}</version>
		</dependency>
		
		<dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
            <version>${dubbo.version}</version>
        </dependency>
        
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>${zookeeper.version}</version>
        </dependency>
        
        <dependency>
            <groupId>com.github.sgroschupf</groupId>
            <artifactId>zkclient</artifactId>
            <version>${zkclient.version}</version>
        </dependency>
        
        <dependency>
            <groupId>org.mortbay.jetty</groupId>
            <artifactId>jetty</artifactId>
            <version>${jetty.version}</version>
            <exclusions>
                <exclusion>
                    <groupId>org.mortbay.jetty</groupId>
                    <artifactId>servlet-api</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
  </dependencies>
  
  <build>
    <plugins>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
          <source>1.6</source>
          <target>1.6</target>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>


2.COntroller或Service層直接使用API
package com.lyh.dubbo.controller;


import org.springframework.web.bind.annotation.RequestMapping;
import javax.annotation.Resource;
@org.springframework.stereotype.Controller
public class HelloWorldController {
	
	@Resource
	private com.lyh.dubbo.api.IHelloWorldAPI helloWorldAPI;
	@Resource
	private com.lyh.dubbo.api.IHttpAPI httpAPI;

	@RequestMapping(value="sayHello.do")
	public void sayHello(){
		String str = helloWorldAPI.sayHello("11111");
		System.out.println(str);
	}
	
	@RequestMapping(value="sayWorld.do")
	public void sayWorld(){
		String str = helloWorldAPI.sayWord("11111");
		System.out.println(str);
	}
	
	@RequestMapping(value="myHttp.do")
	public void myHttp(){
		System.out.println("1111");
		String str =  httpAPI.myHttp("http");
		System.out.println(str);
	}
}


3.配置dubbo-消費者
<?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:context="http://www.springframework.org/schema/context"
    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://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://code.alibabatech.com/schema/dubbo  
        http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
   
   <!-- 啓動註解 -->
   <context:component-scan base-package="com.lyh.dubbo.*" />
   
   <dubbo:registry protocol="zookeeper" address="127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183"/>
   
   <!-- 提供方應用信息,用於計算依賴關係 -->  
   <dubbo:application name="cusumer"  /> 
   
   <!-- 聲明需要暴露的服務接口 -->
   <dubbo:reference check="false" timeout="10000" interface="com.lyh.dubbo.api.IHelloWorldAPI" id="helloWorldAPI">
   		<dubbo:method name="sayHello"></dubbo:method>
   </dubbo:reference>
   
   <dubbo:reference check="false" interface="com.lyh.dubbo.api.IHttpAPI" 
   	 	timeout="10000" id="httpAPI"   />
</beans>


4.web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xmlns="http://java.sun.com/xml/ns/javaee" 
	xmlns:web="http://java.sun.com/xml/ns/javaee" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
			http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
	version="2.5">
  <display-name>tea-portal-web</display-name>

	<context-param>
	    <param-name>contextConfigLocation</param-name>
	    <param-value>
	    	classpath:spring-context.xml
	    </param-value>
	</context-param>
	<listener>
    	<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    
    <servlet>
	    <servlet-name>springmvc</servlet-name>
	    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
	    <init-param>
	      <param-name>encoding</param-name>
	      <param-value>UTF-8</param-value>
	    </init-param>
	    <init-param>
	      <param-name>contextConfigLocation</param-name>
	      <param-value>classpath:spring-mvc.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>
整體環境已經搭建成功!直接運行項目查看。也可以直接安裝Dubbo的監控或者管理頁面查看。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章