
ribbon with eureka
Spring Cloud中使用ribbon(配合eureka)来访问service时,只需要使用http://service-name/xxx这样格式的URL即可访问对应的service的注册的服务,这具体是如何实现的呢?
Netflix ribbonH2
Netflix OSS中ribbon配合eureka来自动配置serverlist时,是需要做如下配置的
bash
myClient.ribbon.NIWSServerListClassName=com.netflix.niws.loadbalancer.DiscoveryEnabledNIWSServerList# the server must register itself with Eureka server with VipAddress "myservice"myClient.ribbon.DeploymentContextBasedVipAddresses=myservice
DeploymentContextBasedVipAddresses 需要配置为需要访问的service的VipAddress的值。
Spring CloudH2
Spring Cloud中自动配置ribbon时会注册LoadBalancerInterceptor。LoadBalancerInterceptor会在拦截请求时,获取请求的Host来作为serviceName来获取ILoadBalancer的实例
bash
LoadBalancerInterceptorpublic ClientHttpResponse intercept(final HttpRequest request, final byte[] body, final ClientHttpRequestExecution execution) throws IOException {URI originalUri = request.getURI();String serviceName = originalUri.getHost();return (ClientHttpResponse)this.loadBalancer.execute(serviceName, new LoadBalancerRequest<ClientHttpResponse>() {public ClientHttpResponse apply(ServiceInstance instance) throws Exception {HttpRequest serviceRequest = LoadBalancerInterceptor.this.new ServiceRequestWrapper(request, instance);return execution.execute(serviceRequest, body);}});}RibbonLoadBalancerClientpublic <T> T execute(String serviceId, LoadBalancerRequest<T> request) throws IOException {ILoadBalancer loadBalancer = this.getLoadBalancer(serviceId);...}
而获取ILoadBalancer实例会单独的ApplicationContext中进行,这个ApplicationContext则会注册EurekaRibbonClientConfiguration类配置ribbonServerList等参数。
EurekaRibbonClientConfiguration返回ribbonServerList的逻辑是优先读取配置文件中xxx.ribbon.listOfServers设置的serverList。如果没有设置则返回DiscoveryEnabledNIWSServerList的包装类DomainExtractingServerList。
bash
EurekaRibbonClientConfiguration@Bean@ConditionalOnMissingBeanpublic ServerList<?> ribbonServerList(IClientConfig config, Provider<EurekaClient> eurekaClientProvider) {if (this.propertiesFactory.isSet(ServerList.class, serviceId)) {return this.propertiesFactory.get(ServerList.class, config, serviceId);}DiscoveryEnabledNIWSServerList discoveryServerList = new DiscoveryEnabledNIWSServerList(config, eurekaClientProvider);DomainExtractingServerList serverList = new DomainExtractingServerList(discoveryServerList, config, this.approximateZoneFromHostname);return serverList;}
DiscoveryEnabledNIWSServerList则需要配合DeploymentContextBasedVipAddresses参数的 ,而EurekaRibbonClientConfiguration的@PostConstruct方法恰巧最终还是会配置DeploymentContextBasedVipAddresses参数
bash
EurekaRibbonClientConfiguration@PostConstructpublic void preprocess() {setRibbonProperty(this.serviceId, DeploymentContextBasedVipAddresses.key(),this.serviceId);setRibbonProperty(this.serviceId, EnableZoneAffinity.key(), "true");}
评论
新的评论
上一篇
Docker compose使用默认的bridge网络
首先compose默认会为当前的compose建立单独的网络,然后所有的服务连接到这个网络。如果需要定义默认连接到自定义的网络,需要这样定义 如果是自定义的外部网络 如果外部网络使用的是docker默认的 bridge 网络,会报如下错误 Network-scoped alia…
下一篇
Hibernate中的关联实体的删除
在删除一个有关联的对象时,Hibernate的处理逻辑是这样的 解除所有自己维护的关系,通常是如果有别人引用自己,则把对方的外键设置为空, 这就要求外键不能有非空约束,否则会报外键约束错误 ;自己引用别人则无需处理。如果被解除关联的关联设置了orphanRemove属性,则接…
