Nacos、Feign、Hystrix服務介紹安裝、注冊、啟動、調用


一、Nacos

1、基本概念

(1)Nacos 是阿里巴巴推出來的一個新開源項目,是一個更易於構建雲原生應用的動態服務發現、配置管理和服務管理平台。Nacos 致力於幫助您發現、配置和管理微服務。Nacos 提供了一組簡單易用的特性集,幫助您快速實現動態服務發現、服務配置、服務元數據及流量管理。Nacos 幫助您更敏捷和容易地構建、交付和管理微服務平台。 Nacos 是構建以“服務”為中心的現代應用架構 (例如微服務范式、雲原生范式) 的服務基礎設施。

(2)常見的注冊中心:

  1. Eureka(原生,2.0遇到性能瓶頸,停止維護)
  2. Zookeeper(支持,專業的獨立產品。例如:dubbo)
  3. Consul(原生,GO語言開發)
  4. Nacos

相對於 Spring Cloud Eureka 來說,Nacos 更強大。Nacos = Spring Cloud Eureka + Spring Cloud Config

 Nacos 可以與 Spring, Spring Boot, Spring Cloud 集成,並能代替 Spring Cloud Eureka, Spring Cloud Config

- 通過 Nacos Server 和 spring-cloud-starter-alibaba-nacos-discovery 實現服務的注冊與發現。

(3)Nacos是以服務為主要服務對象的中間件,Nacos支持所有主流的服務發現、配置和管理。

Nacos主要提供以下四大功能:

  1.  服務發現和服務健康監測
  2. 動態配置服務
  3. 動態DNS服務
  4. 服務及其元數據管理

(4)Nacos結構圖

  • nacos注冊中心
  • consumer消費者(調用方法的)
  • provider生產者(提供方法的)
  • 比如edu調用vod里的方法,edu就是消費者,vod就是生產者

(5)Nacos作用之一是實現微服務之間的調用,比如有edu服務和vod服務,要通過edu調用vod里的方法,按照微服務做法就要用到Nacos。

2、Nacos下載和安裝

(1)下載地址和版本

下載地址:https://github.com/alibaba/nacos/releases

下載版本:nacos-server-1.1.4.tar.gz或nacos-server-1.1.4.zip,解壓任意目錄即可(不要選擇beat版本,公測版本,不推薦上線生成

解壓后, Windows里找到bin文件里的startup.cmd雙擊啟動。

(2)啟動nacos服務

如果啟動失敗,失敗的原因之一是沒有配置jdk環境,參考地址:https://www.cnblogs.com/konglxblog/p/14909489.html進行配置。

Linux/Unix/Mac

  • 啟動命令(standalone代表着單機模式運行,非集群模式)
  • 啟動命令:sh startup.sh -m standalone

Windows

  • 啟動命令:cmd startup.cmd 或者雙擊startup.cmd運行文件。

啟動成功如下圖:

訪問:http://localhost:8848/nacos(固定地址,在瀏覽器直接輸入即可)

用戶名密碼:nacos/nacos

二、服務注冊

1、在service模塊配置pom

配置Nacos客戶端的pom依賴(注意springboot和springcloud的版本兼容)
pom子模塊文件(版本繼承父模塊)
<!--服務注冊-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
pom父模塊文件版本
<?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>
    <modules>
        <module>service</module>
        <module>common</module>
    </modules>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.1.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    
    <groupId>com.stu</groupId>
    <artifactId>guli_parent</artifactId>
    <packaging>pom</packaging>
    <version>0.0.1-SNAPSHOT</version>

    <name>guli_parent</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
        <guli.version>0.0.1-SNAPSHOT</guli.version>
        <mybatis-plus.version>3.0.5</mybatis-plus.version>
        <velocity.version>2.0</velocity.version>
        <swagger.version>2.7.0</swagger.version>
        <aliyun.oss.version>2.8.3</aliyun.oss.version>
        <jodatime.version>2.10.1</jodatime.version>
        <poi.version>3.17</poi.version>
        <commons-fileupload.version>1.3.1</commons-fileupload.version>
        <commons-io.version>2.6</commons-io.version>
        <httpclient.version>4.5.1</httpclient.version>
        <jwt.version>0.7.0</jwt.version>
        <aliyun-java-sdk-core.version>4.3.3</aliyun-java-sdk-core.version>
        <aliyun-sdk-oss.version>3.1.0</aliyun-sdk-oss.version>
        <aliyun-java-sdk-vod.version>2.15.5</aliyun-java-sdk-vod.version>
        <aliyun-java-vod-upload.version>1.4.11</aliyun-java-vod-upload.version>
        <aliyun-sdk-vod-upload.version>1.4.11</aliyun-sdk-vod-upload.version>
        <fastjson.version>1.2.28</fastjson.version>
        <gson.version>2.8.2</gson.version>
        <json.version>20170516</json.version>
        <commons-dbutils.version>1.7</commons-dbutils.version>
        <canal.client.version>1.1.0</canal.client.version>
        <docker.image.prefix>zx</docker.image.prefix>
        <cloud-alibaba.version>0.2.2.RELEASE</cloud-alibaba.version>
    </properties>
    <dependencyManagement>
        <dependencies>
            <!--Spring Cloud-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Hoxton.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${cloud-alibaba.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!--mybatis-plus 持久層-->
            <dependency>
                <groupId>com.baomidou</groupId>
                <artifactId>mybatis-plus-boot-starter</artifactId>
                <version>${mybatis-plus.version}</version>
            </dependency>

            <!-- velocity 模板引擎, Mybatis Plus 代碼生成器需要 -->
            <dependency>
                <groupId>org.apache.velocity</groupId>
                <artifactId>velocity-engine-core</artifactId>
                <version>${velocity.version}</version>
            </dependency>

            <!--swagger-->
            <dependency>
                <groupId>io.springfox</groupId>
                <artifactId>springfox-swagger2</artifactId>
                <version>${swagger.version}</version>
            </dependency>
            <!--swagger ui-->
            <dependency>
                <groupId>io.springfox</groupId>
                <artifactId>springfox-swagger-ui</artifactId>
                <version>${swagger.version}</version>
            </dependency>

            <!--aliyunOSS-->
            <dependency>
                <groupId>com.aliyun.oss</groupId>
                <artifactId>aliyun-sdk-oss</artifactId>
                <version>${aliyun.oss.version}</version>
            </dependency>

            <!--日期時間工具-->
            <dependency>
                <groupId>joda-time</groupId>
                <artifactId>joda-time</artifactId>
                <version>${jodatime.version}</version>
            </dependency>

            <!--xls-->
            <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi</artifactId>
                <version>${poi.version}</version>
            </dependency>
            <!--xlsx-->
            <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi-ooxml</artifactId>
                <version>${poi.version}</version>
            </dependency>

            <!--文件上傳-->
            <dependency>
                <groupId>commons-fileupload</groupId>
                <artifactId>commons-fileupload</artifactId>
                <version>${commons-fileupload.version}</version>
            </dependency>

            <!--commons-io-->
            <dependency>
                <groupId>commons-io</groupId>
                <artifactId>commons-io</artifactId>
                <version>${commons-io.version}</version>
            </dependency>

            <!--httpclient-->
            <dependency>
                <groupId>org.apache.httpcomponents</groupId>
                <artifactId>httpclient</artifactId>
                <version>${httpclient.version}</version>
            </dependency>

            <dependency>
                <groupId>com.google.code.gson</groupId>
                <artifactId>gson</artifactId>
                <version>${gson.version}</version>
            </dependency>

            <!-- JWT -->
            <dependency>
                <groupId>io.jsonwebtoken</groupId>
                <artifactId>jjwt</artifactId>
                <version>${jwt.version}</version>
            </dependency>

            <!--aliyun-->
            <dependency>
                <groupId>com.aliyun</groupId>
                <artifactId>aliyun-java-sdk-core</artifactId>
                <version>${aliyun-java-sdk-core.version}</version>
            </dependency>
            <dependency>
                <groupId>com.aliyun.oss</groupId>
                <artifactId>aliyun-sdk-oss</artifactId>
                <version>${aliyun-sdk-oss.version}</version>
            </dependency>
            <dependency>
                <groupId>com.aliyun</groupId>
                <artifactId>aliyun-java-sdk-vod</artifactId>
                <version>${aliyun-java-sdk-vod.version}</version>
            </dependency>
            <dependency>
                <groupId>com.aliyun</groupId>
                <artifactId>aliyun-java-vod-upload</artifactId>
                <version>${aliyun-java-vod-upload.version}</version>
            </dependency>
            <dependency>
                <groupId>com.aliyun</groupId>
                <artifactId>aliyun-sdk-vod-upload</artifactId>
                <version>${aliyun-sdk-vod-upload.version}</version>
            </dependency>
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>fastjson</artifactId>
                <version>${fastjson.version}</version>
            </dependency>
            <dependency>
                <groupId>org.json</groupId>
                <artifactId>json</artifactId>
                <version>${json.version}</version>
            </dependency>

            <dependency>
                <groupId>commons-dbutils</groupId>
                <artifactId>commons-dbutils</artifactId>
                <version>${commons-dbutils.version}</version>
            </dependency>

            <dependency>
                <groupId>com.alibaba.otter</groupId>
                <artifactId>canal.client</artifactId>
                <version>${canal.client.version}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>
<!--    <build>-->
<!--        <plugins>-->
<!--            <plugin>-->
<!--                <groupId>org.springframework.boot</groupId>-->
<!--                <artifactId>spring-boot-maven-plugin</artifactId>-->
<!--            </plugin>-->
<!--        </plugins>-->
<!--    </build>-->

</project>

2、添加服務配置信息

配置application.properties,在客戶端微服務中添加注冊Nacos服務的配置信息
# nacos服務地址
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848

3、添加Nacos客戶端注解

在客戶端微服務啟動類中添加注解
@EnableDiscoveryClient

例子:

package com.stu.eduservice;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.context.annotation.ComponentScan; @SpringBootApplication @EnableDiscoveryClient @ComponentScan(basePackages = {"com.stu"}) public class EduApplication { public static void main(String[] args) { SpringApplication.run(EduApplication.class,args); } }

4、啟動客戶端微服務

啟動注冊中心
啟動已注冊的微服務,可以在Nacos服務列表中看到被注冊的微服務

三、服務調用-Feign

基本概念

  • Feign是Netflix開發的聲明式、模板化的HTTP客戶端, Feign可以幫助我們更快捷、優雅地調用HTTP API。
  • Feign支持多種注解,例如Feign自帶的注解或者JAX-RS注解等。
  • Spring Cloud對Feign進行了增強,使Feign支持了Spring MVC注解,並整合了Ribbon和Eureka,從而讓Feign的使用更加方便。
  • Spring Cloud Feign是基於Netflix feign實現,整合了Spring Cloud Ribbon和Spring Cloud Hystrix,除了提供這兩者的強大功能外,還提供了一種聲明式的Web服務客戶端定義的方式。
  • Spring Cloud Feign幫助我們定義和實現依賴服務接口的定義。在Spring Cloud feign的實現下,只需要創建一個接口並用注解方式配置它,即可完成服務提供方的接口綁定,簡化了在使用Spring Cloud Ribbon時自行封裝服務調用客戶端的開發量。

1、需求

刪除課時的同時刪除雲端視頻

2、在service模塊添加pom依賴

<!--服務調用-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

3、在調用端的啟動類添加注解(@EnableFeignClients)

package com.stu.eduservice;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.ComponentScan;

@SpringBootApplication
@EnableDiscoveryClient//nacos注冊
@EnableFeignClients //服務調用-Feign(調用端加這個注解,就是edu調用vod)
@ComponentScan(basePackages = {"com.stu"})
public class EduApplication {
    public static void main(String[] args) {

        SpringApplication.run(EduApplication.class,args);
    }
}

4、創建包和接口

創建client包
@FeignClient注解用於指定從哪個服務中調用功能 ,名稱與被調用的服務名保持一致。
@GetMapping注解用於對被調用的微服務進行地址映射。
@PathVariable注解一定要指定參數名稱,否則出錯
@Component注解防止,在其他位置注入CodClient時idea報錯

注意這個接口是創建在edu層的,也就是調用端(edu調用vod里的方法)

package com.stu.eduservice.client;

import com.stu.commonutils.ResultData;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PathVariable;
 @FeignClient("service-vod")//這個是vod屬性文件里的服務名,即spring.application.name=service-vod
@Component
public interface VodClient {

    //根據id刪除阿里雲視頻(映射路徑是Vod業務里controller層的類映射+方法上的映射,即
    // @RequestMapping("/eduvod/video") + @DeleteMapping("removeVideo/{id}"))

    /* @FeignClient注解用於指定從哪個服務中調用功能 ,名稱與被調用的服務名保持一致。
    @GetMapping注解用於對被調用的微服務進行地址映射。
    @PathVariable注解一定要指定參數名稱,否則出錯
    @Component注解防止,在其他位置注入VodClient時idea報錯*/
    
    @DeleteMapping("/eduvod/video/removeVideo/{id}")
    public ResultData removeAlyVideo(@PathVariable("id") String id);
}

5、調用微服務

在調用端的Edu VideoServiceImpl實現刪除阿里雲的視頻和小節
package com.stu.eduservice.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.stu.eduservice.client.VodClient;
import com.stu.eduservice.entity.EduVideo;
import com.stu.eduservice.mapper.EduVideoMapper;
import com.stu.eduservice.service.IEduVideoService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * <p>
 * 課程視頻 服務實現類
 * </p>
 *
 * @author stu
 * @since 2021-05-29
 */
@Service
public class EduVideoServiceImpl extends ServiceImpl<EduVideoMapper, EduVideo> implements IEduVideoService {

    @Autowired
    private VodClient codClient;
    @Override
    public boolean removeVodAndVideoByCourseId(String id) {
        //根據小節id獲取視頻id,調用方法實現刪除
        EduVideo eduVideo =  baseMapper.selectById(id);
        //取得視頻id
        String videoSourceId = eduVideo.getVideoSourceId();

        //根據視頻id刪除阿里雲視頻
        if(!StringUtils.isEmpty(videoSourceId)){
            codClient.removeAlyVideo(videoSourceId);
        }
        //先刪除視頻在刪除小節,因為刪除視頻要先根據小節查出視頻id在刪除視頻
        baseMapper.deleteById(id);
        return true;
    }

}

四、Hystrix基本概念

1、Spring Cloud調用接口過程

Spring Cloud 在接口調用上,大致會經過如下幾個組件配合:

Feign ----->Hystrix —>Ribbon —>Http Client(apache http components 或者 Okhttp)具體交互流程上,如下圖所示:

 
(1)接口化請求調用當調用被 @FeignClient注解修飾的接口時,在框架內部,將請求轉換成Feign的請求實例 feign.Request,交由Feign框架處理(在消費者指定調用的生產者的服務名稱和接口地址,即在edu指定要調用的vod的服務名稱和接口地址)。

(2)Feign :轉化請求Feign是一個http請求調用的輕量級框架,可以以Java接口注解的方式調用Http請求,封裝了Http調用流程(Feign找到調用的服務名稱,根據服務名稱找到接口地址)。

(3)Hystrix:熔斷處理機制 Feign的調用關系,會被Hystrix代理攔截,對每一個Feign調用請求,Hystrix都會將其包裝成HystrixCommand,參與Hystrix的流控和熔斷規則。如果請求判斷需要熔斷,則Hystrix直接熔斷,拋出異常或者使用FallbackFactory返回熔斷Fallback結果;如果通過,則將調用請求傳遞給Ribbon組件(edu服務調用vod服務,假如vod服務突然不好用了,Hystrix就不讓他繼續調用,斷開調用的連接)。

(4)Ribbon:服務地址選擇 當請求傳遞到Ribbon之后,Ribbon會根據自身維護的服務列表,根據服務的服務質量,如平均響應時間,Load等,結合特定的規則,從列表中挑選合適的服務實例,選擇好機器之后,然后將機器實例的信息請求傳遞給Http Client客戶端,HttpClient客戶端來執行真正的Http接口調用;

(5)HttpClient :Http客戶端,真正執行Http調用根據上層Ribbon傳遞過來的請求,已經指定了服務地址,則HttpClient開始執行真正的Http請求

2、Hystrix概念

Hystrix 是一個供分布式系統使用,提供延遲和容錯功能,保證復雜的分布系統在面臨不可避免的失敗時,仍能有其彈性。

比如系統中有很多服務,當某些服務不穩定的時候,使用這些服務的用戶線程將會阻塞,如果沒有隔離機制,系統隨時就有可能會掛掉,從而帶來很大的風險。SpringCloud使用Hystrix組件提供斷路器、資源隔離與自我修復功能。下圖表示服務B觸發了斷路器,阻止了級聯失敗

 

五、feign結合Hystrix使用

改造service-edu模塊

1、在service的pom中添加依賴(紅色加粗部分)

<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>guli_parent</artifactId>
        <groupId>com.stu</groupId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.stu</groupId>
    <artifactId>service</artifactId>
    <packaging>pom</packaging>
    <version>0.0.1-SNAPSHOT</version>
    <modules>
        <module>service-edu</module>
        <module>service-oss</module>
        <module>service-vod</module>

    </modules>

    <dependencies>
        <dependency>
            <groupId>com.stu</groupId>
            <artifactId>service-base</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>

        <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-ribbon</artifactId> </dependency> <!--hystrix依賴,主要是用 @HystrixCommand --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> </dependency> <!--服務注冊--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</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>

        <!--mybatis-plus-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
        </dependency>

        <!--mysql-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.10</version>
        </dependency>

        <!-- velocity 模板引擎, Mybatis Plus 代碼生成器需要 -->
        <dependency>
            <groupId>org.apache.velocity</groupId>
            <artifactId>velocity-engine-core</artifactId>
        </dependency>

        <!--swagger-->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
        </dependency>

        <!--lombok用來簡化實體類:需要安裝lombok插件-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

        <!--xls-->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
        </dependency>

        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
        </dependency>

        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
        </dependency>

        <!--httpclient-->
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
        </dependency>
        <!--commons-io-->
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
        </dependency>
        <!--gson-->
        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
    </dependencies>
    <build>
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.xml</include>
                </includes>
                <filtering>false</filtering>
            </resource>
        </resources>
    </build>
</project>

2、在配置文件中添加hystrix配置(紅色加粗部分)

# 服務端口
server.port=8001
# 服務名
spring.application.name=service-edu

# 環境設置:dev、test、prod
spring.profiles.active=dev

# mysql數據庫連接
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/zxjy?serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=root

#返回json的全局時間格式
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
spring.jackson.time-zone=GMT+8

#配置mapper xml文件的路徑
mybatis-plus.mapper-locations=classpath:com/stu/eduservice/mapper/xml/*.xml

# nacos服務地址
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848

#開啟熔斷機制 feign.hystrix.enabled=true # 設置hystrix超時時間,默認1000ms hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=6000 
# 設置日志級別
#logging.level.root=info
#mybatis日志
#mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

3、在service-edu的client包里面修改接口並創建熔斷器實現類

接口
package com.stu.eduservice.client;

import com.stu.commonutils.ResultData;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestParam;

import java.util.List;
//這個是vod屬性文件里的服務名,即spring.application.name=service-vod,
//fallback是實現類的class
@FeignClient(name = "service-vod",fallback = VodFileDegradeFeignClient.class) @Component public interface VodClient {

    //根據id刪除阿里雲視頻(映射路徑是Vod業務里controller層的類映射+方法上的映射,即
    // @RequestMapping("/eduvod/video") + @DeleteMapping("removeVideo/{id}"))

    /* @FeignClient注解用於指定從哪個服務中調用功能 ,名稱與被調用的服務名保持一致。
    @GetMapping注解用於對被調用的微服務進行地址映射。
    @PathVariable注解一定要指定參數名稱,否則出錯
    @Component注解防止,在其他位置注入CodClient時idea報錯*/

    @DeleteMapping("/eduvod/video/removeVideo/{id}")
    public ResultData removeAlyVideo(@PathVariable("id") String id);

    //根據id批量刪除阿里雲視頻
    @DeleteMapping("eduvod/video/removeVideoBatch")
    public ResultData removeVideoBatch(@RequestParam("videoIdList") List<String> videoIdList);
}

實現類

package com.stu.eduservice.client;

import com.stu.commonutils.ResultData;
import org.springframework.stereotype.Component;

import java.util.List;
/*熔斷器的實現類*/ @Component public class VodFileDegradeFeignClient implements VodClient {

    //如果刪除接口報錯,就會執行這里面的方面,比如刪除視頻的時候,只啟動edu服務,斷掉vod服務,就會執行這里的方法
    @Override
    public ResultData removeAlyVideo(String id) {
        return ResultData.error().message("刪除視頻出錯了");
    }

    @Override
    public ResultData removeVideoBatch(List<String> videoIdList) {
        return ResultData.error().message("批量刪除視頻出錯了");
    }
}

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM