zoukankan      html  css  js  c++  java
  • SpringCloud Feign

    ⒈Feign是什么?

      Feign是Netflix开发的声明式、模板化的HTTP客户端, Feign可以帮助我们更快捷、优雅地调用HTTP API。

      SpringCloud微服务项目之间调用是通过Rest请求来进行服务调用的,之前我们用到RestTemplate来进行服务请求,Spring通过Feign将RestTemplate封装成了可声明式的web客户端,使得编写web客户端更加简单。

      在Spring Cloud中,使用Feign非常简单——创建一个接口,并在接口上添加一些注解,代码就完成了。Spring Cloud对Feign进行了增强,使Feign支持了Spring MVC注解和HttpmessageConverters、Feign注解或者JAX-RS注解等。Feign还支持可插拔的编码器和解码器,SpringCloud还对Feign集成了注册中心(Eureka)和客户端负载均衡(Ribbon),使得我们拥有一个客户端负载均衡的web请求客户端。

    ⒉示例

      ①在服务消费者项目工程中添加Feign依赖  

     1         <dependency>
     2             <groupId>org.springframework.boot</groupId>
     3             <artifactId>spring-boot-starter-web</artifactId>
     4         </dependency>
     5         <dependency>
     6             <groupId>org.springframework.cloud</groupId>
     7             <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
     8         </dependency>
     9         <dependency>
    10             <groupId>org.springframework.cloud</groupId>
    11             <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
    12         </dependency>
    13         <dependency>
    14             <groupId>org.springframework.cloud</groupId>
    15             <artifactId>spring-cloud-starter-openfeign</artifactId>
    16         </dependency>

      ②创建一个Feign接口,并添加@FeignClient注解

     1 package cn.coreqi.feign;
     2 
     3 import cn.coreqi.entities.User;
     4 import org.springframework.cloud.openfeign.FeignClient;
     5 import org.springframework.web.bind.annotation.GetMapping;
     6 import java.util.List;
     7 
     8 @FeignClient(value = "USER-PROVIDER")   //指定微服务实例名称
     9 public interface UserFeignClient {
    10     @GetMapping("/users")   //指定调用微服务的服务地址
    11     public List<User> getList();
    12 }

      ③修改Controller代码,让其调用Feign接口

      

     1 package cn.coreqi.controller;
     2 
     3 import cn.coreqi.entities.User;
     4 import cn.coreqi.feign.UserFeignClient;
     5 import org.springframework.beans.factory.annotation.Autowired;
     6 import org.springframework.web.bind.annotation.GetMapping;
     7 import org.springframework.web.bind.annotation.RestController;
     8 import org.springframework.web.client.RestOperations;
     9 import java.util.List;
    10 
    11 @RestController
    12 public class UserController {
    13     @Autowired
    14     private RestOperations restTemplate;
    15 
    16     @Autowired
    17     private UserFeignClient userFeignClient;
    18 
    19     @GetMapping("/userno1")
    20     public User getUsersFirst(){
    21         User[] users = restTemplate.getForObject("http://user-provider/users",User[].class);
    22         return users[0];
    23     }
    24 
    25     @GetMapping("/userno2")
    26     public User getUsersFirst1(){
    27         List<User> users = userFeignClient.getList();
    28         return users.get(0);
    29     }
    30 }

      ④修改主程序启动类,为其添加@EnableFeignClients注解

      

     1 package cn.coreqi;
     2 
     3 import org.springframework.boot.SpringApplication;
     4 import org.springframework.boot.autoconfigure.SpringBootApplication;
     5 import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
     6 import org.springframework.cloud.client.loadbalancer.LoadBalanced;
     7 import org.springframework.cloud.openfeign.EnableFeignClients;
     8 import org.springframework.context.annotation.Bean;
     9 import org.springframework.web.client.RestOperations;
    10 import org.springframework.web.client.RestTemplate;
    11 
    12 @SpringBootApplication
    13 @EnableDiscoveryClient  //开启服务发现功能
    14 @EnableFeignClients(basePackages = {"cn.coreqi"})
    15 public class SpringbootcloudserviceconsumerApplication {
    16 
    17     public static void main(String[] args) {
    18         SpringApplication.run(SpringbootcloudserviceconsumerApplication.class, args);
    19     }
    20 
    21     @Bean
    22     @LoadBalanced   //使用负载均衡机制
    23     public RestOperations restTemplate(){
    24         return new RestTemplate();
    25     }
    26 
    27 }

    ⒊总结

      其实通过Feign封装了HTTP调用服务方法,使得客户端像调用本地方法那样直接调用方法,类似Dubbo中暴露远程服务的方式,区别在于Dubbo是基于私有二进制协议,而Feign本质上还是个HTTP客户端。

      

  • 相关阅读:
    ASP.NET Core 中的路由约束
    专治拖延症,好方法
    虚拟机hadoop集群搭建
    python爬虫+词云图,爬取网易云音乐评论
    gp数据库运维
    kafka和springboot整合应用
    kafka配置监控和消费者测试
    集群运维ansible
    SpringBoot和微服务
    python每天定时发送短信脚本
  • 原文地址:https://www.cnblogs.com/fanqisoft/p/10479806.html
Copyright © 2011-2022 走看看