主頁 > 後端開發 > 聊聊Spring Boot Actuator

聊聊Spring Boot Actuator

2020-09-19 09:12:47 後端開發

## 概述

在本文中,我們將介紹Spring Boot Actuator。我們將首先介紹基礎知識,然后詳細討論Spring Boot 1.x和2.x中的可用內容。

我們將在Spring Boot 1.x中學習如何使用,配置和擴展此監視工具。然后,我們將討論如何利用反應式編程模型使用Boot 2.x和WebFlux進行相同的操作。

自2014年4月起,Spring Boot Actuator隨Spring Boot一起發布。

隨著SpringBoot2的發布,執行器進行了重新設計,并添加了新的激動人心的端點。本指南分為三個主要部分:

- 什么是執行器(Actuator)
- Spring Boot 1.x Actuator
- Spring Boot 2.x Actuator

---

## 什么是執行器(Actuator)

本質上,執行器為我們的應用帶來了生產就緒功能。

**通過對他的依賴,監視我們的應用程式、收集度量、了解流量或資料庫的狀態變得輕松簡單:**

這個庫的主要好處是,我們可以獲得生產級工具,而不必親自實作這些功能。Actuator主要用于公開有關正在運行的應用程式的操作資訊-運行狀況,指標,資訊,轉儲,環境等。它使用HTTP端點或JMX Bean使我們能夠與其互動。一旦在類路徑上使用執行器,便可以立即使用幾個端點。與大多數Spring模塊一樣,我們可以通過多種方式輕松地對其進行配置或擴展。

### Getting Started

要啟用SpringBootActuator,我們只需要將SpringBootActuator依賴項添加到包管理器中。在Maven:

```xml
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
```

請注意,無論引導版本如何,這都保持有效,因為版本是在Spring Boot Bill of Materials(BOM)中指定的

---

## Spring Boot 1.x Actuator

在1.x中,執行器遵循R/W(read/write)模型,這意味著我們可以對其進行讀取或寫入。例如。我們可以檢索指標或應用程式的運行狀況。另外,我們可以優雅地終止我們的應用程式或更改日志記錄配置。

為了讓它作業,執行器需要Spring MVC通過HTTP公開其端點。不支持其他技術。

### Endpoints

**在1.x中,Actuator帶來了自己的安全模型。它利用了Spring Security構造,但是需要與應用程式的其余部分獨立配置。**

而且,大多數端點都是敏感的-表示它們不是完全公開的,換句話說,大多數資訊將被省略-而少數端點不是敏感的比如/info。

以下是Boot提供的一些最常見的端點:

- /health –顯示應用程式運行狀況資訊(通過未經身份驗證的連接訪問時為簡單的“狀態”,或通過身份驗證時顯示為完整的訊息詳細資訊);默認情況下不敏感

- /info –顯示任意應用程式資訊;默認不敏感

- /metrics –顯示當前應用程式的“指標”資訊;默認情況下是敏感的

- /trace –顯示跟蹤資訊(默認情況下,最后幾個HTTP請求)

  我們可以在[官方檔案](https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#production-ready-endpoints)中找到現有端點的完整串列。

### 配置現有端點

可以使用以下格式使用屬性來自定義每個端點:*endpoints.[endpoint name].[property to customize]*

提供三個屬性:

- id –將通過HTTP訪問該端點
- enabled–如果為true,則可以訪問,否則不能訪問
- sensitive–如果為true,則需要授權通過HTTP顯示關鍵資訊

例如,添加以下屬性將自定義/beans端點:

> ```properties
> endpoints.beans.id=springbeans
> endpoints.beans.sensitive=false
> endpoints.beans.enabled=true
> ```

上述方法現已被棄用。



### /health端點

/health端點用于檢查正在運行的應用程式的運行狀況或狀態。監視軟體通常會執行此操作,以警告我們正在運行的實體出現故障或由于其他原因而變得不正常。例如。資料庫的連接問題,磁盤空間不足…

默認情況下,在未授權狀態下訪問只會顯示運行狀況資訊:

```json
{
  "status" : "UP"
}
```

此健康資訊是從在我們的應用程式背景關系中配置的,實作了HealthIndicator介面的所有bean收集的。

HealthIndicator回傳的某些資訊本質上是敏感的,但是我們可以配置endpoints.health.sensitive = false來公開更多詳細資訊,例如磁盤空間,訊息傳遞代理連接,自定義檢查等。

我們還可以實作自己的自定義運行狀況指示器-可以收集特定于應用程式的任何型別的自定義運行狀況資料,并通過/health端點自動將其公開:

```java
@Component
public class HealthCheck implements HealthIndicator {
  
    @Override
    public Health health() {
        int errorCode = check();//perform some specific health check
        if (errorCode != 0) {
            return Health.down()
              .withDetail("Error Code", errorCode).build();
        }
        return Health.up().build();
    }
     
    public int check() {
       //Our logic to check health
        return 0;
    }
}
```

輸出結果如下所示:

```java
{
    "status" : "DOWN",
    "myHealthCheck" : {
        "status" : "DOWN",
        "Error Code" : 1
     },
     "diskSpace" : {
         "status" : "UP",
         "free" : 209047318528,
         "threshold" : 10485760
     }
}
```

### /info端點

我們還可以自定義/info端點顯示的資料-例如:

```properties
info.app.name=Spring Sample Application
info.app.description=This is my first spring boot application
info.app.version=1.0.0
```

以及示例輸出:

```json
{
    "app" : {
        "version" : "1.0.0",
        "description" : "This is my first spring boot application",
        "name" : "Spring Sample Application"
    }
}
```

### /metrics端點

metrics端點發布有關OS、JVM以及應用程式級度量的資訊。啟用后,我們將獲得諸如記憶體、堆、處理器、執行緒、加載的類、卸載的類、執行緒池以及一些HTTP度量等資訊。

以下是該端點的輸出結果:

```json
{
    "mem" : 193024,
    "mem.free" : 87693,
    "processors" : 4,
    "instance.uptime" : 305027,
    "uptime" : 307077,
    "systemload.average" : 0.11,
    "heap.committed" : 193024,
    "heap.init" : 124928,
    "heap.used" : 105330,
    "heap" : 1764352,
    "threads.peak" : 22,
    "threads.daemon" : 19,
    "threads" : 22,
    "classes" : 5819,
    "classes.loaded" : 5819,
    "classes.unloaded" : 0,
    "gc.ps_scavenge.count" : 7,
    "gc.ps_scavenge.time" : 54,
    "gc.ps_marksweep.count" : 1,
    "gc.ps_marksweep.time" : 44,
    "httpsessions.max" : -1,
    "httpsessions.active" : 0,
    "counter.status.200.root" : 1,
    "gauge.response.root" : 37.0
}
```

**為了收集自定義指標,我們支持“儀表”(即資料的單值快照)和“計數器”(即增/減指標)。**

讓我們在/metrics端點中實作我們自己的自定義指標。例如,我們將自定義登錄流程以記錄成功和失敗的登錄嘗試:

```java
@Service
public class LoginServiceImpl {
 
    private final CounterService counterService;
     
    public LoginServiceImpl(CounterService counterService) {
        this.counterService = counterService;
    }
     
    public boolean login(String userName, char[] password) {
        boolean success;
        if (userName.equals("admin") && "secret".toCharArray().equals(password)) {
            counterService.increment("counter.login.success");
            success = true;
        }
        else {
            counterService.increment("counter.login.failure");
            success = false;
        }
        return success;
    }
}
```

輸出結果如下所示:

```json
{
    ...
    "counter.login.success" : 105,
    "counter.login.failure" : 12,
    ...
}
```

**請注意,登錄嘗試和其他安全相關事件作為審計事件在執行器中是現成可用的。**

### 創建新端點

除了使用Spring Boot提供的現有端點之外,我們還可以創建一個全新的端點。

首先,我們需要讓新的端點實作endpoint<T>介面:

```json
@Component
public class CustomEndpoint implements Endpoint<List<String>> {
     
    @Override
    public String getId() {
        return "customEndpoint";
    }
 
    @Override
    public boolean isEnabled() {
        return true;
    }
 
    @Override
    public boolean isSensitive() {
        return true;
    }
 
    @Override
    public List<String> invoke() {
       //Custom logic to build the output
        List<String> messages = new ArrayList<String>();
        messages.add("This is message 1");
        messages.add("This is message 2");
        return messages;
    }
}
```

為了訪問此新端點,將使用其ID對其進行映射,即我們可以按/customEndpoint對其進行訪問。 輸出:

```json
[ "This is message 1", "This is message 2" ]
```

### 進一步定制

為了安全起見,我們可能選擇通過非標準埠公開執行器端點-可以輕松地使用management.port屬性進行配置。

同樣,正如我們已經提到的,在1.x中。 Actuator基于Spring Security配置其自己的安全模型,但與應用程式的其余部分無關。

因此,我們可以更改management.address屬性以限制可以從網路訪問端點的位置:

```properties
#port used to expose actuator
management.port=8081 
 
#CIDR allowed to hit actuator
management.address=127.0.0.1 
 
#Whether security should be enabled or disabled altogether
management.security.enabled=false
```

此外,默認情況下,除/info外的所有內置終結點都是敏感的。如果應用程式使用的是Spring Security,我們可以通過在application.properties檔案中定義默認的安全屬性(用戶名,密碼和角色)來保護這些端點:

```properties
security.user.name=admin
security.user.password=secret
management.security.role=SUPERUSER
```

---

## Spring Boot 2.x Actuator

在2.x中,Actuator保持其基本意圖,但簡化了其模型,擴展了其功能并結合了更好的默認設定。

首先,該版本與技術無關。此外,它通過將其與應用程式合并來簡化其安全模型。

最后,在各種更改中,請務必記住其中一些正在停用。這包括HTTP請求/回應以及Java API。

此外,與舊的RW(讀/寫)模型相反,最新版本現在支持CRUD模型。

### 技術支持

在第二個主要版本中,Actuator現在與技術無關,而在1.x中,它與MVC關聯,因此與Servlet API關聯。

在2.x中,Actuator定義了其模型,可插入且可擴展,而無需依賴MVC。

**因此,通過這種新模型,我們能夠利用MVC和WebFlux作為基礎Web技術。**

此外,可以通過實作正確的配接器來添加即將出現的技術。

最后,仍然支持JMX公開端點,而無需任何其他代碼。

### 重要變化

與以前的版本不同,Actuator禁用了大多數端點。

因此,默認情況下僅有的兩個可用的是/health和/info。

如果要啟用所有這些功能,可以設定management.endpoints.web.exposure.include = *或者,我們可以列出應啟用的端點。

現在,Actuator與我們的應用安全規則共享安全配置。因此,極大地簡化了安全模型。

因此,要調整執行器安全性規則,我們可以為/actuator/**添加一個條目:

```java
@Bean
public SecurityWebFilterChain securityWebFilterChain(
  ServerHttpSecurity http) {
    return http.authorizeExchange()
      .pathMatchers("/actuator/**").permitAll()
      .anyExchange().authenticated()
      .and().build();
}
```

我們可以在全新的Actuator[官方檔案](https://docs.spring.io/spring-boot/docs/2.0.x/actuator-api/html/)中找到更多詳細資訊。

同樣,默認情況下,所有執行器端點現在都放在/actuator路徑下。

與上一版本相同,我們可以使用新屬性 management.endpoints.web.base-path調整此路徑。

### 預定義端點

讓我們看一下一些可用的端點,其中大多數已經在1.x中可用。

盡管如此,仍添加了一些端點,洗掉了一些端點,并重新構建了一些端點:

- /auditevents –列出與安全審核相關的事件,例如用戶登錄/注銷。另外,我們可以在其他欄位中按主體或型別進行過濾
- /beans –回傳BeanFactory中所有可用的bean。與/auditevents不同,它不支持過濾
- /conditions –以前稱為/autoconfig,圍繞自動配置生成條件報告
- /configprops–允許我們獲取所有@ConfigurationProperties bean
- /env –回傳當前環境屬性。此外,我們可以檢索單個屬性
- /flyway –提供有關我們的Flyway資料庫遷移的詳細資訊
- /health –總結我們應用程式的健康狀態
- /heapdump –從我們的應用程式使用的JVM構建并回傳堆轉儲
- /info –回傳常規資訊。它可能是自定義資料,構建資訊或有關最新提交的詳細資訊
- /liquibase –行為類似于/flyway,但對于Liquibase
- /logfile –回傳普通的應用程式日志
- /loggers –使我們能夠查詢和修改應用程式的日志記錄級別
- /metrics –詳細說明我們應用程式的指標。這可能包括通用指標和自定義指標
- /prometheus –回傳與上一個類似的指標,但其格式可以與Prometheus服務器一起使用
- /scheduledtasks –提供有關我們應用程式中每個計劃任務的詳細資訊
- /sessions –列出我們正在使用Spring Session的HTTP會話
- /shutdown –正常關閉應用程式
- /threaddump –轉儲底層JVM的執行緒資訊

### 健康指標

就像以前的版本一樣,我們可以輕松添加自定義指標。與其他API相反,用于創建自定義健康狀況端點的抽象保持不變。但是,添加了新介面ReactiveHealthIndicator來實作反應式健康檢查。

讓我們看一個簡單的自定義反應式健康檢查:

```java
@Component
public class DownstreamServiceHealthIndicator implements ReactiveHealthIndicator {
 
    @Override
    public Mono<Health> health() {
        return checkDownstreamServiceHealth().onErrorResume(
          ex -> Mono.just(new Health.Builder().down(ex).build())
        );
    }
 
    private Mono<Health> checkDownstreamServiceHealth() {
       //we could use WebClient to check health reactively
        return Mono.just(new Health.Builder().up().build());
    }
}
```

健康指標的一個方便功能是我們可以將它們匯總為層次結構的一部分。因此,按照前面的示例,我們可以將所有下游服務歸為“下游服務”類別。只要可以訪問每個嵌套服務,此類別都是健康的。

復合健康檢查通過CompositeHealthIndicator在1.x中進行。另外,在2.x中,我們可以將CompositeReactiveHealthIndicator用作其回應式副本。

與Spring Boot 1.x中不同的是,*endpoints.*<id>.sensitive標志已被洗掉。要隱藏完整的健康報告,我們可以利用新的*management.endpoint.health.show-details*。默認情況下,此標志為false。

### Spring Boot 2中的指標

在Spring Boot 2.0中,內部指標已被Micrometer支持所取代。因此,我們可以期待重大的變化。如果我們的應用程式使用的是度量服務,例如GaugeService或CounterService,則它們將不再可用。

相反,我們應該直接與Micrometer進行互動。在Spring Boot 2.0中,我們將自動配置一個型別為MeterRegistry的bean。

此外,Micrometer現在是執行器依賴項的一部分。因此,只要執行器依賴項在類路徑中,我們就應該繼續。

此外,我們將從/metrics端點獲得全新的回應:

```json
{
  "names": [
    "jvm.gc.pause",
    "jvm.buffer.memory.used",
    "jvm.memory.used",
    "jvm.buffer.count",
   //...
  ]
}
```

正如我們在前面的示例中觀察到的,沒有像1.x那樣的實際指標。

要獲取特定指標的實際值,我們現在可以導航至所需指標,即/actuator/metrics/jvm.gc.pause并獲取詳細的回應:

```json
{
  "name": "jvm.gc.pause",
  "measurements": [
    {
   

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

標籤:Java EE

上一篇:我有一些一套比較老的程式,是用Google Web Toolkit

下一篇:請問這里為什么報錯,但是能用,我也不知道為什么,說具體點吧,謝謝

標籤雲
其他(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)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more