Feign入门之快速实战

Posted 流楚丶格念

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Feign入门之快速实战相关的知识,希望对你有一定的参考价值。

Feign远程调用

问题引入

先来看我们以前利用RestTemplate发起远程调用的代码:

就这样的代码,存在下面的问题:

  • 代码可读性差,编程体验不统一

  • 参数复杂URL难以维护

那么怎么解决上面的问题呢?这就引出了Feign。

Feign

Feign简介

Feign是一个声明式的http客户端,官方地址:https://github.com/OpenFeign/feign

其作用就是帮助我们优雅的实现http请求的发送,解决上面提到的问题。


详细的概念可以参考官网的内容,后面也会大致讲解,这里就不赘述了,先快速实战一下。

我们直接进入实战,将原来的RestTemplate替换为现在的Feign

Feign替代RestTemplate实战

Fegin的使用步骤如下:

1. 引入依赖

我们在order-service服务的pom文件中引入feign的依赖:

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

2. 添加注解

在order-service的启动类添加注解开启Feign的功能:

package com.yyl.order;

import lombok.extern.slf4j.Slf4j;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.Bean;

@Slf4j
@EnableFeignClients
@MapperScan("com.yyl.order.mapper")
@SpringBootApplication
public class OrderApplication 

    public static void main(String[] args) 
        SpringApplication.run(OrderApplication.class, args);
    

3. 编写Feign的客户端

在order-service中新建一个接口,内容如下:

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")
    User findById(@PathVariable("id") Long id);

这个客户端主要是基于SpringMVC的注解来声明远程调用的信息,比如:

  • 服务名称:userservice
  • 请求方式:GET
  • 请求路径:/user/id
  • 请求参数:Long id
  • 返回值类型:User

这样,Feign就可以帮助我们发送http请求,无需自己使用RestTemplate来发送了。

这里肯定会有小伙伴疑惑,这就完事了,能用啦???

是的是的。这是因为Feign全给你内部封装好了,他基本实现流程是这样的:

  • 首先他会根据主角@FeignClient注解中的服务名,去匹配对应的微服务地址
  • 然后通过@GetMapping注解绑定Feign客户端方法对应的请求
  • 他是声明式客户端,这些基本的都声明好了,他就内部帮你发送了
  • 完事了,用的时候拿这个接口调这个方法就OK了

先大致知道是这样,后面再去学Feign原理,声明式的嘛,就是编写简单

4. 测试

修改order-service中的OrderService类中的queryOrderById方法,使用Feign客户端代替RestTemplate:

@Service
public class OrderService 

    @Autowired
    private OrderMapper orderMapper;

    @Autowired
    private UserClient userClient;

    public Order queryOrderById(Long orderId) 
        // 查询订单
        Order order = orderMapper.findById(orderId);
        // 利用Fegin发送请求
        User user = userClient.findById(order.getUserId());
        // 封装user到order
        order.setUser(user);
        // 返回order
        return order;
    

看起来优雅多了,重启运行,我们请求一下:

也没问题

快速实战总结

使用Feign编写远程调的步骤:

① 引入依赖

② 添加@EnableFeignClients注解

③ 编写FeignClient接口

④ 使用FeignClient中定义的方法代替RestTemplate

以上是关于Feign入门之快速实战的主要内容,如果未能解决你的问题,请参考以下文章

Java 微服务之 SpringCloud快速入门day02 Feign

SpringCloud实战之初级入门— 服务注册与服务调用

Feign快速入门

SaltStack实战之SaltStack快速入门

(05)SpringCloud实战之Feign负载均衡

OpenFeign快速入门