隨著互聯網的發展,應用系統變得越來越龐大,單體應用由於存在著「修改一點全部都需部署」的問題,讓開發和測試做了好多重複的工作,苦不堪言。我們需要引入「微服務」的理念,對項目根據業務進行模塊化拆分。
比如,一個商城系統可以拆分為產品product服務、訂單order服務、用戶user服務。服務之間的通訊(比如用戶服務需要查看某一用戶的訂單數據)就需要用到RPC(遠程過程調用),需要服務提供者將服務發佈到註冊中心(zookeeper)中,然後服務消費者來調用自己需要的服務。註冊中心就相當於服務的中介起到牽線搭橋的作用。
一、技術簡介
1、Zookeeper
Zookeeper是一個分佈式的、開放源碼的分佈式應用程序協調服務。它是一個為分佈式應用提供一致性服務的軟件,提供的功能包括:配置維護、域名服務、分佈式同步、組服務等。
Zookeeper主要用來做註冊中心,下面會使用docker安裝啟動Zookeeper。
①下載zookeeper鏡像。使用docker中國的鏡像加速。
docker pull registry.docker-cn.com/library/zookeeper
②啟動zookeeper,使用鏡像的ID啟動。
docker run --name zk01 -p 2181:2181 --restart always -d 397be0d8fa45
2、Dubbo
Dubbo是阿里巴巴開源的分佈式服務框架,最大的特點是按照分層的方式來架構,使用這種方式可以使各個層之間解耦合(或者最大限度的松耦合)。從服務模型的角度來看,Dubbo採用的是一種非常簡單的模型,要麼是提供方提供服務,要麼是需求方消費服務,所以基於這一點可以抽象出服務提供方(provider)和服務消費方(consumer)兩個角色
使用dubbo來作為rpc框架來保證服務的調用。
下圖是dubbo的架構圖,中文文檔http://dubbo.apache.org/books/dubbo-dev-book/design.html
1.Provider: 暴露服務的服務提供方.
- Consumer: 調用遠程服務的服務消費方。
- Registry: 服務註冊與發現的註冊中心。
- Monitor: 統計服務的調用次調和調用時間的監控中心。
- Container: 服務運行容器。
- 調用關係說明:
- 服務容器負責啟動,加載,運行服務提供者。
- 服務提供者在啟動時,向註冊中心註冊自己提供的服務。
- 服務消費者在啟動時,向註冊中心訂閱自己所需的服務。
- 註冊中心返回服務提供者地址列表給消費者,如果有變更,註冊中心將基於長連接推送變更數據給消費者。
- 服務消費者,從提供者地址列表中,基於軟負載均衡算法,選一臺提供者進行調用,如果調用失敗,再選另一臺調用。
- 服務消費者和提供者,在內存中累計調用次數和調用時間,定時每分鐘發送一次統計數據到監控中心。
3、創建服務提供者和消費者兩個工程
提供者:
①服務提供者,引入bubbo的Springboot的starter
com.alibaba.boot dubbo-spring-boot-starter 0.2.0
引入zookeeper的客戶端工具
com.github.sgroschupf zkclient 0.1
②配置application配置文件
dubbo.application.name=provider-do#註冊中心地址dubbo.register.address=zookeeper://172.20.10.8:2181#dubbo的掃描包dubbo.scan.base-packages=com.pcx.providerdo.service
③在服務的類中添加dubbo的@service啟動application即可.
package com.pcx.providerdo.service;import com.alibaba.dubbo.config.annotation.Service;import org.springframework.stereotype.Component;@Component@Servicepublic class DoserviceImpl implements DoService { @Override public String doThing() { return "我在做事-----------------"; }}
for dubbo config bean [name : 1] has been registered.成功發佈
消費者:
①引入依賴
②配置註冊中心地址
dubbo.application.id=consumerdubbo.register.address=zookeeper://172.20.10.8:2181
③使用:
package com.pcx.consumer.service;import com.alibaba.dubbo.config.annotation.Reference;import com.pcx.service.DoService;import org.springframework.stereotype.Service;@Servicepublic class GoService { @Reference DoService doService; public void hello(){ String s = doService.doThing(); System.out.println("你在幹啥"+s); }}
控制檯打印「你在幹啥我在做事---------------」
即可。
閱讀更多 平常心cz 的文章