主頁 > 後端開發 > Spring Cloud Alibaba的使用

Spring Cloud Alibaba的使用

2020-12-19 06:45:33 後端開發

版本: 2.2.1

一、簡介

  • https://spring.io/projects/spring-cloud-alibaba
  • 阿里云為分布式應用開發提供了一站式解決方案,它包含了開發分布式應用程式所需的所有組件,使您可以輕松地使用springcloud開發應用程式,
  • 有了阿里云,你只需要添加一些注解和少量的配置,就可以將Spring云應用連接到阿里的分布式解決方案上,用阿里中間件搭建一個分布式應用系統,

二、環境搭建

0.構建專案并引入依賴

<!--定義springcloud版本-->
<properties>
  <spring.cloud.alibaba.version>2.2.1.RELEASE</spring.cloud.alibaba.version>
</properties>

<!--全域引入springcloudalibaba下載依賴地址,并不會引入依賴-->
<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>com.alibaba.cloud</groupId>
      <artifactId>spring-cloud-alibaba-dependencies</artifactId>
      <version>${spring.cloud.alibaba.version}</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
  </dependencies>
</dependencyManagement>

完整的pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.5.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.md</groupId>
    <artifactId>08-hello</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>08-hello</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
        <spring.cloud.alibaba.version>2.2.1.RELEASE</spring.cloud.alibaba.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </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>

    <!--全域引入springcloudalibaba下載依賴地址,并不會引入依賴-->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${spring.cloud.alibaba.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>


三、Nacos

0. 簡介

什么是Nacos Name Service & Configurations Services

  • https://nacos.io/zh-cn/index.html

  • Nacos 致力于幫助您發現、配置和管理微服務,Nacos 提供了一組簡單易用的特性集,幫助您快速實作動態服務發現、服務配置、服務元資料及流量管理,

  • 總結:Nacos就是微服務架構中服務注冊中心以及統一配置中心,用來替換原來的(eureka,consul)以及config組件

1. 安裝Nacos

# 0.準備環境
- 1.64 bit OS,支持 Linux/Unix/Mac/Windows,推薦選用 Linux/Unix/Mac,
- 2.64 bit JDK 1.8+;下載 & 配置,
- 3.Maven 3.2.x+;下載 & 配置,

# 1.下載nacos
- https://github.com/alibaba/nacos/releases 

# 2.解壓縮安裝包到指定位置
- bin  			啟動nacos服務的腳本目錄
- conf 			nacos的組態檔目錄
- target 		nacos的啟動依賴存放目錄
- data		  nacos啟動成功后保存資料的目錄

# 3.啟動安裝服務
- linux/unix/mac啟動
	打開終端進入nacos的bin目錄執行如下命令 
	./startup.sh -m standalone

- windows啟動
	在 cmd中 
	執行 startup.cmd -m standalone 或者雙擊startup.cmd運行檔案,
# 4.訪問nacos的web服務管理界面
- http://localhost:8848/nacos/
- 用戶名 和 密碼都是nacos

四、開發服務注冊到nacos

0.創建專案并引入依賴

<!--引入nacos client的依賴-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

完整的pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.5.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <groupId>com.md</groupId>
    <artifactId>09-nacosclient8789</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>09-nacosclient8789</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
        <spring.cloud.alibaba.version>2.2.1.RELEASE</spring.cloud.alibaba.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <!--引入nacos client的依賴-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
    </dependencies>


    <!--全域引入springcloudalibaba下載依賴地址,并不會引入依賴-->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${spring.cloud.alibaba.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>


    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

1.配置注冊地址

server.port=8789 								#指定當前服務埠
spring.application.name=nacosclient					#指定服務名稱
spring.cloud.nacos.server-addr=localhost:8848		#指定nacos服務地址
spring.cloud.nacos.discovery.server-addr=${spring.cloud.nacos.server-addr} #指定注冊中心地址							
management.endpoints.web.exposure.include=*				 #暴露所有web端點

2.加入啟動服務注冊注解

3.查看nacos的服務串列

五、服務間的通信

RestTemplate+Ribbon

https://www.cnblogs.com/mengd/p/14105955.html

可以看之前寫的文章,基本是一致的

1. 創建專案

首先還是創建兩個專案,users和products

首先products對應的的pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.5.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.md</groupId>
    <artifactId>10-products9098</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>10-products9098</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
        <spring.cloud.alibaba.version>2.2.1.RELEASE</spring.cloud.alibaba.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </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>
        <!--引入nacos client的依賴-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
    </dependencies>

    <!--全域引入springcloudalibaba下載依賴地址,并不會引入依賴-->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${spring.cloud.alibaba.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

以及users對應的pom.xml檔案,類似這里就不展示了

2. 組態檔

server.port=9098
spring.application.name=products

spring.cloud.nacos.server-addr=localhost:8848
spring.cloud.nacos.discovery.server-addr=${spring.cloud.nacos.server-addr}
management.endpoints.web.exposure.include=*

#----------------------------------------------

server.port=9099
spring.application.name=users
spring.cloud.nacos.server-addr=localhost:8848
spring.cloud.nacos.discovery.server-addr=${spring.cloud.nacos.server-addr}
management.endpoints.web.exposure.include=*

3. nacos中進行查看

啟動nacos,然后再啟動專案

4. constoller

在商品服務中,

package com.md.controller;

/**
 * @author md
 * @Desc
 * @date 2020/12/17 20:38
 */
@RestController
@Slf4j
public class ProductController {

    @Value("${server.port}")
    private int port;

    @GetMapping("/product/find")
    public Map<String, Object> find(@RequestParam("id") String id)
    {
        HashMap<String, Object> map = new HashMap<>();
        map.put("status",true);
        map.put("msg","當前呼叫的是商品服務,查詢商品的id:"+id);
        map.put("port","當前的埠是:"+port);
        return map;
    }

}

重啟,進行測驗,直接訪問

5. 使用RestTemplate

在users專案中

package com.md.controller;

@RestController
@Slf4j
public class UserController {


    @GetMapping("/user/getProductInfo")
    public String getProductInfo(String productId){

        // 第一種方式. 通過restTemplate直接呼叫
        RestTemplate restTemplate = new RestTemplate();
        String forObject = restTemplate.getForObject("http://localhost:9098/product/find?id=" + productId, String.class);
        return forObject;

    }
}

重啟,再通過users進行訪問

6. restTemplate + ribbon

默認已經有依賴了

直接使用注解的方式

@Configuration
public class RestTemplateConfig {

    // 在工廠中創建一個restTemplate物件
    @Bean
    // 加上這個注解代表當前的restTemplate物件帶有ribbon負載均衡
    @LoadBalanced
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }
}

在controller中

package com.md.controller;
@RestController
@Slf4j
public class UserController {

    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("/user/getProductInfo")
    public String getProductInfo(String productId){

        // 第二種方式,注解的方式
        String forObject = restTemplate.getForObject("http://products/product/find?id=" + productId, String.class);
        return forObject;
    }
}

這樣更加的方便,頁面還是可以正常的方法

7.使用OpenFeign

https://www.cnblogs.com/mengd/p/14111059.html

可以看這個,寫的比較詳細

引入依賴在users中

<!--Open Feign依賴-->
<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
            <version>2.2.3.RELEASE</version>
 </dependency>

剩下的就不重復寫了

六、使用nacos作為配置中心

1.從nacos獲取配置

創建一個新的專案,還是基于alibaba的環境

# 1.創建專案并引入nacons配置中心依賴
<!--引入nacos client依賴-->
<dependency>
  <groupId>com.alibaba.cloud</groupId>
  <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

<!--引入nacos config 依賴-->
<dependency>
  <groupId>com.alibaba.cloud</groupId>
  <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

完整的pom.xml檔案

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
         <version>2.2.5.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.md</groupId>
    <artifactId>11-configclient9066</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>11-configclient9066</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
        <spring.cloud.alibaba.version>2.2.1.RELEASE</spring.cloud.alibaba.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </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>

        <!--引入nacos client依賴-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

        <!--引入nacos config 依賴-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
    </dependencies>

    <!--全域引入springcloudalibaba下載依賴地址,并不會引入依賴-->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${spring.cloud.alibaba.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

# 2.配置配置中心地址
spring.cloud.nacos.server-addr=localhost:8848				# 遠程配置中心的地址
spring.cloud.nacos.config.group=DEFAULT_GROUP						# 讀取配置的分組

# 這三者構成了下面的Data ID
spring.cloud.nacos.config.file-extension=properties				# 指定讀取檔案后綴
spring.application.name=config								# 指定讀取檔案的前綴
spring.profiles.active=prod							# 指定讀取檔案的具體環境

注意:寫的時候組態檔不要有注釋

最好還是使用bootstrap.properties

# 3.在nacos中創建配置

這個配置內容就是之前寫的注冊到nacos上的配置,不要寫中文

# 4.撰寫控制器測驗配置讀取情況
@RestController
@Slf4j
public class HelloController {
    //注入配置
    @Value("${user.name}")
    private String username;
    @GetMapping("/hello/config")
    public String config(){
        log.info("用戶名: [{}]",username);
        return username;
    }
}
# 5.啟動專案方式測驗配置讀取

2. DataId

# 1.DataId
- 用來讀取遠程配置中心的中具體組態檔其完整格式如下:
- ${prefix}-${spring.profile.active}.${file-extension}
	a. prefix 默認為 spring.application.name 的值,也可以通過配置項 spring.cloud.nacos.config.prefix來配置,
	
	b. spring.profile.active 即為當前環境對應的 profile,詳情可以參考 Spring Boot檔案, 注意:當 spring.profile.active 為空時,對應的連接符 - 也將不存在,dataId 的拼接格式變成 ${prefix}.${file-extension}
	
	c. file-exetension 為配置內容的資料格式,可以通過配置項 spring.cloud.nacos.config.file-extension 來配置,目前只支持 properties 和 yaml 型別,

3.實作自動配置重繪

# 1.自動重繪
- 默認情況下nacos已經實作了自動配置重繪功能,如果需要重繪配置直接在控制器中加入@RefreshScope注解即可
@RestController
@Slf4j
@RefreshScope
public class HelloController {
    //注入配置
    @Value("${user.name}")
    private String username;
    @GetMapping("/hello/config")
    public String config(){
        log.info("用戶名: [{}]",username);
        return username;
    }
}

4.命名空間

# 1.命名空間(namespace)
- https://github.com/alibaba/spring-cloud-alibaba/wiki/Nacos-config
- namespace命名空間是nacos針對于企業級開發設計用來針對于不同環境的區分,比如正在企業開發時有測驗環境,生產環境,等其他環境,因此為了保證不同環境配置實作隔離,提出了namespace的概念,默認在nacos中存在一個public命名空間所有配置在沒有指定命名空間時都在這個命名空間中獲取配置,在實際開發時可以針對于不能環境創建不同的namespace空間,默認空間不能洗掉!

# 2.創建其他命名空間
- 每個命名空間都有一個唯一id,這個id是讀取配置時指定空間的唯一標識

# 3.在配置串列查看空間

# 4.在指定空間下載創建組態檔

# 5.專案中使用命名空間指定配置

# 6.測驗配置

5.配置分組

# 1.配置分組(group)
- 配置分組是對配置集進行分組,通過一個有意義的字串(如 Buy 或 Trade )來表示,不同的配置分組下可以有相同的配置集(Data ID),當您在 Nacos 上創建一個配置時,如果未填寫配置分組的名稱,則配置分組的名稱默認采用 DEFAULT_GROUP ,配置分組的常見場景:可用于區分不同的專案或應用,例如:學生管理系統的配置集可以定義一個group為:STUDENT_GROUP,

# 2.創建分組

# 3.讀取不同分組的配置


七、sentinel 流量衛兵

1.什么是sentinel

說明

  • https://github.com/alibaba/Sentinel/wiki
  • 隨著微服務的普及,服務呼叫的穩定性變得越來越重要,Sentinel以“流量”為突破口,在流量控制、斷路、負載保護等多個領域進行作業,保障服務可靠性,
  • 通俗:用來在微服務系統中保護微服務對的作用 如何 服務雪崩 服務熔斷 服務降級 就是用來替換hystrix

特性

  • 豐富的應用場景:Sentinel 承接了阿里巴巴近 10 年的雙十一大促流量的核心場景,例如秒殺(即突發流量控制在系統容量可以承受的范圍)、訊息削峰填谷、集群流量控制、實時熔斷下游不可用應用等,
  • 完備的實時監控:Sentinel 同時提供實時的監控功能,您可以在控制臺中看到接入應用的單臺機器秒級資料,甚至 500 臺以下規模的集群的匯總運行情況,
  • 廣泛的開源生態:Sentinel 提供開箱即用的與其它開源框架/庫的整合模塊,例如與 Spring Cloud、Dubbo、gRPC 的整合,您只需要引入相應的依賴并進行簡單的配置即可快速地接入 Sentinel,

sentinel使用

- sentinel提供了兩個服務組件:
	一個是 sentinel 用來實作微服務系統中服務熔斷、降級等功能,這點和hystrix 類似
	一個是 sentinel dashboard 用來監控微服務系統中流量呼叫等情況,這點和hystrix 類似

2. sentinel dashboard的安裝

# 1.下載
- https://github.com/alibaba/Sentinel/releases

# 2.啟動
- 儀表盤是個jar包可以直接通過java命令啟動 如: java -jar 方式運行 默認埠為 8080
- java -Dserver.port=9191 -jar  sentinel-dashboard-1.7.2.jar

默認的埠有沖突,所以啟動的時候指定埠啟動

# 3.訪問web界面
- http://localhost:9191/#/login

# 4.登錄
- 用戶名&密碼: sentinel

3.sentinel 實時監控服務

創建一個新的專案

# 1.創建專案引入依賴
<!--引入nacos client依賴-->
<dependency>
  <groupId>com.alibaba.cloud</groupId>
  <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

<!--引入sentinel依賴-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

完整的pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.5.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <groupId>com.md</groupId>
    <artifactId>09-nacosclient8789</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>09-nacosclient8789</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
        <spring.cloud.alibaba.version>2.2.1.RELEASE</spring.cloud.alibaba.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <!--引入nacos client的依賴-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

        <!--引入sentinel依賴-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>
        
    </dependencies>


    <!--全域引入springcloudalibaba下載依賴地址,并不會引入依賴-->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${spring.cloud.alibaba.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>


    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

# 2.組態檔
server.port=8789
spring.application.name=nacosclient
spring.cloud.nacos.server-addr=localhost:8848
spring.cloud.nacos.discovery.server-addr=${spring.cloud.nacos.server-addr}

spring.cloud.sentinel.enabled=true							 # 開啟sentinel 默認開啟
spring.cloud.sentinel.transport.dashboard=localhost:9191 # 連接dashboard
spring.cloud.sentinel.transport.port=8719					 # 與dashboard通信的埠

# 3.啟動服務

# 4.訪問dashboard界面查看服務監控
- 發現界面什么都沒有? 
- 默認情況下sentiel為延遲加載,不會在啟動之后立即創建服務監控,需要對服務進行呼叫時才會初始化

# 5.開發服務
@RestController
@Slf4j
public class SentinelController {
    @GetMapping("/sentinel/test")
    public String test(){
        log.info("sentinel test");
        return "sentinel test ";
    }

    @GetMapping("/sentinel/test1")
    public String test1(){
        log.info("sentinel test1");
        return "sentinel test1 ";
    }
}
# 6.啟動進行呼叫
- http://localhost:8789/sentinel/test

# 7.查看監控界面

4.sentinel 流量控制

  • 流量控制(flow control),其原理是監控應用流量的 QPS 或并發執行緒數等指標,當達到指定的閾值時對流量進行控制,以避免被瞬時的流量高峰沖垮,從而保障應用的高可用性,
  • 同一個資源可以創建多條限流規則,FlowSlot 會對該資源的所有限流規則依次遍歷,直到有規則觸發限流或者所有規則遍歷完畢,
  • 一條限流規則主要由下面幾個因素組成,我們可以組合這些元素來實作不同的限流效果:
    resource:資源名,即限流規則的作用物件
    count: 限流閾值
    grade: 限流閾值型別(QPS 或并發執行緒數)
    limitApp: 流控針對的呼叫來源,若為 default 則不區分呼叫來源
    strategy: 呼叫關系限流策略
    controlBehavior: 流量控制效果(直接拒絕、Warm Up、勻速排隊)
  • 流量控制主要有兩種統計型別,一種是統計并發執行緒數,另外一種則是統計 QPS
  • 更多細節參見官網:https://github.com/alibaba/Sentinel/wiki/流量控制

QPS限流

# 1.配置QPS流量控制

# 2.測驗
- 每秒只能最大接收1個請求,超過1個報錯

執行緒數限流

# 1.配置執行緒數限流

# 2.訪問測驗

流控模式

說明

  • 直接:標識流量控制規則到達閾值直接觸發流量控制
  • 關聯: 當兩個資源之間具有資源爭搶或者依賴關系的時候,這兩個資源便具有了關聯,比如對資料庫同一個欄位的讀操作和寫操作存在爭搶,讀的速度過高會影響寫得速度,寫的速度過高會影響讀的速度,如果放任讀寫操作爭搶資源,則爭搶本身帶來的開銷會降低整體的吞吐量,可使用關聯限流來避免具有關聯關系的資源之間過度的爭搶,舉例來說,read_db 和 write_db 這兩個資源分別代表資料庫讀寫,我們可以給 read_db 設定限流規則來達到寫優先的目的:設定 strategy 為 RuleConstant.STRATEGY_RELATE 同時設定 refResource 為 write_db,這樣當寫庫操作過于頻繁時,讀資料的請求會被限流,

- 鏈路限流: https://github.com/alibaba/Sentinel/wiki/%E6%B5%81%E9%87%8F%E6%8E%A7%E5%88%B6

流控效果

  • 直接拒絕:(RuleConstant.CONTROL_BEHAVIOR_DEFAULT)方式是默認的流量控制方式,當QPS超過任意規則的閾值后,新的請求就會被立即拒絕,拒絕方式為拋出FlowException,
  • Warm Up:(RuleConstant.CONTROL_BEHAVIOR_WARM_UP)方式,即預熱/冷啟動方式,當系統長期處于低水位的情況下,當流量突然增加時,直接把系統拉升到高水位可能瞬間把系統壓垮,通過"冷啟動",讓通過的流量緩慢增加,在一定時間內逐漸增加到閾值上限,給冷系統一個預熱的時間,避免冷系統被壓垮,
    更多:https://github.com/alibaba/Sentinel/wiki/限流---冷啟動
  • 勻速排隊:(RuleConstant.CONTROL_BEHAVIOR_RATE_LIMITER)方式會嚴格控制請求通過的間隔時間,也即是讓請求以均勻的速度通過,對應的是漏桶演算法, 只能對請求進行排隊等待
    更多:https://github.com/alibaba/Sentinel/wiki/流量控制-勻速排隊模式

4.熔斷降級

  • https://github.com/alibaba/Sentinel/wiki/熔斷降級
  • 除了流量控制以外,對呼叫鏈路中不穩定的資源進行熔斷降級也是保障高可用的重要措施之一,由于呼叫關系的復雜性,如果呼叫鏈路中的某個資源不穩定,最侄訓導致請求發生堆積,Sentinel 熔斷降級會在呼叫鏈路中某個資源出現不穩定狀態時(例如呼叫超時或例外比例升高),對這個資源的呼叫進行限制,讓請求快速失敗,避免影響到其它的資源而導致級聯錯誤,當資源被降級后,在接下來的降級時間視窗之內,對該資源的呼叫都自動熔斷(默認行為是拋出 DegradeException),

降級策略

  • 平均回應時間 (DEGRADE_GRADE_RT):當 1s 內持續進入 N 個請求,對應時刻的平均回應時間(秒級)均超過閾值(count,以 ms 為單位),那么在接下的時間視窗(DegradeRule 中的 timeWindow,以 s 為單位)之內,對這個方法的呼叫都會自動地熔斷(拋出 DegradeException),注意 Sentinel 默認統計的 RT 上限是 4900 ms,超出此閾值的都會算作 4900 ms,若需要變更此上限可以通過啟動配置項 -Dcsp.sentinel.statistic.max.rt=xxx 來配置,

  • 例外比例 (DEGRADE_GRADE_EXCEPTION_RATIO):當資源的每秒請求量 >= N(可配置),并且每秒例外總數占通過量的比值超過閾值(DegradeRule 中的 count)之后,資源進入降級狀態,即在接下的時間視窗(DegradeRule 中的 timeWindow,以 s 為單位)之內,對這個方法的呼叫都會自動地回傳,例外比率的閾值范圍是 [0.0, 1.0],代表 0% - 100%,

  • 例外數 (DEGRADE_GRADE_EXCEPTION_COUNT):當資源近 1 分鐘的例外數目超過閾值之后會進行熔斷,注意由于統計時間視窗是分鐘級別的,若 timeWindow 小于 60s,則結束熔斷狀態后仍可能再進入熔斷狀態,

5.SentinelResource注解

說明

  • https://github.com/alibaba/Sentinel/wiki/注解支持

 @GetMapping("/sentinel/test1")
    @SentinelResource(value = "https://www.cnblogs.com/mengd/p/aa",blockHandler = "fallBack",fallback = "fall")
    public String test1(int id){
        log.info("sentinel test1");
        if(id<0)		
            throw new RuntimeException("非法引數!!!");
        }
        return "sentinel test1 :"+id;
    }
		//降級例外處理
    public String fallBack(int id,BlockException e){
            if(e instanceof FlowException){
                return "當前服務已被流控! "+e.getClass().getCanonicalName();
            }
            return "當前服務已被降級處理! "+e.getClass().getCanonicalName();
    }
		//例外處理
    public String fall(int id){
        return "當前服務已不可用!";
    }

八、.整合環境公共依賴

spring boot 2.2+

springcloud Hoxton

springcloud alibaba 2.2.1+

# 0.構建專案并引入依賴
<properties>
  <java.version>1.8</java.version>
  <spring-cloud.version>Hoxton.SR6</spring-cloud.version>
  <spring.cloud.alibaba.version>2.2.1.RELEASE</spring.cloud.alibaba.version>
</properties>

<dependencyManagement>
  <dependencies>
    <!--引入springcloud alibaba-->
    <dependency>
      <groupId>com.alibaba.cloud</groupId>
      <artifactId>spring-cloud-alibaba-dependencies</artifactId>
      <version>${spring.cloud.alibaba.version}</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
    <!--引入springcloud-->
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-dependencies</artifactId>
      <version>${spring-cloud.version}</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
  </dependencies>
</dependencyManagement>

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

標籤:Java

上一篇:寫了10年的代碼,我最怕寫Mybatis這些配置,現在有詳解了

下一篇:MyBatisPlus-快速入門

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