Spring-Cloud系列 Feign (三)

什么是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>

目錄結(jié)構(gòu)

代碼定義客戶端

定義客戶端

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用法

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容