1. 程式人生 > >服務化的時代已經來臨:學習dubbo有感

服務化的時代已經來臨:學習dubbo有感

IT行業日新月異,瘋狂的發展速度令人感慨萬分,與之帶來的挑戰也更加明顯!如誇張到不可思議的大資料,愈發膨脹的服務等等等等,都是我們要去面對學習解決的問題,當然如果你只是去開發簡單的專案 並一直如此,你可能就沒有必要去面對這些。去應對挑戰,學習新的技能是個很愉快但也摻雜痛苦的過程,首先你要確定自己的方向,沒有方向你連前進的路都找不到,只會有拔劍四顧心茫然的迷茫。

大資料方面已經有了好多穩定的框架,並且資料很是豐富,有一點你可能需要清楚,這只是用來處理資料的,但處理資料的究極目標是什麼?無非是展示給人來看,這就是需要來實現的服務。服務實現或許很是簡單,一個表的增刪改查就可以是一個服務,這就又有了一個很重要也很棘手的問題,這就是如果你的服務越來越多,呼叫越來越複雜,你該如何去解決這個問題!,這就引出了服務化的概念!

什麼是服務化,我個人理解是:改變原有的mvc開發模式和思想,把之前的縱向開發演變為呼叫服務的橫向開發,不是把所有的實現都放到一個工程裡,而是把一些服務層的東西抽取出來,註冊後一個公用的服務,在需要的地方呼叫!這種理解可能與事實變差很遠,希望高手給與指點。

我們為什麼要用服務化?或者說什麼時候要用到服務化,這才是大家真正關心的問題!

一個大的專案有多個子業務工程和業務庫(每個業務庫歸屬一個業務工程),但工程之間的好多資料是要共享的,比如一個業務庫的資料是其他幾個業務工程也需要的東西,這就涉及到表的同義詞或是資料庫分中心之類,專案越來越大,表的結構也不可能一層不變,資料庫的耦合越來越緊,感覺壓抑的喘不過氣,想要解耦資料庫的關聯怎麼辦?用服務化!

一個公司的幾個專案之間沒有很多的資料庫耦合,但有一些資料互動,通常會選擇使用webservice或是ejb之類,這涉及到一個開發量和更改量的問題(題外話:個人表示很不喜歡webservice,就算用工具生成,呼叫程式碼也繁瑣),介面的變化會嚴重影響兩個工程的其他功能應用,或者一個工程掛掉或是重啟,直接導致了呼叫服務的不可用!想要斬斷這些藕斷絲連,我死你也別想活的關係咋辦?用服務化!

功能越來越豐富,專案越來越龐大,需要的資源也就越來越多,對伺服器的要求也就更高!傳統的應對方案就是加硬體,換伺服器,這跟大資料處理的起源一個概念,硬體的價格會成指數級的上升!想要 馬跑的快,草呢還不能吃的太好(你吃的太好我掙什麼錢呀),怎麼辦?用服務化!

服務化的大餅畫的這兒漂亮,好多公司和團隊都想著去吃一口,那我們該如何去實現服務化呢?阿里巴巴推出了一個dubbo的開源框架,專門的來實現服務化!dubbo的開發或者說是整合很是簡單漂亮,它依賴於spring(官方推薦,你不用spring也可以用,只是呼叫api,個人感覺呼叫api很不好,麻煩不說,很多東西要自己控制,容易出漏子),你可以很簡單的整合到自己的工程中,只需要簡單加入jar包或是依賴,然後改變或是加入你的spring配置,你原有的程式碼不需要或是很小的改動就能實現服務的釋出!

服務的釋出有什麼用呢?這就是服務化的核心了(純個人感覺,歡迎拍磚)!服務釋出註冊後,你可以提供你的介面和bean的java檔案給想要呼叫你的使用者,在他們的工程中配置好你的服務(只需要簡單的在spring檔案中配置兩三行,或是直接用api呼叫)為一個bean,然後可以像呼叫普通spring的bean一樣去呼叫你釋出的服務,簡單的令人髮指!當然jar或者依賴還有dubbo基本配置是不可少的,

看上去好簡單吧,別猶豫去dubbo的官方看下,然後走一個簡單的例子,你可能會驚喜的叫出來!至於其他的你能想到或是需要的一些東西,dubbo都已經提供,如叢集使用,負載均衡,監控,管理等等等等,一應具有!

學習探索服務化的過程不單單是學習框架的過程,還有一些知識經驗思想的進步與積累,關於服務化的其他一些想法和建議,會在之後的文章中提到,希望大家多多指點謝謝!

附上dubbo的依賴(包括使用zookeeper作為註冊中心的依賴):

<properties>
  	<spring.version>3.1.1.RELEASE</spring.version>
  	<log4j.version>1.2.12</log4j.version>
  	<slf4j.version>1.6.1</slf4j.version>
  	<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  	<project.reporting.sourceEncoding>UTF-8</project.reporting.sourceEncoding>
  </properties>

  <dependencies>
  	<dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>dubbo</artifactId>	
        <version>2.5.3</version>
    </dependency>
    <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-context</artifactId>
    	<version>${spring.version}</version>
    </dependency>
    <dependency>
    	<groupId>org.springframework</groupId>
    	<artifactId>spring-context-support</artifactId>
    	<version>${spring.version}</version>
    </dependency>
    <dependency>
			<groupId>log4j</groupId>
			<artifactId>log4j</artifactId>
			<version>1.2.15</version>
			<exclusions>
				<exclusion>
					<groupId>com.sun.jmx</groupId>
					<artifactId>jmxri</artifactId>
				</exclusion>
				<exclusion>
					<groupId>com.sun.jdmk</groupId>
					<artifactId>jmxtools</artifactId>
				</exclusion>
				<exclusion>
					<groupId>javax.jms</groupId>
					<artifactId>jms</artifactId>
				</exclusion>
			</exclusions>
		</dependency>
		<dependency>
			<groupId>org.apache.zookeeper</groupId>
			<artifactId>zookeeper</artifactId>
			<version>3.4.5</version>
		</dependency>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.7</version>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>com.github.sgroschupf</groupId>
			<artifactId>zkclient</artifactId>
			<version>0.1</version>
		</dependency>
  </dependencies>