(二).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的监控或者管理页面查看。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值