第七章 声明式服务Feign

本文介绍了Feign,一个由Netflix开发的声明式REST客户端,用于简化SpringCloud微服务之间的调用。通过添加相关依赖并启用Feign,我们可以轻松创建服务消费者。在应用中定义接口并使用@FeignClient注解绑定服务,配合Ribbon实现负载均衡,结合Hystrix实现服务熔断。当服务异常时,可以通过fallbackFactory获取异常信息。
摘要由CSDN通过智能技术生成
7-1. Feign是什么?

​   Feign是NetFlix公司开发的一个声明式的REST调用客户端。

​   Ribbon负载均衡、Hystrix服务熔断器是我们Spring Cloud中进行微服务开发非常基础的组件,在使用的过程中我们也发现它们一般都是同时存在的,而且配置也都非常相似,每次开发中有很多相同的代码,因此Spring Cloud基于Netflix Fegin整合了Ribbon和Hystrix两个组件,让我们的开发工作变得非常简单,就像Spring Boot是对Spring + Spring MVC的简化一样,Spring Cloud Feign对Ribbon负载均衡和Hystrix服务熔断器进行了简化,在其基础上进行了进一步的封装,不仅在配置上大大简化了工作,同时还提供了一种声明式的web服务客户端定义方式;

7-2.使用Feign实现消费者

  使用Feign实现消费者,我们通过以下步骤进行

  1. 创建一个Spring Boot工程

  2. 添加依赖 :主要添加spring-cloud-starter-netflix-eureka-client和spring-cloud-starter-feign

    <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>
    
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-hystrix</artifactId>
        <version>1.4.5.RELEASE</version>
    </dependency>
    
    
  3. 添加注解

    • 在项目入口类上添加@EnableFeignClients注解表示开启Spring Cloud Feign的支持功能
  4. 声明服务

    • 定义一个HelloService接口,通过@FeignClient注解来指定服务名称,进而绑定服务,然后再通过Spring MVC 中提供的注解来绑定服务提供者提供的接口,如下:

      @FeginClient("xxx-xxx-xxx-provider") // 远程服务的名称
      public interface HelloService{
          @RequestMapping("/service/hello")
          public String hello();
      }
      

      这就相当于绑定了一个名叫xxx-xxx-xxx-provider(这里的名字大小写都可以)的服务提供者提供的/service/hello接口;

    我们服务提供者的接口如下:

    @GetMapping("/service/hello")
    public String hello(){
        return "hello spring cloud,provider 1";
    }
    
  5. 创建一个Controller来调用上面的服务:

    @RestController
    public class FeignController{
        @Autowired
        HelloService helloService;
        @RequestMapping("/web/hello")
        public String hello(){
        	return helloService.hello();
        }
    }
    
  6. 属性配置

    ​ 在application.properties中指定服务注册中心、端口信息等。

    server.port=8082
    #配置服务的名称
    spring.application.name=xxx-xxx-xxx-feign
    #配置eureka注册中心地址
    eureka.client.service-url.defaultZone=http://eureka项目名:端口号/eureka
    
  7. 测试

    依次启动注册中心、服务提供者、Feign实现服务消费者,然后访问地址:http://localhost:8082/web/hello

7-3. 使用Feign实现消费者的测试

  • 负载均衡

    • 我们知道,Spring Cloud提供了Ribbon来实现负载均衡,使用Ribbon直接注入RestTemplate对象即可,RestTemplate已经做好了负载均衡配置;在Spring Cloud下,使用Feign也可以直接实现负载均衡,定义一个注解有@FeginClient注解的接口,然后使用@RequestMapping注解到方法上映射远程的REST服务,此方法也是做好负载均衡配置的。
  • 服务熔断

    1. 在application.properties文件开启hystrix功能

      feign.hystrix.enabled=true
      
    2. 指定熔断回调逻辑

    // 上面的注解中加一个fallback参数
    @FeignClient(name="spring-cloud-service-provider",fallback=MyFallback.class) // 远程服务的名称)
    
    
    //下面是出现异常时回调的函数
    @Component
    public class MyFallback implements HelloService{
        @Override
        public String hello(){
            retrun "远程调用服务出现异常";
        }
    }
    

    ​ 3.服务熔断获取异常信息

    ​   为@FeignClient修饰的接口上加上fallback方法可以实现远程服务发生异常后进行服务的熔断,但是不能获取到远程服务的异常信息,要获取远程服务的信息,怎么办?此时可以使用fallbackFactory

    // 上面的注解中加一个fallback参数
    @FeignClient(name="spring-cloud-service-provider",fallbackFactory=MyFallbackFactory.class) 
    
    
    //下面是出现异常时回调的函数  FallbackFactory泛型为有@FeignClient注解的接口类名称
    @Component 
    public class MyFallbackFactory implements FallbackFactory<HelloService>{
        @Override
        public HelloService create(Throwable throwable){
            return new HelloService(){
                @Override
                public String hello(){
                    return throwable.getMessage();
                }
            }
        }
    }
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值