springboot整合dubbo,zookeeper實現簡單的微服務
阿新 • • 發佈:2021-01-15
zookeeper
什麼是zookeeper
zookeeper主要服務於分散式系統,使用類似於unix的檔案系統管理模式(樹狀結構)來管理多個節點(znode),還使用監聽器管理znode節點的資料變化和子節點的增減變化
應用場景
- 統一配置管理
多個機器上面的配置大同小異時,將公共的配置放到zookeeper的znode節點中,系統A,B,C監聽節點有沒有做變更,有變更則及時響應,避免同時更改多個伺服器配置檔案所帶來的麻煩 - 統一命名服務
因為zookeeper樹狀結構實現,可以生成一些唯一的命名,統一命名服務的理解其實跟域名一樣,是我們為這某一部分的資源給它取一個名字,別人通過這個名字就可以拿到對應的資源 - 分散式鎖
多個服務之間保證資源一致性需要分散式鎖實現,
多個系統訪問的時候會建立帶順序號的臨時/短暫(EPHEMERAL_SEQUENTIAL
)節點,比如,系統A建立了id_000000
節點,系統B建立了id_000002
節點,系統C建立了id_000001
節點。接著,拿到/locks
節點下的所有子節點(id_000000,id_000001,id_000002),判斷自己建立的是不是最小的那個節點
- 如果是,則拿到鎖。
- 釋放鎖:執行完操作後,把建立的節點給刪掉
- 如果不是,則監聽比自己要小1的節點變化
- 佇列管理
(4)佇列管理
兩種型別的佇列:
1、 同步佇列,當一個佇列的成員都聚齊時,這個佇列才可用,否則一直等待所有成員到達。
2、佇列按照 FIFO 方式進行入隊和出隊操作。
第二類,和分散式鎖服務中的控制時序場景基本原理一致,入列有編號,出列按編號。
dubbo
什麼是dubbo
dubbo是一個分散式的服務排程框架,可以提供服務註冊、服務發現、服務消費,
類似於springcloud的eruka等元件,將服務和消費者註冊到註冊中心,並用監控器監控所有服務,主要有
provider
用於暴露服務提供者的服務
consumer
用於消費服務提供者的服務
Registry
服務註冊與發現的註冊中心。
Monitor
統計服務的呼叫次調和呼叫時間的監控中心。
Container
服務執行容器。
買票服務示例
介面服務
介面單獨實現一個model,provider和consumer都引入介面服務的依賴,就可以將所有介面單獨管理,注意消費者和生產者的service方法路徑得一致
public interface TicketService {
String getTicket();
}
服務提供者
pom.xml
<!--引入介面服務依賴-->
<dependency>
<groupId>com.wzb</groupId>
<artifactId>service</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.3</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
<version>2.7.3</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>4.0.1</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>2.8.0</version>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.13</version>
<type>pom</type>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
properties.yml
dubbo:
application:
name: dubbo_provider
protocol:
name: dubbo
port: 20880
registry:
address: zookeeper://127.0.0.1:2181
protocol: zookeeper
scan:
base-packages: com.wzb.provider.service
spring:
application:
name: dubbo_auto_configuration_provider_demo
server:
port: 8080
service
//@Service使用的是dubbo的service註解
@Service(version = "1.0.0",interfaceClass = TicketService.class)
public class ProviderTicketService implements TicketService {
@Override
public String getTicket() {
return "芳華";
}
}
服務消費者
1.pom.xml檔案和消費者一致
2.properties.yml如下
dubbo:
application:
name: dubbo_consumer
registry:
address: zookeeper://127.0.0.1:2181
protocol: zookeeper
server:
port: 8085
3.service
@Service
public class ConsumerTicketService {
@Reference(version = "1.0.0",interfaceClass = TicketService.class)
private TicketService ticketService;
public String buyTicket(String user) {
return "welcome "+ user+" to see " + ticketService.getTicket();
}
}
這樣啟用provider和consumer服務,將服務註冊到zookeeper,並通過dubbo進行服務發現和呼叫,就可以實現一個簡單的分散式呼叫
最後:呼叫 買票
結果如下圖所示: