Spring Cloud --组件 -- Feign(远程调用)

Feign

我们使用了Ribbon的负载均衡功能,大大简化了远程调用时的代码:

String baseUrl = "http://userservice/user/";
User user = this.restTemplate.getForObject(baseUrl + id, User.class)

这样可能以后需要编写类似的大量重复代码,格式基本相同,无非参数不一样。有没有更优雅的方式,来对这些代码再次优化呢?

这就是我们接下来要学的Feign的功能了。

简介

有道词典的英文解释:

在这里插入图片描述

为什么叫伪装?

Feign可以把Rest的请求进行隐藏,伪装成类似SpringMVC的Controller一样。你不用再自己拼接url,拼接参数等等操作,一切都交给Feign去做。

项目主页:https://github.com/OpenFeign/feign

快速入门

导入依赖

在order-service项目中

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

Feign的客户端

创建一个interface接口

package cn.itcast.order.client;

import cn.itcast.order.pojo.User;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;

@FeignClient("userservice")
public interface UserClient {

    @GetMapping("/user/{id}")  //这里的返回结果和 url地址一定要和提供方保持一致
    User findById(@PathVariable("id") Long id);
}
  • 首先这是一个接口,Feign会通过动态代理,帮我们生成实现类。这点跟mybatis的mapper很像
  • @FeignClient,声明这是一个Feign客户端,同时通过value属性指定服务名称
  • 接口中的定义方法,完全采用SpringMVC的注解,Feign会根据注解帮我们生成URL,并访问获取结果

改造原来的调用逻辑,使用UserClient访问:

@Autowired
private UserClient userClient;

public String queryOrderById(Long orderId) {
    // 1.查询订单
    Order order = orderMapper.findById(orderId);
    //        2、查询用户
    //        User user = restTemplate.getForObject("http://userservice/user/" + order.getUserId(), User.class);
    User user = userClient.findById(order.getUserId());
    //        3、set到order的属性中
    order.setUser(user);
    // 4.返回
    //        return order;
    return JSON.toJSONString(order);
}

开启Feign功能

我们在启动类上,添加注解,开启Feign功能

在这里插入图片描述

  • 你会发现RestTemplate的已经用不到了可以删除了。Feign中已经自动集成了Ribbon负载均衡,因此我们不需要自己定义RestTemplate了

启动测试

注意:把Hystrix降级相关的代码先去掉

在这里插入图片描述

访问接口:
在这里插入图片描述
正常获取到了结果。

负载均衡

Feign中本身已经集成了Ribbon依赖和自动配置:
因此我们不需要额外引入依赖,也不需要再注册RestTemplate对象。

Fegin内置的ribbon默认设置了请求超时时长,默认是1000ms,我们可以通过手动配置来修改这个超时时长:

ribbon:
  ReadTimeout: 2000 # 读取超时时长
  ConnectTimeout: 500 # 建立链接的超时时长

,因为ribbon内部有重试机制,一旦超时,会自动重新发起请求。如果不希望重试,可以添加配置:

ribbon:
  ReadTimeout: 2000 # 数据通信超时时长
  ConnectTimeout: 500 # 连接超时时长  
  MaxAutoRetries: 0 # 当前服务器的重试次数
  MaxAutoRetriesNextServer: 1 # 重试多少次服务
  OkToRetryOnAllOperations: false # 是否对所有的请求方式都重试 如果是false代表只对get请求重试

另外,Hystix的超时时间,应该比重试的总时间要大,比如当前案例中,应该配 大于2500*2 = 5000

在这里插入图片描述

对Hystix的支持(了解)

Feign默认也有对Hystix的集成。
只不过,默认情况下是关闭的。我们需要通过下面的参数来开启:

feign:
  hystrix:
    enabled: true # 开启Feign的熔断功能

但是,Feign中的Fallback配置不像Hystrix中那样简单了。

1)首先,我们要定义一个类,是在刚才编写的UserFeignClient,作为fallback的处理类

package cn.itcast.order.client;

import cn.itcast.order.pojo.User;
import org.springframework.stereotype.Component;

@Component
public class UserClientFallback implements UserClient {
    @Override
    public User findById(Long id) {
        User user = new User();
        user.setId(0L);
        user.setUsername("用户查询出现异常!");
        return user;
    }
}

2)然后在UserFeignClient中,指定刚才编写的实现类

@FeignClient(value = "userservice", fallback = UserClientFallback.class)
public interface UserClient {

    @GetMapping("/user/{id}")
    User findById(@PathVariable("id") Long id);
}

3)重启测试:

我们关闭user-service服务,然后在页面访问:

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值