主頁 > 軟體設計 > SpringCloud學習筆記(十)----服務熔斷與限流 Sentinel

SpringCloud學習筆記(十)----服務熔斷與限流 Sentinel

2021-01-12 11:40:37 軟體設計

SpringCloud Alibaba Sentinel實作熔斷與限流

Sentinel概述

隨著微服務的流行,服務和服務之間的穩定性變得越來越重要,Sentinel 是面向分布式服務架構的流量控制組件,主要以流量為切入點,從限流、流量整形、熔斷降級、系統負載保護、熱點防護等多個維度來幫助開發者保障微服務的穩定性,
在這里插入圖片描述
Sentinel下載地址

安裝Sentinel控制臺

Sentinel組件由倆部分組成:后臺和前臺8080,

  • 核心庫(Java客戶端)不依賴任何框架/庫,能夠運行于所有Java運行時環境,同時對Dubbo/SpringCloud等框架也有較好的支持,
  • 控制臺(Dashboard)基于Spring Boot開發,打包后可以直接運行, 不需要額外的Tomcat等應用容器,

下載到本地sentinel-dashboard-1.7.0.jar

運行命令:

  • 前提:java8環境OK,8080埠不能被占用,
  • 命令:java -jar sentinel-dashboard-1.7.0.jar

訪問sentinel管理界面:

  • http://localhost:8080
  • 賬號密碼均為sentinel

微服務整合sentinel

1.啟動Nacos
2.新建cloudalibaba-sentinel-service8401 Module
2.1 POM.xml

<dependencies>
        <dependency>
            <groupId>com.atguigu.springcloud</groupId>
            <artifactId>cloud-api-commons</artifactId>
            <version>${project.version}</version>
        </dependency>

        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-datasource-nacos</artifactId>
        </dependency>

        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
      
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>4.6.3</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

    </dependencies>

2.2application.yml

server:
  port: 8401

spring:
  application:
    name: cloudalibaba-sentinel-service
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
    sentinel:
      transport:
        dashboard: localhost:8080
        port: 8719  #默認8719,假如被占用了會自動從8719開始依次+1掃描,直至找到未被占用的埠

management:
  endpoints:
    web:
      exposure:
        include: '*'

2.3主啟動類

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

2.4controller

@RestController
public class FlowLimitController
{
    @GetMapping("/testA")
    public String testA() {
        return "------testA";
    }

    @GetMapping("/testB")
    public String testB() {

        return "------testB";
    }
}

3.啟動Sentinel8080 啟動微服務8401

4.查看sentinel控制臺,發現空空如也,啥都沒有,是因為sentinel是采用懶加載,需要我們執行一次訪問,才會有資訊,
訪問localhost/8401/testA
在這里插入圖片描述
可以看到,已經開始監聽了,

流控規則

基本介紹

在這里插入圖片描述

  • 資源名:唯一名稱,默認請求路徑,
  • 針對來源:Sentinel可以針對呼叫者進行限流,填寫微服務名,默認default(不區分來源)
  • 閾值型別/單機閾值:
    • QPS(每秒鐘的請求數量):當呼叫該api的QPS達到閾值的時候,進行限流,
    • 執行緒數:當呼叫該api的執行緒數達到閾值的時候,進行限流,
  • 流控模式:
    • 直接:api達到限流條件時,直接限流,
    • 關聯:當關聯的資源達到閾值時,就限流自己,
    • 鏈路:只記錄指定鏈路上的流量(指定資源從入口資源進行的流量,如果達到閾值,就進行限流)【api級別的針對來源】
  • 流控效果:
    • 快速失敗:直接失敗,拋例外,
    • Warm UP:根據codeFactor(冷加載因子,默認3)的值,從閾值/codeFactor,經過預熱時長,才達到設定的QPS閾值,
    • 排隊等待:勻速排隊,讓請求以勻速的速度通過,閾值型別必須設定為QPS,否則無效,

流控模式

直接->快速失敗

在這里插入圖片描述
快速點擊訪問http://localhost:8401/testA,直接失敗的效果如下圖:
在這里插入圖片描述

執行緒數:
在這里插入圖片描述
比如a請求過來,處理的慢,在一直處理,此時b請求又過來了,此時因為a占用一個執行緒,此時要處理b請求就只有額外開啟一個執行緒,那么就會報錯,

修改controller中testA方法,使用定時器來模擬業務處理請求比較慢的情況,

@GetMapping("/testA")
    public String testA() {
        try {
            Thread.sleep(800);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return "------testA";
    }

在這里插入圖片描述

關聯

當關聯的資源達到閾值時,就限流自己,
一句話來說,當與A關聯的資源B達到閾值后,就限流自己,B惹事,A掛了,

應用場景:比如支付介面達到閾值時,就要限流下訂單的介面,防止一直有訂單,

在這里插入圖片描述
這里可以使用postman模擬并發密集訪問testB,大批量執行緒高并發訪問B,導致A失效了, 這時候再去訪問testA,可以發現testA掛了,

鏈路

多個請求呼叫了同一個微服務,

流控效果

直接->快速失敗(默認的流控處理)

直接失敗,拋出例外

Blocked by Sentinel (flow limiting)

原始碼:

com.alibaba.csp.sentinel.slots.block.flow.controller.DefaultController
預熱

公式:閾值除以coldFactor(默認值為3),經過預熱時長后才會達到閾值,
在這里插入圖片描述
Warmup配置:
在這里插入圖片描述
應用場景:秒殺系統在開啟的瞬間,會有很多流量上來,很有可能吧系統打死,預熱方式就是為了保護系統,可慢慢的把流量放進來,慢慢的把閾值增長到設定的閾值,

排隊等待:

在這里插入圖片描述
在這里插入圖片描述

降級規則

基本介紹

就是熔斷降級,
在這里插入圖片描述
在這里插入圖片描述
Sentinel熔斷降級會在呼叫鏈路中某個資源出現不穩定狀態時(例如呼叫超時或例外比例升高),對這個資源的呼叫進行限制,讓請求快速失敗,避免影響到其它的資源而導致級聯錯誤,
當資源被降級后,在接下來的降級時間視窗之內,對該資源的呼叫都自動熔斷(默認行為是拋出DegradeException),

Sentinel的斷路器是沒有半開狀態的,
半開的狀態系統自動去檢測是否請求有例外,沒有例外就關閉斷路器恢復使用,有例外則繼續打開斷路器不可用,具體可以 參考Hystrix,

降級策略

RT

在這里插入圖片描述
在這里插入圖片描述
測驗:
1.在controller添加一個方法,用于測驗

 @GetMapping("/testD")
    public String testD()
    {
        try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); }
        log.info("testD 測驗RT");

        return "------testD";
    }

2.配置RT,這里的配置的RT,默認是秒級的平均回應時間,
在這里插入圖片描述
默認計算平均時間是,1秒內進入5個請求,并且回應的平均值超過閾值(這里設定的200ms),就報錯, 1秒5請求是Sentinel默認設定的,

測驗:
在這里插入圖片描述
后續停止jmeter,沒有這么大的訪問量了,斷路器關閉(保險絲恢復),微服務恢復OK,在這里插入圖片描述

例外比例

在這里插入圖片描述
在這里插入圖片描述
測驗:
1.修改請求方法:

 @GetMapping("/testD")
    public String testD()
    {
//        try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); }
//        log.info("testD 測驗RT");
        log.info("testD 測驗RT");
        int age = 10/0;
        return "------testD";
    }

2.配置

在這里插入圖片描述
上面配置一句話來說,當1秒請求量>5,并且請求次數中出現例外的次數/總請求次數>0.2(我們設定的例外比例),就會出現服務熔斷,
3.jmeter
在這里插入圖片描述
4.結論:
按照上述配置,單獨訪問一次,必然來一次報錯一次(int age = 10/0),調一次錯一次,因為沒有達到每秒的請求量>5,
在這里插入圖片描述
開啟jmeter后,直接高并發發送請求,多次呼叫達到我們的配置條件了,
斷路器開啟(保險絲跳閘),微服務不可用了,不再報錯error而是服務降級了,
在這里插入圖片描述

例外數

在這里插入圖片描述
在這里插入圖片描述
注意:例外數是按照分鐘統計的,
一分鐘內,有5個請求發生例外,進入熔斷,

測驗:
1.添加請求方法

@GetMapping("/testE")
public String testE()
{
    log.info("testE 測驗例外數");
    int age = 10/0;
    return "------testE 測驗例外數";
}

2.配置
在這里插入圖片描述

熱點key限流

何為熱點?熱點即經常訪問的資料,很多時候我們希望統計某個熱點資料中訪問頻次最高的Top K資料,并對其訪問進行限制,比如:

  • 商品ID為引數,統計一段時間內最常購買的商品ID并進行限制,
  • 用戶ID為引數,針對一段時間內頻繁訪問的用戶ID進行限制,

熱點引數限流會統計傳入引數中的熱點引數,并根據配置的限流閾值與模式,對包含熱點引數的資源呼叫進行限流,熱點引數限流可以看做是一種特殊的流量控制,僅對包含熱點引數的資源呼叫生效,

比如:

  • localhost:8080/aa?name=aa
  • localhost:8080/aa?name=bb
  • 這兩個請求中,帶有引數aa的請求訪問頻次非常高,我們就限制name=aa的請求,但是bb的不限制,

如何自定義降級方法,而不是默認的拋出例外?
在這里插入圖片描述
使用@SentinelResource直接實作降級方法,它等同Hystrix的@HystrixCommand,

 @GetMapping("/testHotKey")
                        //定義一個名字      //指定降級方法
    @SentinelResource(value = "testHotKey",blockHandler = "deal_testHotKey")
    public String testHotKey(@RequestParam(value = "p1",required = false) String p1,
                             @RequestParam(value = "p2",required = false) String p2) {
        //int age = 10/0;
        return "------testHotKey";
    }

    //兜底方法
    public String deal_testHotKey (String p1, String p2, BlockException exception) {
        return "------deal_testHotKey";
    }

定義熱點規則:
在這里插入圖片描述
比如說:我們controller中,有兩個引數p1,p2,這個引數索引0表示 是對p1進行限制,1表示對p2進行限制,以此類推,

測驗:
此時我們訪問/testHotkey并且帶上p1,如果qps大于1,就會觸發我們定義的降級方法,
在這里插入圖片描述
如果我們的引數是p2,就沒有問題,
在這里插入圖片描述
如果修改controller為@SentinelResource(value = “testHotKey”),不指定降級方法,那么例外會打到前臺用戶界面,不太友好,

只有帶上p1,才會觸發熱點限流,
在這里插入圖片描述

設定熱點規則的其他選項

需求:
在這里插入圖片描述
添加配置:
在這里插入圖片描述
測驗:
在這里插入圖片描述
注意:
引數型別只支持8種基本型別+String型別,

注意:
如果我們程式出現例外,是不會走blockHander的降級方法的,因為這個方法只配置了熱點規程,沒有配置限流規則,
我們這里配置的降級方法是sentinel針對熱點規則配置的,只有觸發熱點規則才會降級,
在這里插入圖片描述

系統規則

系統自適應限流:從整體維度對應用入口進行限流,
對整體限流,比如qps到達100,這里限流會限制整個系統不可用,
在這里插入圖片描述
在這里插入圖片描述
測驗:
在這里插入圖片描述
這里設定了,如果QPS到達1,那么整個系統將不可用,
在這里插入圖片描述

@SentinelResource

用于配置降級等功能,

按資源名稱限流

1.啟動Nacos+Sentinel成功,
2.為8401添加依賴,添加我們自己的common包的依賴

<dependency>
    <groupId>com.atguigu.springcloud</groupId>
    <artifactId>cloud-api-commons</artifactId>
    <version>${project.version}</version>
</dependency>

3.額外創建一個controller類

@RestController
public class RateLimitController {
    @GetMapping("/byResource")
    @SentinelResource(value = "byResource", blockHandler = "handleException")
    public CommonResult byResource() {
        return new CommonResult(200, "按資源名稱限流測驗OK", new Payment(2020L, "serial001"));
    }

    public CommonResult handleException(BlockException exception) {
        return new CommonResult(444, exception.getClass().getCanonicalName() + "\t 服務不可用");
    }
}

3.配置限流
注意,我們這里配置規則,資源名指定的是@SentinelResource注解value的值,這樣也是可以的,也就是不一定要指定訪問路徑,
在這里插入圖片描述
4.測驗,可以看到已經進入降級方法了

在這里插入圖片描述
5.此時,我們關閉8401服務,可以看到,這些定義的規則是臨時的,關閉服務,規則就沒有了,
在這里插入圖片描述

按照Url地址限流

通過訪問的URL來限流,會回傳Sentinel自帶默認的限流處理資訊
1.controller中添加一個方法,用于測驗

@GetMapping("/rateLimit/byUrl")
@SentinelResource(value = "byUrl")
public CommonResult byUrl()
{
    return new CommonResult(200,"按url限流測驗OK",new Payment(2020L,"serial002"));
}

2.Sentinel控制臺配置
在這里插入圖片描述
3.測驗 回傳Sentinel自帶默認的限流處理資訊
在這里插入圖片描述

上面兜底方法面臨的問題

  • 系統默認的,沒有體現我們自己的業務要求,
  • 依照現有條件,我們自定義的處理方法又和業務代碼耦合在一塊,不直觀,
  • 每個業務方法都對應一個兜底的方法,代碼膨脹加劇,
  • 全域統一的處理方法沒有體現,

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/247642.html

標籤:其他

上一篇:我是如何在短期內快速掌握Dubbo的原理和原始碼的(純干貨)?

下一篇:資料存盤架構的發展史,看完這一篇就夠了

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more