SpringCloud之Feign简单入门
Feign简介Feign是一个声明式的Web服务客户端。这使得Web服务客户端的写入更加方便 要使用Feign创建一个界面并对其进行注释。它具有可插入注释支持,包括Feign注释和JAX-RS注释。Feign还支持可插拔编码器和解码器。Spring Cloud增加了对Spring MVC注释的支持,并使用Spring Web中默认使用的HttpMessageConverters。Spring Cl
Feign简介
Feign是一个声明式的Web服务客户端。这使得Web服务客户端的写入更加方便 要使用Feign创建一个界面并对其进行注释。它具有可插入注释支持,包括Feign注释和JAX-RS注释。Feign还支持可插拔编码器和解码器。Spring Cloud增加了对Spring MVC注释的支持,并使用Spring Web中默认使用的HttpMessageConverters。Spring Cloud集成Ribbon和Eureka以在使用Feign时提供负载均衡的http客户端。
——摘自SpringCloud参考文档
Feign客户端和Ribbon类似,同样实现了客户端的负载均衡,与Ribbon不同的是,Feign的调用与本地接口的调用更加类似,并且更加便捷、更加优雅,传入参数较多时得以体现,当然,在实际项目中,两者可能都会用到,下面来写一下Feign的实现:
搭建步骤
1、均在之前的父工程下,新建ms-consumer-feign-8003子工程;
2、开启之前的Eureka单机版的Server;
3、两个服务提供者,名称均为micro-service-provider,端口分别7001,7002;
4、配置子工程,依赖、配置文件、启动类等,自定义feign,配置日志、拦截器等;
前三步可以参考之前的文章,默认已完成,直接进入第4步。
引入依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<artifactId>spring-cloud-parent</artifactId>
<groupId>org.example</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>ms-consumer-feign-8003</artifactId>
<packaging>war</packaging>
<name>ms-consumer-feign-8003 Maven Webapp</name>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!--加入feign的依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
application.properties配置文件
server.port=8003
# 注册到Eureka服务端的微服务名称
spring.application.name=ms-consumer-feign-user
# 注册到Eureka服务端的地址
# http://${eureka.instance.hostname}:${server.port}/eureka/ ----修改了hosts文件
# eureka.client.service-url.defaultZone=http://www.eureka9000.com:9000/eureka/
eureka.client.service-url.defaultZone=http://localhost:9000/eureka/
# 点击具体的微服务,右下角是否显示ip
eureka.instance.prefer-ip-address=true
# 显示微服务的名称
eureka.instance.instance-id=ms-consumer-feign-8003
启动类
@SpringBootApplication
@EnableFeignClients(basePackages = "com.xxx")
@EnableDiscoveryClient
public class MsConsumerFeign8003Application {
public static void main(String[] args) {
SpringApplication.run(MsConsumerFeign8003Application.class,args);
}
}
远程调用设置
FeignApi
@FeignClient(name = "micro-service-provider",path = "/ms")
public interface FeignApi {
@RequestLine("GET /hello")
String testFeign();
}
FeignClient里的name指的是注册到Eureka的服务提供者名称,path是指服务提供者中Controller上的mapping。
Controller
@RestController
public class FeignController {
@Autowired
private FeignApi feignApi;
@RequestMapping("/feign")
public String feignHttp(){
return feignApi.testFeign();
}
}
应用测试
服务消费者、服务提供者在EurekaServer上进行注册:
使用Feign进行远程调用:
再点击一次,进行了轮询:
Feign和Ribbon一样,也实现了负载均衡。
自定义Feign
日志
实现步骤:
- 首先需要在application.properties中使用 logging.level.<Feign客户端对应的接口的全限定名> =<日志级别>的参数配置格式来开启指定客户端日志:
logging.level.com.xxx.api.FeignApi=debug
- 但由于Feign客户端默认的Logger.Level对象定义为NONE级别,因此需要对它进行调整. Logger.Level的源码中规定了以下几个级别:
public enum Level {
// 不记录日志 (默认)。
NONE,
//只记录请求方法和URL以及响应状态代码和执行时间
BASIC,
//记录请求和应答的头的基本信息
HEADERS,
//记录请求和响应的头信息,正文和元数据
FULL
}
拦截器
实现RequestInterceptor接口:
public class feignInterceptor implements RequestInterceptor {
@Override
public void apply(RequestTemplate requestTemplate) {
System.out.println("自定义拦截器");
requestTemplate.header("token", "123456");
}
}
config
/**
* 自定义Feign的日志、拦截器等
*/
public class MsProviderFeignConfig {
@Bean
public Contract feignContract() {
return new Contract.Default();
}
@Bean
public Logger.Level feignLoggerLevel() {
return Logger.Level.FULL;
}
@Bean
public Request.Options feignRequestOptions() {
return new Request.Options(30000, 30000);
}
@Bean
public RequestInterceptor feignInterceptor() {
return new feignInterceptor();
}
}
在FeignApi中设置
@FeignClient(name = "micro-service-provider",path = "/ms",configuration = MsProviderFeignConfig.class)
public interface FeignApi {
@RequestLine("GET /hello")
String testFeign();
}
在FeignClient中加入configuration = MsProviderFeignConfig.class。
实现效果
至此,SpringCloud之Feign的简单入门就结束了,这些组件用起来都有共同的三步:引入依赖、编写配置文件、启动类标注解,掌握它们各自的配置基本就可以用了,入门后就可以慢慢去研究源码了。
更多推荐
所有评论(0)