Spring整合Ribbon及Fegin的使用及配置方式

import java.io.IOException;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.netflix.client.ClientFactory;
import com.netflix.client.config.IClientConfig;
import com.netflix.config.ConfigurationManager;
import com.netflix.loadbalancer.ILoadBalancer;
import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import com.netflix.loadbalancer.ZoneAvoidanceRule;
import com.netflix.loadbalancer.ZoneAwareLoadBalancer;
import com.sam.demo.service.RemoteService;
import feign.Feign;
import feign.jackson.JacksonDecoder;
import feign.jackson.JacksonEncoder;
import feign.ribbon.LBClient;
import feign.ribbon.LBClientFactory;
import feign.ribbon.RibbonClient;

@Configuration
public class Config {
	public Config() {
		try {
			ConfigurationManager.loadPropertiesFromResources("sample-client.properties");
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	@Bean
	public RemoteService remoteService() {
		RibbonClient client = RibbonClient.builder().lbClientFactory(new LBClientFactory() {
			@Override
			public LBClient create(String clientName) {
				IClientConfig config = ClientFactory.getNamedConfig(clientName);
				ILoadBalancer lb = ClientFactory.getNamedLoadBalancer(clientName);
				ZoneAwareLoadBalancer zb = (ZoneAwareLoadBalancer) lb;
				zb.setRule(zoneAvoidanceRule());
				return LBClient.create(lb, config);
			}
		}).build();
		RemoteService service = Feign.builder().client(client).encoder(new JacksonEncoder())
				.decoder(new JacksonDecoder()).target(RemoteService.class, "http://sample-client/gradle-web");
		return service;
	}

	/**
	 * * Ribbon负载均衡策略实现 *
	 * 使用ZoneAvoidancePredicate和AvailabilityPredicate来判断是否选择某个server,前一个判断判定一个zone的运行性能是否可用,
	 * * 剔除不可用的zone(的所有server),AvailabilityPredicate用于过滤掉连接数过多的Server。 * @return
	 */
	private IRule zoneAvoidanceRule() {
		return new ZoneAvoidanceRule();
	}

	/** * Ribbon负载均衡策略实现 * 随机选择一个server。 * @return */ 
        private IRule randomRule() { return new RandomRule(); }
import feign.Headers;
import feign.RequestLine;

public interface RemoteService {
	@Headers({ "Content-Type: application/json", "Accept: application/json" })
	@RequestLine("POST /users/list")
	public User getOwner(User user);
}
    # Max number of retries   
    sample-client.ribbon.MaxAutoRetries=1  
      
    # Max number of next servers to retry (excluding the first server)  
    sample-client.ribbon.MaxAutoRetriesNextServer=1  
      
    # Whether all operations can be retried for this client  
    sample-client.ribbon.OkToRetryOnAllOperations=true  
      
    # Interval to refresh the server list from the source  
    sample-client.ribbon.ServerListRefreshInterval=2000  
      
    # Connect timeout used by Apache HttpClient  
    sample-client.ribbon.ConnectTimeout=3000  
      
    # Read timeout used by Apache HttpClient  
    sample-client.ribbon.ReadTimeout=3000  
      
    # Initial list of servers, can be changed via Archaius dynamic property at runtime  
    sample-client.ribbon.listOfServers=127.0.0.1:8080, 127.0.0.1:8081
  sample-client.ribbon.EnablePrimeConnections=true  




猜你喜欢

转载自blog.csdn.net/u013560667/article/details/80283478