1. 程式人生 > 實用技巧 >【SpringBoot1.x】SpringBoot1.x 分散式

【SpringBoot1.x】SpringBoot1.x 分散式

SpringBoot1.x 分散式

分散式應用

Zookeeper&Dubbo

ZooKeeper 是用於分散式應用程式的高效能協調服務。它在一個簡單的介面中公開了常見的服務,例如命名,配置管理,同步和組服務,因此您不必從頭開始編寫它們。您可以現成使用它來實現共識,組管理,領導者選舉和狀態協議。您可以根據自己的特定需求在此基礎上構建。

Apache Dubbo 是一款高效能、輕量級的開源 Java 服務框架。它提供了六大核心能力:面向介面代理的高效能RPC呼叫,智慧容錯和負載均衡,服務自動註冊和發現,高度可擴充套件能力,執行期流量排程,視覺化的服務治理與運維。它最大的特點是按照分層的方式來架構,使用這種方式可以使各個層之間解耦合(或者最大限度地鬆耦合)。從服務模型的角度來看,Dubbo採用的是一種非常簡單的模型,要麼是提供方提供服務,要麼是消費方消費服務,所以基於這一點可以抽象出服務提供方(Provider)和服務消費方(Consumer)兩個角色。

安裝 Zookeeper

  • 下載:docker pull zookeeper:3.4.14
  • 執行:docker run --name zookeeper -p 2181:2181 -p 2888:2888 -p 3888:3888 -p 8088:8080 --restart always -d zookeeper:3.4.14

整合使用

本節原始碼

  • 安裝 zookeeper 作為註冊中心

  • 編寫服務提供者,分為三步:

    • 引入 dubbo 和 zookeeper 相關依賴

              <!-- https://mvnrepository.com/artifact/com.alibaba.boot/dubbo-spring-boot-starter -->
              <dependency>
                  <groupId>com.alibaba.boot</groupId>
                  <artifactId>dubbo-spring-boot-starter</artifactId>
                  <version>0.1.2.RELEASE</version>
              </dependency>
      
    • 配置 dubbo 的註冊中心地址和掃描包

      dubbo.application.name=provider-ticket
      dubbo.registry.address=zookeeper://localhost:2181
      dubbo.scan.base-packages=cn.parzulpan.ticket.service
      
    • 使用 @com.alibaba.dubbo.config.annotation.Service,將服務釋出出去,src/main/java/cn/parzulpan/ticket/service/TicketServiceImpl.java

      /**
      * @Author : parzulpan
      * @Time : 2021-01
      * @Desc :
      */
      
      @Service
      @com.alibaba.dubbo.config.annotation.Service    //將服務釋出出去
      public class TicketServiceImpl implements TicketService {
          @Override
          public String getTicket() {
              return "《大鬧天宮》";
          }
      }
      
  • 編寫服務消費者,分為三步:

    • 引入 dubbo 和 zookeeper 相關依賴

              <!-- https://mvnrepository.com/artifact/com.alibaba.boot/dubbo-spring-boot-starter -->
              <dependency>
                  <groupId>com.alibaba.boot</groupId>
                  <artifactId>dubbo-spring-boot-starter</artifactId>
                  <version>0.1.2.RELEASE</version>
              </dependency>
      
    • 配置 dubbo 的註冊中心地址

      dubbo.application.name=consumer-user
      dubbo.registry.address=zookeeper://localhost:2181
      
    • 消費服務,src/main/java/cn/parzulpan/user/service/UserService.java

      @Service
      public class UserService {
      
          @Reference  // 遠端引用,按照註冊中心的全類名匹配的
          TicketService ticketService;
      
          public void get() {
              String ticket = ticketService.getTicket();
              System.out.println("買到票了:" + ticket);
          }
      }
      
  • 測試,先啟動服務提供者,然後執行測試程式

    @RunWith(SpringRunner.class)
    @SpringBootTest
    public class ConsumerUserApplicationTests {
    
        @Autowired
        UserService userService;
    
        @Test
        public void contextLoads() {
            userService.get();
        }
    }
    

SpringBoot&SpringCloud

SpringCloud 為開發人員提供了工具,以快速構建分散式系統中的一些常見模式(例如配置管理,服務發現,斷路器,智慧路由,微代理,控制匯流排,一次性令牌,全域性鎖,領導選舉,分散式會話,群集狀態)。分散式系統的協調導致樣板式樣,並且使用 SpringCloud 開發人員可以快速站起來實現這些樣板的服務和應用程式。它們可以在任何分散式環境中正常工作,包括開發人員自己的膝上型電腦,裸機資料中心以及 Cloud 等託管平臺。

Spring Cloud 分散式開發,常用解決方案:

  • Spring Cloud Alibaba
  • Spring Cloud Netflix

Spring Cloud Alibaba

Spring Cloud Alibaba

Spring Cloud Alibaba 致力於提供微服務開發的一站式解決方案。此專案包含開發分散式應用微服務的必需元件,方便開發者通過 Spring Cloud 程式設計模型輕鬆使用這些元件來開發分散式應用服務。依託 Spring Cloud Alibaba,您只需要新增一些註解和少量配置,就可以將 Spring Cloud 應用接入阿里微服務解決方案,通過阿里中介軟體來迅速搭建分散式應用系統。

主要功能

  • 服務限流降級:預設支援 WebServlet、WebFlux, OpenFeign、RestTemplate、Spring Cloud Gateway, Zuul, Dubbo 和 RocketMQ 限流降級功能的接入,可以在執行時通過控制檯實時修改限流降級規則,還支援檢視限流降級 Metrics 監控。
  • 服務註冊與發現:適配 Spring Cloud 服務註冊與發現標準,預設集成了 Ribbon 的支援。
  • 分散式配置管理:支援分散式系統中的外部化配置,配置更改時自動重新整理。
  • 訊息驅動能力:基於 Spring Cloud Stream 為微服務應用構建訊息驅動能力。
  • 分散式事務:使用 @GlobalTransactional 註解,高效並且對業務零侵入地解決分散式事務問題。
  • 阿里雲物件儲存:阿里雲提供的海量、安全、低成本、高可靠的雲端儲存服務。支援在任何應用、任何時間、任何地點儲存和訪問任意型別的資料。
  • 分散式任務排程:提供秒級、精準、高可靠、高可用的定時(基於 Cron 表示式)任務排程服務。同時提供分散式的任務執行模型,如網格任務。網格任務支援海量子任務均勻分配到所有 Worker(schedulerx-client)上執行。
  • 阿里雲簡訊服務:覆蓋全球的簡訊服務,友好、高效、智慧的互聯化通訊能力,幫助企業迅速搭建客戶觸達通道。

主要元件

  • Sentinel:把流量作為切入點,從流量控制、熔斷降級、系統負載保護等多個維度保護服務的穩定性。
  • Nacos:一個更易於構建雲原生應用的動態服務發現、配置管理和服務管理平臺。
  • RocketMQ:一款開源的分散式訊息系統,基於高可用分散式叢集技術,提供低延時的、高可靠的訊息釋出與訂閱服務。
  • Dubbo:Apache Dubbo™ 是一款高效能 Java RPC 框架。
  • Seata:阿里巴巴開源產品,一個易於使用的高效能微服務分散式事務解決方案。
  • Alibaba Cloud OSS: 阿里雲物件儲存服務(Object Storage Service,簡稱 OSS),是阿里雲提供的海量、安全、低成本、高可靠的雲端儲存服務。您可以在任何應用、任何時間、任何地點儲存和訪問任意型別的資料。
  • Alibaba Cloud SchedulerX: 阿里中介軟體團隊開發的一款分散式任務排程產品,提供秒級、精準、高可靠、高可用的定時(基於 Cron 表示式)任務排程服務。
  • Alibaba Cloud SMS: 覆蓋全球的簡訊服務,友好、高效、智慧的互聯化通訊能力,幫助企業迅速搭建客戶觸達通道。

使用步驟

  • 引入依賴,如果需要使用已釋出的版本,在 dependencyManagement 中新增如下配置

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2.2.3.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    
  • 版本管理

    • 1.5.x 版本適用於 Spring Boot 1.5.x
    • 2.0.x 版本適用於 Spring Boot 2.0.x
    • 2.1.x 版本適用於 Spring Boot 2.1.x
    • 2.2.x 版本適用於 Spring Boot 2.2.x

Spring Cloud Netflix

Spring Cloud Netflix

該專案通過自動配置並繫結到 Spring Environment 和其他 Spring 程式設計模型習慣用法,為 Spring Boot 應用程式提供了 Netflix OSS 整合。通過一些簡單的註釋,您可以快速啟用和配置應用程式內部的通用模式,並使用經過實戰檢驗的 Netflix 元件構建大型分散式系統。提供的模式包括服務發現(Eureka),斷路器(Hystrix),智慧路由/服務閘道器(Zuul),客戶端負載平衡(Ribbon)和 分散式配置(Spring Cloud
Config)。

主要功能

  • 服務發現:可以註冊 Eureka 例項,並且客戶端可以使用 Spring 託管的 Bean 發現例項
  • 服務發現:可以使用宣告性 Java 配置建立嵌入式 Eureka 伺服器
  • 斷路器:Hystrix 客戶端可以使用簡單的註釋驅動的方法裝飾器構建
  • 斷路器:具有宣告性 Java 配置的嵌入式 Hystrix 儀表板
  • 客戶端負載均衡器:功能區
  • 外部配置:從 Spring Environment 到 Archaius 的橋樑(使用 Spring Boot 約定啟用 Netflix 元件的本機配置)
  • 路由器和過濾器:Zuul 過濾器的自動註冊,以及用於反向代理建立的簡單配置約定

主要元件

  • spring-cloud-netflix-archaius
  • spring-cloud-netflix-concurrency-limits
  • spring-cloud-netflix-hystrix-contract
  • spring-cloud-netflix-hystrix-dashboard
  • spring-cloud-netflix-hystrix-stream
  • spring-cloud-netflix-hystrix
  • spring-cloud-netflix-ribbon
  • spring-cloud-netflix-turbine-stream
  • spring-cloud-netflix-turbine
  • spring-cloud-netflix-zuul

整合使用

本節原始碼

  • 編寫 eureka 註冊中心
    • 匯入相關依賴
    • 編寫註冊中心
      • 配置 eureka 資訊
      • 使用 @EnableEurekaServer 啟用註冊中心服務
      • 啟動註冊中心,訪問 http://localhost:8761/ 就能看到註冊中心的介面
  • 編寫 服務提供者
    • 匯入相關依賴
    • 將服務提供者註冊到 eureka 註冊中心
      • 配置 eureka 資訊
      • 可以觀察到註冊中心的介面,執行的示例。同一個應用也可以註冊多次
        • 分別使用 8801 和 8002 埠,然後 打包啟動這兩個應用
  • 編寫 服務消費者
    • 匯入相關依賴
    • 從 eureka 註冊中心取得服務給消費者
      • 配置 eureka 資訊
      • 使用 @EnableDiscoveryClient 啟用發現服務功能
  • 測試,先啟動 eureka 註冊中心,再啟動服務提供者,最後啟動服務消費者

總結和練習