什么是Feign?
????Feign是一個(gè)聲明式Web服務(wù)客戶端。支持可插拔編碼器和解碼器。Spring Cloud的Feign添加了對(duì)Spring MVC注釋的支持,并且使用了Spring Web中默認(rèn)使用的相同HttpMessageConverters。Spring Cloud的Feign將Ribbon和Eureka集成在一起,在使用Feign時(shí)提供負(fù)載均衡的http客戶端。
快速開(kāi)始
這個(gè)案例依賴(lài)Eureka-Server,請(qǐng)準(zhǔn)備好server服務(wù)。Eureka相關(guān)查看Spring-Cloud系列(一) Eureka
添加依賴(lài)
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.13.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Dalston.SR5</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
代碼
注解掃描
@EnableEurekaClient
@EnableFeignClients
@SpringBootApplication
public class FeignApplication {
public static void main(String[] args) {
SpringApplication.run(FeignApplication.class, args);
}
}
定義客戶端
@FeignClient("eureka-client-one") //必須是你調(diào)用服務(wù)的名稱(chēng),即spring.application.name
public interface FeignTestClient {
/**
* Feign默認(rèn)解析合約是Spring-MVC的注解
* @return
*/
@RequestMapping(method = RequestMethod.GET, value = "/url")
String getUrl();
}
使用
@Autowired
private FeignTestClient feignTestClient;
@GetMapping("/test")
public String testService(){
return feignTestClient.getUrl();
}
application配置
server:
</br>??port: 8083
</br>spring:
</br>??application:
</br>????name: feign-one
</br>eureka:
</br>??instance:
</br>????prefer-ip-address: true
</br>????instanceId: ${spring.application.name}:${vcap.application.instance_id:${spring.application.instance_id:${random.value}}}
</br>??client:
</br>????serviceUrl:
</br>??????defaultZone: http://user:Pass123456@localhost:8761/eureka
啟動(dòng)效果
[圖片上傳失敗...(image-bfe5a9-1527557581139)]
自定義feignClient和feign日志登等級(jí)
配置定義客戶端
自定義配置
@Configuration
public class FeignConfiguration {
@Bean
public Contract feignContract() {
return new feign.Contract.Default();
}
}
定義客戶端
@FeignClient(name = "eureka-client-one",configuration = FeignConfiguration.class)
public interface FeignTestClient {
@RequestLine("GET /url") //根據(jù)配置現(xiàn)在Feign支持的是原生注解
String getUrl();
}
??注意!Feign的客戶端的自定義和Ribbon類(lèi)似,配置類(lèi)不能放在啟動(dòng)類(lèi)的平級(jí)和子目錄下。否則會(huì)覆蓋全局配置,正確目錄如下:</br>

代碼定義客戶端
定義客戶端
public interface FeignTestClient {
@RequestLine("GET /url")
String getUrl();
}
使用客戶端
@RestController
@Import(FeignClientsConfiguration.class)
public class FeignTestContoller {
@GetMapping("/test")
public String testService(){
FeignTestClient feignTestClient = Feign.builder()
.options(new Request.Options(1000, 3500))
.retryer(new Retryer.Default(5000, 5000, 3))
.requestInterceptor(new BasicAuthRequestInterceptor("user", "Pass123456"))
.target(FeignTestClient.class, "http://lodalhost:8080");
return feignTestClient.getUrl();
}
}
Feign提供的配置
????Feign提供以下默認(rèn)配置:
- Decoder feignDecoder: ResponseEntityDecoder (which wraps a SpringDecoder)
- Encoder feignEncoder: SpringEncoder
- Logger feignLogger: Slf4jLogger
- Contract feignContract: SpringMvcContract
- Feign.Builder feignBuilder: HystrixFeign.Builder
- Client feignClient: if Ribbon is enabled it is a LoadBalancerFeignClient, otherwise the default feign client is used.
????Feign未提供默認(rèn)配置:
- Logger.Level
- Retryer
- ErrorDecoder
- Request.Options
- Collection<RequestInterceptor>
- SetterFactory
自定義日志級(jí)別
application配置
logging:
</br>??level:
</br>????com.midai.feign.client.FeignTestClient: DEBUG #Client是用戶自定義Clien全稱(chēng)
代碼配置
@Configuration
public class FeignConfiguration {
@Bean
Logger.Level feignLoggerLevel() {
return Logger.Level.FULL;
}
}
Feign的可選日志等級(jí)
- NONE, No logging (DEFAULT).
- BASIC, Log only the request method and URL and the response status code and execution time.
- HEADERS, Log the basic information along with request and response headers.
- FULL, Log the headers, body, and metadata for both requests and responses.
Feign其他用法和配置
抽取公用包依賴(lài)
UserService.java
public interface UserService {
@RequestMapping(method = RequestMethod.GET, value ="/users/{id}")
User getUser(@PathVariable("id") long id);
}
UserResource.java
@RestController
public class UserResource implements UserService {
}
UserClient.java
@FeignClient("users")
public interface UserClient extends UserService {
}
????接口抽取共用,服務(wù)提供方直接實(shí)現(xiàn),FeignClient繼承提高代碼可用性。
Feign請(qǐng)求響應(yīng)設(shè)置
Feign請(qǐng)求響應(yīng)壓縮
feign:
</br>??compression:
</br>????request:
</br>??????enabled: true
</br>feign:
</br>??compression:
</br>????response:
</br>??????enabled: true
Feign請(qǐng)求設(shè)置
feign:
</br>??compression:
</br>????request:
</br>??????mime-types: text/xml,application/xml,application/json
</br>feign:
</br>??compression:
</br>????request:
</br>??????min-request-size: 2048
????本文參考Spring-Cloud-Feign,Feign-Builder用法