1. 程式人生 > >SpringCloud學習筆記3

SpringCloud學習筆記3

服務的消費的兩種方式:一種使用:rest+ribbon,一種是Feign

一.第二種客戶端呼叫方式 — 服務消費者(Feign)

  1. Feign簡介
    Feign是一個宣告式的偽Http客戶端,它使得寫Http客戶端變得更簡單。
    使用Feign,只需要建立一個介面並註解。
    它具有可插拔的註解特性,可使用Feign註解和JAX-RS註解。Feign支援可插拔的編碼器和解碼器。
    Feign預設集成了Ribbon,並和Eureka結合,預設實現了負載均衡的效果。
    簡單來說:
    Feign採用的是基於介面 + 註解;Feign整合了ribbon

  2. 引入依賴
    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>
  1. 在呼叫的應用中建立 呼叫介面 並加入呼叫服務註解
    @FeignClient
@FeignClient("HELLO-SERVICE")    //明確該介面所對應eureka中哪個服務
public interface HelloServiceInterface {

    @RequestMapping("/hello/hello") //指定呼叫哪個url(一般是:應用名/類名/方法名)
    public String hello(@RequestParam("name") String name);	//對應上引數
}
  1. 開發入口類
    @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;
    }

}
  1. 配置application.yml
    ①指定服務埠、②、指定註冊中心地址、③指定應用名
spring:
  application:
    name: springcloud-feign-client  #指定應用名
server:
  port: 9091  #埠
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka
  1. 請求結果如圖
    圖一
    兩種客戶端呼叫掌握一種即可,Feign的複用更好,所以更推薦Feign形式

二.斷路器(Hystrix)

微服務架構中,根據業務拆分成各個服務,服務間相互呼叫(RPC),在SpringCloud可以用RestTemplate+Ribbon和Feign來呼叫。為保證其高可用,單個服務通常會叢集部署。
由於網路原因或者自身的原因,服務並不能保證100%可用,如果單個服務出現問題,呼叫這個服務就會出現執行緒阻塞,此時若有大量的請求湧入,Servlet容器的執行緒資源會被消耗完畢,導致服務癱瘓。
服務與服務之間的依賴性,故障會傳播,會對整個微服務系統造成災難性的嚴重後果,這就是服務故障的“雪崩”效應。

  1. 斷路器簡介

Netflix開源了Hystrix元件,實現了斷路器模式,SpringCloud對這一元件進行了整合。 在微服務架構中,一個請求需要呼叫多個服務是非常常見的,如下架構所展示一樣:

圖二

如果較底層的服務如果出現故障,會導致連鎖故障。當對特定的服務的呼叫的不可用達到到個閥值(Hystric 是5秒 2 0 次) 斷路器將會被開啟。如下圖所示:

圖三

注意:此時斷路器開啟後,可以避免連鎖故障,fallback方法可以直接返回一個固定值。

  1. 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介面時,會執行快速失敗,直接返回一組字串,而不是等待響應超時,這很好的控制了容器的執行緒阻塞

  1. 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框架無縫整合。