Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

spring-cloud-zookeeper with spring-cloud-fegin #155

Closed
thinkd1ff opened this issue Dec 21, 2017 · 0 comments
Closed

spring-cloud-zookeeper with spring-cloud-fegin #155

thinkd1ff opened this issue Dec 21, 2017 · 0 comments

Comments

@thinkd1ff
Copy link

thinkd1ff commented Dec 21, 2017

I wrote a demo use zookeeper use the fegin default enable ribbon,but it did'nt work for PATCH method,
I had Add the Apache Client,But i remove zookeper,just use the Ribbo setting ribbon.listofServers,it workwd! what's wrong with my demo

I debug it. the auto configuration class:

package org.springframework.cloud.zookeeper.discovery.dependency;

import java.io.IOException;
import java.net.URI;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.cloud.netflix.feign.ribbon.CachingSpringLoadBalancerFactory;
import org.springframework.cloud.netflix.feign.ribbon.FeignRibbonClientAutoConfiguration;
import org.springframework.cloud.netflix.feign.ribbon.LoadBalancerFeignClient;
import org.springframework.cloud.netflix.ribbon.RibbonAutoConfiguration;
import org.springframework.cloud.netflix.ribbon.SpringClientFactory;
import org.springframework.cloud.zookeeper.ConditionalOnZookeeperEnabled;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;

import feign.Client;
import feign.Request;
import feign.Response;

/**
 * Configuration for ensuring that headers are set for a given dependency when
 * Feign is used.
 *
 * @author Marcin Grzejszczak
 * @since 1.0.0
 */
@Configuration
@ConditionalOnDependenciesPassed
@ConditionalOnZookeeperEnabled
@ConditionalOnProperty(value = "spring.cloud.zookeeper.dependency.headers.enabled", matchIfMissing = true)
@ConditionalOnClass({ Client.class, LoadBalancerFeignClient.class })
@AutoConfigureAfter({ RibbonAutoConfiguration.class, FeignRibbonClientAutoConfiguration.class })
public class DependencyFeignClientAutoConfiguration {
	@Autowired(required = false) private LoadBalancerFeignClient ribbonClient;
	@Autowired private ZookeeperDependencies zookeeperDependencies;
	@Autowired private CachingSpringLoadBalancerFactory loadBalancerFactory;
	@Autowired private SpringClientFactory springClientFactory;

	@Bean
	@Primary
	Client dependencyBasedFeignClient() {
		return new LoadBalancerFeignClient(
				new Client.Default(null, null), this.loadBalancerFactory, this.springClientFactory) {

			@Override
			public Response execute(Request request, Request.Options options)
					throws IOException {
				URI asUri = URI.create(request.url());
				String clientName = asUri.getHost();
				ZookeeperDependency dependencyForAlias =
						DependencyFeignClientAutoConfiguration.this.zookeeperDependencies
						.getDependencyForAlias(clientName);
				Map<String, Collection<String>> headers = getUpdatedHeadersIfPossible(
						request, dependencyForAlias);
				if (DependencyFeignClientAutoConfiguration.this.ribbonClient != null) {
					return DependencyFeignClientAutoConfiguration.this.ribbonClient.execute(
							request(request, headers), options);
				}
				return super.execute(request(request, headers), options);
			}

			private Request request(Request request,
					Map<String, Collection<String>> headers) {
				return Request.create(request.method(), request.url(), headers,
						request.body(), request.charset());
			}

			private Map<String, Collection<String>> getUpdatedHeadersIfPossible(
					Request request, ZookeeperDependency dependencyForAlias) {
				if (dependencyForAlias != null) {
					return Collections.unmodifiableMap(new HashMap<>(
							dependencyForAlias.getUpdatedHeaders(request.headers())));
				}
				return request.headers();
			}

		};
	}

}

the line @Autowired(required = false) private LoadBalancerFeignClient ribbonClient; just null,is the problem? where I can enble inject a ribbonClient instance?

the I see the file part of RibbonAutoConfiguration as :

public class RibbonAutoConfiguration {

	@Autowired(required = false)
	private List<RibbonClientSpecification> configurations = new ArrayList<>();
	
	@Autowired
	private RibbonEagerLoadProperties ribbonEagerLoadProperties;

	@Bean
	public HasFeatures ribbonFeature() {
		return HasFeatures.namedFeature("Ribbon", Ribbon.class);
	}

	@Bean
	public SpringClientFactory springClientFactory() {
		SpringClientFactory factory = new SpringClientFactory();
		factory.setConfigurations(this.configurations);
		return factory;
	}

	@Bean
	@ConditionalOnMissingBean(LoadBalancerClient.class)
	public LoadBalancerClient loadBalancerClient() {
		return new RibbonLoadBalancerClient(springClientFactory());
	}
.....
}

the last method look like desn't create the the LoadBalancerClient..

anybody can help,I had confused a few day...and the ask an issuse in spring-cloud-netflix as #2550

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants