yzc 2 лет назад
Родитель
Сommit
86c445202f
18 измененных файлов с 476 добавлено и 88 удалено
  1. 49 46
      sckw-common/sckw-common-core/src/main/java/com/sckw/core/aspect/DaoAspect.java
  2. 17 0
      sckw-common/sckw-common-core/src/main/java/com/sckw/core/utils/CollectionUtils.java
  3. 1 1
      sckw-common/sckw-common-stream/src/main/java/com/sckw/stream/model/SckwSms.java
  4. 3 0
      sckw-modules/sckw-message/src/main/java/com/sckw/message/MessageApplication.java
  5. 1 2
      sckw-modules/sckw-message/src/main/java/com/sckw/message/controller/SmsController.java
  6. 12 0
      sckw-modules/sckw-message/src/main/java/com/sckw/message/dao/KwmMessageUserMapper.java
  7. 1 1
      sckw-modules/sckw-message/src/main/java/com/sckw/message/service/KwmMessageUserService.java
  8. 10 10
      sckw-modules/sckw-message/src/main/java/com/sckw/message/service/SckwMessageHandlerService.java
  9. 2 0
      sckw-modules/sckw-message/src/main/java/com/sckw/message/service/SckwSmsHandlerService.java
  10. 6 4
      sckw-modules/sckw-message/src/main/java/com/sckw/message/service/SmsService.java
  11. 0 1
      sckw-modules/sckw-message/src/main/resources/bootstrap-dev.yml
  12. 35 0
      sckw-modules/sckw-message/src/main/resources/mapper/KwmMessageUserMapper.xml
  13. 48 7
      sckw-modules/sckw-order/pom.xml
  14. 7 8
      sckw-modules/sckw-order/src/main/java/com/sckw/order/OrderApplication.java
  15. 114 0
      sckw-modules/sckw-order/src/main/resources/bootstrap-dev.yml
  16. 50 7
      sckw-modules/sckw-product/pom.xml
  17. 7 1
      sckw-modules/sckw-product/src/main/java/com/sckw/product/ProductApplication.java
  18. 113 0
      sckw-modules/sckw-product/src/main/resources/bootstrap-dev.yml

+ 49 - 46
sckw-common/sckw-common-core/src/main/java/com/sckw/core/aspect/DaoAspect.java

@@ -3,21 +3,22 @@ package com.sckw.core.aspect;
 import com.sckw.core.model.auth.context.LoginUserHolder;
 import com.sckw.core.model.constant.Global;
 import com.sckw.core.utils.BeanUtils;
+import com.sckw.core.utils.CollectionUtils;
 import com.sckw.core.utils.IdWorker;
-import com.sckw.core.utils.StringUtils;
 import org.aspectj.lang.ProceedingJoinPoint;
 import org.aspectj.lang.annotation.Around;
 import org.aspectj.lang.annotation.Aspect;
 import org.aspectj.lang.annotation.Pointcut;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.stereotype.Component;
-import org.springframework.web.context.request.RequestContextHolder;
-import org.springframework.web.context.request.ServletRequestAttributes;
+
 import java.util.Date;
+import java.util.List;
 import java.util.Objects;
 
 /**
  * DAO切面,插入创建人,创建时间,修改人,修改时间
+ *
  * @author zk
  * @date Oct 29, 2018
  */
@@ -51,20 +52,24 @@ public class DaoAspect {
         }
         HttpServletRequest request = attributes.getRequest();*/
         Object[] objects = point.getArgs();
-        if (objects != null && objects.length > 0) {
+        if (objects != null) {
             for (Object arg : objects) {
-                Long userId = LoginUserHolder.getUserId();
-                String userName = LoginUserHolder.getUserName();
-                if (isProperty(arg, UPDATE_BY) && Objects.isNull(BeanUtils.getProperty(arg, UPDATE_BY)) && userId != null) {
-                    BeanUtils.setProperty(arg, UPDATE_BY, userId);
-                }
-                if (isProperty(arg, UPDATE_TIME) && Objects.isNull(BeanUtils.getProperty(arg, UPDATE_TIME))) {
-                    BeanUtils.setProperty(arg, UPDATE_TIME, new Date());
+                List<Object> objs = CollectionUtils.objectCastList(arg, Object.class);
+                if (CollectionUtils.isEmpty(objs)){
+                    objs.add(arg);
                 }
+                Long userId = LoginUserHolder.getUserId();
+                objs.forEach(obj->{
+                    if (isProperty(obj, UPDATE_BY) && Objects.isNull(BeanUtils.getProperty(obj, UPDATE_BY)) && userId != null) {
+                        BeanUtils.setProperty(obj, UPDATE_BY, userId);
+                    }
+                    if (isProperty(obj, UPDATE_TIME) && Objects.isNull(BeanUtils.getProperty(obj, UPDATE_TIME))) {
+                        BeanUtils.setProperty(obj, UPDATE_TIME, new Date());
+                    }
+                });
             }
         }
-        Object object = point.proceed();
-        return object;
+        return point.proceed();
     }
 
     @Around("daoCreate()")
@@ -75,26 +80,24 @@ public class DaoAspect {
         }
         HttpServletRequest request = attributes.getRequest();*/
         Object[] objects = point.getArgs();
-        if (objects != null && objects.length > 0) {
+        if (objects != null) {
             for (Object arg : objects) {
-                Long userId = LoginUserHolder.getUserId();
+                List<Object> objs = CollectionUtils.objectCastList(arg, Object.class);
+                if (CollectionUtils.isEmpty(objs)){
+                    objs.add(arg);
+                }
                 Date date = new Date();
-                if (userId != null) {
-                    if (isProperty(arg, CREATE_BY) && Objects.isNull(BeanUtils.getProperty(arg, CREATE_BY))) {
-                        BeanUtils.setProperty(arg, CREATE_BY, userId);
+                objs.forEach(obj -> {
+                    Long userId = LoginUserHolder.getUserId();
+                    if (userId == null) {
+                        userId = 1L;
                     }
-                    if (isProperty(arg, UPDATE_BY) && Objects.isNull(BeanUtils.getProperty(arg, UPDATE_BY))) {
-                        BeanUtils.setProperty(arg, UPDATE_BY, userId);
+                    if (isProperty(obj, CREATE_BY) && Objects.isNull(BeanUtils.getProperty(obj, CREATE_BY))) {
+                        BeanUtils.setProperty(obj, CREATE_BY, userId);
                     }
-                } else {
-                    userId = 1L;
-                    if (isProperty(arg, CREATE_BY) && Objects.isNull(BeanUtils.getProperty(arg, CREATE_BY))) {
-                        BeanUtils.setProperty(arg, CREATE_BY, userId);
+                    if (isProperty(obj, UPDATE_BY) && Objects.isNull(BeanUtils.getProperty(obj, UPDATE_BY))) {
+                        BeanUtils.setProperty(obj, UPDATE_BY, userId);
                     }
-                    if (isProperty(arg, UPDATE_BY) && Objects.isNull(BeanUtils.getProperty(arg, UPDATE_BY))) {
-                        BeanUtils.setProperty(arg, UPDATE_BY, userId);
-                    }
-                }
 
 //                if (userName != null){
 //                    if (isProperty(arg, CREATE_BY_NAME) && StringUtils.isBlank(BeanUtils.getProperty(arg, CREATE_BY_NAME))) {
@@ -105,32 +108,32 @@ public class DaoAspect {
 //                    }
 //                }
 
-                if (isProperty(arg, CREATE_TIME) && Objects.isNull(BeanUtils.getProperty(arg, CREATE_TIME))) {
-                    BeanUtils.setProperty(arg, CREATE_TIME, date);
-                }
+                    if (isProperty(obj, CREATE_TIME) && Objects.isNull(BeanUtils.getProperty(obj, CREATE_TIME))) {
+                        BeanUtils.setProperty(obj, CREATE_TIME, date);
+                    }
 
-                if (isProperty(arg, UPDATE_TIME) && Objects.isNull(BeanUtils.getProperty(arg, UPDATE_TIME))) {
-                    BeanUtils.setProperty(arg, UPDATE_TIME, date);
-                }
+                    if (isProperty(obj, UPDATE_TIME) && Objects.isNull(BeanUtils.getProperty(obj, UPDATE_TIME))) {
+                        BeanUtils.setProperty(obj, UPDATE_TIME, date);
+                    }
 
-                if (isProperty(arg, ID) && Objects.isNull(BeanUtils.getProperty(arg, ID))) {
-                    BeanUtils.setProperty(arg, ID, new IdWorker(1).nextId());
-                }
+                    if (isProperty(obj, ID) && Objects.isNull(BeanUtils.getProperty(obj, ID))) {
+                        BeanUtils.setProperty(obj, ID, new IdWorker(1).nextId());
+                    }
 
-                if (isProperty(arg, STATUS) && Objects.isNull(BeanUtils.getProperty(arg, STATUS))) {
-                    BeanUtils.setProperty(arg, STATUS, Global.NO);
-                }
+                    if (isProperty(obj, STATUS) && Objects.isNull(BeanUtils.getProperty(obj, STATUS))) {
+                        BeanUtils.setProperty(obj, STATUS, Global.NO);
+                    }
 
-                if (isProperty(arg, DEL_FLAG) && Objects.isNull((BeanUtils.getProperty(arg, DEL_FLAG)))) {
-                    BeanUtils.setProperty(arg, DEL_FLAG, Global.NO);
-                }
+                    if (isProperty(obj, DEL_FLAG) && Objects.isNull((BeanUtils.getProperty(obj, DEL_FLAG)))) {
+                        BeanUtils.setProperty(obj, DEL_FLAG, Global.NO);
+                    }
+                });
             }
         }
-        Object object = point.proceed();
-        return object;
+        return point.proceed();
     }
 
-    public static boolean isProperty(Object bean, String field){
+    public static boolean isProperty(Object bean, String field) {
         return BeanUtils.isProperty(bean, field);
     }
 }

+ 17 - 0
sckw-common/sckw-common-core/src/main/java/com/sckw/core/utils/CollectionUtils.java

@@ -311,4 +311,21 @@ public class CollectionUtils extends CollectionUtil {
 	  outList = change2(inList, "name", outList);
 	  System.out.println("retList==2==:" + JSONObject.toJSONString(outList));
     }
+    /**
+     * @desc: object转list
+     * @author: yzc
+     * @date: 2023-06-26 15:27
+     * @Param obj:
+     * @Param clazz:
+     * @return: java.util.List<T>
+     */
+    public static <T> List<T> objectCastList(Object obj, Class<T> clazz) {
+        List<T> result = new ArrayList<>();
+        if (obj instanceof List<?>) {
+			for (Object o : (List<?>) obj) {
+				result.add(clazz.cast(o));
+			}
+		}
+		return result;
+    }
 }

+ 1 - 1
sckw-common/sckw-common-stream/src/main/java/com/sckw/stream/model/SckwSms.java

@@ -44,7 +44,7 @@ public class SckwSms {
     /**
      * 创建人
      */
-    private String createBy;
+    private Long createBy;
 
     /**
      * 签名

+ 3 - 0
sckw-modules/sckw-message/src/main/java/com/sckw/message/MessageApplication.java

@@ -7,6 +7,9 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
 import org.springframework.cloud.openfeign.EnableFeignClients;
 
+/**
+ * @author admin
+ */
 @EnableDubbo
 @EnableFeignClients({"com.sckw.*.api.feign"})
 @EnableDiscoveryClient

+ 1 - 2
sckw-modules/sckw-message/src/main/java/com/sckw/message/controller/SmsController.java

@@ -30,8 +30,7 @@ public class SmsController {
      */
     @PostMapping(value = "/sendVerifyCode", produces = MediaType.APPLICATION_JSON_VALUE)
     public HttpResult sendVerifyCode(@Valid @RequestBody SendSmsVerifyCoderReqVO param) {
-        smsService.sendVerifyCode(param);
-        return HttpResult.ok();
+        return smsService.sendVerifyCode(param);
     }
 
 }

+ 12 - 0
sckw-modules/sckw-message/src/main/java/com/sckw/message/dao/KwmMessageUserMapper.java

@@ -3,6 +3,9 @@ package com.sckw.message.dao;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.sckw.message.model.KwmMessageUser;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 /**
  * @desc: 用户消息mapper
@@ -12,4 +15,13 @@ import org.apache.ibatis.annotations.Mapper;
 @Mapper
 public interface KwmMessageUserMapper extends BaseMapper<KwmMessageUser> {
 
+    /**
+     * @desc: 批量插入
+     * @author: yzc
+     * @date: 2023-06-26 12:02
+     * @Param messageUsers:
+     * @return: void
+     */
+    void insertBatch(@Param(value = "list") List<KwmMessageUser> list);
+
 }

+ 1 - 1
sckw-modules/sckw-message/src/main/java/com/sckw/message/service/KwmMessageUserService.java

@@ -89,7 +89,7 @@ public class KwmMessageUserService {
      */
     @Transactional(rollbackFor = Exception.class)
     public void batchSave(List<KwmMessageUser> messageUsers) {
-        messageUsers.forEach(kwmMessageUserMapper::insert);
+        kwmMessageUserMapper.insertBatch(messageUsers);
     }
 
     /**

+ 10 - 10
sckw-modules/sckw-message/src/main/java/com/sckw/message/service/SckwMessageHandlerService.java

@@ -31,14 +31,14 @@ public class SckwMessageHandlerService {
     private final KwmMessageUserService kwmMessageUserService;
 
 
-/**
- * @desc: message消息处理
- * @author: yzc
- * @date: 2023-06-09 15:33
- * @Param sckwMessage:
- * @return: void
- */
-@Transactional(rollbackFor = Exception.class)
+    /**
+     * @desc: message消息处理
+     * @author: yzc
+     * @date: 2023-06-09 15:33
+     * @Param sckwMessage:
+     * @return: void
+     */
+    @Transactional(rollbackFor = Exception.class)
     public void handler(SckwMessage sckwMessage) {
         if (Boolean.FALSE.equals(RedissonUtils.tryLock(getKey(sckwMessage.getRequestId()), 10L, RedisConstant.CONSUMER_REQUEST_VALID_TIME))) {
             log.info("重复message消息:{},不处理", sckwMessage.getRequestId());
@@ -54,16 +54,16 @@ public class SckwMessageHandlerService {
         KwmMessage kwmMessage = KwmMessage.builder().category(messageEnum.getCategory()).type(messageEnum.getType()).title(messageEnum.getTitle())
                 .content(messageEnum.getContent()).clientType(messageEnum.getPushType()).url(sckwMessage.getMsgUrl())
                 .params(JSON.toJSONString(sckwMessage.getParams())).build();
-        kwmMessage.setStatus(0);
         kwmMessage.setCreateBy(sckwMessage.getCreateBy());
+        kwmMessage.setUpdateBy(sckwMessage.getCreateBy());
         Long msgId = kwmMessageService.insert(kwmMessage);
         //多个用户id,构建多个KwmMessageUser对象保存
         List<String> userIdList = Arrays.asList(userIds.split(","));
         List<KwmMessageUser> messageUsers = Lists.newArrayList();
         userIdList.forEach(e -> {
             KwmMessageUser messageUser = KwmMessageUser.builder().userId(Long.valueOf(e)).msgId(msgId).build();
-            messageUser.setStatus(0);
             messageUser.setCreateBy(sckwMessage.getCreateBy());
+            messageUser.setUpdateBy(sckwMessage.getCreateBy());
             messageUsers.add(messageUser);
         });
         kwmMessageUserService.batchSave(messageUsers);

+ 2 - 0
sckw-modules/sckw-message/src/main/java/com/sckw/message/service/SckwSmsHandlerService.java

@@ -47,6 +47,8 @@ public class SckwSmsHandlerService {
         KwmSms kwmSms = KwmSms.builder().type(smsCodeEnum.getType()).code(smsCodeEnum.getName())
                 .telephone(sckwSms.getTelephone()).content(smsCodeEnum.getValue())
                 .params(JSON.toJSONString(sckwSms.getParams())).build();
+        kwmSms.setCreateBy(sckwSms.getCreateBy());
+        kwmSms.setUpdateBy(sckwSms.getCreateBy());
         kwmSmsService.add(kwmSms);
     }
 

+ 6 - 4
sckw-modules/sckw-message/src/main/java/com/sckw/message/service/SmsService.java

@@ -1,8 +1,9 @@
 package com.sckw.message.service;
 
 import com.alibaba.fastjson2.JSON;
-import com.sckw.core.exception.BusinessException;
 import com.sckw.core.utils.NumberUtils;
+import com.sckw.core.web.constant.HttpStatus;
+import com.sckw.core.web.response.HttpResult;
 import com.sckw.message.constant.RedisConstant;
 import com.sckw.message.model.vo.req.SendSmsVerifyCoderReqVO;
 import com.sckw.redis.utils.RedissonUtils;
@@ -33,14 +34,14 @@ public class SmsService {
      * @author: yzc
      * @date: 2023-06-13 13:43
      * @param param
-     * @return void
+     * @return com.sckw.core.web.response.HttpResult
      */
-    public void sendVerifyCode(SendSmsVerifyCoderReqVO param) {
+    public HttpResult sendVerifyCode(SendSmsVerifyCoderReqVO param) {
         String phone = param.getPhone();
         // 防重攻击
         String messageSmsVerifyCodeKey = getMessageSmsVerifyCodeKey(phone);
         if (Boolean.TRUE.equals(RedissonUtils.exists(messageSmsVerifyCodeKey))) {
-            throw new BusinessException("请勿频繁获取短信验证码");
+            return HttpResult.error(HttpStatus.GLOBAL_EXCEPTION_CODE, "请勿频繁获取短信验证码");
         }
         SckwSms sckwSms = new SckwSms();
         sckwSms.setTelephone(param.getPhone());
@@ -49,6 +50,7 @@ public class SmsService {
         params.put("code", NumberUtils.createRandomVcode());
         sckwSms.setParams(params);
         streamBridge.send("sckw-sms", JSON.toJSONString(sckwSms));
+        return HttpResult.ok();
     }
 
     private String getMessageSmsVerifyCodeKey(String phone) {

+ 0 - 1
sckw-modules/sckw-message/src/main/resources/bootstrap-dev.yml

@@ -133,4 +133,3 @@ dubbo:
     #use-as-config-center: false
     #use-as-metadata-center: false
 
-links:

+ 35 - 0
sckw-modules/sckw-message/src/main/resources/mapper/KwmMessageUserMapper.xml

@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.sckw.message.dao.KwmMessageUserMapper">
+
+    <insert id="insertBatch">
+        insert into kwm_message_user
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            id,
+            msg_id,
+            user_id,
+            remark,
+            status,
+            create_by,
+            create_time,
+            update_by,
+            update_time,
+            del_flag
+        </trim>
+        values
+        <foreach collection="list" item="item" separator=",">
+            <trim prefix="(" suffix=")" suffixOverrides=",">
+                #{item.id,jdbcType=BIGINT},
+                #{item.msgId,jdbcType=BIGINT},
+                #{item.userId,jdbcType=VARCHAR},
+                #{item.remark,jdbcType=VARCHAR},
+                #{item.status,jdbcType=INTEGER},
+                #{item.createBy,jdbcType=BIGINT},
+                #{item.createTime,jdbcType=TIMESTAMP},
+                #{item.updateBy,jdbcType=BIGINT},
+                #{item.updateTime,jdbcType=TIMESTAMP},
+                #{item.delFlag,jdbcType=INTEGER}
+            </trim>
+        </foreach>
+    </insert>
+</mapper>

+ 48 - 7
sckw-modules/sckw-order/pom.xml

@@ -9,10 +9,7 @@
         <version>1.0.0</version>
     </parent>
 
-    <groupId>com.sckw</groupId>
     <artifactId>sckw-order</artifactId>
-    <version>1.0.0</version>
-    <description>订单服务</description>
 
     <properties>
         <maven.compiler.source>17</maven.compiler.source>
@@ -24,17 +21,61 @@
         <dependency>
             <groupId>com.sckw</groupId>
             <artifactId>sckw-common-core</artifactId>
-            <version>1.0.0</version>
         </dependency>
         <dependency>
             <groupId>com.sckw</groupId>
             <artifactId>sckw-common-datasource</artifactId>
-            <version>1.0.0</version>
         </dependency>
+
+        <dependency>
+            <groupId>com.sckw</groupId>
+            <artifactId>sckw-common-remote</artifactId>
+        </dependency>
+
         <dependency>
             <groupId>com.sckw</groupId>
-            <artifactId>sckw-common-redis</artifactId>
-            <version>1.0.0</version>
+            <artifactId>sckw-common-stream</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.sckw</groupId>
+            <artifactId>sckw-common-seata</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.sckw</groupId>
+            <artifactId>sckw-common-sentinel</artifactId>
+        </dependency>
+
+        <!--web-->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-loadbalancer</artifactId>
+        </dependency>
+
+        <!--注册中心客户端-->
+        <dependency>
+            <groupId>com.alibaba.cloud</groupId>
+            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
+        </dependency>
+        <!--配置中心客户端-->
+        <dependency>
+            <groupId>com.alibaba.cloud</groupId>
+            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-bootstrap</artifactId>
         </dependency>
     </dependencies>
 

+ 7 - 8
sckw-modules/sckw-order/src/main/java/com/sckw/order/OrderApplication.java

@@ -1,26 +1,25 @@
 package com.sckw.order;
 
 
+import io.seata.spring.annotation.datasource.EnableAutoDataSourceProxy;
+import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
+
 /**
  * @desc: 订单服务
  * @author: yzc
  * @date: 2023-06-21 11:46
  */
+@EnableDubbo
 @EnableDiscoveryClient
-@SpringBootApplication(scanBasePackages = {"com.sckw.core", "com.sckw.order"})
+@EnableAutoDataSourceProxy
+@SpringBootApplication
 public class OrderApplication {
 
     public static void main(String[] args) {
-        // 关闭nacos日志
-        System.setProperty("nacos.logging.default.config.enabled", "false");
-        try {
-            SpringApplication.run(OrderApplication.class, args);
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
+        SpringApplication.run(OrderApplication.class, args);
     }
 
 }

+ 114 - 0
sckw-modules/sckw-order/src/main/resources/bootstrap-dev.yml

@@ -18,6 +18,120 @@ spring:
         # 共享配置
         group: sckw-service-platform
 
+# seata-sentinel读取的nacos配置
+lfdc:
+  nacos:
+    server-addr: 10.10.10.230:8848
+    namespace: sckw-service-platform-dev
+    group: sckw-service-platform
+
+  data:
+    # sentinel降级配置
+    sentinel:
+      transport:
+        client-ip: ${spring.cloud.client.ip-address} # 获取本机IP地址
+        port: 8719  #默认8719端口,如果被占用会向上扫描。
+        #控制台地址
+        dashboard: 10.10.10.230:19527
+      log:
+        #日志路径
+        dir: logs/sentinel
+        # 默认将调用链路收敛,导致链路流控效果无效
+        web-context-unify: false
+        #持久化nacos配置中
+      datasource:
+        #sentinel-rule: 唯一名称可自定义
+        #限流
+        flow:
+          nacos:
+            # 设置Nacos的连接地址、命名空间和Group ID
+            #            namespace:  sckw-service-platform-dev
+            #            server-addr:  ${spring.cloud.nacos.discovery.server-addr}
+            server-addr: ${lfdc.nacos.server-addr}
+            namespace: ${lfdc.nacos.namespace}
+            # 设置Nacos中配置文件的命名规则
+            #            data-id:  ${spring.application.name}-sentinel-flow-rules
+            data-id:  sckw-order-sentinel-flow-rules
+            group-id: SENTINEL_GROUP
+            data-type: json
+            # 必填的重要字段,指定当前规则类型是"限流"
+            rule-type: flow
+        #熔断
+        degrade:
+          nacos:
+            #            namespace:  sckw-service-platform-dev
+            #            server-addr: ${spring.cloud.nacos.discovery.server-addr}
+            server-addr: ${lfdc.nacos.server-addr}
+            namespace: ${lfdc.nacos.namespace}
+            #data-id: ${spring.application.name}-sentinel-degrade-rules
+            data-id: sckw-order-sentinel-degrade-rules
+            group-id: SENTINEL_GROUP
+            #熔断
+            rule-type: degrade
+      #取消慢加载
+      eager: true
+  datasource:
+    dynamic:
+      seata: true
+  main:
+    allow-circular-references: true
+
+
+seata:
+  # seata 服务分组,要与服务端nacos-config.txt中service.vgroup_mapping的后缀对应
+  # 事务分组名称,要和服务端对应
+  tx-service-group: order-seata-service-group
+  service:
+    vgroup-mapping:
+      # key是事务分组名称 value要和服务端的机房名称保持一致
+      order-seata-service-group: default
+  registry:
+    # 指定nacos作为注册中心
+    type: nacos
+    nacos:
+      #group: SEATA_GROUP为默认分组
+      server-addr: ${lfdc.nacos.server-addr}
+      namespace: ${lfdc.nacos.namespace}
+      group: ${lfdc.nacos.group}
+  config:
+    # 指定nacos作为配置中心
+    type: nacos
+    nacos:
+      #      server-addr: ${spring.cloud.nacos.discovery.server-addr}
+      #      namespace: ${spring.cloud.nacos.discovery.namespace}
+      #      group: ${spring.cloud.nacos.discovery.group}
+      server-addr: ${lfdc.nacos.server-addr}
+      namespace: ${lfdc.nacos.namespace}
+      group: ${lfdc.nacos.group}
+  application-id: ${spring.application.name}
+  #  当前不生效,使用驼峰
+  enabled: true
+  #  enable-auto-data-source-proxy: false
+  enableAutoDataSourceProxy: false
+# 支持feign对sentinel支持
+#feign:
+#  sentinel:
+#    enabled: true
+
+# dubbo
+dubbo:
+  application:
+    # 此处没有延用spring.application.name是因为当前项目本身也会注册到nacos中,如果dubbo也延用相同的名称,在nacos服务里会看到注册的producer-server服务数为2
+    name: order-dubbo-server
+    parameters:
+      group: ${spring.cloud.nacos.discovery.group}
+      namespace: ${spring.cloud.nacos.discovery.namespace}
+  protocol:
+    name: dubbo
+    port: -1
+  registry:
+    # 配置dubbo的注册中心为nacos
+    address: nacos://${spring.cloud.nacos.discovery.server-addr}
+    group: ${spring.cloud.nacos.discovery.group}
+    namespace: ${spring.cloud.nacos.discovery.namespace}
+    protocol: nacos
+    #use-as-config-center: false
+    #use-as-metadata-center: false
 
 
 

+ 50 - 7
sckw-modules/sckw-product/pom.xml

@@ -8,10 +8,8 @@
         <artifactId>sckw-modules</artifactId>
         <version>1.0.0</version>
     </parent>
-    <groupId>com.sckw</groupId>
+
     <artifactId>sckw-product</artifactId>
-    <version>1.0.0</version>
-    <description>产品服务</description>
 
     <properties>
         <maven.compiler.source>17</maven.compiler.source>
@@ -23,17 +21,62 @@
         <dependency>
             <groupId>com.sckw</groupId>
             <artifactId>sckw-common-core</artifactId>
-            <version>1.0.0</version>
         </dependency>
+
         <dependency>
             <groupId>com.sckw</groupId>
             <artifactId>sckw-common-datasource</artifactId>
-            <version>1.0.0</version>
         </dependency>
+
+        <dependency>
+            <groupId>com.sckw</groupId>
+            <artifactId>sckw-common-stream</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.sckw</groupId>
+            <artifactId>sckw-common-remote</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.sckw</groupId>
+            <artifactId>sckw-common-seata</artifactId>
+        </dependency>
+
         <dependency>
             <groupId>com.sckw</groupId>
-            <artifactId>sckw-common-redis</artifactId>
-            <version>1.0.0</version>
+            <artifactId>sckw-common-sentinel</artifactId>
+        </dependency>
+
+        <!--web-->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-loadbalancer</artifactId>
+        </dependency>
+
+        <!--注册中心客户端-->
+        <dependency>
+            <groupId>com.alibaba.cloud</groupId>
+            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
+        </dependency>
+        <!--配置中心客户端-->
+        <dependency>
+            <groupId>com.alibaba.cloud</groupId>
+            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-bootstrap</artifactId>
         </dependency>
     </dependencies>
 

+ 7 - 1
sckw-modules/sckw-product/src/main/java/com/sckw/product/ProductApplication.java

@@ -1,16 +1,22 @@
 package com.sckw.product;
 
 
+import io.seata.spring.annotation.datasource.EnableAutoDataSourceProxy;
+import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
+import org.springframework.cloud.openfeign.EnableFeignClients;
+
 /**
  * @desc: 产品服务
  * @author: yzc
  * @date: 2023-06-21 11:46
  */
+@EnableDubbo
 @EnableDiscoveryClient
-@SpringBootApplication(scanBasePackages = {"com.sckw.core", "com.sckw.product"})
+@EnableAutoDataSourceProxy
+@SpringBootApplication
 public class ProductApplication {
 
     public static void main(String[] args) {

+ 113 - 0
sckw-modules/sckw-product/src/main/resources/bootstrap-dev.yml

@@ -18,6 +18,119 @@ spring:
         # 共享配置
         group: sckw-service-platform
 
+# seata-sentinel读取的nacos配置
+lfdc:
+  nacos:
+    server-addr: 10.10.10.230:8848
+    namespace: sckw-service-platform-dev
+    group: sckw-service-platform
 
+  data:
+    # sentinel降级配置
+    sentinel:
+      transport:
+        client-ip: ${spring.cloud.client.ip-address} # 获取本机IP地址
+        port: 8719  #默认8719端口,如果被占用会向上扫描。
+        #控制台地址
+        dashboard: 10.10.10.230:19527
+      log:
+        #日志路径
+        dir: logs/sentinel
+        # 默认将调用链路收敛,导致链路流控效果无效
+        web-context-unify: false
+        #持久化nacos配置中
+      datasource:
+        #sentinel-rule: 唯一名称可自定义
+        #限流
+        flow:
+          nacos:
+            # 设置Nacos的连接地址、命名空间和Group ID
+            #            namespace:  sckw-service-platform-dev
+            #            server-addr:  ${spring.cloud.nacos.discovery.server-addr}
+            server-addr: ${lfdc.nacos.server-addr}
+            namespace: ${lfdc.nacos.namespace}
+            # 设置Nacos中配置文件的命名规则
+            #            data-id:  ${spring.application.name}-sentinel-flow-rules
+            data-id:  sckw-product-sentinel-flow-rules
+            group-id: SENTINEL_GROUP
+            data-type: json
+            # 必填的重要字段,指定当前规则类型是"限流"
+            rule-type: flow
+        #熔断
+        degrade:
+          nacos:
+            #            namespace:  sckw-service-platform-dev
+            #            server-addr: ${spring.cloud.nacos.discovery.server-addr}
+            server-addr: ${lfdc.nacos.server-addr}
+            namespace: ${lfdc.nacos.namespace}
+            #data-id: ${spring.application.name}-sentinel-degrade-rules
+            data-id: sckw-product-sentinel-degrade-rules
+            group-id: SENTINEL_GROUP
+            #熔断
+            rule-type: degrade
+      #取消慢加载
+      eager: true
+  datasource:
+    dynamic:
+      seata: true
+  main:
+    allow-circular-references: true
+
+
+seata:
+  # seata 服务分组,要与服务端nacos-config.txt中service.vgroup_mapping的后缀对应
+  # 事务分组名称,要和服务端对应
+  tx-service-group: product-seata-service-group
+  service:
+    vgroup-mapping:
+      # key是事务分组名称 value要和服务端的机房名称保持一致
+      product-seata-service-group: default
+  registry:
+    # 指定nacos作为注册中心
+    type: nacos
+    nacos:
+      #group: SEATA_GROUP为默认分组
+      server-addr: ${lfdc.nacos.server-addr}
+      namespace: ${lfdc.nacos.namespace}
+      group: ${lfdc.nacos.group}
+  config:
+    # 指定nacos作为配置中心
+    type: nacos
+    nacos:
+      #      server-addr: ${spring.cloud.nacos.discovery.server-addr}
+      #      namespace: ${spring.cloud.nacos.discovery.namespace}
+      #      group: ${spring.cloud.nacos.discovery.group}
+      server-addr: ${lfdc.nacos.server-addr}
+      namespace: ${lfdc.nacos.namespace}
+      group: ${lfdc.nacos.group}
+  application-id: ${spring.application.name}
+  #  当前不生效,使用驼峰
+  enabled: true
+  #  enable-auto-data-source-proxy: false
+  enableAutoDataSourceProxy: false
+# 支持feign对sentinel支持
+#feign:
+#  sentinel:
+#    enabled: true
+
+# dubbo
+dubbo:
+  application:
+    # 此处没有延用spring.application.name是因为当前项目本身也会注册到nacos中,如果dubbo也延用相同的名称,在nacos服务里会看到注册的producer-server服务数为2
+    name: product-dubbo-server
+    parameters:
+      group: ${spring.cloud.nacos.discovery.group}
+      namespace: ${spring.cloud.nacos.discovery.namespace}
+  protocol:
+    name: dubbo
+    port: -1
+  registry:
+    # 配置dubbo的注册中心为nacos
+    address: nacos://${spring.cloud.nacos.discovery.server-addr}
+    group: ${spring.cloud.nacos.discovery.group}
+    namespace: ${spring.cloud.nacos.discovery.namespace}
+    protocol: nacos
+    #use-as-config-center: false
+    #use-as-metadata-center: false