zhuzhoutong 5 лет назад
Родитель
Сommit
316cb7abd1

+ 4 - 2
framework-boot/src/main/java/com/mrxu/framework/boot/config/MetaFilterAutoConfiguration.java

@@ -6,13 +6,14 @@ import com.netflix.appinfo.ApplicationInfoManager;
 import com.netflix.niws.loadbalancer.DiscoveryEnabledNIWSServerList;
 import org.springframework.beans.factory.InitializingBean;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.config.ConfigurableBeanFactory;
 import org.springframework.boot.autoconfigure.AutoConfigureBefore;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
 import org.springframework.cloud.netflix.ribbon.RibbonClientConfiguration;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Scope;
 
 /**
  * 功能概要:[原信息过滤配置] <br>
@@ -31,10 +32,11 @@ public class MetaFilterAutoConfiguration implements InitializingBean {
 
     /**
      * 配置全局的路由策略
+     * bean为原型模式,否则每个lb都是同样的rule,rule的lb是上次的
      * @return 路由策略
      */
     @Bean
-    @ConditionalOnMissingBean
+    @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
     public MetadataAwareRule metadataAwareRule() {
         return new MetadataAwareRule();
     }

+ 6 - 12
framework-boot/src/main/java/com/mrxu/framework/boot/irule/MetadataAwareRule.java

@@ -1,9 +1,7 @@
 package com.mrxu.framework.boot.irule;
 
 import com.netflix.loadbalancer.AbstractServerPredicate;
-import com.netflix.loadbalancer.AvailabilityPredicate;
 import com.netflix.loadbalancer.CompositePredicate;
-import com.netflix.loadbalancer.ZoneAvoidancePredicate;
 import com.netflix.loadbalancer.ZoneAvoidanceRule;
 
 /**
@@ -20,11 +18,9 @@ public class MetadataAwareRule extends ZoneAvoidanceRule {
     private CompositePredicate compositePredicate;
 
     public MetadataAwareRule() {
-        super();
-        ZoneAvoidancePredicate zonePredicate = new ZoneAvoidancePredicate(this,null);
-        AvailabilityPredicate availabilityPredicate = new AvailabilityPredicate(this,null);
+        ZoneAvoidanceRule zoneAvoidanceRule = new ZoneAvoidanceRule();
         MetadataAwarePredicate metadataAwarePredicate = new MetadataAwarePredicate(this);
-        compositePredicate = createCompositePredicate(metadataAwarePredicate,zonePredicate, availabilityPredicate);
+        compositePredicate = createCompositePredicate(metadataAwarePredicate,zoneAvoidanceRule.getPredicate());
     }
 
     @Override
@@ -35,14 +31,12 @@ public class MetadataAwareRule extends ZoneAvoidanceRule {
     /**
      * 优先p0选择,再使用原始的选择逻辑
      * @param p0 原信息选择
-     * @param p1 地区地域
-     * @param p2 可用服务
+     * @param p1 地区地域、可用服务
      * @return 组合选择逻辑
      */
-    private CompositePredicate createCompositePredicate(MetadataAwarePredicate p0,ZoneAvoidancePredicate p1, AvailabilityPredicate p2) {
-        return CompositePredicate.withPredicates(p0,p1,p2)
-                .addFallbackPredicate(CompositePredicate.withPredicates(p1,p2).build())
-                .addFallbackPredicate(p2)
+    private CompositePredicate createCompositePredicate(MetadataAwarePredicate p0,AbstractServerPredicate p1) {
+        return CompositePredicate.withPredicates(p0, p1)
+                .addFallbackPredicate(p1)
                 .addFallbackPredicate(AbstractServerPredicate.alwaysTrue())
                 .build();
     }