Spring Cloud Feign的用法

1.feign是什么?

官方的说法:Feign是一个声明式的Web服务客户端。这使得Web服务客户端的写入更加方便 要使用Feign创建一个界面并对其进行注释。它具有可插入注释支持,包括Feign注释和JAX-RS注释。Feign还支持可插拔编码器和解码器。Spring Cloud增加了对Spring MVC注释的支持,并使用Spring Web中默认使用的HttpMessageConverters。Spring Cloud集成Ribbon和Eureka以在使用Feign时提供负载均衡的http客户端。

2.为什么用feign?

Feign以最小的开销将代码连接到http API,并通过可定制的解码器和错误处理(可以写入任何基于文本的httpapi)将代码连接到httpapi。
在本人博文Ribbon用法中,ribbon 给 RestTemplate加 @LoadBalanced ,使得 服务调用具有了负载均衡的能力。可见Ribbon需要自己构建http请求,模拟http请求然后使用RestTemplate发送给其他服务,步骤相当繁琐。
Feign则是在Ribbon的基础上进行了一次改进,采用接口的方式,将需要调用的其他服务的方法定义成抽象方法即可,不需要自己构建http请求。

3.feign如何使用?

3.1 引入依赖包

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

3.2 主类中启用feign

@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
public class EurekaClientFeignApplication {
	public static void main(String[] args) {
		SpringApplication.run(EurekaClientFeignApplication.class, args);
	}
}

@EnableFeignClients 表示启用feign功能

3.3 创建FeignClient

@FeignClient("provide1")
public interface HelloService {
    @GetMapping("/say/{name}")
    String sayHello(@PathVariable String name) ;
}

这段表示HelloService 中的 sayHello 与注册到eureka上的微服务provide1的say服务绑定。

3.4 使用FeignClient
在任意代码中引入HelloService ,正常使用sayHello方法即可。

@RestController
@RequestMapping("/feign")
public class FeignController {
    
    @Autowired
    private HelloService helloService;
    
    @GetMapping("/hello")
    public String hello() {
        return "hello world!";
    }
    
    @GetMapping("/say/{name}")
    public String sayHello(@PathVariable String name) {
	return helloService.sayHello(name);
    }
}

3.5 执行结果
要先确保serveiceid为“provide1”的微服务注册到了eureka上,注册操作见链接,provide1的代码见git链接

本地启动eureka-client-feign,浏览器访问 http://localhost:8705/feign/say/deg
在这里插入图片描述本文将provide1的微服务部署到了两台机器上,h105和h106,
h105的日志
在这里插入图片描述
h106的日志在这里插入图片描述
发现负载均衡策略是轮询的。
如果想修改负载均衡策略可以在application.properties中加入
.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.xxxRule。示例

server.port=8705
spring.application.name=feign
eureka.client.register-with-eureka=true
eureka.client.serviceUrl.defaultZone=http://server1:8761/eureka/
provide1.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule

4.覆盖Feign默认值

官方说法:Spring Cloud的Feign支持的中心概念是指定的客户端。每个假装客户端都是组合的组件的一部分,它们一起工作以根据需要联系远程服务器,并且该集合具有您将其作为应用程序开发人员使用@FeignClient注释的名称。Spring Cloud根据需要,使用FeignClientsConfiguration为每个已命名的客户端创建一个新的集合ApplicationContext。这包含(除其他外)feign.Decoder,feign.Encoder和feign.Contract。
Spring Cloud可以通过使用@FeignClient声明额外的配置(FeignClientsConfiguration)来完全控制假客户端。

Spring Cloud Netflix默认为feign(BeanType beanName:ClassName)提供以下bean:

Decoder feignDecoder:ResponseEntityDecoder(其中包含SpringDecoder)

Encoder feignEncoder:SpringEncoder

Logger feignLogger:Slf4jLogger

Contract feignContract:SpringMvcContract

Feign.Builder feignBuilder:HystrixFeign.Builder

Client feignClient:如果Ribbon启用,则为LoadBalancerFeignClient,否则将使用默认的feign客户端。

可见源码
org.springframework.cloud.netflix.feign.FeignClientsConfiguration.java

@Configuration
public class FeignClientsConfiguration {

	@Autowired
	private ObjectFactory<HttpMessageConverters> messageConverters;

	@Autowired(required = false)
	private List<AnnotatedParameterProcessor> parameterProcessors = new ArrayList<>();

	@Autowired(required = false)
	private List<FeignFormatterRegistrar> feignFormatterRegistrars = new ArrayList<>();

	@Autowired(required = false)
	private Logger logger;

	@Bean
	@ConditionalOnMissingBean
	public Decoder feignDecoder() {
		return new ResponseEntityDecoder(new SpringDecoder(this.messageConverters));
	}

	@Bean
	@ConditionalOnMissingBean
	public Encoder feignEncoder() {
		return new SpringEncoder(this.messageConverters);
	}

	@Bean
	@ConditionalOnMissingBean
	public Contract feignContract(ConversionService feignConversionService) {
		return new SpringMvcContract(this.parameterProcessors, feignConversionService);
	}

	@Bean
	public FormattingConversionService feignConversionService() {
		FormattingConversionService conversionService = new DefaultFormattingConversionService();
		for (FeignFormatterRegistrar feignFormatterRegistrar : feignFormatterRegistrars) {
			feignFormatterRegistrar.registerFormatters(conversionService);
		}
		return conversionService;
	}

	@Configuration
	@ConditionalOnClass({ HystrixCommand.class, HystrixFeign.class })
	protected static class HystrixFeignConfiguration {
		@Bean
		@Scope("prototype")
		@ConditionalOnMissingBean
		@ConditionalOnProperty(name = "feign.hystrix.enabled", matchIfMissing = true)
		public Feign.Builder feignHystrixBuilder() {
			return HystrixFeign.builder();
		}
	}

	@Bean
	@Scope("prototype")
	@ConditionalOnMissingBean
	public Feign.Builder feignBuilder() {
		return Feign.builder();
	}

	@Bean
	@ConditionalOnMissingBean(FeignLoggerFactory.class)
	public FeignLoggerFactory feignLoggerFactory() {
		return new DefaultFeignLoggerFactory(logger);
	}

}

覆盖Feign默认值,可以创建一个类型的bean并将其放置在@FeignClient配置,覆盖所描述的每个bean。例:

@FeignClient(name="provide1",configuration=MyFeignClientsConfiguration.class)
public interface HelloService {
    
    @RequestLine("GET /say/{name}")
    String sayHello(@ParamString name) ;
}
@Configuration
public class MyFeignClientsConfiguration {

    @Bean
    public Contract feignContract() {
      return new feign.Contract.Default();
    }
}

说明:默认feignContract是SpringMvcContract,只支持springmvc注释,而这里被改成了feign.Contract.Default,只支持feign注释,详细见https://github.com/OpenFeign/feign/blob/master/README.md

5.Feign日志记录

为每个创建的Feign客户端创建一个记录器。默认情况下,记录器的名称是用于创建Feign客户端的接口的完整类名。Feign日志记录仅响应DEBUG级别。
application.properties

logging.level.com.springcloud.feign.HelloService: DEBUG

可以为每个客户端配置的Logger.Level对象告诉Feign记录多少。选择是:

    NONE,无记录(DEFAULT)。

    BASIC,只记录请求方法和URL以及响应状态代码和执行时间。

    HEADERS,记录基本信息以及请求和响应标头。

    FULL,记录请求和响应的头文件,正文和元数据。

例如,以下将Logger.Level设置为FULL:

@Configuration
public class MyFeignClientsConfiguration {
    @Bean
    Logger.Level feignLoggerLevel() {
      return Logger.Level.FULL;
    }
}

这样就可以看到feign的全日志了
在这里插入图片描述
项目全代码见https://github.com/840369583/springcloud-learning
eureka-client-feign : feign默认值
eureka-client-feign2 : 覆盖默认值+日志输出

发布了5 篇原创文章 · 获赞 0 · 访问量 53
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 1024 设计师: 上身试试

分享到微信朋友圈

×

扫一扫,手机浏览