Explorar o código

【修改】服务选择逻辑修改

zhuzhoutong %!s(int64=5) %!d(string=hai) anos
pai
achega
52ca3c7926

+ 0 - 3
framework-boot/src/main/java/com/mrxu/framework/boot/config/MetaFilterAutoConfiguration.java

@@ -6,14 +6,12 @@ import com.netflix.appinfo.ApplicationInfoManager;
 import com.netflix.niws.loadbalancer.DiscoveryEnabledNIWSServerList;
 import com.netflix.niws.loadbalancer.DiscoveryEnabledNIWSServerList;
 import org.springframework.beans.factory.InitializingBean;
 import org.springframework.beans.factory.InitializingBean;
 import org.springframework.beans.factory.annotation.Autowired;
 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.AutoConfigureBefore;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
 import org.springframework.cloud.netflix.ribbon.RibbonClientConfiguration;
 import org.springframework.cloud.netflix.ribbon.RibbonClientConfiguration;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.Scope;
 
 
 /**
 /**
  * 功能概要:[原信息过滤配置] <br>
  * 功能概要:[原信息过滤配置] <br>
@@ -36,7 +34,6 @@ public class MetaFilterAutoConfiguration implements InitializingBean {
      * @return 路由策略
      * @return 路由策略
      */
      */
     @Bean
     @Bean
-    @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
     public MetadataAwareRule metadataAwareRule() {
     public MetadataAwareRule metadataAwareRule() {
         return new MetadataAwareRule();
         return new MetadataAwareRule();
     }
     }

+ 2 - 1
framework-boot/src/main/java/com/mrxu/framework/boot/irule/MetadataAwarePredicate.java

@@ -13,11 +13,12 @@ import java.util.Map;
 
 
 /**
 /**
  * 功能概要:[服务合法判断逻辑] <br>
  * 功能概要:[服务合法判断逻辑] <br>
- *
+ * 废弃
  * @author zzt
  * @author zzt
  * @date 2020/10/15
  * @date 2020/10/15
  */
  */
 @Slf4j
 @Slf4j
+@Deprecated
 public class MetadataAwarePredicate extends AbstractServerPredicate {
 public class MetadataAwarePredicate extends AbstractServerPredicate {
 
 
 
 

+ 39 - 28
framework-boot/src/main/java/com/mrxu/framework/boot/irule/MetadataAwareRule.java

@@ -1,8 +1,16 @@
 package com.mrxu.framework.boot.irule;
 package com.mrxu.framework.boot.irule;
 
 
-import com.netflix.loadbalancer.AbstractServerPredicate;
-import com.netflix.loadbalancer.CompositePredicate;
+import com.google.common.base.Optional;
+import com.mrxu.framework.boot.util.ComputerInfo;
+import com.mrxu.framework.boot.util.SpringApplicationContextUtil;
+import com.netflix.loadbalancer.ILoadBalancer;
+import com.netflix.loadbalancer.Server;
 import com.netflix.loadbalancer.ZoneAvoidanceRule;
 import com.netflix.loadbalancer.ZoneAvoidanceRule;
+import com.netflix.niws.loadbalancer.DiscoveryEnabledServer;
+import org.springframework.cloud.netflix.eureka.EurekaInstanceConfigBean;
+
+import java.util.List;
+import java.util.Map;
 
 
 /**
 /**
  * 功能概要:[原信息过滤器,根据原信息过滤合法的服务,可用于开发调试和版本过滤] <br>
  * 功能概要:[原信息过滤器,根据原信息过滤合法的服务,可用于开发调试和版本过滤] <br>
@@ -12,33 +20,36 @@ import com.netflix.loadbalancer.ZoneAvoidanceRule;
  */
  */
 public class MetadataAwareRule extends ZoneAvoidanceRule {
 public class MetadataAwareRule extends ZoneAvoidanceRule {
 
 
-    /**
-     * 过滤服务逻辑
-     */
-    private CompositePredicate compositePredicate;
-
-    public MetadataAwareRule() {
-        ZoneAvoidanceRule zoneAvoidanceRule = new ZoneAvoidanceRule();
-        MetadataAwarePredicate metadataAwarePredicate = new MetadataAwarePredicate(this);
-        compositePredicate = createCompositePredicate(metadataAwarePredicate,zoneAvoidanceRule.getPredicate());
-    }
-
     @Override
     @Override
-    public AbstractServerPredicate getPredicate() {
-        return compositePredicate;
-    }
+    public Server choose(Object key) {
+        ILoadBalancer lb = getLoadBalancer();
+        //是注册中心中的服务时,判断过滤逻辑
+        EurekaInstanceConfigBean eurekaInstanceConfigBean = SpringApplicationContextUtil.getBean(EurekaInstanceConfigBean.class);
+        if(eurekaInstanceConfigBean != null){
+            String isOpenDevStr = eurekaInstanceConfigBean.getEnvironment().getProperty("spring.application.open-dev","false");
+            if("true".equalsIgnoreCase(isOpenDevStr)){
+                //本地开启调试模式,转发本机机器码的服务
+                String localMac = ComputerInfo.getMacAddress();
+                List<Server> upList = lb.getReachableServers();
+                for(Server upServer : upList){
+                    DiscoveryEnabledServer server = (DiscoveryEnabledServer) upServer;
+                    Map<String, String> metadata = server.getInstanceInfo().getMetadata();
+                    if(metadata!=null&&metadata.size()>0&&metadata.keySet().contains("mac-addr")){
+                        String remoteMac = metadata.get("mac-addr");
+                        if(localMac.equalsIgnoreCase(remoteMac)){
+                            return upServer;
+                        }
+                    }
+                }
+            }
+        }
 
 
-    /**
-     * 优先p0选择,再使用原始的选择逻辑
-     * @param p0 原信息选择
-     * @param p1 地区地域、可用服务
-     * @return 组合选择逻辑
-     */
-    private CompositePredicate createCompositePredicate(MetadataAwarePredicate p0,AbstractServerPredicate p1) {
-        return CompositePredicate.withPredicates(p0, p1)
-                .addFallbackPredicate(p1)
-                .addFallbackPredicate(AbstractServerPredicate.alwaysTrue())
-                .build();
+        //没有找到合适的服务
+        Optional<Server> server = getPredicate().chooseRoundRobinAfterFiltering(lb.getAllServers(), key);
+        if (server.isPresent()) {
+            return server.get();
+        } else {
+            return null;
+        }
     }
     }
-
 }
 }