前言
在盤龍等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強發(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 負責(zé)監(jiān)控服務(wù)之間的調(diào)用情況,連續(xù)多次失敗的
情況進行熔斷保護。保護的方法就是使用 Fallback,當調(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
# 實例的主機名
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/
這里使用了默認的 8761 端口,當然也可以更改,不過在發(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
# 實例的主機名
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 功能進行遠程調(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)被注冊進來了
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ù)也注冊進來了
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://aaarwkj.com/article24/psojce.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供做網(wǎng)站、移動網(wǎng)站建設(shè)、網(wǎng)站維護、標簽優(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)