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