天天看點

DUBBO--基礎篇(一)--簡介(示意Demo)                        DUBBO--基礎篇(一)--簡介(示意Demo)完美~~

                        DUBBO--基礎篇(一)--簡介(示意Demo)

一、Dubbo由來的漸進史:

DUBBO--基礎篇(一)--簡介(示意Demo)                        DUBBO--基礎篇(一)--簡介(示意Demo)完美~~

(1)ORM史:開發過程中,占用的資源越來越多,而且随着流量的增加越來越難以維護。

(2)MVC史:垂直應用架構解決了單一應用架構所面臨的擴容問題,流量能夠分散到各個子系統當中,且系統的體積可控,一定程度上降低了開發人員之間協同以及維護的成本,提升了開發效率。 

缺點:但是在垂直架構中相同邏輯代碼需要不斷的複制,不能複用。 也隻能在一台伺服器中,是以無法抵擋高并發。

(3)RPC(分布式應用架構)史:當垂直應用越來越多,應用之間互動不可避免,将核心業務抽取出來,作為獨立的服務,逐漸形成穩定的服務中心 。但是RPC容易出現的問題就是系統之間(IP+PORT)互相調用,錯綜複雜。不好維護。

(4)SOA(流動計算架構)史:面向服務的架構體系(SOA),也是以衍生出了一系列相應的技術,如對服務提供、服務調用、連接配接處理、通信協定、序列化方式、服務發現、服務路由、日志輸出等行為進行封裝的服務架構。

二、Dubbo定義

Dubbo是 阿裡巴巴公司開源的一個高性能優秀的服務架構,使得應用可通過高性能的 RPC 實作服務的輸出和輸入功能,可以和 Spring架構無縫內建。

Dubbo提供了三大核心功能:(1)面向接口的遠端方法調用。(2)智能容錯和負載均衡。(3)服務自動注冊和發現

三、工作原理圖

DUBBO--基礎篇(一)--簡介(示意Demo)                        DUBBO--基礎篇(一)--簡介(示意Demo)完美~~

Provider: 暴露服務方稱之為“服務提供者”。

Consume: 可以調用遠端服務方 稱之為“服務消費者”。

Registry: 服務注冊于發現的中心目錄稱之為 “服務注冊中心”。

Monitor: 統計服務的調用次數和調用時間的日志服務稱之為“服務監控中心”。

調用流程:

(1)服務容器負責啟動,加載,運作服務提供者。

(2).服務提供者在啟動時,向注冊中心注冊自己提供的服務。

(3).服務消費者在啟動時,向注冊中心訂閱自己所需的服務。。

(4)注冊中心傳回服務提供者位址清單給消費者,如果有變更,注冊中心将基于長連接配接推送變更資料給消費者。 

(5)服務消費者,從提供者位址清單中,基于軟負載均衡算法,選一台提供者進行調用,如果調用失敗,再選另一台調用。

(6)服務消費者和提供者,在記憶體中累計調用次數和調用時間,定時每分鐘發送一次統計資料到監控中心。

通過将服務統一管理起來,可以有效地優化内部應用對服務釋出/使用的流程和管理。服務注冊中心可以通過特定協定來完成服務對外的統一。

Dubbo提供的注冊中心有如下幾種類型可供選擇:

  • Multicast注冊中心
  • Zookeeper注冊中心
  • Redis注冊中心
  • Simple注冊中心

在這裡我們使用的服務注冊中心為zookeeper。

四、Dubbo準備工作

(1)Linux下 安裝JDK。

網上一籮筐...自行百度

(2)Linux下安裝zookeeper(在這兒啟動一台就行...)

分布式系統詳解--架構(Zookeeper-簡介和叢集搭建)

即:開啟注冊中心

五、建立項目--服務方(student-server)

5.1 建立maven項目(simple就可以)--war工程

DUBBO--基礎篇(一)--簡介(示意Demo)                        DUBBO--基礎篇(一)--簡介(示意Demo)完美~~

5.2 pox檔案添加相應的Jar包。

<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>org.dubbo</groupId>
  <artifactId>students-server</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>war</packaging>
  
  <!-- 統一版本号 -->
  <properties>
  	<spring.version>4.3.17.RELEASE</spring.version>
  </properties>
  
  
  <dependencies>
  <!-- spring的各種依賴 -->
  	<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>
  	
  	
  	<dependency>
  		<groupId>commons-dbcp</groupId>
  		<artifactId>commons-dbcp</artifactId>
  		<version>1.4</version>
  	</dependency>
  	
  	<dependency>
  		<groupId>commons-logging</groupId>
  		<artifactId>commons-logging</artifactId>
  		<version>1.1.1</version>
  	</dependency>
  	
  	<!-- dubbo 元件 -->
  	<dependency>
  		<groupId>com.alibaba</groupId>
  		<artifactId>dubbo</artifactId>
  		<version>2.5.10</version>
  	</dependency>
  	
  	<!-- zookeeper元件 -->
  	<dependency>
  		<groupId>org.apache.zookeeper</groupId>
  		<artifactId>zookeeper</artifactId>
  		<version>3.4.12</version>
  	</dependency>
  	
  	<!-- zookeeper用戶端 -->
  	<dependency>
  		<groupId>com.github.sgroschupf</groupId>
  		<artifactId>zkclient</artifactId>
  		<version>0.1</version>
  	</dependency>
  	
  	<!-- java 幫助類 -->
   	<dependency>
  		<groupId>org.javassist</groupId>
  		<artifactId>javassist</artifactId>
  		<version>3.21.0-GA</version>
  	</dependency>
  	
  	
  	 <dependency>
  		<groupId>org.mybatis</groupId>
  		<artifactId>mybatis</artifactId>
  		<version>3.4.6</version>
  	</dependency>	
  </dependencies>
  
  <build>
  	<plugins>
  	<!-- tomcat的元件可以幫助我們内置一個tomcat,可以直接運作。 -->
  		<plugin>
  			<groupId>org.apache.maven.plugins</groupId>
  			<artifactId>maven-compiler-plugin</artifactId>
  			<version>3.7.0</version>
  			<configuration>
  				<source>1.8</source>
  				<target>1.8</target>
  				<encoding>UTF8</encoding>
  			</configuration>
  		</plugin>
  		<plugin>
			<groupId>org.apache.tomcat.maven</groupId>  
			<artifactId>tomcat7-maven-plugin</artifactId>	
			<configuration>
				<port>8881</port>
				<path>/</path>
			</configuration>	
  		</plugin>
  	  	</plugins>
  </build>
</project>
           

5.3 寫一個簡單借接口和實作類

package org.students.server;

public interface StudentServer {
	
	public String server(String name);

}
           
package org.students.server.impl;

import org.students.server.StudentServer;

import com.alibaba.dubbo.config.annotation.Service;

@Service  //該@Service為alibba 提供的注解(需要放在dubbo中被掃描,也需要放在spring中被掃描)
public class StudentServerImpl implements StudentServer{

	public String server(String name) {
		// TODO Auto-generated method stub
		return "server: "+name;
	}

}
           

5.4 在webaspp下建立WEB-INF檔案夾,新家web.xml。

DUBBO--基礎篇(一)--簡介(示意Demo)                        DUBBO--基礎篇(一)--簡介(示意Demo)完美~~

5.5 編輯web.xml。(web.xml和application頭檔案需要根據自己的情況而選擇相應的配置)

将applicationContext.xml放置web.xml中進行管理加載。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">

<!-- 內建spring 标志一下spring檔案位置 -->
<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>
           

5.6 建立applicaltionContext.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"
	xmlns:context="http://www.springframework.org/schema/context"
	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-4.3.xsd
		http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">

           <!-- dubbo相關 -->

<!-- 配置dubbo的應用名稱 -->
<dubbo:application name = "students-service" />
<!-- 配置注冊中心位址(尚未配置) -->
<dubbo:registry protocol = "zookeeper" address = "zookeeper://192.168.1.110:2181" />
<!-- 配置dubbo的掃描包  将service放置在其中,為了dubbo在之後的RPC(遠端調用時使用)              -->
<dubbo:annotation package = "org.students.server.impl.StudentServerImpl" />

<context:component-scan base-package = "org.students.server.impl.StudentServerImpl">
</context:component-scan>

</beans>
           

在這裡值得注意的是,在service的實作類上加上@service注解的時候,在applicationContext中進行配置的時候,需要在Dubbo中進行配置,在spring中也需要配置。

六、建立項目--API

6.1 項目搭建(普通Maven項目,simple)

DUBBO--基礎篇(一)--簡介(示意Demo)                        DUBBO--基礎篇(一)--簡介(示意Demo)完美~~

6.2 建立接口(在com.dubbo包中建立DemoService類)

package com.dubbo;

public interface DemoService {
	
	public String sayHello(String name);
	
}
           

七、項目搭建--服務端(server)

7.1 建立工程(普通Maven項目)

DUBBO--基礎篇(一)--簡介(示意Demo)                        DUBBO--基礎篇(一)--簡介(示意Demo)完美~~

7.2 pom檔案

在pom檔案中,需要将API的pom的各種版本資訊,作為一個dependency放在server中,這樣就可以調用其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>
  <groupId>com.dubbo</groupId>
  <artifactId>dubbo-server</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  
<dependencies>
	<dependency>
		<groupId>com.dubbo</groupId>
  		<artifactId>dubbo-api</artifactId>
 		<version>0.0.1-SNAPSHOT</version>
	</dependency>
	<dependency>
			<groupId>com.101tec</groupId>
			<artifactId>zkclient</artifactId>
			<version>0.10</version>
	</dependency>

	 	 <dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>dubbo</artifactId>
			<version>2.6.0</version>
		</dependency>
</dependencies>

</project>
           

7.3 寫一下DemoService實作類

package com.dubbo;

public class DemoServerImpl implements DemoService{

	public String sayHello(String name) {
		// TODO Auto-generated method stub
		return "Hello--"+name;
	}
}
           

7.3 server.xml

配置檔案中的dubbo做了一件事,就是将DemoService借口以及其實作類放在了dubbo的Service中,在zookeeper中的服務中心進行了注冊。

在server.xml中需要配置好關于dubbo的記個點:

(1)供應方的名稱,即dubbo:application 的name屬性。

(2)供應方将資訊注冊到zookeeper中是的位址。即dubbo:registery 中的address 屬性。

(3)dubbo協定的暴露端口号(預設為20880--不配置也可以)

(4)将API中的借口DemoService實作類寫好後,配置在spring中。值得注意的是,需要将<bean>需要放入的地方是<dubbo:service>中。

<?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"
	xmlns:context="http://www.springframework.org/schema/context"
	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-4.3.xsd
		http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
	<!--定義了提供方應用資訊,用于計算依賴關系;在 dubbo-admin 或 dubbo-monitor 會顯示這個名字,友善辨識 -->
	<dubbo:application name="demotest-server" />
	<!--使用 zookeeper 注冊中心暴露服務,注意要先開啟 zookeeper -->
	<dubbo:registry address="zookeeper://192.168.0.222:2181" />
	<!-- 用dubbo協定在20880端口暴露服務 -->
	 <dubbo:protocol name="dubbo" port="20880" />
	<dubbo:service inter ref="demoServer" protocol="dubbo" />
	<bean id="demoServer" class="com.dubbo.DemoServerImpl"> </bean>
</beans>
           

7.4 寫一個啟動類。Server.

ClassPathXmlApplicationCpntext進行讀取配置檔案,并進行啟動。

System.in.read()。隻要不在控制台上輸入。該服務将一直處于啟動狀态。

package com.dubbo;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Server {
	public static void main(String[] args) throws Exception{
		ClassPathXmlApplicationContext app = new ClassPathXmlApplicationContext("server.xml");
		app.start();
		System.out.println("----server start-----");
		System.in.read();
	}
}
           

八. 項目搭建(用戶端)Client

8.1 項目搭建(簡單Maven項目)

DUBBO--基礎篇(一)--簡介(示意Demo)                        DUBBO--基礎篇(一)--簡介(示意Demo)完美~~

8.2 pom檔案

将API類pom同樣配置過來。

<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.dubbo</groupId>
  <artifactId>dubbo-client</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  
  <dependencies>
  	<dependency>
  		<groupId>com.dubbo</groupId>
  		<artifactId>dubbo-api</artifactId>
 		 <version>0.0.1-SNAPSHOT</version>
  	</dependency>
  	<dependency>
		<groupId>com.alibaba</groupId>
		<artifactId>dubbo</artifactId>
		<version>2.6.0</version>
	</dependency>

	<dependency>
		<groupId>com.101tec</groupId>
		<artifactId>zkclient</artifactId>
		<version>0.10</version>
	</dependency>

  </dependencies>
  
</project>
           

8.3 client.xml

需要配置的跟上面不盡相同。

除了應用名稱和注冊位址一樣之外。dubbo:reference 如同 Spring中的 @Autowired注解。将DemoService依賴注入進來。而不同的是,reference是可以進行不同項目之間的調用,他調用自己的剛才注冊到Dubbo中的Service類。

<?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-admin 或 dubbo-monitor 會顯示這個名字,友善辨識 -->
		<dubbo:application name="demotest-client" />
		<!--使用 zookeeper 注冊中心暴露服務,注意要先開啟 zookeeper -->
		<dubbo:registry address="zookeeper://192.168.0.222:2181" />
		<!-- 用dubbo協定在20880端口暴露服務 -->
		<dubbo:protocol name="dubbo" port="20880" />	
		<dubbo:reference id="demoServe" inter></dubbo:reference>	
</beans>
           

8.4 Client 類

如同上面一樣,可以讀取xml檔案之後進行開啟。

因為在xml檔案中我們進行了dubbo:reference配置。是以我們可以通過getBean的方式擷取到DemoService接口。

package com.dubbo;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Client {
	
	public static void main(String[] args) throws InterruptedException {
		ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("Client.xml");
		context.start();
		while(true) {
			Thread.sleep(1000);
			DemoService demoService = (DemoService)context.getBean(DemoService.class);
			String sayHello = demoService.sayHello("zxxx");
			System.out.println(sayHello);
		}
	}
}
           

如此我們就算配置完成。

先啟動server,後啟動Client。

九。效果

9.1 啟動server

(1)server--控制台

DUBBO--基礎篇(一)--簡介(示意Demo)                        DUBBO--基礎篇(一)--簡介(示意Demo)完美~~

(2)zookeeper中

DUBBO--基礎篇(一)--簡介(示意Demo)                        DUBBO--基礎篇(一)--簡介(示意Demo)完美~~

9.2 啟動Client

(1)控制台-1秒鐘列印一個字元串

DUBBO--基礎篇(一)--簡介(示意Demo)                        DUBBO--基礎篇(一)--簡介(示意Demo)完美~~

(2)在server的控制台中随機列印

雙方服務停止。

完美~~