SpringCloud學習筆記3
服務的消費的兩種方式:一種使用:rest+ribbon,一種是Feign
一.第二種客戶端呼叫方式 — 服務消費者(Feign)
-
Feign簡介
Feign是一個宣告式的偽Http客戶端,它使得寫Http客戶端變得更簡單。
使用Feign,只需要建立一個介面並註解。
它具有可插拔的註解特性,可使用Feign註解和JAX-RS註解。Feign支援可插拔的編碼器和解碼器。
Feign預設集成了Ribbon,並和Eureka結合,預設實現了負載均衡的效果。
簡單來說:
Feign採用的是基於介面 + 註解;Feign整合了ribbon -
引入依賴
spring-cloud-starter-eureka
spring-cloud-starter-feign
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<!--引入client的feign-->
<dependency>
< groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</ artifactId>
</dependency>
</dependencies>
- 在呼叫的應用中建立 呼叫介面 並加入呼叫服務註解
@FeignClient
@FeignClient("HELLO-SERVICE") //明確該介面所對應eureka中哪個服務
public interface HelloServiceInterface {
@RequestMapping("/hello/hello") //指定呼叫哪個url(一般是:應用名/類名/方法名)
public String hello(@RequestParam("name") String name); //對應上引數
}
- 開發入口類
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class,args);
}
}
開發Controller
@RestController
@RequestMapping("/hello")
public class HelloController {
//注入
@Autowired
private HelloServiceInterface helloServiceInterface;
@RequestMapping("/hello")
public String hello(String name){
String hello = helloServiceInterface.hello(name);
return hello;
}
}
- 配置application.yml
①指定服務埠、②、指定註冊中心地址、③指定應用名
spring:
application:
name: springcloud-feign-client #指定應用名
server:
port: 9091 #埠
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka
- 請求結果如圖
兩種客戶端呼叫掌握一種即可,Feign的複用更好,所以更推薦Feign形式
二.斷路器(Hystrix)
微服務架構中,根據業務拆分成各個服務,服務間相互呼叫(RPC),在SpringCloud可以用RestTemplate+Ribbon和Feign來呼叫。為保證其高可用,單個服務通常會叢集部署。
由於網路原因或者自身的原因,服務並不能保證100%可用,如果單個服務出現問題,呼叫這個服務就會出現執行緒阻塞,此時若有大量的請求湧入,Servlet容器的執行緒資源會被消耗完畢,導致服務癱瘓。
服務與服務之間的依賴性,故障會傳播,會對整個微服務系統造成災難性的嚴重後果,這就是服務故障的“雪崩”效應。
- 斷路器簡介
Netflix開源了Hystrix元件,實現了斷路器模式,SpringCloud對這一元件進行了整合。 在微服務架構中,一個請求需要呼叫多個服務是非常常見的,如下架構所展示一樣:
如果較底層的服務如果出現故障,會導致連鎖故障。當對特定的服務的呼叫的不可用達到到個閥值(Hystric 是5秒 2 0 次) 斷路器將會被開啟。如下圖所示:
注意:此時斷路器開啟後,可以避免連鎖故障,fallback方法可以直接返回一個固定值。
- restTemplate+ribbon 的斷路器使用示例
①.引入斷路器依賴
spring-cloud-starter-hystrix
<!--引入斷路器-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
②.開啟斷路器
入口類加入@EnableHystrix
@SpringBootApplication
@EnableDiscoveryClient
@EnableHystrix
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class,args);
}
}
③.使用斷路器
開發一個斷路器開發
@RestController
@RequestMapping("/show")
@DefaultProperties(defaultFallback = "defaultError")
public class ShowHelloController {
@Autowired
private RestTemplate restTemplate;
@RequestMapping("/hello")
@HystrixCommand(fallbackMethod = "errorHello" )
//該註解對該方法建立熔斷器功能,並指定了fallbackMethod熔斷方法,熔斷方法直接返回了一個字串
//fallbackMethod觸發節點:伺服器節點都宕機或都阻塞時,才會觸發。
public String showHello(String name){
String forObject = restTemplate.getForObject("http://HELLO-SERVICE/hello/hello?name=" + name, String.class);
return forObject;
}
public String errorHello(String name){
return "servers is shutdown, name: " + name;
}
public String defaultError(String name){
return "servers is shutdown, name: " + name;
}
}
④.啟動客戶端呼叫,測試斷路器
這就說明當服務不可用時,service-ribbon呼叫服務的API介面時,會執行快速失敗,直接返回一組字串,而不是等待響應超時,這很好的控制了容器的執行緒阻塞 。
- Feign 的斷路器使用示例
使用更為簡便,預設集成了Hystrix元件
①.開啟斷路器
Feign是自帶斷路器的,在低版本的Springcloud中,它沒有預設開啟。需要在配置檔案件中配置開啟它,在配置檔案加以下程式碼:
feign:
hystrix:
enabled: true
②.在FeignClient的服務介面加入如下實現類:
通過實現client介面中的方法,將實現方法作為呼叫的斷路器方法用來返回具體的值
@FeignClient(value = "HELLO-SERVICE",fallback = HelloServiceHystrixImpl.class)
//明確該介面對應eureka中的哪個服務
//fallback用來指定斷路器的實現 類的物件
public interface HelloServiceInterface {
@RequestMapping("/hello/hello/")
public String hello(@RequestParam("name") String name);
}
@Component
public class HelloServiceHystrixImpl implements HelloServiceInterface{
@Override
public String hello(String name) {
return "servers is : "+name;
}
}
③.啟動測試
三.擴充套件資訊/新聞
1、首先Hystix是什麼?
單詞中文名稱“豪豬”,因為周身長滿刺,能保護自己,代表一種防禦機制,這與Hystix功能不謀而合。
在一個分散式系統裡,許多依賴不可避免的會呼叫失敗,比如超時、異常等。如何能夠保證在一個依賴出問題的情況下,不會導致整體服務失敗,這個就是Hystrix需要做的事情。
Hystrix提供了熔斷、隔離、Fallback、Cache、監控等功能,能夠在一個或多個依賴同時出現問題時保證系統依然可用。
一個服務掛了後續的服務跟著不能用了,這就是雪崩效應!
2、Hystrix停止更新,Eureka停止更新
六年的時間說散就散,還來不及學一下原理,就不更新了!一聲惋惜,幾聲嘆息!
很多國內的中小公司,沒有技術能力更新維護的,基本也都在找替代的技術方案,相繼的轉向Consul、ZooKeeper、Etcd 等開源中介軟體上去了。
3、Hystrix官方推薦的替代產品
Hystrix官方同時也推薦我們使用新一代熔斷器神器Resilience4j。
Resilience4j有很多優勢,比如輕量級、依賴少、模組化程度較好、函數語言程式設計等優勢。
4、Spring Cloud該何去何從?
Spring Cloud生態正經歷著一些變化,前有Eureka閉源,後有Hystrix停止開發新功能。
同時,Spring Cloud也從依賴生態夥伴提供關鍵元件,演變到自己開發適配關鍵元件,例如提供了srpingcloud Zuul、springcloud Config、springcloud Loadbalance等開源產品,逐漸的整合,才能為更多的開發者提供舒心的服務。
5、Dubbo
Dubbo是阿里巴巴公司一個開源的高效能服務框架,致力於提供高效能和透明化的RPC遠端服務呼叫方案,以及SOA服務治理方案,使得應用可通過高效能RPC實現服務的輸出、輸入功能和Spring框架無縫整合。
-
Dubbo特性一覽
-
一張RPC完整的呼叫鏈圖
參考資料: https://mp.weixin.qq.com/s/uW5x5wS8XsSPQn7uBm8eDQ