什么是fegin

 fegin是一个声明式的模板化的http客户端,在SpringCloud中使用fegin,可以做到使用http请求访问远程服务,就像调用本地方法一样,开发者完全感知不到这是在调用本地方法,更感知不到在访问http请求。

  1. 支持可插拔的HTTP编码器和解码器
  2. 支持Ribbon的负载均衡
  3. 支持HTTP请求和响应的压缩

Fegin入门案例

导入maven依赖

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- Spring Cloud OpenFeign的Starter的依赖 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

启动类上添加 @EnableFeginClients 代表启动时将会扫描所有包下的@FeginClient注解的类 将其加载到IOC容器中

@SpringBootApplication
@EnableFeignClients
public class SpringCloudFeignApplication {

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

编辑FeginClient  

@FeignClient(name="access-git",url ="https://api.github.com",configuration = WorldFeginServiceConfig.class)
public interface WorldFeginService {

    @RequestMapping(value = "/search/repositories",method = RequestMethod.GET)
    String queryRepo(@RequestParam("q") String queryStr);
}

url代表这个路径  拼接下面的具体路径可以从git上查找项目    可通过浏览器直接看

spring cloud stream消息分区 springcloud使用fegin_git

FeginClientConfig  FULL 会将所有信息都打印出来可以看到 响应内容还是非常大的

@Configuration
public class WorldFeginServiceConfig {


    /**
     * Logger.Level 的具体级别如下:
     *          NONE:不记录任何信息
     *          BASIC:仅记录请求方法、URL以及响应状态码和执行时间
     *          HEADERS:除了记录 BASIC级别的信息外,还会记录请求和响应的头信息
     *          FULL:记录所有请求与响应的明细,包括头信息、请求体、元数据
     * @return
     */
    @Bean
    Logger.Level feignLoggerLevel(){
        return Logger.Level.FULL;
    }
}

spring cloud stream消息分区 springcloud使用fegin_git_02

写个Controller层去调用刚才的Fegin 就如同调用一个方法一样

@RestController
public class WorldFeginController {

    @Autowired
    private WorldFeginService worldFeginService;

    @RequestMapping(value = "/query/git",method = RequestMethod.GET)
    public String queryRepo(@RequestParam("queryStr") String queryStr){
        return worldFeginService.queryRepo(queryStr);
    }
}

spring cloud stream消息分区 springcloud使用fegin_spring_03

上面已经写了一个简单Fegin调用了。我们来看看其他的概念

Fegin调用的基本原理

当程序启动时,注意到启动类上有@EnableFeginClients,扫描包  发现@FeginClients的类后,将这些类会加载到IOC中,在调调用时,通过JDK方式动态生成requestTemplate,每个requestTemplate中携带了请求参数,请求名等信息都是在生成这个requestTemplate中确定的

然后由requestTemplate生成request交给client去,client可以是jdk原生的URLCollection ,Apache的HttpClient ,最后这个Clien封装到LoadBanlanceClient类,结合Ribbon负载均衡发起服务之间的调用。

@FeginClient注解

  • name 指定feginClent的名称,项目启用Ribbon下,会作为微服务的名称用于服务发现
  • url  一般用于调式,可以手动指定url地址
  • configuration: FeginClient的配置类 可以Encoder Decoder LogLevel、Contract
  • fallback: 容错类,当调用失败时会走到这个类  容错逻辑 , 这个类必须继承@FeginClients标记的接口
  • fallbackFactory:  工厂类,用于生产fallback的示例类,通过这个属性可以进行容错通用的逻辑 减少重复代码
  • path  定义当前feginClient统一前缀

fallback和fallbackFactory如果需要查看回退原因用fallbackFactory

配置Gzip压缩

添加配置文件

feign:
  compression:
    request:
      enabled: true
      mime-types: text/xml,application/xml,application/json # 配置压缩支持的MIME TYPE
      min-request-size: 2048  # 配置压缩数据大小的下限
    response:
      enabled: true # 配置响应GZIP压缩

将 @FeginClients 类中的返回值改为 ResponseEntity  否则会导致服务之间的Fegin调用乱码

如下图 压缩后的响应

spring cloud stream消息分区 springcloud使用fegin_git_04