乐趣区

全栈之路微服务课程10Feign之初遇见

Feign 是什么

  • Feign 是一个受到 Retrofit,JAXRS-2.0 和 WebSocket 启发的 Java 到 HTTP 客户端绑定器。
  • Feign 的第一个目标是降低将 Denominator 统一绑定到 HTTP API 的复杂性。
  • Feign 是一个声明 web 服务客户端,这使得编写 web 服务客户端更容易,使用 Feign 创建一个接口并对它进行注解,它具有可插拔的注解支持包括 Feign 注解与 JAX-RS 注解,Feign 还支持可插拔的编码器与解码器。

RestTemplate 与 Feign 对比

如何使用

  • 引入依赖
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
  • 创建 feign Client

@FeignClient(name = "shop-provider-user")
public interface UserFeignClient {@GetMapping("/users/{id}")
  User findById(@PathVariable("id") Long id);
}
  • 添加注解 @EnableFeignClients
@EnableFeignClients
@SpringBootApplication//(scanBasePackages = {"com.dream.shop"})
public class MovieApplication {

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

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

}
  • 控制器调用
@RequestMapping("/movies")
@RestController
public class MovieController {
  @Autowired
  private RestTemplate restTemplate;

  @Autowired
  private UserFeignClient userFeignClient;

  @GetMapping("/usersByFeign/{id}")
  public User findByIdByFeign(@PathVariable Long id) {return this.userFeignClient.findById(id);
  }

  @GetMapping("/users/{id}")
  public User findById(@PathVariable Long id) {
    // 这里用到了 RestTemplate 的占位符能力
//    User user = this.restTemplate.getForObject("http://localhost:8000/users/{id}", User.class, id);
    User user = this.restTemplate.getForObject("http://shop-provider-user/users/{id}", User.class, id);
    // ... 电影微服务的业务...
    return user;
  }
}
退出移动版