《深入實踐Spring Boot》閱讀筆記之二:分散式應用開發

来源:https://www.cnblogs.com/qqtalk/archive/2018/04/07/8735223.html
-Advertisement-
Play Games

上篇文章總結了《深入實踐Spring Boot》的第一部分,這篇文章介紹第二部分:分散式應用開發,以及怎麼構建一個高性能的服務平臺。 主要從以下幾個方面總結: Spring Boot SSO 使用分散式文件系統 雲應用開發 構建高性能的服務平臺 <!-- more --> Spring Boot S ...


 

上篇文章總結了《深入實踐Spring Boot》的第一部分,這篇文章介紹第二部分:分散式應用開發,以及怎麼構建一個高性能的服務平臺。

主要從以下幾個方面總結:

  • Spring Boot SSO
  • 使用分散式文件系統
  • 雲應用開發
  • 構建高性能的服務平臺

Spring Boot SSO

上篇文章提到了安全設計,使用Spring Security進行用戶驗證和許可權驗證,但一個企業級的應用系統可能存在很多應用系統,每個應用系統都需要設計安全管理,但不可能為每一個應用系統都設計一套安全管理,這樣不但耗時耗力,而且要做重覆的工作,也不適宜建立統一的用戶中心。

可以使用單點登錄SSO的方式建立一個登錄認證系統,並且實現對用戶的統一管理。本章在使用Spring Security安全管理的基礎上,再結合OAuth2認證授權協議來實現的,它不但適用於大型的分散式管理系統,也適用於為第三方提供統一的用戶管理和認證的平臺。

作者給出了一個完整的實例,以模塊化的設計方式進行實現,整個demo的代碼可以在github上查看。(https://github.com/chenfromsz/spring-boot-sso

demo說明

我在本地運行了demo,通過chrome查看了系統間跳轉的過程,先說明下模塊的劃分,然後看下運行效果。

項目工程類型功能
資料庫管理模塊 mysql 程式集成 資料庫管理
安全配置模塊 security 程式集成 安全策略配置和許可權管理
登錄認證模塊 login Web應用 SSO登錄認證(80)
共用資源模塊 resource Web應用 共用資源(8083)
客戶端應用1 web1 Web應用 客戶端1(8081)
客戶端應用2 web2 Web應用 客戶端2(8082)

訪問首頁時,跳轉到登錄頁面,輸入正確的賬號、密碼、驗證碼。
登錄成功後,跳轉到首頁:
首頁

訪問web1系統、web2系統時不需要重新登錄,會自動登錄:
web1系統首頁

「登錄認證模塊」主要包括驗證用戶賬號、集成OAuth2服務端端功能。

「安全配置模塊」是一個公共模塊,集成了SSO客戶端的安全策略配置和許可權管理功能,供客戶端引用。

「資料庫管理模塊」是一個公共模塊,主要提供資料庫的訪問功能,供其他模塊使用。

「共用資源模塊」提供了一個簡單的公共服務,2個客戶端應用可通過spring-cloud-zuul直接調用。

後面會重點介紹下登錄認證模塊,其他模塊比較簡單,不再過多介紹。

模塊化設計可以提高代碼的復用性,避免重覆開發,實例中的「資料庫管理模塊」和「安全配置模塊」可以被其他模塊共用,減少大部分重覆工作。
作者的這種設計方式值得我們學習,在以後的系統設計中,應多借鑒這種方式。

登錄認證模塊

我畫了一個流程圖,先瞭解下用戶認證、許可權驗證的基本過程:
基本處理流程

整個處理流程,Spring Security都幫我們自動實現了,我們只需要對賬號中心數據源、許可權中心數據源進行配置和擴展,另外,可以對登錄頁面進行擴展,配置許可權管理規則、防攻擊策略、記住登錄狀態。

為了實現多個系統只需登錄一次,需要集成OAuth2。添加spring-cloud-starter-oauth2依賴,編寫一個配置類,繼承AuthorizationServerConfigurerAdapter,並聲明下@EnableAuthrizationServer來啟用OAuth2的認證伺服器功能。

OAuth2有很多授權機制,本例中使用authorization_code機制,具體配置就不過多說明瞭,可以參考下麵的幾篇文章:

[1] 初步理解Spring Security並實踐
[2] security OAuth2.0 提供者實現原理
[3] jwt token介紹
[4] security OAuth2.0 jwt完美整合例子

使用分散式文件系統

有這樣一個問題,如果上傳文件,如上傳圖片,應該怎樣保存,保存在哪裡?

傳統的做法一般都保存在Web伺服器所在機器中。但隨著業務的日益發展,可能上傳的文件會累積越來越多,單台機器往往會不堪重負,再加上一些負載均衡的配置和服務,需要分散式文件系統解決。

在諸多分散式的文件系統中,FastDFS是比較優秀的分散式文件系統。FastDFS是一個完全開源的分散式文件系統,使用比較簡單方便,而且性能也很優秀,存儲容量和訪問性能可按需求進行線性橫向擴展。

FastDFS服務端和客戶端的安排、配置、管理都比較簡單,書中描述的也比較詳細,就不在此贅述了。

雲應用開發

Spring Cloud 是一套雲應用開發工具集,為分散式的微服務開發提供了一整套簡單易用的使用工具。Spring Cloud主要包括配置管理、服務發現、動態路由、負載均衡、斷路器、安全管理、事件匯流排、分散式消息等組件的開發工具包。

Spring Cloud與Spring Boot 關係密切,能夠臻於完美的幾何使用。

本章重點介紹了配置服務、發現服務、動態路由和斷路器、監控服務。

配置服務

一個項目工程總是需要一些配置,比如,要配置伺服器的埠、訪問資料庫的參數等。一個大型的分散式系統可能存在很多這樣需要配置的項目工程,配置管理是一個龐大的工程,需要一個單獨的系統專門管理各個項目的配置。

通過Spring Cloud的配置管理,只需創建一個簡單的工程,就可以實現分散式配置管理服務,同時還支持線上更新。

第一步,配置管理伺服器
引入spring-cloud-config-server依賴,創建一個主程式:

@SpringBootApplication
@EnableConfigServer
@EnableDiscoveryClient
public class ConfigApplication{
    public static void main(String[] args) {
        SpringApplication.run(ConfigApplication.class, args);
    }
}

配置文件的存儲目前支持使用本地存儲、Git以及Subversion等方式。以Git方式為例,說明本地配置文件:

spring:
  cloud:
    config:
      server:
        git:
          uri: https://github.com/chenfromsz/spring-cloud-config-repo
  rabbitmq:
      addresses: ${vcap.services.${PREFIX:}rabbitmq.credentials.uri:amqp://${RABBITMQ_HOST:192.168.1.215}:${RABBITMQ_PORT:5672}}
      username: alan
      password: alan

服務端會自動從指定的git地址獲取配置信息。raabitmq的配置用於通知客戶端應用配置更新。

第二步,配置管理的客戶端
需要在工程中引入spring-cloud-starter-config依賴,使用配置管理服務之後,如果本地的配置文件與配置管理伺服器的配置文件有相同的配置項,將優先使用配置管理伺服器的配置項。

客戶端的配置文件bookstrap.yml如下:

spring:
  application:
    name: data
  profiles:
    active: development
  cloud:
    config:
      uri: http://localhost:8888
  rabbitmq:
        addresses: amqp://192.168.1.214:5672
        username: alan
        password: alan

其中,name用來指定應用的名稱和配置文件的名稱,uri設定配置服務服務端的地址和埠,profiles為使用配置文件名稱的尾碼部分,用於綁定不同的線上環境。

第三步,使用配置
如果配置文件中有cloud.config.test配置項,可以這樣使用

@Value("${cloud.config.test:World!}") String msg;

另外,可以使用spring-cloud-bus-amqp依賴,通過事件匯流排的方式,實現線上更新所有客戶端的配置。

發現服務

在分散式系統中,可能存在很多應用和服務,各個服務瀆職自主地管理自身的數據。服務與服務之間,需要互相共用一些數據,傳統的方式需要自己編寫一些介面程式,還需要使用複雜的配置來實現,使用Spring Cloud可以輕易做到這些。

第一步,創建發現伺服器
引入spring-cloud-starter-eureka-server依賴,創建一個簡單的主程式即可:

@SpringBootApplication
@EnableEurekaServer
public class DiscoveryApplication {
    public static void main(String[] args) {
        SpringApplication.run(DiscoveryApplication.class, args);
    }
}

第二步,創建客戶端
引入spring-cloud-starter-eurake依賴,主程式中加入@EnableDiscoveryClient啟用發現服務的客戶端。

配置文件如下:

eureka:
  instance:
    hostname: discovery
  client:
    registerWithEureka: false
    fetchRegistry: false
    serviceUrl:
      defaultZone: http://192.168.1.221:${server.port}/eureka/
動態路由和斷路器

如何在服務間相互調用呢,可以使用動態路由、斷路器和故障容錯等功能。

引入spring-cloud-starter-zuul、spring-cloud-starter-hystrix依賴,添加@EnableZuulProxy和@EnableHystrix註解即可。

為了便於測試,可以通過共用Rest資源將repository的類直接暴露出來,很神奇吧,如下:

@RepositoryRestResource(collectionResourceRel="users",path="users")
public interface UserRepository extends GraphRepository<User> {
    User findByName(@Param("name") String name);

    @Query("MATCH (u:User) WHERE u.name =~ ('(?i).*'+{name}+'.*') RETURN u")
    Collection<User> findByNameContaining(@Param("name") String name);

}

可以通過http://localhost/usershttp://localhost/users/123 之類的方式訪問。

通過以下3種方式調用其他服務對外暴露的介面:

  • JavaScript:前端直接調用
  • RestTemplate:後端調用
  • FeignClient:特殊方式

以RestTemplate為例說明一個服務調用data服務的例子:

 @Autowired @LoadBalanced
 RestTemplate restTemplate;
 @HystrixCommand(fallbackMethod = "getUserFallback")
     public User getUserByName(String name) {
         Map<String, Object> params = new HashMap<>();
         params.put("name", name);
         User user = restTemplate.getForObject("http://data/user/findByName?name={name}", User.class, params);

         return user;
 }

上面例子中使用了@HystrixCommand用於實現斷路器,當一個系統服務突然出現故障時,會自動阻斷對服務的訪問和調用,轉而調用備用方法。

監控服務

分散式服務系統中運行著很多服務,必須有一個管理機制和方法,能夠一目瞭然地隨時瞭解各個服務的運行情況及其健康指數。

使用Spring Cloud的監控服務,可以實時監控應用的運行情況。使用很簡單,引入spring-cloud-starter-hystrix-dashboard依賴,創建一個主程式即可:

@SpringBootApplication
@Controller
@EnableHystrixDashboard
public class HystrixApplication{
    @RequestMapping("/")
    public String home() {
        return "forward:/hystrix";
    }

    public static void main(String[] args) {
        SpringApplication.run(HystrixApplication.class, args);
    }
}

具體監控指標可參看官網文檔。

構建高性能的服務平臺

使用Spring Cloud開發的微服務,其獨立而又相對隔離的特性,與Docker的理念有異曲同工之妙,所以使用Docker發佈微服務,能夠發揮其最大的優勢,並且可以非常輕易地構建一個高性能和高可用的服務平臺。

Docker可以很方便地創建和管理鏡像,以及管理已經生成的和正在運行的容器。鏡像是一種文件存儲方式,可以把許多文件做成一個鏡像文件。容器是鏡像運行的一個實例,運行一個鏡像,就會生成一個容器,容器生成之後,就可以在容器中管理應用系統了。

Docker的安裝和發佈服務,網上的資料很多,這裡就不贅述了。

另外,可以使用其他一些服務管理工具來構建高性能和高可用的服務平臺。docker-compose工具是Docker容器管理工具集,可以很方便地用來創建和重建容器、執行啟動和停止容器等管理操作,以及查看整個服務體系的運行情況和輸出日誌等。使用docker-compose工具,只要一條指令就能啟動整個分散式服務體系。

通過本篇文章的介紹,大家可以感受到Spring Cloud在構建分散式應用時提供的便捷性,減少了大量的工作量。同時為我們考慮了方方面面,增強了系統的穩定性、高性能。
作者把所有代碼都上傳到github,大家可以直接運行demo深入瞭解。
[1] Spring Boot SSO:https://github.com/chenfromsz/spring-boot-sso
[2] 雲應用開發:https://github.com/chenfromsz/spring-boot-cloud

 


情情說

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 題面:https://www.cnblogs.com/fu3638/p/6759919.html 硬幣購物一共有4種硬幣。面值分別為c1,c2,c3,c4。某人去商店買東西,去了tot次。每次帶di枚ci硬幣,買si的價值的東西, 請問每次有多少種付款方法。其中di,s<=100000,tot<=1 ...
  • 1.如果是在Run Configurations中修改編碼格式的話,只能是修改當前java文件的編碼格式,把改文件中的代碼複製到 另一新建 的java文件中會出現異常,所以就會出現相同的代碼在兩個不同的java文件中卻出現了一個可以正確運行, 另一個無法正確運行的情況;此時,應當統一兩個java文件 ...
  • “賈璉欲執事” 1.載入驅動2.獲取連接3.SQL語句4.執行SQL5.釋放資源 示例: ...
  • 這可能是我在博客園的第一篇認真寫的文章,由於之前的公司工作太忙,一直沒有時間管理,平時登錄博客也只是把不常見問題的解決辦法記錄一下,現在離職了,時間較為富裕,在準備新面試之前將去年遇到的難點一一梳理一下。 高併發業務場景在電商系統中經常出現,尤其是庫存方面,搞不好就要超賣,給公司造成直接的經濟損失, ...
  • 今天,我學習了這個web前端中的C#語言,瞭解到在這個軟體的使用當中,原來有這麼多神奇和奇妙的方式,原來在我們生活中、工作中、學習中無處不在,我學習了c#語言所使用的編譯器,書寫方式,如何使用VS軟體進行代碼編寫和其中的語法和重要知識點,這是一個奇妙的開始,希望在將來的電腦語言中,我能探索更多的奧 ...
  • 很多人問:我高中都沒畢業能學好Java嗎?我數學差的要死我能學好Java嗎?我英語一竅不通我能學好Java嗎?學習Java到底要多久?等等。現在換我問你們:你們真的想學好Java嗎?你們打算怎麼樣學好Java?你們是否真的想好要學習Java了? Java- 近10年來電腦軟體發展過程中的傳奇,其在 ...
  • 簡單音樂播放器 在工程根目錄下建立一個sounds文件夾,格式只能是wav格式 輸入想播放的歌名,然後自動播放 ...
  • No. 方法名稱 功能 字元與字元串 01 public String(char[] value) 將字元數組中所有內容變為字元串 02 public String(char[] value,int offset,int count) 將字元數組中部分內容變為字元串 03 public char c ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...