1. 程式人生 > 其它 >springboot整合dubbo,zookeeper實現簡單的微服務

springboot整合dubbo,zookeeper實現簡單的微服務

技術標籤:JAVAjavazookeeper分散式

zookeeper

什麼是zookeeper

zookeeper主要服務於分散式系統,使用類似於unix的檔案系統管理模式(樹狀結構)來管理多個節點(znode),還使用監聽器管理znode節點的資料變化和子節點的增減變化

應用場景

  1. 統一配置管理
    多個機器上面的配置大同小異時,將公共的配置放到zookeeper的znode節點中,系統A,B,C監聽節點有沒有做變更,有變更則及時響應,避免同時更改多個伺服器配置檔案所帶來的麻煩
  2. 統一命名服務
    因為zookeeper樹狀結構實現,可以生成一些唯一的命名,統一命名服務的理解其實跟域名一樣,是我們為這某一部分的資源給它取一個名字,別人通過這個名字就可以拿到對應的資源
  3. 分散式鎖
    多個服務之間保證資源一致性需要分散式鎖實現,
    多個系統訪問的時候會建立帶順序號的臨時/短暫(EPHEMERAL_SEQUENTIAL)節點,比如,系統A建立了id_000000節點,系統B建立了id_000002節點,系統C建立了id_000001節點。接著,拿到/locks節點下的所有子節點(id_000000,id_000001,id_000002),判斷自己建立的是不是最小的那個節點
  • 如果是,則拿到鎖。
    • 釋放鎖:執行完操作後,把建立的節點給刪掉
  • 如果不是,則監聽比自己要小1的節點變化
  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進行服務發現和呼叫,就可以實現一個簡單的分散式呼叫
最後:呼叫 買票
結果如下圖所示:
消費者呼叫結果