Spring Cloud Feign的原理及基本使用

  • 了解Feign的作用
  • 掌握Feign的使用过程
  • 掌握Feign的负载均衡配置
  • 掌握Feign的熔断配置
  • 掌握Feign的压缩配置
  • 掌握Feign的日志配置

一、 Feign简介

Feign [feɪn] 译文 伪装。Feign是一个声明式WebService客户端.使用Feign能让编写WebService客户端更加简单,它的使用方法是定义一个接口,然后在上面添加注解。不再需要拼接URL,参数等操作。项目主页:https://github.com/OpenFeign/feign 。

  • 集成Ribbon的负载均衡功能
  • 集成了Hystrix的熔断器功能
  • 支持请求压缩
  • 大大简化了远程调用的代码,同时功能还增强啦
  • Feign以更加优雅的方式编写远程调用代码,并简化重复代码

总结:

  • feign 是一个[声明式]REST客户端。(http客户端:RestTemplate 使用Restful 风格进行开发的)
  • feign 是基于RestTemplate开发的一个声明式的Rest客户端;只需要写一个接口,定义一个注解,就可以直接使用。

二、Feign的快速入门

使用Feign替代RestTemplate发送Rest请求。

2.1 使用feign的步骤

  1. consumer中添加起步依赖(spring-cloud-starter-openfeign)
  2. consumer中编写一个接口, 添加一个注解进行声明@FeignClient,注解后面的name 指定的是要发送到哪个微服务对应的名字。最后定义一个方法。
  3. consumer中编写控制层,在Controller中使用@Autowired注入FeignClient。(在controller service dao里面都可以使用)
  4. consumer中在启动类中添加@EnableFeignClients,开启Feign。
  5. provider中被调用方controller 一定要【实现】声明的接口的方法。

(1)导入依赖

在user-consumer中添加spring-cloud-starter-openfeign依赖

<!--配置feign-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

(2)创建Feign客户端(接口)

在user-consumer中创建com.it.feign.UserClient接口,添加一个注解进行声明@FeignClient,定义一个方法。

//name 指定的是要发送到哪个微服务对应的名字
@FeignClient(name = "user-provider",fallback = UserClientFallback.class)
/*@RequestMapping("/user")*/
public interface UserClient {
    /**
     * 实际上是发送请求给微服务 获取数据的
     * @param id
     * @return
     */
    @RequestMapping("/user/find/{id}")
    public User findById(@PathVariable(name = "id") Integer id);
}

 解释:

  1. Feign会通过动态代理,帮我们生成实现类。
  2. 注解@FeignClient声明Feign的客户端,注解value指明服务名称
  3. 接口定义的方法,采用SpringMVC的注解。Feign会根据注解帮我们生成URL地址
  4. 注解@RequestMapping中的/user,不要忘记。因为Feign需要拼接可访问地址

(3)编写控制层

在user-consumer中:  创建com.it.controller.ConsumerFeignController,在Controller中使用@Autowired注入FeignClient,代码如下:

@RestController
@RequestMapping("/feign")
public class ConsumerFeignController {

    @Autowired
    private UserClient userClient;

    //根据ID获取用户的数据(要使用feign的方式来获取)
    @RequestMapping(value = "/{id}")
    public User findById(@PathVariable(name = "id") Integer id){
        return userClient.findById(id);
    }
}

(4)在user-provider的controller 一定要【实现】声明的接口的方法。

@RestController
@RequestMapping("/user")
public class UserController {
    @Autowired
    private UserService userService;

    @GetMapping("/{id}")
    public User findById(@PathVariable Integer id){
        System.out.println("这个是18081==================================");
        return userService.findById(id);
    }

    //provider接受这个请求
    @GetMapping("/find/{id}")
    public User find(@PathVariable Integer id){
        System.out.println("这个是18081==================================");
        return userService.findById(id);
    }
}

(5)在启动类中开启Feign

在user-consumer的启动类中添加@EnableFeignClients,开启Feign。

@SpringBootApplication
@EnableEurekaClient
@EnableCircuitBreaker
@EnableFeignClients//开启feign
public class UserConsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(UserConsumerApplication.class,args);
    }

    @Bean
    @LoadBalanced
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }

    @Bean
    public Logger.Level feignLoggerLevel(){
        //设置feign调用的级别是 Full
        return Logger.Level.FULL;
    }
}

(6)测试

请求<http://localhost:18082/feign/2>,效果如下:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值