Pārlūkot izejas kodu

考生端APP配置调整 Use CloudDiscoveryClient

deason 6 gadi atpakaļ
vecāks
revīzija
309ef3efaa

+ 74 - 0
src/main/java/cn/com/qmth/examcloud/app/core/CloudDiscoveryClient.java

@@ -0,0 +1,74 @@
+/*
+ * *************************************************
+ * Copyright (c) 2019 QMTH. All Rights Reserved.
+ * Created by Deason on 2019-05-29 11:54:21.
+ * *************************************************
+ */
+
+package cn.com.qmth.examcloud.app.core;
+
+import cn.com.qmth.examcloud.commons.exception.ExamCloudRuntimeException;
+import com.google.common.cache.Cache;
+import com.google.common.cache.CacheBuilder;
+import com.google.common.collect.Lists;
+import org.apache.commons.collections.CollectionUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cloud.client.ServiceInstance;
+import org.springframework.cloud.client.discovery.DiscoveryClient;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Random;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * 系统实例
+ *
+ * @author: fengdesheng
+ * @since: 2019/5/29
+ */
+@Component
+public class CloudDiscoveryClient {
+
+    @Autowired(required = false)
+    private DiscoveryClient discoveryClient;
+
+    private Cache<String, List<String>> cache = CacheBuilder.newBuilder()
+            .maximumSize(1000)//最大缓存对象数
+            .expireAfterWrite(60, TimeUnit.SECONDS)//过期时间
+            .concurrencyLevel(8)//并发级别,即允许最多N个线程并发更新, 默认值为4
+            .recordStats()//开启记录状态
+            .build();
+
+    /**
+     * 获取实例的URL
+     */
+    public String getInstanceUrl(String appName) {
+        List<String> appUrls = cache.getIfPresent(appName);
+        if (CollectionUtils.isNotEmpty(appUrls)) {
+            //随机分配一个地址
+            int n = this.randomInt(0, appUrls.size() - 1);
+            return appUrls.get(n);
+        }
+
+        List<ServiceInstance> instances = discoveryClient.getInstances(appName);
+        if (CollectionUtils.isEmpty(instances)) {
+            throw new ExamCloudRuntimeException("No Instance " + appName);
+        }
+
+        appUrls = Lists.newArrayList();
+        for (ServiceInstance instance : instances) {
+            appUrls.add(String.format("http://%s:%s", instance.getHost(), instance.getPort()));
+        }
+        cache.put(appName, appUrls);
+
+        //随机分配一个地址
+        int n = this.randomInt(0, appUrls.size() - 1);
+        return appUrls.get(n);
+    }
+
+    public int randomInt(int min, int max) {
+        return new Random().nextInt(max - min + 1) + min;
+    }
+
+}

+ 43 - 0
src/main/java/cn/com/qmth/examcloud/app/core/Constants.java

@@ -0,0 +1,43 @@
+/*
+ * *************************************************
+ * Copyright (c) 2019 QMTH. All Rights Reserved.
+ * Created by Deason on 2019-05-29 11:33:47.
+ * *************************************************
+ */
+
+package cn.com.qmth.examcloud.app.core;
+
+/**
+ * 系统常量
+ *
+ * @author: fengdesheng
+ * @since: 2019/5/29
+ */
+public interface Constants {
+
+    /**
+     * 基础信息平台
+     */
+    String EC_CORE_BASIC = "EC-CORE-BASIC";
+
+    /**
+     * 考务平台
+     */
+    String EC_CORE_EXAMWORK = "EC-CORE-EXAMWORK";
+
+    /**
+     * 网考管理端平台
+     */
+    String EC_CORE_OE_ADMIN = "EC-CORE-OE-ADMIN";
+
+    /**
+     * 网考学生端平台
+     */
+    String EC_CORE_OE_STUDENT = "EC-CORE-OE-STUDENT";
+
+    /**
+     * 题库平台
+     */
+    String EC_CORE_QUESTION = "EC-CORE-QUESTION";
+
+}

+ 16 - 25
src/main/java/cn/com/qmth/examcloud/app/core/PropertyService.java

@@ -9,6 +9,7 @@ package cn.com.qmth.examcloud.app.core;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Component;
 
@@ -18,45 +19,43 @@ import org.springframework.stereotype.Component;
 @Component
 public class PropertyService {
     private static Logger log = LoggerFactory.getLogger(PropertyService.class);
-    @Value("${examcloud.base.info.url}")
-    private String baseInfoUrl;//基础信息服务
-    @Value("${examcloud.exam.admin.url}")
-    private String examAdminUrl;//考务服务
-    @Value("${examcloud.net.exam.url}")
-    private String netExamUrl;//网考服务
-    @Value("${examcloud.admin.exam.url}")
-    private String netAdminExamUrl;//网考后端服务
-    @Value("${examcloud.question.pool.url}")
-    private String questionPoolUrl;//题库服务
-    @Value("${examcloud.user.auth.url}")
-    private String userAuthUrl;//认证中心服务
+    @Autowired
+    private CloudDiscoveryClient discoveryClient;
+
     @Value("${examcloud.upyun.url}")
     private String upYunUrl;//又拍云文件服务
+
     @Value("${examcloud.sms.url}")
     private String smsUrl;//短信服务地址
+
     @Value("${examcloud.sms.sign}")
     private String smsSign;//短信签名
+
     @Value("${examcloud.sms.template}")
     private String smsTemplate;//短信模板Code
 
     public String getBaseInfoUrl() {
-        return baseInfoUrl;
+        return discoveryClient.getInstanceUrl(Constants.EC_CORE_BASIC);
     }
 
     public String getExamAdminUrl() {
-        return examAdminUrl;
+        return discoveryClient.getInstanceUrl(Constants.EC_CORE_EXAMWORK);
     }
 
     public String getNetExamUrl() {
-        return netExamUrl;
+        return discoveryClient.getInstanceUrl(Constants.EC_CORE_OE_STUDENT);
+    }
+
+    public String getNetAdminExamUrl() {
+        return discoveryClient.getInstanceUrl(Constants.EC_CORE_OE_ADMIN);
     }
 
     public String getQuestionPoolUrl() {
-        return questionPoolUrl;
+        return discoveryClient.getInstanceUrl(Constants.EC_CORE_QUESTION);
     }
 
     public String getUserAuthUrl() {
-        return userAuthUrl;
+        return discoveryClient.getInstanceUrl(Constants.EC_CORE_BASIC);
     }
 
     public String getUpYunUrl() {
@@ -75,12 +74,4 @@ public class PropertyService {
         return smsTemplate;
     }
 
-    public String getNetAdminExamUrl() {
-        return netAdminExamUrl;
-    }
-
-    public void setNetAdminExamUrl(String netAdminExamUrl) {
-        this.netAdminExamUrl = netAdminExamUrl;
-    }
-
 }