---恢復內容開始---
分布式項目架構
根據業務需求進行拆分成N個子系統,多個子系統相互協作才能完成業務流程子系統之間通訊使用RPC遠程通訊技術。
優點:
1.把模塊拆分,使用接口通信,降低模塊之間的耦合度。
2.把項目拆分成若干個子項目,不同的團隊負責不同的子項目。
3.增加功能時只需要再增加一個子項目,調用其它系統的接口就可以。
4.可以靈活的進行分布式部署。
有優點就有缺點,缺點如下:
1.系統之間交互需要使用遠程通信,接口開發增加工作量。
2.各個模塊有一些通用的業務邏輯無法共用。
為了解決上面分布式架構的缺點,我們引入了soa架構,SOA:Service Oriented Architecture面向服務的架構。也就是把工程拆分成服務層、表現層兩個工程。服務層中包含業務邏輯,只需要對外提供服務即可。表現層只需要處理和頁面的交互,業務邏輯都是調用服務層的服務來實現。
rpc遠程調用框架
幾種比較典型的RPC的實現和調用框架。
(1)RMI實現,利用java.rmi包實現,基於Java遠程方法協議(Java Remote Method Protocol)
和java的原生序列化。
(2)Hessian,是一個輕量級的remoting onhttp工具,使用簡單的方法提供了RMI的功能。 基於HTTP協議,采用二進制編解碼。
(3)thrift是一種可伸縮的跨語言服務的軟件框架。thrift允許你定義一個描述文件,描述數據類型和服務接口。依據該文件,編譯器方便地生成RPC客戶端和服務器通信代碼。
(4)SpringCloud 為開發人員提供了快速構建分布式系統的一些工具,包括配置管理、服務發現、斷路器、路由、微代理、事件總線、全局鎖、決策競選、分布式會話等等。
(4) Dubbo是阿里巴巴公司開源的一個高性能優秀的服務框架,使得應用可通過高性能的 RPC 實現服務的輸出和輸入功能,可以和 Spring框架無縫集成。
1.服務的注冊與發現(Eureka )(注冊中心)

Eureka環境搭建:
1.pom文件如下
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.2.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<!--eureka server -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
<!-- spring boot test -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Dalston.RC1</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>
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
2.配置application.yml
port: 8888
eureka:
instance:
hostname: localhost
client:
registerWithEureka: false
fetchRegistry: false
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
3.配置Springboot的啟動文件
package com.nswi;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
/**
*
*@author jianghaojie
*Date:2019年3月14日
*
*/
@SpringBootApplication
@EnableEurekaServer
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
}
4.打開eureka可以看見生產者service-menmber與service-order都同時注入到eureka中

查看service-menber

查看service-order

生產者與消費者將IP和端口號注入eureka,消費者在eureka中拿到生產者的IP與端口號,在通過httpclient請求對生產者進行調用

使用ribbon實現負載均衡
啟動兩個會員服務工程,端口號分別為8762、8763,訂單服務 使用負載均衡策略輪訓到會員服務接口。



但是外面一般采用fengn
服務消費者(Feign)
什么是Feign
Feign是一個聲明式的偽Http客戶端,它使得寫Http客戶端變得更簡單。使用Feign,只需要創建一個接口並注解。它具有可插拔的注解特性,可使用Feign 注解和JAX-RS注解。Feign支持可插拔的編碼器和解碼器。Feign默認集成了Ribbon,並和Eureka結合,默認實現了負載均衡的效果。
簡而言之:
- Feign 采用的是基於接口的注解
- Feign 整合了ribbon
Maven依賴
| <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.2.RELEASE</version> <relativePath /> <!-- lookup parent from repository --> </parent>
<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties>
<dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-ribbon</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-feign</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>
<dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Dalston.RC1</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>
<repositories> <repository> <id>spring-milestones</id> <name>Spring Milestones</name> <url>https://repo.spring.io/milestone</url> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories> |
application.yml配置
| eureka: client: serviceUrl: defaultZone: http://localhost:8888/eureka/ server: port: 8765 spring: application: name: service-order-feign |
service層如下
/**
*
*/
package com.nswi.service;
import java.util.List;
import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;
import com.nswi.fallbake.MenberFallbake;
/**
*
*@author jianghaojie
*Date:2019年3月15日
* feign
*/
@FeignClient(value ="service-member" )
public interface FengnService {
@RequestMapping("/getall")
public List<String > feigngetall();
}control層如下
/**
*
*/
package com.nswi.controller;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.nswi.service.FengnService;
/**
*
*@author jianghaojie
*Date:2019年3月15日
*
*/
@RestController
public class FengnControlller {
@Autowired
private FengnService service;
@RequestMapping(value="getall")
public List<String > feigngetall2(){
return service.feigngetall();
}
}
application的啟動如下
/**
*
*/
package com.nswi;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.feign.EnableFeignClients;
/**
*
*@author jianghaojie
*Date:2019年3月15日
*
*/
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
public class FeignApp {
public static void main(String[] args) {
SpringApplication.run(FeignApp.class, args);
}
}
同樣他也能fengn作負載均衡。采用輪訓機制
效果如下


4.路由網關zuul
Zuul的主要功能是路由轉發和過濾器。路由功能是微服務的一部分,比如/api/user轉發到到user服務,/api/shop轉發到到shop服務。zuul默認和Ribbon結合實現了負載均衡的功能, 類似於nginx轉發。
Maven依賴
創建工程service-zuul
| <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.2.RELEASE</version> <relativePath /> <!-- lookup parent from repository --> </parent>
<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties>
<dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-zuul</artifactId> </dependency> <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> </dependencies>
<dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Dalston.RC1</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>
<repositories> <repository> <id>spring-milestones</id> <name>Spring Milestones</name> <url>https://repo.spring.io/milestone</url> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories> |
application.yml配置
| eureka: client: serviceUrl: defaultZone: http://localhost:8888/eureka/ server: port: 8769 spring: application: name: service-zuul zuul: routes: api-a: path: /api-member/** service-id: service-member api-b: path: /api-order/** service-id: service-order |
/api-order/**這個是以/api-order/攔截開頭的后面任何地址
application的啟動項如下
/**
*
*/
package com.nswi;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
/**
*
*@author jianghaojie
*Date:2019年3月15日
*
*/
@EnableZuulProxy
@EnableEurekaClient
@SpringBootApplication
public class ZuulAPP {
public static void main(String[] args) {
SpringApplication.run(ZuulAPP.class, args);
}
}
發送請求http://127.0.0.1:8769/api-member/getMemberAll
轉發到http://127.0.0.1:8762/getMemberAll
開啟網關 @EnableZuulProxy
服務過濾
| @Component public class MyFilter extends ZuulFilter {
private static Logger log = LoggerFactory.getLogger(MyFilter.class);
@Override public String filterType() { return "pre"; }
@Override public int filterOrder() { return 0; }
public boolean shouldFilter() { return true; }
public Object run() { RequestContext ctx = RequestContext.getCurrentContext(); HttpServletRequest request = ctx.getRequest(); log.info(String.format("%s >>> %s", request.getMethod(), request.getRequestURL().toString())); Object accessToken = request.getParameter("token"); if (accessToken != null) { return null; } log.warn("token is empty"); ctx.setSendZuulResponse(false); ctx.setResponseStatusCode(401); try { ctx.getResponse().getWriter().write("token is empty"); } catch (Exception e) { } return null;
} } |
消費者的controller層測試配置如下
/**
*
*/
package com.nswi.controller;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.nswi.service.OrderService;
/**
*
*@author jianghaojie
*Date:2019年3月14日
*
*/
@RestController
public class OrderController {
@Autowired
private OrderService orderService;
@RequestMapping("/getOrederUserall")
public List<String > getOrederUserall() {
System.out.println("訂單開始調用任務");
return orderService.getOrder();
}
@RequestMapping("/getorderapi")
public String getOrderapi() {
return "this is order service";
}
}
生產者conroller層配置如下(主要是增加了加黑的配置方便區別和學習)
/**
*
*/
package com.nswi.concroller;
import java.util.ArrayList;
import java.util.List;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
*
*@author jianghaojie
*Date:2019年3月14日
*
*/
@RestController
public class MemberController {
@Value("${server.port}")
private String serverport;
@RequestMapping(value="/getall")
public List<String> getall() {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
List<String >list= new ArrayList<>();
list.add("zhangfei");
list.add("lisi");
list.add("wangwu");
list.add(serverport);
return list;
}
@RequestMapping("/getmemberApi")
public String getmemberApi() {
return "this is vip service";
}
}


斷路器(Hystrix)
為什么需要 Hystrix?
在微服務架構中,我們將業務拆分成一個個的服務,服務與服務之間可以相互調用(RPC)。為了保證其高可用,單個服務又必須集群部署。由於網絡原因或者自身的原因,服務並不能保證服務的100%可用,如果單個服務出現問題,調用這個服務就會出現網絡延遲,此時若有大量的網絡涌入,會形成任務累計,導致服務癱瘓,甚至導致服務“雪崩”。為了解決這個問題,就出現斷路器模型。
Hystrix 是一個幫助解決分布式系統交互時超時處理和容錯的類庫, 它同樣擁有保護系統的能力.什么是服務雪崩
分布式系統中經常會出現某個基礎服務不可用造成整個系統不可用的情況, 這種現象被稱為服務雪崩效應. 為了應對服務雪崩, 一種常見的做法是手動服務降級. 而Hystrix的出現,給我們提供了另一種選擇.
服務雪崩應對策略
針對造成服務雪崩的不同原因, 可以使用不同的應對策略:
- 流量控制
- 改進緩存模式
- 服務自動擴容
- 服務調用者降級服務
流量控制 的具體措施包括:
- 網關限流
- 用戶交互限流
- 關閉重試
服務雪崩解決辦法
1.服務雪崩的原因
(1)某幾個機器故障:例如機器的硬驅動引起的錯誤,或者一些特定的機器上出現一些的bug(如,內存中斷或者死鎖)。
(2)服務器負載發生變化:某些時候服務會因為用戶行為造成請求無法及時處理從而導致雪崩,例如阿里的雙十一活動,若沒有提前增加機器預估流量則會造服務器壓力會驟然增大二掛掉。
(3)人為因素:比如代碼中的路徑在某個時候出現bug
2.解決或緩解服務雪崩的方案
一般情況對於服務依賴的保護主要有3中解決方案:
(1)熔斷模式:這種模式主要是參考電路熔斷,如果一條線路電壓過高,保險絲會熔斷,防止火災。放到我們的系統中,如果某個目標服務調用慢或者有大量超時,此時,熔斷該服務的調用,對於后續調用請求,不在繼續調用目標服務,直接返回,快速釋放資源。如果目標服務情況好轉則恢復調用。
(2)隔離模式:這種模式就像對系統請求按類型划分成一個個小島的一樣,當某個小島被火少光了,不會影響到其他的小島。例如可以對不同類型的請求使用線程池來資源隔離,每種類型的請求互不影響,如果一種類型的請求線程資源耗盡,則對后續的該類型請求直接返回,不再調用后續資源。這種模式使用場景非常多,例如將一個服務拆開,對於重要的服務使用單獨服務器來部署,再或者公司最近推廣的多中心。
(3)限流模式:上述的熔斷模式和隔離模式都屬於出錯后的容錯處理機制,而限流模式則可以稱為預防模式。限流模式主要是提前對各個類型的請求設置最高的QPS閾值,若高於設置的閾值則對該請求直接返回,不再調用后續資源。這種模式不能解決服務依賴的問題,只能解決系統整體資源分配問題,因為沒有被限流的請求依然有可能造成雪崩效應。
3.熔斷設計
在熔斷的設計主要參考了hystrix的做法。其中最重要的是三個模塊:熔斷請求判斷算法、熔斷恢復機制、熔斷報警
(1)熔斷請求判斷機制算法:使用無鎖循環隊列計數,每個熔斷器默認維護10個bucket,每1秒一個bucket,每個blucket記錄請求的成功、失敗、超時、拒絕的狀態,默認錯誤超過50%且10秒內超過20個請求進行中斷攔截。
(2)熔斷恢復:對於被熔斷的請求,每隔5s允許部分請求通過,若請求都是健康的(RT<250ms)則對請求健康恢復。
(3)熔斷報警:對於熔斷的請求打日志,異常請求超過某些設定則報警
4.隔離設計
隔離的方式一般使用兩種
(1)線程池隔離模式:使用一個線程池來存儲當前的請求,線程池對請求作處理,設置任務返回處理超時時間,堆積的請求堆積入線程池隊列。這種方式需要為每個依賴的服務申請線程池,有一定的資源消耗,好處是可以應對突發流量(流量洪峰來臨時,處理不完可將數據存儲到線程池隊里慢慢處理)
(2)信號量隔離模式:使用一個原子計數器(或信號量)來記錄當前有多少個線程在運行,請求來先判斷計數器的數值,若超過設置的最大線程個數則丟棄改類型的新請求,若不超過則執行計數操作請求來計數器+1,請求返回計數器-1。這種方式是嚴格的控制線程且立即返回模式,無法應對突發流量(流量洪峰來臨時,處理的線程超過數量,其他的請求會直接返回,不繼續去請求依賴的服務)
5 超時機制設計
超時分兩種,一種是請求的等待超時,一種是請求運行超時。
等待超時:在任務入隊列時設置任務入隊列時間,並判斷隊頭的任務入隊列時間是否大於超時時間,超過則丟棄任務。
運行超時:直接可使用線程池提供的get方法
什么是熔斷機制
熔斷機制,就是下游服務出現問題后,為保證整個系統正常運行下去,而提供一種降級服務的機制,通過返回緩存數據或者既定數據,避免出現系統整體雪崩效應。在springcloud中,該功能可通過配置的方式加入到項目中。
Hystrix作用
1.斷路器機制
斷路器很好理解, 當Hystrix Command請求后端服務失敗數量超過一定比例(默認50%), 斷路器會切換到開路狀態(Open). 這時所有請求會直接失敗而不會發送到后端服務. 斷路器保持在開路狀態一段時間后(默認5秒), 自動切換到半開路狀態(HALF-OPEN). 這時會判斷下一次請求的返回情況, 如果請求成功, 斷路器切回閉路狀態(CLOSED), 否則重新切換到開路狀態(OPEN). Hystrix的斷路器就像我們家庭電路中的保險絲, 一旦后端服務不可用, 斷路器會直接切斷請求鏈, 避免發送大量無效請求影響系統吞吐量, 並且斷路器有自我檢測並恢復的能力.
2.Fallback
Fallback相當於是降級操作. 對於查詢操作, 我們可以實現一個fallback方法, 當請求后端服務出現異常的時候, 可以使用fallback方法返回的值. fallback方法的返回值一般是設置的默認值或者來自緩存.
3.資源隔離
在Hystrix中, 主要通過線程池來實現資源隔離. 通常在使用的時候我們會根據調用的遠程服務划分出多個線程池. 例如調用產品服務的Command放入A線程池, 調用賬戶服務的Command放入B線程池. 這樣做的主要優點是運行環境被隔離開了. 這樣就算調用服務的代碼存在bug或者由於其他原因導致自己所在線程池被耗盡時, 不會對系統的其他服務造成影響. 但是帶來的代價就是維護多個線程池會對系統帶來額外的性能開銷. 如果是對性能有嚴格要求而且確信自己調用服務的客戶端代碼不會出問題的話, 可以使用Hystrix的信號模式(Semaphores)來隔離資源.
服務的降級
什么是服務降級
所有的RPC技術里面服務降級是一個最為重要的話題,所謂的降級指的是當服務的提供方不可使用的時候,程序不會出現異常,而會出現本地的操作調
service-order工程新增Maven依賴
| <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-hystrix</artifactId> </dependency> |
下面使用feign演示熔斷機制
service層如下:
加入的東西我加粗重點
/**
*
*/
package com.nswi.service;
import java.util.List;
import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;
import com.nswi.fallbake.MenberFallbake;
/**
*
*@author jianghaojie
*Date:2019年3月15日
* feign
*/
@FeignClient(value ="service-member" ,fallback=MenberFallbake.class)
public interface FengnService {
@RequestMapping("/getall")
public List<String > feigngetall();
}
controller層如下
/**
*
*/
package com.nswi.controller;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.nswi.service.FengnService;
/**
*
*@author jianghaojie
*Date:2019年3月15日
*
*/
@RestController
public class FengnControlller {
@Autowired
private FengnService service;
@RequestMapping(value="getall")
public List<String > feigngetall2(){
return service.feigngetall();
}
}
關鍵的fallbake如下也就是出現高並發服務器出現不能立即響應的情況的解決方案
/**
*
*/
package com.nswi.fallbake;
import java.util.ArrayList;
import java.util.List;
import org.springframework.stereotype.Component;
import com.nswi.service.FengnService;
/**
*
*@author jianghaojie
*Date:2019年3月15日
*
*/
@Component
public class MenberFallbake implements FengnService {
@Override
public List<String> feigngetall() {
List<String> List = new ArrayList<>();
List.add("服務發生異常");
return List;
}
}
application.yml的配置如下(黑色為重點)
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8888/eureka/
server:
port: 8765
spring:
application:
name: service-order-feign
feign:
hystrix:
enabled: true
###超時時間
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 2000
這個是hystrix超時時間的配置,加黑的為重點
下面是啟動項不變
/**
*
*/
package com.nswi;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.feign.EnableFeignClients;
/**
*
*@author jianghaojie
*Date:2019年3月15日
*
*/
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
public class FeignApp {
public static void main(String[] args) {
SpringApplication.run(FeignApp.class, args);
}
}在member(生產者)里面用thread。sleep的故意延遲響應方面查看熔斷機制
/**
*
*/
package com.nswi.concroller;
import java.util.ArrayList;
import java.util.List;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
*
*@author jianghaojie
*Date:2019年3月14日
*
*/
@RestController
public class MemberController {
@Value("${server.port}")
private String serverport;
@RequestMapping(value="/getall")
public List<String> getall() {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
List<String >list= new ArrayList<>();
list.add("zhangfei");
list.add("lisi");
list.add("wangwu");
list.add(serverport);
return list;
}
@RequestMapping("/getmemberApi")
public String getmemberApi() {
return "this is vip service";
}
}
就會產生如下的這樣的效果,但是不影響其他線程,如果其他響應正常的話,也能做出反應,這就是熔斷機制

