1.Dubbo簡介
Dubbo是一個分佈式服務框架,致力於提供高性能和透明化的RPC遠程服務調用方案,以及SOA服務治理方案
Dubbo是阿里巴巴SOA服務化治理方案的核心框架,每天爲2,000+個服務提供3,000,000,000+次訪問量支持,並被廣泛應用於阿里巴巴集團的各成員站點。
Dubbo是阿里巴巴SOA服務化治理方案的核心框架,每天爲2,000+個服務提供3,000,000,000+次訪問量支持,並被廣泛應用於阿里巴巴集團的各成員站點。
1.1、Dubbo是什麼
Dubbo是一個分佈式服務框架,致力於提供高性能和透明化的RPC遠程服務調用方案,以及SOA服務治理方案。
其核心部分包含:
遠程通訊: 提供對多種基於長連接的NIO框架抽象封裝,包括多種線程模型,序列化,以及“請求-響應”模式的信息交換方式。
集羣容錯: 提供基於接口方法的透明遠程過程調用,包括多協議支持,以及軟負載均衡,失敗容錯,地址路由,動態配置等集羣支持。
自動發現: 基於註冊中心目錄服務,使服務消費方能動態的查找服務提供方,使地址透明,使服務提供方可以平滑增加或減少機器。
其核心部分包含:
遠程通訊: 提供對多種基於長連接的NIO框架抽象封裝,包括多種線程模型,序列化,以及“請求-響應”模式的信息交換方式。
集羣容錯: 提供基於接口方法的透明遠程過程調用,包括多協議支持,以及軟負載均衡,失敗容錯,地址路由,動態配置等集羣支持。
自動發現: 基於註冊中心目錄服務,使服務消費方能動態的查找服務提供方,使地址透明,使服務提供方可以平滑增加或減少機器。
1.2、Dubbo能做什麼
透明化的遠程方法調用,就像調用本地方法一樣調用遠程方法,只需簡單配置,沒有任何API侵入。
軟負載均衡及容錯機制,可在內網替代F5等硬件負載均衡器,降低成本,減少單點。
服務自動註冊與發現,不再需要寫死服務提供方地址,註冊中心基於接口名查詢服務提供者的IP地址,並且能夠平滑添加或刪除服務提供者。
軟負載均衡及容錯機制,可在內網替代F5等硬件負載均衡器,降低成本,減少單點。
服務自動註冊與發現,不再需要寫死服務提供方地址,註冊中心基於接口名查詢服務提供者的IP地址,並且能夠平滑添加或刪除服務提供者。
1.3、Dubbo的核心部件
Remoting: 網絡通信框架,實現了sync-over-async 和 request-response 消息機制.
RPC: 一個遠程過程調用的抽象,支持負載均衡、容災和集羣功能
Registry: 服務目錄框架用於服務的註冊和服務事件發佈和訂閱。
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的監控或者管理頁面查看。