springcloud-Feign配置一
一 前言
前文我们使用过了使用restTemplate结合Ribbon实现了HTTP远程过程调用消费服务,由于使用直接使用RestTenplate进行服务调用不是很理想,所以我们选择更好方式使用Feign进行Web Service 调用;之前文章的学习jdk版本都是基于javaSE8.0,Feign也是如此,不支持8.0以下,如果是初学者,请看知识追寻者cloud系列文章从头开始看,否则会一头雾水;
本篇文章的Feign只是入门级别,主要讲解feign的工作流程,基本TTTP远程调用,相关基本配置等,后续会出主流高级配置;
二 Feign 简介
Feign的由来是基于retrofit , jax-rs,JSR 356, Java API for WebSocket;其内部对RestTemplate进行了封装,在使用过程中简化了HTTP远程过程调用过程,使开发人员使用更加简便;
Feign特色如下:
- 响应缓存支持,可多中类型选择;支持扩展的缓存,如EhCache, Google, Spring;
- 完整的URI 模板表达式语言支持;
- 类SLF4J 日志支持;
三 Feign的工作流
@EnableFeignClients 表示开启Feign功能,然后扫描 注解@FeignClient,程序启动后,会将这些类扫描进IOC容器;Feign会 对 RestTemplate 进行 封装,简化HTTP远程过程调用;RestTemplate使用Request 模板生成新的Requst 发送请求,其底层通常是基于URLConnection;
四 Eureka-Client
在之前的Eureka-Clinet 工程的表现层包创建新的controller层API用于服务提供;
/**
* @Author lsc
* <p> 知识追寻者 Feign 服务消费</p>
*/
@RestController
public class FeignProvoderController {
@GetMapping("zszxz/feign")
public String getFeign(){
return "the get method of feign test";
}
}
五 Feign-client
在父工程中创建新的 子工程 Feign-client;
5.1 pom.xml
添加openfeign 依赖;
<dependencies>
<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>
</dependencies>
5.2 application.yml
这边我们使用新的端口8093,应用名称是 feign-client; 同样将服务注入peer1,peer2,peer3;并且设置feign的客户端属性,比如连接时间,读取时间,日志级别;
server:
port: 8093
spring:
application:
name: feign-client # 应用名称
eureka:
client:
service-url:
# 服务注册地址
defaultZone: http://peer1:10081/eureka/,http://peer2:10082/eureka/,http://peer3:10083/eureka/
feign:
client:
config:
default:
connectTimeout: 5000 # 连接超时时间
readTimeout: 5000 # 读超时时间
loggerLevel: full # 日志级别
5.3 service
在service 接口 上标明注解 @FeignClient表示 是 一个Feign的客户端类; 属性 name 表示 Feign客户端名称;value表示服务提供者的应用名称;由于 eureka-client 中 提供了表现层API,我们 在service接口中定义相应的方法并且使用@GetMapping注解,里面配上需要调用的path,表示我们具体要消费的服务;
/**
* @Author lsc
* <p> </p>
*/
@FeignClient( name = "eureka-client", value = "eureka-client")
public interface FeignService {
@GetMapping("zszxz/feign")
public String getFeign();
}
5.4 controller
controller层也就是平常的表现层,没什么特别之处,直接调用service接口提供的API;
/**
* @Author lsc
* <p> feign 表现层 </p>
*/
@RestController
public class FeignController {
@Autowired
FeignService feignService;
@GetMapping("zszxz/feign")
public String getFeign(){
// 调用 getFeign方法
return feignService.getFeign();
}
}
5.5 启动类
在启动类上方标明@EnableFeignClients,其表示启用feign功能,扫描@FeignClient 标明的类入IOC容器;
/**
* @Author lsc
* <p> feign启动类</p>
*/
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients//表示启用feign
public class FeignApp {
public static void main(String[] args) {
SpringApplication.run(FeignApp.class,args);
}
}
六 调用结果
6.1 工程结构如下
6.2 结果
启动工程,访问地址 http://localhost:8093/zszxz/feign ; 结果如下如,表示使用Feign调用HTTP服务消费成功;
七 @FeignClient注解说明
当 IOC容器中有相同的实例,@Autowired 会不起作用,此时会报错,使用@Primary 标明哪一个实例是首要实例,会优先被IOC扫描注入;
属性 | 说明 |
---|---|
name | Feign Client的名称 支持占位符${} |
serviceId | 服务id |
value | 指定 serviceId |
url | 指定调用的URl, 支持占位符${} |
decode404 | 404错误时,设置为true,会进行decode解码,否则FeignException |
fallback | 容错处理 |
fallbackFactory | 生成fallback模板示例,减少重复代码 |
path | Path统一前缀 |
primary | 设置为 primary Bean |
qualifier | 为Feign Client 新增注解@Qualifier |
八 日志设置
每个 Feign client 都会创建日志,默认是接口的全类名作为日志名称,日志响应仅支持debug模式;日志的配置方式有两步骤,一是通过配置文件,二是通过JAVA注解配置类;
日志级别 | 说明 |
---|---|
NONE | 没有日志(默认) |
BASIC | 请求和响应的状态码,时间 |
HEADERS | 基于Basic加上请求和响应头 |
FULL | 请求和响应的 head ,body 和元数据 |
8.1 application.yml
在 application.yml 中添加如下配置
logging:
level:
com.zszxz.feign.service: Debug
8.2 config
配置类如下
/**
* @Author lsc
* <p> </p>
*/
@Configuration
public class FeignConfiguration {
@Bean
Logger.Level feignLoggerLevel() {
return Logger.Level.FULL;
}
}
8.3 指定Config
在 @FeignClien 中可以指定具体使用Feign的配置类,此时会覆盖feign的默认配置;
@FeignClient( name = "eureka-client", value = "eureka-client",configuration = FeignConfiguration.class)
九参考文档
https://cloud.spring.io/spring-cloud-static/Finchley.SR4/single/spring-cloud.html