Springcloud(二) feign

西涼馬戳戳發表於2021-12-23

Feign

Spring Cloud Feign對 Ribbon 負載均衡、Hystrix 服務熔斷進行簡化,在其基礎上進行了進一步的封裝,不僅在配置上大大簡化了開發工作,同時還提供了一種宣告式的 Web 服務客戶端定義方式。

使用 Feign 實現消費者

  1. 建立spring boot工程,並匯入依賴

    <dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency> 
    <dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-starter-feign</artifactId>
     <version>1.4.5.RELEASE</version>
    </dependency>
    
  2. 在專案入口類上新增@EnableFeignClients 註解表示開啟 Spring Cloud Feign

    @SpringBootApplication
    @EnableEurekaClient
    @EnableFeignClients
    public class SpringcloudConsumerApplication {
        ……
    }
    
  3. 定義一個 HelloService 介面,通過@FeignClient 註解來指定服務名稱,進而繫結服務,然後再通過 SpringMVC 中提供的註解來繫結服務提供者提供的介面。

    @FeignClient(name="springcloud-client")
    public interface HelloService {
    
        /**
         * 宣告一個方法,這個方法就是遠端的服務提供者提供的那個方法
         *
         * @return
         */
        @RequestMapping("/service/hello")
        String hello();
    }
    

    服務提供者:

    @RestController
    public class HelloController {
    
        @GetMapping("/service/hello")
        public String hello() {
            System.out.println("服務提供者1。。。。。。。");
            return "Hello, Spring Cloud,Provider 1";
        }
    }
    
  4. 在服務消費者模組中建立一個controller,

    @RestController
    public class FeignController {
    
        @Autowired
        private HelloService helloService;
    
        @RequestMapping("/web/hello")
        public String hello () {
    
            //呼叫宣告式的介面方法,實現對遠端服務的呼叫
            return helloService.hello();
    
        }
    }
    
  5. 啟動服務消費者,訪問localhost:8764/web/hello

使用 Feign 實現負載均衡和服務熔斷

  • 負載均衡:@FeignClient 註解的介面,然後使用@RequestMapping 註解到方法上對映遠端的 REST 服務,此方法是做好負責均衡配置的。

  • 服務熔斷

    1. 匯入 hystrix 依賴:

      <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
      </dependency>
      
    2. 在 application.yml 檔案中新增:

      feign:
        hystrix:
          enabled: true
      
    3. 指定熔斷回撥邏輯,自定義回撥類實現介面,並實現對應的方法,即為對應方法的熔斷回撥邏輯。

      @FeignClient(name="springcloud-client", fallback = MyFallback.class)
      
      @Component
      public class MyFallback implements HelloService {
          @Override
          public String hello() {
              return "發生異常了";
          }
      }
      
    4. 啟動:

    1. 為@FeignClient 修飾的介面加上 fallback 方法可以實現遠端服務發生異常後進行服務的熔斷,但是不能獲取到遠端服務的異常資訊,如果要獲取遠端服務的異常資訊,此時可以使用 fallbackFactory:

      @FeignClient(name="springcloud-client", fallbackFactory = MyFallbackFactory.class)
      
      @Component
      public class MyFallbackFactory implements FallbackFactory<HelloService> {
          @Override
          public HelloService create(Throwable throwable) {
              return () -> throwable.getMessage();
          }
      }
      

相關文章