Browse Source

替换为OpenFeign服务间调用

chao 3 years ago
parent
commit
17ad12d2fa

+ 5 - 5
pom.xml

@@ -33,7 +33,7 @@
     <dependencies>
         <dependency>
             <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-webflux</artifactId>
+            <artifactId>spring-boot-starter-web</artifactId>
         </dependency>
         <dependency>
             <groupId>org.springframework.cloud</groupId>
@@ -55,10 +55,10 @@
             <groupId>org.springframework.cloud</groupId>
             <artifactId>spring-cloud-starter-loadbalancer</artifactId>
         </dependency>
-<!--        <dependency>-->
-<!--            <groupId>org.springframework.cloud</groupId>-->
-<!--            <artifactId>spring-cloud-starter-openfeign</artifactId>-->
-<!--        </dependency>-->
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-openfeign</artifactId>
+        </dependency>
         <!-- mysql -->
         <dependency>
             <groupId>mysql</groupId>

+ 2 - 1
src/main/java/com/caimei365/order/OrderApplication.java

@@ -8,13 +8,14 @@ import org.springframework.cloud.openfeign.EnableFeignClients;
 /**
  * `@EnableEurekaClient`: 声明一个Eureka客户端,只能注册到Eureka Server
  * `@EnableDiscoveryClient`: 声明一个可以被发现的客户端,可以是其他注册中心
+ * `@EnableFeignClients(basePackages = {"com.caimei365.order.feign"})`:开启feign接口扫描,指定扫描的包
  *
  * @author : Charles
  * @date : 2021/2/22
  */
 @EnableDiscoveryClient
 @SpringBootApplication
-@EnableFeignClients
+@EnableFeignClients(basePackages = {"com.caimei365.order.feign"})
 public class OrderApplication {
 
     public static void main(String[] args) {

+ 1 - 1
src/main/java/com/caimei365/order/controller/OrderClubApi.java

@@ -117,7 +117,7 @@ public class OrderClubApi {
      *
      * @param orderDto {
      *                orderId      订单ID
-     *                note         备注(订单取消原因)
+     *                remark       备注(订单取消原因)
      * }
      */
     @ApiOperation("机构取消订单(旧:/order/cancel)")

+ 36 - 0
src/main/java/com/caimei365/order/feign/ToolsFeign.java

@@ -0,0 +1,36 @@
+package com.caimei365.order.feign;
+
+import com.caimei365.order.model.ResponseJson;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+
+/**
+ * Description
+ *
+ * @author : Charles
+ * @date : 2021/9/8
+ */
+@FeignClient("CAIMEI365-CLOUD-TOOLS")
+public interface ToolsFeign {
+    /**
+     * 请求发短信接口
+     *
+     * @param mobile  手机号
+     * @param content 内容
+     * @return str
+     */
+    @GetMapping("/tools/sms/send")
+    String getSendSms(@RequestParam String mobile, @RequestParam String content);
+
+    /**
+     * 智能获取物流信息
+     *
+     * @param number      快递单号
+     * @param companyCode 快递公司的编码
+     * @param mobile      收/寄件人的电话号码(顺丰必填)
+     * @return str
+     */
+    @GetMapping("/tools/query/logistics")
+    String getLogisticsByNumber(@RequestParam String number, @RequestParam String companyCode, @RequestParam String mobile);
+}

+ 28 - 0
src/main/java/com/caimei365/order/feign/UserFeign.java

@@ -0,0 +1,28 @@
+package com.caimei365.order.feign;
+
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestHeader;
+import org.springframework.web.bind.annotation.RequestParam;
+
+
+/**
+ * Description
+ *
+ * @author : Charles
+ * @date : 2021/9/7
+ */
+@FeignClient("CAIMEI365-CLOUD-USER")
+public interface UserFeign {
+    /**
+     * 微信小程序授权登录(调用user服务,发送服务间调用POST请求)
+     *
+     * @param code          微信code
+     * @param encryptedData 微信加密数据
+     * @param iv            微信加密算法的初始向量
+     * @param referer       HttpHeaders(referer)
+     * @return str
+     */
+    @PostMapping("/user/login/auth/applets")
+    String appletsAuthorization(@RequestParam String code, @RequestParam String encryptedData, @RequestParam String iv, @RequestHeader("Referer") String referer);
+}

+ 3 - 1
src/main/java/com/caimei365/order/service/impl/CartClubServiceImpl.java

@@ -84,6 +84,8 @@ public class CartClubServiceImpl implements CartClubService {
         // 用户身份
         Integer userIdentity = baseMapper.getIdentityByUserId(userId);
         if (null != shopInfoList && shopInfoList.size()>0) {
+            // 删除空数据
+            shopInfoList.removeIf(Objects::isNull);
             // 遍历供应商列表
             shopInfoList.forEach(shop -> {
                 // 默认未选中状态(前端要求)
@@ -262,7 +264,7 @@ public class CartClubServiceImpl implements CartClubService {
                 }
             });
             // 删除空数据
-            shopInfoList.removeIf(shop -> (null == shop || shop.getCount() == 0));
+            shopInfoList.removeIf(shop -> (shop.getCount() == 0));
             // 总促销计算
             totalPromotions.forEach(promotions -> {
                 // 凑单满减

+ 29 - 74
src/main/java/com/caimei365/order/service/impl/RemoteCallServiceImpl.java

@@ -1,24 +1,17 @@
 package com.caimei365.order.service.impl;
 
 import com.alibaba.fastjson.JSONObject;
+import com.caimei365.order.feign.ToolsFeign;
+import com.caimei365.order.feign.UserFeign;
 import com.caimei365.order.mapper.MessagePushMapper;
 import com.caimei365.order.service.RemoteCallService;
 import com.caimei365.order.utils.CodeUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang.StringUtils;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.http.HttpHeaders;
-import org.springframework.http.MediaType;
 import org.springframework.stereotype.Service;
-import org.springframework.util.LinkedMultiValueMap;
-import org.springframework.util.MultiValueMap;
-import org.springframework.web.reactive.function.BodyInserters;
-import org.springframework.web.reactive.function.client.WebClient;
-import reactor.core.publisher.Mono;
-
 import javax.annotation.Resource;
-import java.time.Duration;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.concurrent.atomic.AtomicBoolean;
@@ -27,7 +20,7 @@ import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
 /**
- * 推送服务
+ * 远程调用数据处理
  *
  * @author : Charles
  * @date : 2021/7/15
@@ -39,8 +32,10 @@ public class RemoteCallServiceImpl implements RemoteCallService {
     private String profile;
     @Resource
     private MessagePushMapper messagePushMapper;
-    @Autowired
-    private WebClient.Builder webClientBuilder;
+    @Resource
+    private ToolsFeign toolsFeign;
+    @Resource
+    private UserFeign userFeign;
 
     /**
      * 生成短链接
@@ -63,7 +58,7 @@ public class RemoteCallServiceImpl implements RemoteCallService {
     /**
      * 请求发短信接口
      *
-     * @param markId  短信类型
+     * @param markId  跳转类型
      * @param mobile  手机号
      * @param content 内容
      */
@@ -83,28 +78,14 @@ public class RemoteCallServiceImpl implements RemoteCallService {
                     Pattern pattern = Pattern.compile(regex);
                     Matcher matcher = pattern.matcher(mobile);
                     if (matcher.matches()) {
-                        //提交参数设置
-                        MultiValueMap<String, String> map = new LinkedMultiValueMap<>();
-                        map.add("mobile", mobile);
-                        map.add("content", content);
-                        // 发送服务间调用POST请求
-                        Mono<String> result = webClientBuilder.build()
-                                .post()
-                                .uri("http://CAIMEI365-CLOUD-TOOLS/tools/sms/send")
-                                .contentType(MediaType.APPLICATION_FORM_URLENCODED)
-                                .body(BodyInserters.fromFormData(map))
-                                .retrieve()
-                                .bodyToMono(String.class)
-                                // 10秒超时
-                                .timeout(Duration.ofSeconds(10));
-                        result.subscribe(log::info);
-                        result.subscribe(jsonStr -> {
-                            JSONObject parseObject = JSONObject.parseObject(jsonStr);
-                            if (0 == parseObject.getInteger("code")){
-                                messagePushMapper.updateSmsSendCount(markId, 1);
-                                returnValue.set(true);
-                            }
-                        });
+                        // 调用 ToolsFeign 发送短信
+                        String jsonStr = toolsFeign.getSendSms(mobile, content);
+                        JSONObject parseObject = JSONObject.parseObject(jsonStr);
+                        if (0 == parseObject.getInteger("code")){
+                            // 保存短信发送条数+count
+                            messagePushMapper.updateSmsSendCount(markId, 1);
+                            returnValue.set(true);
+                        }
                     }
                 }
             }
@@ -127,29 +108,17 @@ public class RemoteCallServiceImpl implements RemoteCallService {
         AtomicReference<String> resultData = new AtomicReference<>("");
         // 获取当前微信小程序的环境
         String referer = headers.getFirst("Referer");
-        //提交参数设置
-        MultiValueMap<String, String> map = new LinkedMultiValueMap<>();
-        map.add("code", code);
-        map.add("encryptedData", encryptedData);
-        map.add("iv", iv);
-        // 发送服务间调用POST请求
-        Mono<String> result = webClientBuilder.defaultHeader("Referer", referer).build()
-                .post()
-                .uri("http://CAIMEI365-CLOUD-USER/user/login/auth/applets")
-                .contentType(MediaType.APPLICATION_FORM_URLENCODED)
-                .body(BodyInserters.fromFormData(map))
-                .retrieve()
-                .bodyToMono(String.class)
-                // 10秒超时
-                .timeout(Duration.ofSeconds(10));
-        result.subscribe(log::info);
-        result.subscribe(jsonStr -> {
+        try {
+            // 调用 UserFeign 获取物流
+            String jsonStr = userFeign.appletsAuthorization(code, encryptedData, iv, referer);
             JSONObject parseObject = JSONObject.parseObject(jsonStr);
             if (0 == parseObject.getInteger("code")){
-                // 登录成功
+                // 授权登录成功
                 resultData.set(parseObject.getString("data"));
             }
-        });
+        } catch (Exception e) {
+            log.error("获取微信小程序授权失败:", e);
+        }
         return resultData.get();
     }
 
@@ -163,31 +132,17 @@ public class RemoteCallServiceImpl implements RemoteCallService {
     @Override
     public String getLogisticsByNumber(String number, String companyCode, String mobile) {
         AtomicReference<String> resultData = new AtomicReference<>("");
-        // 请求参数
-        String params = "?number=" + number;
-        if (StringUtils.isNotEmpty(companyCode) && StringUtils.isNotEmpty(mobile)) {
-            params = params + ("&companyCode=" + companyCode + "&mobile=" + mobile);
-        } else if (StringUtils.isNotEmpty(companyCode)) {
-            params = params + ("&companyCode=" + companyCode);
-        } else if (StringUtils.isNotEmpty(mobile)) {
-            params = params + ("&mobile=" + mobile);
-        }
-        // 发送服务间调用GET请求
-        Mono<String> result = webClientBuilder.build()
-                .get()
-                .uri("http://CAIMEI365-CLOUD-TOOLS/tools/query/logistics" + params)
-                .retrieve()
-                .bodyToMono(String.class)
-                // 10秒超时
-                .timeout(Duration.ofSeconds(10));
-        result.subscribe(log::info);
-        result.subscribe(jsonStr -> {
+        try {
+            // 调用 ToolsFeign 获取物流
+            String jsonStr = toolsFeign.getLogisticsByNumber(number, companyCode, mobile);
             JSONObject parseObject = JSONObject.parseObject(jsonStr);
             if (0 == parseObject.getInteger("code")){
                 // 获取物流信息成功
                 resultData.set(parseObject.getString("data"));
             }
-        });
+        } catch (Exception e) {
+            log.error("获取物流信息失败:", e);
+        }
         return resultData.get();
     }
 }