SpringCloud之熔斷器Hystrix

前言

在盤龍等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都網(wǎng)站制作、網(wǎng)站建設(shè) 網(wǎng)站設(shè)計制作定制網(wǎng)站建設(shè),公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),成都品牌網(wǎng)站建設(shè),網(wǎng)絡(luò)營銷推廣,外貿(mào)營銷網(wǎng)站建設(shè),盤龍網(wǎng)站建設(shè)費用合理。

SpringCloud 是微服務(wù)中的翹楚,最佳的落地方案。

在微服務(wù)架構(gòu)中多層服務(wù)之間會相互調(diào)用,如果其中有一層服務(wù)故障了,可能會導(dǎo)致一層服務(wù)或者多層服務(wù)

故障,從而導(dǎo)致整個系統(tǒng)故障。這種現(xiàn)象被稱為服務(wù)雪崩效應(yīng)。

SpringCloud 中的 Hystrix 組件就可以解決此類問題,Hystrix 負(fù)責(zé)監(jiān)控服務(wù)之間的調(diào)用情況,連續(xù)多次失敗的

情況進(jìn)行熔斷保護(hù)。保護(hù)的方法就是使用 Fallback,當(dāng)調(diào)用的服務(wù)出現(xiàn)故障時,就可以使用 Fallback 方法的

返回值;Hystrix 間隔時間會再次檢查故障的服務(wù),如果故障服務(wù)恢復(fù),將繼續(xù)使用服務(wù)。

源碼

GitHub地址:https://github.com/intomylife/SpringCloud

環(huán)境

JDK 1.8.0 +

Maven 3.0 +

SpringBoot 2.0.3

SpringCloud Finchley.RELEASE

開發(fā)工具

IntelliJ IDEA

正文

commons 工程

commons 工程 - POM 文件

xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

4.0.0

com.zwc

springcloud-hystrix-commons

1.0

springcloud-hystrix-commons

公用工程

jar

UTF-8

1.8

Cairo-SR3

Finchley.RELEASE

io.spring.platform

platform-bom

${platform-bom.version}

pom

import

org.springframework.cloud

spring-cloud-dependencies

${spring-cloud-dependencies.version}

pom

import

org.springframework.boot

spring-boot-maven-plugin

配置一些共用依賴

commons 工程 - 項目結(jié)構(gòu)

service 工程

① 此工程下有四個模塊:一個注冊中心以及服務(wù) A、B、C

② A 提供服務(wù)并且調(diào)用服務(wù) B、B 提供服務(wù)并且調(diào)用服務(wù) C 以及 C 提供服務(wù)

registry-server(注冊中心)

registry-server - POM 文件

xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

4.0.0

com.zwc

springcloud-hystrix-service

1.0

com.zwc

springcloud-hystrix-registry-service

1.0

springcloud-hystrix-registry-service

注冊中心

jar

com.zwc

springcloud-hystrix-commons

1.0

org.springframework.cloud

spring-cloud-starter-netflix-eureka-server

org.springframework.boot

spring-boot-maven-plugin

主要是加入 spring-cloud-starter-netflix-eureka-server 依賴

registry-server - application.yml 配置文件

# 端口

server:

port: 8761

# 應(yīng)用名稱

spring:

application:

name: eurka-server

eureka:

instance:

# 使用 ip 代替實例名

prefer-ip-address: true

# 實例的主機(jī)名

hostname: ${spring.cloud.client.ip-address}

# 實例的 ID 規(guī)則

instance-id: ${spring.cloud.client.ip-address}:${spring.application.name}:${server.port}

client:

# 是否向注冊中心注冊自己

registerWithEureka: false

# 是否向注冊中心獲取注冊信息

fetchRegistry: false

serviceUrl:

# 注冊中心地址

defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

這里使用了默認(rèn)的 8761 端口,當(dāng)然也可以更改,不過在發(fā)現(xiàn)調(diào)用服務(wù)端的注冊中心地址端口要與它一致

registry-server - 啟動類

package com.zwc;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@SpringBootApplication

@EnableEurekaServer

public class SpringcloudHystrixRegistryServiceApplication {

public static void main(String[] args) {

SpringApplication.run(SpringcloudHystrixRegistryServiceApplication.class, args);

}

}

在啟動類中添加 @EnableEurekaServer 注解表示此工程是注冊中心

registry-server - 啟動項目

1. 項目啟動成功后訪問 http://localhost:8761/ 即可看到 eureka-server 主頁面

服務(wù)工程 A(提供者和消費者)

服務(wù)工程 A - POM 文件

xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

4.0.0

com.zwc

springcloud-hystrix-a-service

1.0

com.zwc

springcloud-hystrix-a-service-core

1.0

springcloud-hystrix-a-service-core

服務(wù)工程 - A 核心

jar

com.zwc

springcloud-hystrix-commons

1.0

com.zwc

springcloud-hystrix-a-service-api

1.0

org.springframework.cloud

spring-cloud-starter-netflix-eureka-client

org.springframework.cloud

spring-cloud-starter-openfeign

org.springframework.boot

spring-boot-maven-plugin

加入 spring-cloud-starter-netflix-eureka-client 依賴

還需要加入 Feign 的起步依賴 spring-cloud-starter-openfeign

服務(wù)工程 A - application.yml 配置文件

# 端口

server:

port: 8090

# 應(yīng)用名稱

spring:

application:

name: hystrix-a

eureka:

instance:

# 使用 ip 代替實例名

prefer-ip-address: true

# 實例的主機(jī)名

hostname: ${spring.cloud.client.ip-address}

# 實例的 ID 規(guī)則

instance-id: ${spring.cloud.client.ip-address}:${spring.application.name}:${server.port}

client:

serviceUrl:

# 注冊中心地址

defaultZone: http://${eureka.instance.hostname}:8761/eureka/

注意此處配置注冊中心地址的端口為 8761 也就是上面注冊中心工程配置的端口

spring.application.name:應(yīng)用名稱,被消費者調(diào)用時需要用到,它在消費的同時也可以被消費

這里除注冊中心工程以外的三個工程都與此配置相似,不一樣的地方就是端口和應(yīng)用名稱,不再贅述

服務(wù)工程 A - application.properties(注意)

# 開啟斷路器

feign.hystrix.enabled=true

斷路器要主動開啟,服務(wù)調(diào)用失敗時才會熔斷

此處有一個坑,把此配置寫到 yml 中熔斷不會生效

A 和 B 工程都有此配置,此次搭建中 C 工程只提供服務(wù),沒有消費服務(wù)。所以 C 工程不用該配置

服務(wù)工程 A - controller 前端控制器(提供服務(wù))

package com.zwc.a.controller;

import org.springframework.beans.factory.annotation.Value;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RestController;

/*

* @ClassName ASayHelloController

* @Desc TODO Say Hello

* @Date 2019/5/20 23:24

* @Version 1.0

*/

@RestController

public class ASayHelloController {

/*

* @ClassName ASayHelloController

* @Desc TODO 讀取配置文件中的端口

* @Date 2019/5/20 23:24

* @Version 1.0

*/

@Value("${server.port}")

private String port;

/*

* @ClassName ASayHelloController

* @Desc TODO Say Hello

* @Date 2019/5/20 23:24

* @Version 1.0

*/

@RequestMapping("/a")

public String a(){

return "Hello!I'm a. port:" + port;

}

}

提供一個服務(wù):輸出 Hello 和端口

服務(wù)工程 A - 服務(wù)調(diào)用

package com.zwc.a.api.feign;

import com.zwc.a.api.impl.FeignApiFallBack;

import org.springframework.cloud.openfeign.FeignClient;

import org.springframework.web.bind.annotation.RequestMapping;

/*

* @ClassName FeignApi

* @Desc TODO 使用 Feign 調(diào)用 b - 接口

* @Date 2019/5/20 23:21

* @Version 1.0

*/

@FeignClient(value = "hystrix-b" , fallback = FeignApiFallBack.class)

public interface FeignApi {

/*

* @ClassName FeignApi

* @Desc TODO 通過 hystrix-b 服務(wù)名調(diào)用 b() 方法

* @Date 2019/5/20 23:21

* @Version 1.0

*/

@RequestMapping("/b")

String b();

}

通過 @FeignClient 注解中 value = "hystrix-b" 來指定調(diào)用哪個服務(wù)

hystrix-b 就是提供者的 spring.application.name:應(yīng)用名稱

通過 @FeignClient 注解中 fallback = FeignApiFallBack.class 來指定熔斷時調(diào)用的方法

FeignApiFallBack 就是此類(FeignApi)的實現(xiàn)類,對應(yīng)的實現(xiàn)方法就是此類的熔斷時調(diào)用的方法

b():此方法是 B 工程中提供的服務(wù),在這里定義成接口

注意要與提供者具有相同返回值,相同方法名以及相同參數(shù)

服務(wù)工程 A - Fallback(FeignApiFallBack)

package com.zwc.a.api.impl;

import com.zwc.a.api.feign.FeignApi;

import org.springframework.stereotype.Component;

/*

* @ClassName FeignApi

* @Desc TODO fallback

* @Date 2019/5/20 23:21

* @Version 1.0

*/

@Component

public class FeignApiFallBack implements FeignApi {

/*

* @ClassName FeignApiFallBack

* @Desc TODO 調(diào)用 hystrix-b 服務(wù)中的 b() 方法失敗時執(zhí)行

* @Date 2019/5/20 23:31

* @Version 1.0

*/

@Override

public String b() {

return "Hello!aUseB fail";

}

}無錫婦科醫(yī)院 http://mobile.xasgyy.net/

使用 @Component 注解把此類交給 Spring 管理

實現(xiàn)了 FeignApi 接口,提供熔斷時對應(yīng)的方法

服務(wù)工程 A - controller 前端控制器(消費服務(wù))

package com.zwc.a.controller;

import com.zwc.a.api.feign.FeignApi;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RestController;

/*

* @ClassName AUseBFeignController

* @Desc TODO 使用 Feign 調(diào)用 b - 前端控制器

* @Date 2019/5/20 23:23

* @Version 1.0

*/

@RestController

public class AUseBFeignController {

@Autowired(required = false)

private FeignApi feignApi;

/*

* @ClassName FeignController

* @Desc TODO 通過 hystrix-b 服務(wù)名調(diào)用 b() 方法

* @Date 2019/5/20 23:13

* @Version 1.0

*/

@RequestMapping("/aUseB")

public String aUseB(){

return feignApi.b();

}

}

使用 @Autowired 注解裝配 Bean,通過此 Bean 中的方法調(diào)用服務(wù)

此類對外暴露接口,調(diào)用的實則是提供者的服務(wù)

服務(wù)工程 A - 啟動類

package com.zwc;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

import org.springframework.cloud.openfeign.EnableFeignClients;

@SpringBootApplication

@EnableEurekaClient

@EnableFeignClients

public class SpringcloudHystrixAServiceCoreApplication {

public static void main(String[] args) {

SpringApplication.run(SpringcloudHystrixAServiceCoreApplication.class, args);

}

}

添加 @EnableEurekaClient 注解表示此工程可以提供服務(wù)或調(diào)用服務(wù)

添加 @EnableFeignClients 注解表示開啟 Feign 功能進(jìn)行遠(yuǎn)程調(diào)用

服務(wù)工程 A - 啟動項目

1. 項目啟動成功后訪問:http://localhost:8090/a (調(diào)用自己的服務(wù))

2. 輸出內(nèi)容:'Hello!I'm a. port:8090'

3. 刷新 http://localhost:8761/(注冊中心)可以看到服務(wù)已經(jīng)被注冊進(jìn)來了

4. 訪問地址:http://localhost:8090/aUseB (調(diào)用 B 工程的服務(wù))

5. 輸出內(nèi)容:'Hello!aUseB fail' (此時因為 B 工程還未啟動,所以調(diào)用了 fallback 中的方法)

6. 啟動服務(wù)工程 B,項目啟動成功后再次訪問:http://localhost:8090/aUseB (調(diào)用 B 工程的服務(wù))

7. 輸出內(nèi)容:'Hello!I'm b. port:8091' (如果還未調(diào)用成功,等待一會再刷新試試)

8. 此時就證明熔斷成功

9. 訪問地址:http://localhost:8091/b (調(diào)用自己的服務(wù))

10. 輸出內(nèi)容:'Hello!I'm b. port:8091'

11. 再次刷新 http://localhost:8761/(注冊中心),發(fā)現(xiàn) B 工程服務(wù)也注冊進(jìn)來了

service 工程 - 項目結(jié)構(gòu)

把多工程項目使用 IntelliJ IDEA 打開

把項目從 GitHub 中下載到你的本地

打開 IntelliJ IDEA

點擊 File -> Open

打開你下載到本地的項目目錄

springcloud-hystrix -> springcloud-hystrix-service(選擇打開此工程)

打開 service 工程后

再次點擊 File -> Project Structrue

選擇 Modules,點擊 '+' 符號

點擊 Import Module

還是打開你下載到本地的項目目錄

springcloud-hystrix -> springcloud-hystrix-commons -> pom.xml

點擊 OK

點擊 Next,F(xiàn)inish

點擊 Apply,OK

希望能夠幫助到你

over

新聞名稱:SpringCloud之熔斷器Hystrix
網(wǎng)頁網(wǎng)址:http://bm7419.com/article24/psojce.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供做網(wǎng)站、移動網(wǎng)站建設(shè)、網(wǎng)站維護(hù)、標(biāo)簽優(yōu)化關(guān)鍵詞優(yōu)化、網(wǎng)站改版

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站建設(shè)