• Spring Cloud声明式调用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()为配置熔断器的处理类。

    @FeignClient 接口调用

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

    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

    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;
        }
         
         
         
         
         
    }
    View Code

    UserFeign客户端

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

    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客户端

    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);
             
        }
    }
  • 相关阅读:
    牛客练习赛24 E:青蛙(最短路)
    菜根谭#10
    菜根谭#9
    菜根谭#8
    菜根谭#7
    菜根谭#6
    菜根谭#5
    菜根谭#4
    菜根谭#3
    菜根谭#2
  • 原文地址:https://www.cnblogs.com/edda/p/13653452.html
Copyright © 2020-2023  润新知