添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
坏坏的骆驼  ·  android 异步处理 android ...·  2 年前    · 
  • 1.3. Timeout Handling
  • 1.4. Creating Feign Clients Manually
  • 1.5. Feign Spring Cloud CircuitBreaker Support
  • 1.6. Configuring CircuitBreakers With Configuration Properties
  • 1.7. Feign Spring Cloud CircuitBreaker Fallbacks
  • 1.8. Feign and @Primary
  • 1.9. Feign Inheritance Support
  • 1.10. Feign request/response compression
  • 1.11. Feign logging
  • 1.12. Feign Capability support
  • 1.13. Micrometer Support
  • 1.14. Feign Caching
  • 1.15. Feign @QueryMap support
  • 1.16. HATEOAS support
  • 1.17. Spring @MatrixVariable Support
  • 1.18. Feign CollectionFormat support
  • 1.19. Reactive Support
  • 1.19.1. Early Initialization Errors
  • 1.20. Spring Data Support
  • 1.21. Spring @RefreshScope Support
  • 1.22. OAuth2 Support
  • 1.23. Transform the load-balanced HTTP request
  • 1.24. X-Forwarded Headers Support
  • 1.25. Supported Ways To Provide URL To A Feign Client
  • 1.26. AOT and Native Image Support
  • 2. Configuration properties
  • This project provides OpenFeign integrations for Spring Boot apps through autoconfiguration and binding to the Spring Environment and other Spring programming model idioms.

    Feign is a declarative web service client. It makes writing web service clients easier. To use Feign create an interface and annotate it. It has pluggable annotation support including Feign annotations and JAX-RS annotations. Feign also supports pluggable encoders and decoders. Spring Cloud adds support for Spring MVC annotations and for using the same HttpMessageConverters used by default in Spring Web. Spring Cloud integrates Eureka, Spring Cloud CircuitBreaker, as well as Spring Cloud LoadBalancer to provide a load-balanced http client when using Feign.

    1.1. How to Include Feign

    To include Feign in your project use the starter with group org.springframework.cloud and artifact id spring-cloud-starter-openfeign . See the Spring Cloud Project page for details on setting up your build system with the current Spring Cloud Release Train.

    Example spring boot app

    @SpringBootApplication
    @EnableFeignClients
    public class Application {
        public static void main(String[] args) {
            SpringApplication.run(Application.class, args);
    
    @FeignClient("stores")
    public interface StoreClient {
        @RequestMapping(method = RequestMethod.GET, value = "/stores")
        List<Store> getStores();
        @RequestMapping(method = RequestMethod.GET, value = "/stores")
        Page<Store> getStores(Pageable pageable);
        @RequestMapping(method = RequestMethod.POST, value = "/stores/{storeId}", consumes = "application/json")
        Store update(@PathVariable("storeId") Long storeId, Store store);
        @RequestMapping(method = RequestMethod.DELETE, value = "/stores/{storeId:\\d+}")
        void delete(@PathVariable Long storeId);
    

    In the @FeignClient annotation the String value ("stores" above) is an arbitrary client name, which is used to create a Spring Cloud LoadBalancer client. You can also specify a URL using the url attribute (absolute value or just a hostname). The name of the bean in the application context is the fully qualified name of the interface. To specify your own alias value you can use the qualifiers value of the @FeignClient annotation.

    The load-balancer client above will want to discover the physical addresses for the "stores" service. If your application is a Eureka client then it will resolve the service in the Eureka service registry. If you don’t want to use Eureka, you can configure a list of servers in your external configuration using SimpleDiscoveryClient.

    Spring Cloud OpenFeign supports all the features available for the blocking mode of Spring Cloud LoadBalancer. You can read more about them in the project documentation.

    To use @EnableFeignClients annotation on @Configuration-annotated-classes, make sure to specify where the clients are located, for example: @EnableFeignClients(basePackages = "com.example.clients") or list them explicitly: @EnableFeignClients(clients = InventoryServiceFeignClient.class)

    1.1.1. Attribute resolution mode

    While creating Feign client beans, we resolve the values passed via the @FeignClient annotation. As of 4.x, the values are being resolved eagerly. This is a good solution for most use-cases, and it also allows for AOT support.

    If you need the attributes to be resolved lazily, set the spring.cloud.openfeign.lazy-attributes-resolution property value to true.

    1.2. Overriding Feign Defaults

    A central concept in Spring Cloud’s Feign support is that of the named client. Each feign client is part of an ensemble of components that work together to contact a remote server on demand, and the ensemble has a name that you give it as an application developer using the @FeignClient annotation. Spring Cloud creates a new ensemble as an ApplicationContext on demand for each named client using FeignClientsConfiguration. This contains (amongst other things) an feign.Decoder, a feign.Encoder, and a feign.Contract. It is possible to override the name of that ensemble by using the contextId attribute of the @FeignClient annotation.

    Spring Cloud lets you take full control of the feign client by declaring additional configuration (on top of the FeignClientsConfiguration) using @FeignClient. Example:

    @FeignClient(name = "stores", configuration = FooConfiguration.class)
    public interface StoreClient {
    FooConfiguration does not need to be annotated with @Configuration. However, if it is, then take care to exclude it from any @ComponentScan that would otherwise include this configuration as it will become the default source for feign.Decoder, feign.Encoder, feign.Contract, etc., when specified. This can be avoided by putting it in a separate, non-overlapping package from any @ComponentScan or @SpringBootApplication, or it can be explicitly excluded in @ComponentScan.
    Using contextId attribute of the @FeignClient annotation in addition to changing the name of
    the ApplicationContext ensemble, it will override the alias of the client name
    and it will be used as part of the name of the configuration bean created for that client.
    
    @FeignClient(name = "${feign.name}", url = "${feign.url}")
    public interface StoreClient {
    

    MicrometerObservationCapability micrometerObservationCapability: If feign-micrometer is on the classpath and ObservationRegistry is available

    MicrometerCapability micrometerCapability: If feign-micrometer is on the classpath, MeterRegistry is available and ObservationRegistry is not available

    CachingCapability cachingCapability: If @EnableCaching annotation is used. Can be disabled via spring.cloud.openfeign.cache.enabled.

    Contract feignContract: SpringMvcContract

    Feign.Builder feignBuilder: FeignCircuitBreaker.Builder

    Client feignClient: If Spring Cloud LoadBalancer is on the classpath, FeignBlockingLoadBalancerClient is used. If none of them is on the classpath, the default feign client is used.

    The OkHttpClient and Apache HttpClient 5 Feign clients can be used by setting spring.cloud.openfeign.okhttp.enabled or spring.cloud.openfeign.httpclient.hc5.enabled to true, respectively, and having them on the classpath. You can customize the HTTP client used by providing a bean of either org.apache.hc.client5.http.impl.classic.CloseableHttpClient when using Apache HC5.

    You can further customise http clients by setting values in the spring.cloud.openfeign.httpclient.xxx properties. The ones prefixed just with httpclient will work for all the clients, the ones prefixed with httpclient.hc5 to Apache HttpClient 5 and the ones prefixed with httpclient.okhttp to OkHttpClient. You can find a full list of properties you can customise in the appendix.

    A bean of Retryer.NEVER_RETRY with the type Retryer is created by default, which will disable retrying. Notice this retrying behavior is different from the Feign default one, where it will automatically retry IOExceptions, treating them as transient network related exceptions, and any RetryableException thrown from an ErrorDecoder.

    Creating a bean of one of those type and placing it in a @FeignClient configuration (such as FooConfiguration above) allows you to override each one of the beans described. Example:

    @Configuration
    public class FooConfiguration {
        @Bean
        public Contract feignContract() {
            return new feign.Contract.Default();
        @Bean
        public BasicAuthRequestInterceptor basicAuthRequestInterceptor() {
            return new BasicAuthRequestInterceptor("user", "password");
    

    This replaces the SpringMvcContract with feign.Contract.Default and adds a RequestInterceptor to the collection of RequestInterceptor.

    @FeignClient also can be configured using configuration properties.

    application.yml

    spring:
        cloud:
            openfeign:
                client:
                    config:
                        feignName:
                            url: http://remote-service.com
                            connectTimeout: 5000
                            readTimeout: 5000
                            loggerLevel: full
                            errorDecoder: com.example.SimpleErrorDecoder
                            retryer: com.example.SimpleRetryer
                            defaultQueryParameters:
                                query: queryValue
                            defaultRequestHeaders:
                                header: headerValue
                            requestInterceptors:
                                - com.example.FooRequestInterceptor
                                - com.example.BarRequestInterceptor
                            responseInterceptor: com.example.BazResponseInterceptor
                            dismiss404: false
                            encoder: com.example.SimpleEncoder
                            decoder: com.example.SimpleDecoder
                            contract: com.example.SimpleContract
                            capabilities:
                                - com.example.FooCapability
                                - com.example.BarCapability
                            queryMapEncoder: com.example.SimpleQueryMapEncoder
                            micrometer.enabled: false

    feignName in this example refers to @FeignClient value, that is also aliased with @FeignClient name and @FeignClient contextId. In a load-balanced scenario, it also corresponds to the serviceId of the server app that will be used to retrieve the instances.

    Default configurations can be specified in the @EnableFeignClients attribute defaultConfiguration in a similar manner as described above. The difference is that this configuration will apply to all feign clients.

    If you prefer using configuration properties to configure all @FeignClient, you can create configuration properties with default feign name.

    You can use spring.cloud.openfeign.client.config.feignName.defaultQueryParameters and spring.cloud.openfeign.client.config.feignName.defaultRequestHeaders to specify query parameters and headers that will be sent with every request of the client named feignName.

    application.yml

    spring:
        cloud:
            openfeign:
                client:
                    config:
                        default:
                            connectTimeout: 5000
                            readTimeout: 5000
                            loggerLevel: basic

    If we create both @Configuration bean and configuration properties, configuration properties will win. It will override @Configuration values. But if you want to change the priority to @Configuration, you can change spring.cloud.openfeign.client.default-to-properties to false.

    If we want to create multiple feign clients with the same name or url so that they would point to the same server but each with a different custom configuration then we have to use contextId attribute of the @FeignClient in order to avoid name collision of these configuration beans.

    @FeignClient(contextId = "fooClient", name = "stores", configuration = FooConfiguration.class)
    public interface FooClient {
    
    @FeignClient(contextId = "barClient", name = "stores", configuration = BarConfiguration.class)
    public interface BarClient {
    

    It is also possible to configure FeignClient not to inherit beans from the parent context. You can do this by overriding the inheritParentConfiguration() in a FeignClientConfigurer bean to return false:

    @Configuration
    public class CustomConfiguration{
    @Bean
    public FeignClientConfigurer feignClientConfigurer() {
                return new FeignClientConfigurer() {
                    @Override
                    public boolean inheritParentConfiguration() {
                        return false;
    

    1.2.1. SpringEncoder configuration

    In the SpringEncoder that we provide, we set null charset for binary content types and UTF-8 for all the other ones.

    You can modify this behaviour to derive the charset from the Content-Type header charset instead by setting the value of spring.cloud.openfeign.encoder.charset-from-content-type to true.

    In case the server is not running or available a packet results in connection refused. The communication ends either with an error message or in a fallback. This can happen before the connectTimeout if it is set very low. The time taken to perform a lookup and to receive such a packet causes a significant part of this delay. It is subject to change based on the remote host that involves a DNS lookup.

    1.4. Creating Feign Clients Manually

    In some cases it might be necessary to customize your Feign Clients in a way that is not possible using the methods above. In this case you can create Clients using the Feign Builder API. Below is an example which creates two Feign Clients with the same interface but configures each one with a separate request interceptor.

    @Import(FeignClientsConfiguration.class)
    class FooController {
        private FooClient fooClient;
        private FooClient adminClient;
        @Autowired
        public FooController(Client client, Encoder encoder, Decoder decoder, Contract contract, MicrometerObservationCapability micrometerObservationCapability) {
            this.fooClient = Feign.builder().client(client)
                    .encoder(encoder)
                    .decoder(decoder)
                    .contract(contract)
                    .addCapability(micrometerObservationCapability)
                    .requestInterceptor(new BasicAuthRequestInterceptor("user", "user"))
                    .target(FooClient.class, "https://PROD-SVC");
            this.adminClient = Feign.builder().client(client)
                    .encoder(encoder)
                    .decoder(decoder)
                    .contract(contract)
                    .addCapability(micrometerObservationCapability)
                    .requestInterceptor(new BasicAuthRequestInterceptor("admin", "admin"))
                    .target(FooClient.class, "https://PROD-SVC");
    The Feign Contract object defines what annotations and values are valid on interfaces. The
    autowired Contract bean provides supports for SpringMVC annotations, instead of
    the default Feign native annotations.
    

    You can also use the Builder`to configure FeignClient not to inherit beans from the parent context. You can do this by overriding calling `inheritParentContext(false) on the Builder.

    1.5. Feign Spring Cloud CircuitBreaker Support

    If Spring Cloud CircuitBreaker is on the classpath and spring.cloud.openfeign.circuitbreaker.enabled=true, Feign will wrap all methods with a circuit breaker.

    To disable Spring Cloud CircuitBreaker support on a per-client basis create a vanilla Feign.Builder with the "prototype" scope, e.g.:

    @Configuration
    public class FooConfiguration {
        @Bean
        @Scope("prototype")
        public Feign.Builder feignBuilder() {
            return Feign.builder();
    As of 2020.0.2, the circuit breaker name pattern has changed from <feignClientName>_<calledMethod>.
    Using CircuitBreakerNameResolver introduced in 2020.0.4, circuit breaker names can retain the old pattern.
    public class FooConfiguration {
        @Bean
        public CircuitBreakerNameResolver circuitBreakerNameResolver() {
            return (String feignClientName, Target<?> target, Method method) -> feignClientName + "_" + method.getName();
    

    1.6. Configuring CircuitBreakers With Configuration Properties

    You can configure CircuitBreakers via configuration properties.

    For example, if you had this Feign client

    @FeignClient(url = "http://localhost:8080")
    public interface DemoClient {
        @GetMapping("demo")
        String getDemo();
    

    1.7. Feign Spring Cloud CircuitBreaker Fallbacks

    Spring Cloud CircuitBreaker supports the notion of a fallback: a default code path that is executed when the circuit is open or there is an error. To enable fallbacks for a given @FeignClient set the fallback attribute to the class name that implements the fallback. You also need to declare your implementation as a Spring bean.

    @FeignClient(name = "test", url = "http://localhost:${server.port}/", fallback = Fallback.class)
        protected interface TestClient {
            @RequestMapping(method = RequestMethod.GET, value = "/hello")
            Hello getHello();
            @RequestMapping(method = RequestMethod.GET, value = "/hellonotfound")
            String getException();
        @Component
        static class Fallback implements TestClient {
            @Override
            public Hello getHello() {
                throw new NoFallbackAvailableException("Boom!", new RuntimeException());
            @Override
            public String getException() {
                return "Fixed response";
    
    @FeignClient(name = "testClientWithFactory", url = "http://localhost:${server.port}/",
                fallbackFactory = TestFallbackFactory.class)
        protected interface TestClientWithFactory {
            @RequestMapping(method = RequestMethod.GET, value = "/hello")
            Hello getHello();
            @RequestMapping(method = RequestMethod.GET, value = "/hellonotfound")
            String getException();
        @Component
        static class TestFallbackFactory implements FallbackFactory<FallbackWithFactory> {
            @Override
            public FallbackWithFactory create(Throwable cause) {
                return new FallbackWithFactory();
        static class FallbackWithFactory implements TestClientWithFactory {
            @Override
            public Hello getHello() {
                throw new NoFallbackAvailableException("Boom!", new RuntimeException());
            @Override
            public String getException() {
                return "Fixed response";
    

    1.8. Feign and @Primary

    When using Feign with Spring Cloud CircuitBreaker fallbacks, there are multiple beans in the ApplicationContext of the same type. This will cause @Autowired to not work because there isn’t exactly one bean, or one marked as primary. To work around this, Spring Cloud OpenFeign marks all Feign instances as @Primary, so Spring Framework will know which bean to inject. In some cases, this may not be desirable. To turn off this behavior set the primary attribute of @FeignClient to false.

    @FeignClient(name = "hello", primary = false)
    public interface HelloClient {
        // methods here
    

    1.9. Feign Inheritance Support

    Feign supports boilerplate apis via single-inheritance interfaces. This allows grouping common operations into convenient base interfaces.

    UserService.java
    public interface UserService {
        @RequestMapping(method = RequestMethod.GET, value ="/users/{id}")
        User getUser(@PathVariable("id") long id);
    

    1.10. Feign request/response compression

    You may consider enabling the request or response GZIP compression for your Feign requests. You can do this by enabling one of the properties:

    spring.cloud.openfeign.compression.request.enabled=true
    spring.cloud.openfeign.compression.response.enabled=true
    
    spring.cloud.openfeign.compression.request.enabled=true
    spring.cloud.openfeign.compression.request.mime-types=text/xml,application/xml,application/json
    spring.cloud.openfeign.compression.request.min-request-size=2048
    

    1.11. Feign logging

    A logger is created for each Feign client created. By default, the name of the logger is the full class name of the interface used to create the Feign client. Feign logging only responds to the DEBUG level.

    application.yml
    logging.level.project.user.UserClient: DEBUG

    The Logger.Level object that you may configure per client, tells Feign how much to log. Choices are:

    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.

    1.12. Feign Capability support

    The Feign capabilities expose core Feign components so that these components can be modified. For example, the capabilities can take the Client, decorate it, and give the decorated instance back to Feign. The support for Micrometer is a good real-life example for this. See Micrometer Support.

    Creating one or more Capability beans and placing them in a @FeignClient configuration lets you register them and modify the behavior of the involved client.

    @Configuration
    public class FooConfiguration {
        @Bean
        Capability customCapability() {
            return new CustomCapability();
    spring.cloud.openfeign.micrometer.enabled=false disables Micrometer support for all Feign clients regardless of the value of the client-level flags: spring.cloud.openfeign.client.config.feignName.micrometer.enabled.
    If you want to enable or disable Micrometer support per client, don’t set spring.cloud.openfeign.micrometer.enabled and use spring.cloud.openfeign.client.config.feignName.micrometer.enabled.
    public class FooConfiguration {
        @Bean
        public MicrometerObservationCapability micrometerObservationCapability(ObservationRegistry registry) {
            return new MicrometerObservationCapability(registry);
    public class FooConfiguration {
        @Bean
        public MicrometerCapability micrometerCapability(MeterRegistry meterRegistry) {
            return new MicrometerCapability(meterRegistry);
        @GetMapping("/demo/{filterParam}")
        @Cacheable(cacheNames = "demo-cache", key = "#keyParam")
        String demoEndpoint(String keyParam, @PathVariable String filterParam);
    

    1.15. Feign @QueryMap support

    Spring Cloud OpenFeign provides an equivalent @SpringQueryMap annotation, which is used to annotate a POJO or Map parameter as a query parameter map.

    For example, the Params class defines parameters param1 and param2:

    // Params.java
    public class Params {
        private String param1;
        private String param2;
        // [Getters and setters omitted for brevity]
    

    1.16. HATEOAS support

    Spring provides some APIs to create REST representations that follow the HATEOAS principle, Spring Hateoas and Spring Data REST.

    If your project use the org.springframework.boot:spring-boot-starter-hateoas starter or the org.springframework.boot:spring-boot-starter-data-rest starter, Feign HATEOAS support is enabled by default.

    When HATEOAS support is enabled, Feign clients are allowed to serialize and deserialize HATEOAS representation models: EntityModel, CollectionModel and PagedModel.

    @FeignClient("demo")
    public interface DemoTemplate {
        @GetMapping(path = "/stores")
        CollectionModel<Store> getStores();
    

    1.17. Spring @MatrixVariable Support

    Spring Cloud OpenFeign provides support for the Spring @MatrixVariable annotation.

    If a map is passed as the method argument, the @MatrixVariable path segment is created by joining key-value pairs from the map with a =.

    If a different object is passed, either the name provided in the @MatrixVariable annotation (if defined) or the annotated variable name is joined with the provided method argument using =.

    IMPORTANT

    Even though, on the server side, Spring does not require the users to name the path segment placeholder same as the matrix variable name, since it would be too ambiguous on the client side, Spring Cloud OpenFeign requires that you add a path segment placeholder with a name matching either the name provided in the @MatrixVariable annotation (if defined) or the annotated variable name.

    1.18. Feign CollectionFormat support

    We support feign.CollectionFormat by providing the @CollectionFormat annotation. You can annotate a Feign client method (or the whole class to affect all methods) with it by passing the desired feign.CollectionFormat as annotation value.

    In the following example, the CSV format is used instead of the default EXPLODED to process the method.

    @FeignClient(name = "demo")
    protected interface DemoFeignClient {
        @CollectionFormat(feign.CollectionFormat.CSV)
        @GetMapping(path = "/test")
        ResponseEntity performRequest(String test);
    

    1.19. Reactive Support

    As the OpenFeign project does not currently support reactive clients, such as Spring WebClient, neither does Spring Cloud OpenFeign.We will add support for it here as soon as it becomes available in the core project.

    Until that is done, we recommend using feign-reactive for Spring WebClient support.

    1.19.1. Early Initialization Errors

    Depending on how you are using your Feign clients you may see initialization errors when starting your application. To work around this problem you can use an ObjectProvider when autowiring your client.

    @Autowired
    ObjectProvider<TestFeignClient> testFeignClient;
    

    1.20. Spring Data Support

    If Jackson Databind and Spring Data Commons are on the classpath, converters for org.springframework.data.domain.Page and org.springframework.data.domain.Sort will be added automatically.

    To disable this behaviour set

    spring.cloud.openfeign.autoconfiguration.jackson.enabled=false
    

    feign.Request.Options as a refresh-scoped bean. This means properties such as connectTimeout and readTimeout can be refreshed against any Feign client instance.

    A url wrapped under org.springframework.cloud.openfeign.RefreshableUrl. This means the URL of Feign client, if defined with spring.cloud.openfeign.client.config.{feignName}.url property, can be refreshed against any Feign client instance.

    When the flag is set to true, and the oauth2 client context resource details are present, a bean of class OAuth2AccessTokenInterceptor is created. Before each request, the interceptor resolves the required access token and includes it as a header. OAuth2AccessTokenInterceptor uses the OAuth2AuthorizedClientManager to get OAuth2AuthorizedClient that holds an OAuth2AccessToken. If the user has specified an OAuth2 clientRegistrationId using the spring.cloud.openfeign.oauth2.clientRegistrationId property, it will be used to retrieve the token. If the token is not retrieved or the clientRegistrationId has not been specified, the serviceId retrieved from the url host segment will be used.

    Using the serviceId as OAuth2 client registrationId is convenient for load-balanced Feign clients. For non-load-balanced ones, the property-based clientRegistrationId is a suitable approach.

    If you do not want to use the default setup for the OAuth2AuthorizedClientManager, you can just instantiate a bean of this type in your configuration.

    1.23. Transform the load-balanced HTTP request

    You can use the selected ServiceInstance to transform the load-balanced HTTP Request.

    For Request, you need to implement and define LoadBalancerFeignRequestTransformer, as follows:

    @Bean
    public LoadBalancerFeignRequestTransformer transformer() {
        return new LoadBalancerFeignRequestTransformer() {
            @Override
            public Request transformRequest(Request request, ServiceInstance instance) {
                Map<String, Collection<String>> headers = new HashMap<>(request.headers());
                headers.put("X-ServiceId", Collections.singletonList(instance.getServiceId()));
                headers.put("X-InstanceId", Collections.singletonList(instance.getInstanceId()));
                return Request.create(request.httpMethod(), request.url(), headers, request.body(), request.charset(),
                        request.requestTemplate());
    

    If multiple transformers are defined, they are applied in the order in which beans are defined. Alternatively, you can use LoadBalancerFeignRequestTransformer.DEFAULT_ORDER to specify the order.

    1.24. X-Forwarded Headers Support

    X-Forwarded-Host and X-Forwarded-Proto support can be enabled by setting following flag:

    spring.cloud.loadbalancer.x-forwarded.enabled=true

    The URL is provided in the @FeignClient annotation.

    @FeignClient(name="testClient", url="http://localhost:8081")

    The URL is resolved from the url attribute of the annotation, without load-balancing.

    The URL is provided in the @FeignClient annotation and in the configuration properties.

    @FeignClient(name="testClient", url="http://localhost:8081") and the property defined in application.yml as spring.cloud.openfeign.client.config.testClient.url=http://localhost:8081

    The URL is resolved from the url attribute of the annotation, without load-balancing. The URL provided in the configuration properties remains unused.

    The URL is not provided in the @FeignClient annotation but is provided in configuration properties.

    @FeignClient(name="testClient") and the property defined in application.yml as spring.cloud.openfeign.client.config.testClient.url=http://localhost:8081

    The URL is resolved from configuration properties, without load-balancing. If spring.cloud.openfeign.client.refresh-enabled=true, then the URL defined in configuration properties can be refreshed as described in Spring RefreshScope Support.

    The URL is neither provided in the @FeignClient annotation nor in configuration properties.

    @FeignClient(name="testClient")

    The URL is resolved from name attribute of annotation, with load balancing.

    However, if you set the url value via properties, it is possible to override the @FeignClient url value by running the image with -Dspring.cloud.openfeign.client.config.[clientId].url=[url] flag. In order to enable overriding, a url value also has to be set via properties and not @FeignClient attribute during buildtime.