背景
隨着互聯網的發展,網站應用的規模不斷擴大,常規的垂直應用架構已無法應對,分佈式服務架構以及流動計算架構勢在必行,亟需一個治理系統確保架構有條不紊的演進。
單一應用架構
當網站流量很小時,只需一個應用,將所有功能都部署在一起,以減少部署節點和成本。此時,用於簡化增刪改查工作量的數據訪問框架(ORM)是關鍵。
垂直應用架構
當訪問量逐漸增大,單一應用增加機器帶來的加速度越來越小,提升效率的方法之一是將應用拆成互不相干的幾個應用,以提升效率。此時,用於加速前端頁面開發的Web框架(MVC)是關鍵。
分佈式服務架構
當垂直應用越來越多,應用之間交互不可避免,將核心業務抽取出來,作爲獨立的服務,逐漸形成穩定的服務中心,使前端應用能更快速的響應多變的市場需求。此時,用於提高業務複用及整合的分佈式服務框架(RPC)是關鍵。
流動計算架構
當服務越來越多,容量的評估,小服務資源的浪費等問題逐漸顯現,此時需增加一個調度中心基於訪問壓力實時管理集羣容量,提高集羣利用率。此時,用於提高機器利用率的資源調度和治理中心(SOA)是關鍵。
SOA:服務治理-- 最主要就是服務之間的治理(治理基本上要做成運行時治理)
dubbo架構
節點角色說明
節點 | 角色說明 |
---|---|
Provider | 暴露服務的服務提供方 |
Consumer | 調用遠程服務的服務消費方 |
Registry | 服務註冊與發現的註冊中心 |
Monitor | 統計服務的調用次數和調用時間的監控中心 |
Container | 服務運行容器 |
調用關係說明
0. 服務容器負責啓動,加載,運行服務提供者。
1.服務提供者在啓動時,向註冊中心註冊自己提供的服務。
2.服務消費者在啓動時,向註冊中心訂閱自己所需的服務。
3.註冊中心返回服務提供者地址列表給消費者,如果有變更,註冊中心將基於長連接推送變更數據給消費者。
4.服務消費者,從提供者地址列表中,基於軟負載均衡算法,選一臺提供者進行調用,如果調用失敗,再選另一臺調用。
5.服務消費者和提供者,在內存中累計調用次數和調用時間,定時每分鐘發送一次統計數據到監控中心。
環境搭建
安裝單機版zk
windows
啓動 zkServer.cmd
zk客戶端查看:zkCli.cmd
linux
啓動zookeeper:bin/zkServer.sh start
關閉zookeeper:bin/zkServer.sh stop
查看zookeeper狀態:bin/zkServer.sh status
dubbo 服務端
dubbo相關依賴
<!--dubbo start-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>${dubbo.version}</version>
</dependency>
<!--我這裏使用zookeeper作爲dubbo的註冊中心-->
<!--dubbo2.6以前的版本使用zkclient操作zookeeper-->
<!--dubbo2.6及以後的版本使用curator操作zookeeper-->
<!--根據dubbo的版本二選其一-->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>${curator.version}</version>
</dependency>
<!--<dependency>-->
<!--<groupId>com.101tec</groupId>-->
<!--<artifactId>zkclient</artifactId>-->
<!--<version>0.11</version>-->
<!--</dependency>-->
<!--dubbo end-->
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: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">
<!--1、指定當前服務/應用的名字(同樣的服務名字相同,不要和其它的服務同名)-->
<dubbo:application name="user-provider"/>
<!--2、指定註冊中心的位置(註冊中心不同,服務地址的寫法不同)-->
<dubbo:registry address="zookeeper://127.0.0.1:2181"/>
<!--3、指定通信規則(通信協議&通信端口)-->
<dubbo:protocol name="dubbo" port="20880"/>
<!--4、聲明需要暴露的服務接口,ref屬性要指向容器中的接口實現對象-->
<dubbo:service ref="userService" interface="com.myke.consumer.api.UserService"/>
<!--5.服務實現-->
<bean id="userService" class="com.myke.provider.service.UserServiceImpl"/>
</beans>
服務端啓動
@Slf4j
public class ProviderApplication {
static {
//加載日載
System.setProperty(ContextInitializer.CONFIG_FILE_PROPERTY, "logback-spring.xml");
}
public static void main(String[] args) throws IOException {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
new String[]{
"dubbo-provider.xml"});
log.info(context.getDisplayName() + ": here");
context.start();
log.info("userService beanName:[{}]", context.getBeanNamesForType(UserServiceImpl.class));
log.info("ProviderApplication 服務已經啓動...");
System.in.read();
}
}
查看 dubbo 在zk上的註冊的服務
[zk: localhost:2181(CONNECTED) 1] ls /dubbo
[com.myke.consumer.api.UserService]