首页 > 其他分享 >Netflix之Feign

Netflix之Feign

时间:2023-10-07 12:55:53浏览次数:27  
标签:Feign http 请求 Netflix 配置 feign 注解

一、什么是Feign

Feign是Netflix开发的一套声明式、模板话的http请求客户端,更便捷优雅的迪用API。
会根据带有注解的函数信息构建网络请求模板,在请求发送之前,将函数的参数值设置到请求模板中。
是一个http请求的轻量级框架,封装了http调用流程,面向接口编程,可以以接口注解的方式调用http请求,而不用向java中封装请求报文的方式直接调用,通过处理注解,将请求模板化,当实际调用的时候传入参数,根据参数再应用到请求上,进而转化成真正的请求。
可以集成ribbon和hystrix,提供负载均衡和断路器机制。

二、Feign和OpenFeign的关系

Feign有一套自己独立的主角,不支持SpringMVC的注解。所以有了OpenFeign,它是SpringCloud在Feign的基础上支持了SpringMVC的注解,如@RequestMapping等。
OpenFeign的@FeignClient注解可以解析@RequestMapping注解下的一些接口,并通过动态代理的方式产生实现类,实现类中负载均衡调用其他服务。

三、配置使用

1、依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

2、当前服务需要连接Eureka服务器
3、启动类添加@EnableFeignClients注解
4、Feign默认所有带参数的请求都是Post,想要使用指定的提交方式需引入依赖

<dependency>
    <groupId>io.github.openfeign</groupId>
    <artifactId>feign-httpclient</artifactId>
</dependency>

5、日志

配置日志
logging.level.com.xinay.Consumer:debug


import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class FeiginConfig {
  @Bean
  Logger.Level logLevel(){	
  	return Logger.Level.BASIC;
  }
}

6、Feign默认支持Ribbon,Ribbon的重试机制和Feign的重试机制有冲突,所以源码中默认关闭Feign的重试机制,使用Ribbon的重试机制

#连接超时时间(ms)
ribbon.ConnectTimeout=1000
#业务逻辑超时时间(ms)
ribbon.ReadTimeout=6000

Ribbon的重试机制,请求失败后,每隔6秒会重新尝试

#同一台实例最大重试次数,不包括首次调用
ribbon.MaxAutoRetries=1
#重试负载均衡其他的实例最大重试次数,不包括首次调用
ribbon.MaxAutoRetriesNextServer=1
#是否所有操作都重试
ribbon.OkToRetryOnAllOperations=false

四、配置权限

1、feign的默认配置类是:org.springframework.cloud.openfeign.FeignClientsConfiguration。默认定义了feign使用的编码器,解码器等。
允许使用@FeignClient的configuration的属性自定义Feign配置。自定义的配置优先级高于上面的FeignClientsConfiguration。

开放权限:
<!-- 安全认证 -->
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-security</artifactId>
</dependency>

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

	@Override
	protected void configure(HttpSecurity http) throws Exception {
		// 关闭csrf
		http.csrf().disable();
		// 表示所有的访问都必须认证,认证处理后才可以正常进行
		http.httpBasic().and().authorizeRequests().anyRequest().fullyAuthenticated();
		// 所有的rest服务一定要设置为无状态,以提升操作效率和性能
		http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
	}
}
		
spring: 
  security: 
    user: 
      name: root
      password: root
  

2、自定义配置配

配置类:
public class FeignAuthConfiguration {
	
	@Bean
	public BasicAuthRequestInterceptor basicAuthRequestInterceptor() {
		return new BasicAuthRequestInterceptor("root", "root");
	}
}

在feign上加配置
@FeignClient(name = "service-auth",configuration = FeignAuthConfiguration.class)
//如果在配置类上添加了@Configuration注解,并且该类在@ComponentScan所扫描的包中,那么该类中的配置信息就会被所有的@FeignClient共享。最佳实践是:不指定@Configuration注解(或者指定configuration,用注解忽略),而是手动:
//@FeignClient(name = "service-auth",configuration = FeignAuthConfiguration.class)

3、拦截器

import feign.RequestInterceptor;
import feign.RequestTemplate;

public class MyBasicAuthRequestInterceptor implements RequestInterceptor {
	@Override
	public void apply(RequestTemplate template) {
		// TODO Auto-generated method stub
		template.header("Authorization", "Basic cm9vdDpyb290");
	}
}

feign:
  client: 
    config:  
      service-auth: 
        request-interceptors:
        - com.xinay.feign.interceptor.MyBasicAuthRequestInterceptor
# 对指定服务进行配置
feign:
 client: 
   config:  
     service-auth: 
       connect-timeout: 5000
       read-timeout: 5000
       logger-level: full
# 通用配置
feign:
 client: 
   config:  
     default: 
       connect-timeout: 5000
       read-timeout: 5000
       logger-level: full
# 属性配置默认比java代码配置优先级高  可以通过此项配置调整
feign:
  client: 
	default-to-properties: false

五、原理

1、主程序入口添加@EnableFeignClients注解开启对Feign Client扫描加载处理。
2、当程序启动时,会进行包扫描,扫描所有添加@FeignClient注解的类,将这些信息注入Spring IOC容器中,当定义的Feign接口中的方法被调用时,通过JDK代理为每一个方法生成具体的RequestTemplate对象,这个对象封装了http请求需要的全部信息,如请求参数名、请求方法等信息都在这个过程中确定。
3、然后由RequestTemplate生成Request,然后把这个Request交给Client(JDK原生的URLConnection/Apache的HttpClient/Okhttp)处理,最后Client被封装到LoadBalanceClient类,结合ribbon负载均衡发起服务之前的调用。

六、压缩

#服务端开启压缩
server.compression.enabled=true

#调用方配置
#配置请求GZIP压缩
feign.compression.request.enabled=true
#配置响应GZIP压缩
feign.compression.response.enabled=true
#单位是B
feign.compression.request.min-request-size=100

标签:Feign,http,请求,Netflix,配置,feign,注解
From: https://www.cnblogs.com/xinay/p/17746013.html

相关文章

  • SpringCloud:Feign实现微服务之间相互请求
    文章目录......
  • Netflix的eureka注册中心简单使用
    使用服务端<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId></dependency>server:port:9000servlet:context-path:/eureka-servere......
  • SpringCloud微服务学习笔记(二)【Feign,Gateway,Docker】
    Feign先来看我们以前利用RestTemplate发起远程调用的代码:存在下面的问题:•代码可读性差,编程体验不统一•参数复杂URL难以维护Feign是一个声明式的http客户端,官方地址:https://github.com/OpenFeign/feign其作用就是帮助我们优雅的实现http请求的发送,解决上面提到的问题。基......
  • 声明式调用 —— SpringCloud OpenFeign
    Feign简介SpringCloudFeign是一个HTTP请求调用的轻量级框架,可以以Java接口注解的方式调用HTTP请求,而不用通过封装HTTP请求报文的方式直接调用Feign通过处理注解,将请求模板化,当实际调用的时候传入参数,根据参数再应用到请求上,进而转化成真正的请求第一个Feign程......
  • openfeign开启日志Logger.Level feignLoggerLevel()中Level爆红的解决
    问题原因:引错包了!!!应该引入如下这个包importfeign.Logger;......
  • OpenFeign
    OpenFeign底层实现上:获取到你正在运行的实例(instance(也即是注册在nacos等注册中心的applicationName))编辑请求(包括函数的url,参数,方法,返回值等)(通常是调用一些方法来构成这个请求)负载均衡:最烂的做法就是获取总共的该服务有多少instance然后在其中取个随机值即可发......
  • 负载均衡 —— SpringCloud Netflix Ribbon
    Ribbon简介Ribbon是Netfix客户端的负载均衡器,可对HTTP和TCP客户端的行为进行控制。为Ribbon配置服务提供者地址后,Ribbon就可以基于某种负载均衡算法自动帮助服务消费者去请求。Ribbon默认提供了很多负载均衡算法,例如轮询、随机等,也可以为Ribbon实现自定义的负载均......
  • SpringCloudAlibaba整合OpenFeign
    OpenFeign是一个用于简化HTTP客户端的开源框架,它是SpringCloud生态系统的一部分。它的主要作用是简化在使用HTTP请求时编写客户端代码的过程,特别是在构建微服务架构中的服务之间进行通信时。OpenFeign提供了一种声明式的方式来定义和使用HTTP客户端接口。通过使用注解来描述HTTP......
  • 自定义Feign日志打印
    说明想要自定义feign日志打印只需要继承feign.Logger抽象类,在自定义类中一般会重写三个方法logRequest这个方法入参分别是StringconfigKey,Logger.LevellogLevel,RequestrequestconfigKey:feign调用的所在接口名+方法名logLevel:日志层级NONE,BASIC,HEADERS,FULLre......
  • 自定义Feign的配置
        ......