• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • 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框架無縫集成。

    版權聲明:本文為weixin_30883311原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/weixin_30883311/article/details/97671381

    智能推薦

    springcloud學習筆記

    原文地址:請移步原文 一、什么是springcloud,有什么作用 Spring Cloud是一系列框架的有序集合。它利用Spring Boot的開發便利性巧妙地簡化了分布式系統基礎設施的開發,如服務發現注冊、配置中心、消息總線、負載均衡、斷路器、數據監控等,都可以用Spring Boot的開發風格做到一鍵啟動和部署。 二、springcloud的基本使用 1.服務的注冊與發現 ①創建一個pare...

    SpringCloud學習筆記(一)

    聲明:關于springcloud微服務的整套學習筆記都是基于開源項目AG-Admin的學習而整理的,本次文章中所涉及的包名或人名都沿用開源項目里面的名稱,也算是給老A推廣推廣他的項目吧。項目地址:https://gitee.com/geek_qi/ace-security。感謝老A能夠帶頭去搭建一個完整的spingcloud的微服務架構,這對于想要學習springcloud 的新手來說是...

    Springcloud學習筆記(二)

    上回在springcloud學習筆記(一)中我們演示了如何搭建eureka注冊中心和網關,今天我們借著老A的項目接著演示用戶微服務和配置微服務。用戶微服務就是用來模擬真實開發環境中的具體業務服務,配置微服務則是用來統一管理每個微服務的啟動文件的。 一:用戶微服務搭建 第一步是在ag-parent父工程中新建一個子工程取名ag-uc,接下來還是之前的套路,搭建一個微服務的三個步驟:導入依賴文件,修改...

    SpringCloud學習筆記

    SpringCloud學習筆記   ESB企業服務總線:用來連接各個服務節點,為了集成各種不同的服務。 1.系統架構演變 目標:   了解項目架構的演變歷程。 小結: 集中式架構 垂直拆分 分布式架構 SOA面向服務架構 微服務架構 2.微服務架構說明 目標:   了解SOA與微服務架構的區別以及說出微服務架構的特點。 分析: &emsp...

    HTML中常用操作關于:頁面跳轉,空格

    1.頁面跳轉 2.空格的代替符...

    猜你喜歡

    freemarker + ItextRender 根據模板生成PDF文件

    1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...

    電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!

    Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...

    requests實現全自動PPT模板

    http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...

    Linux C系統編程-線程互斥鎖(四)

    互斥鎖 互斥鎖也是屬于線程之間處理同步互斥方式,有上鎖/解鎖兩種狀態。 互斥鎖函數接口 1)初始化互斥鎖 pthread_mutex_init() man 3 pthread_mutex_init (找不到的情況下首先 sudo apt-get install glibc-doc sudo apt-get install manpages-posix-dev) 動態初始化 int pthread_...

    精品国产乱码久久久久久蜜桃不卡