Springcloud(二) feign

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();
          }
      }
      

posted @ 2021-12-23 22:32  西凉马戳戳  阅读(287)  评论(0编辑  收藏  举报