Feign是一个声明式WebService客户端,其使用方法是定义一个服务接口,然在接口上添加注解,Spring Cloud对Feign进行了封装,使其支持Spring MVC标准注解和HttpMessageConverters,Feign可以与Eureka和Ribbon组合使用以支持负载均衡
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-openfeignartifactId>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
dependency>
server:
port: 8790
spring:
application:
name: cloud-openfeign
eureka:
client:
register-with-eureka: false
service-url:
defaultZone: http://localhost:8761/eureka
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
public class OpenFeignApplication {
public static void main(String[] args) {
SpringApplication.run(OpenFeignApplication.class, args);
}
}
@FeignClient(value = "CLOUD-PROVIDER", configuration = FeignConfiguration.class)
public interface ProviderClient {
@GetMapping(value = "/provider/getProviderInfo/{message}", consumes = "application/json")
String getProviderInfo(@PathVariable("message") String message);
}
注意:
value:是服务提供者在Eureka注册中心的名称
configuration:自定义Feign配置,比如日志级别,安全校验等
@RestController
@RequestMapping("/openfeign")
public class OpenFeignController {
@Autowired
private ProviderClient providerClient;
@GetMapping("/getOpenFeignInfo/{message}")
public String getOpenFeignInfo(@PathVariable("message") String message) {
String providerInfo = providerClient.getProviderInfo(message);
return "This is openfeign consumer, from provider get info is " + providerInfo;
}
}
依次启动Eureka Server、Provider和Feign Consumer微服务,浏览器地址输入http://localhost:8790/openfeign/getOpenFeignInfo/world
在服务提供端新增超时测试方法
@GetMapping("/getProviderTimeout")
public String getProviderTimeout() {
try {
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "This is provider, The port is " + serverPort;
}
在服务消费端新增超时测试feign接口和业务测试接口
@GetMapping(value = "/provider/getProviderTimeout")
String getProviderTimeout();
@GetMapping(value = "/timeout")
public String openFeignTimeOUt() {
return providerClient.getProviderTimeout();
}
分别启动Eureka Server、Provider和consumer,浏览器地址输入http://localhost:8790/openfeign/timeout
查看服务端控制台日志,提示Read timed out
OpenFeign客户端默认只等待一秒钟,服务端处理业务超过1秒钟,导致Feign客户端不等待了,直接返回错误,为了避免这样的情况,需要在yml配置文件中配置Feign超时配置
feign:
client:
config:
default:
connectTimeout: 5000 #连接超时
readTimeout: 5000 #读取超时
再次启动客户端服务,浏览器输入http://localhost:8790/openfeign/timeout
OpenFeign提供日志打印功能,可以通过配置来调整日志级别,从而了解Feign中Http请求的细节,也就是对Feign接口的调用情况进行监控和输出
Feign的日志级别有以下四种
新增Feign配置类,添加日志Bean
@Configuration
public class FeignConfiguration {
@Bean
Logger.Level feignLoggerLevel() {
return Logger.Level.FULL;
}
}
在yml配置文件中开启日志的Feign客户端
logging:
level:
com.xlhj.cloud.openfeign.api.ProviderClient: debug
重新启动Feign客户端,查看控制台日志