Feign:声明式调用Feign负载均衡FeignClient详解和 @FeignClient 接口调用

本文深入解析FeignClient注解及其在微服务架构中的应用,通过实例展示如何结合Ribbon实现负载均衡调用,以及如何在项目中配置并使用Feign进行远程服务调用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

声明式调用Feign负载均衡FeignClient详解

为了深入理解Feign,下面将从源码的角度来讲解Feign。首先来看看FeignClient注解@FeignClient的源码,代码如下:

FeignClient注解被@Target(ElementType.TYPE)修饰,表示FeignClient的作用目标在接口上。@Retention(RetentionPolicy.RUNTIME)注解表明该注解会在Class字节码中存在,在运行时可以通过反射获取到。@Documented表明该注解被包含在javadoc中。

@FeignClient用于创建声明式API接口,该接口是RESTful风格的。Feign被设计成插拔式的,可注入其他组件和Feign一起使用。最典型的是如果Ribbon可用,Feign会和Ribbon相结合进行负载均衡。

在代码中,value()和name()一样,是被调用的服务的ServiceId。url()直接填写硬编码URL地址。decode404()即404是被解码,还是抛异常。configuration()指明FeignClient的配置类,默认的配置类为FeignClientsConfiguration类,在缺省情况下,这个类注入了默认的Decoder、Encoder和Constant等配置的bean。fallback()为配置熔断器的处理类。

 

Feign: @FeignClient 接口调用

在项目的启动文件加入:@EnableFeignClients 注解,

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

import org.springframework.cloud.netflix.feign.EnableFeignClients;

import org.springframework.context.annotation.Bean;

import org.springframework.web.client.RestTemplate;

 

@EnableEurekaClient

@SpringBootApplication

@EnableFeignClients

public class FeignApp {

 

 

    public static void main(String[] args) {

        SpringApplication.run(FeignApp.class, args);

    }

}

  

实例结构如下:

 

 

 

 

那么有实体类: User.java

Fengn客户端:UserFeignClient.java

控制器: MovieController.java调取第三方user接口

 

User.java

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

import java.math.BigDecimal;

 

public class User {

 

    private  Long id;

     

    private String username;

     

    private String name;

     

    private int age;

     

    private BigDecimal balance;

 

    public Long getId() {

        return id;

    }

 

    public void setId(Long id) {

        this.id = id;

    }

 

    public String getUsername() {

        return username;

    }

 

    public void setUsername(String username) {

        this.username = username;

    }

 

    public String getName() {

        return name;

    }

 

    public void setName(String name) {

        this.name = name;

    }

 

    public int getAge() {

        return age;

    }

 

    public void setAge(int age) {

        this.age = age;

    }

 

    public BigDecimal getBalance() {

        return balance;

    }

 

    public void setBalance(BigDecimal balance) {

        this.balance = balance;

    }

     

     

     

     

     

}

  

UserFeign客户端

其中:@FeignClient("spring-boot-user"): spring-boot-user是eureka服务里面user项目的名称,加入此注解,能直接连接user项目接口

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

import org.springframework.cloud.netflix.feign.FeignClient;

import org.springframework.web.bind.annotation.PathVariable;

import org.springframework.web.bind.annotation.RequestBody;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RequestMethod;

 

import com.muyang.bootmovie.entity.User;

 

@FeignClient("spring-boot-user")

public interface UserFeignClient {

 

    // 两个坑:1. @GetMapping不支持   2. @PathVariable得设置value

    @RequestMapping(value="/simple/{id}", method=RequestMethod.GET)

    public User findById(@PathVariable("id") Long id);

     

    @RequestMapping(value="/test", method=RequestMethod.POST)

    public User postUser(@RequestBody User user);

}

  

MovieController控制中心,调取UserFeign客户端

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.web.bind.annotation.GetMapping;

import org.springframework.web.bind.annotation.PathVariable;

import org.springframework.web.bind.annotation.RequestBody;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RequestMethod;

import org.springframework.web.bind.annotation.RestController;

import com.muyang.bootmovie.entity.User;

import com.muyang.bootmovie.feign.UserFeignClient;

 

@RestController

public class MovieController {

 

    @Autowired

    private UserFeignClient userFeignClient;

     

    @GetMapping("/movie/{id}")

    public User findById(@PathVariable("id") Long id) {

        return this.userFeignClient.findById(id);

    }

     

    @RequestMapping(value="/test", method=RequestMethod.GET)

    public User userPost(User user)

    {

        return this.userFeignClient.postUser(user);

         

    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值