实名认证

分布式事务

@Transactional注解 对ap_user_realname ap_user的操作会回滚
而基于远程调用的article服务和wemedia服务 不会回滚
这时传统的数据库事务无法解决,需要用到分布式事务的解决方案
seata时2019年阿里巴巴开源的分布式事务解决方案 (一站式的分布式解决方案)
用docker部署seata,nacos作为seata的注册和配置中心,方便以后的高可用和统一的配置管理

  • 修改seataTC配置

    1. # 进入到挂载目录
    2. cd /var/lib/docker/volumes/seata-config/_data
    3. # 修改注册中心配置
    4. vi registry.conf
    5. # 配置中的内容
    6. registry {
    7. # tc服务的注册中心类,这里选择nacos,也可以是eureka、zookeeper等
    8. type = "nacos"
    9. nacos {
    10. # seata tc 服务注册到 nacos的服务名称,可以自定义 spring.application.name
    11. application = "seata-tc-server"
    12. serverAddr = "192.168.200.130:8848"
    13. group = "SEATA_GROUP"
    14. namespace = "seata"
    15. cluster = "SH"
    16. username = "nacos"
    17. password = "nacos"
    18. }
    19. }
    20. config {
    21. # 读取tc服务端的配置文件的方式,这里是从nacos配置中心读取,这样如果tc是集群,可以共享配置
    22. type = "nacos"
    23. # 配置nacos地址等信息
    24. nacos {
    25. serverAddr = "192.168.200.130:8848"
    26. namespace = "seata"
    27. group = "SEATA_GROUP"
    28. username = "nacos"
    29. password = "nacos"
    30. dataId = "seataServer.properties"
    31. }
    32. }
  • 微服务配置seata

    #创建seata共享配置
    #在配置中心nacos 的 dev 环境中 创建share-seata.yml
    seata:
    registry: # TC服务注册中心的配置,微服务根据这些信息去注册中心获取tc服务地址
      # 参考tc服务自己的registry.conf中的配置
      type: nacos
      nacos: # tc
        server-addr: ${spring.profiles.ip}:8848
        namespace: "seata"
        group: SEATA_GROUP
        application: seata-tc-server # tc服务在nacos中的服务名称
    tx-service-group: seata-demo # 事务组,根据这个获取tc服务的cluster名称
    service:
      vgroup-mapping: # 事务组与TC服务cluster的映射关系
        seata-demo: SH
    
  • 引入依赖

    <dependencies>
          <!--seata-->
          <dependency>
              <groupId>com.alibaba.cloud</groupId>
              <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
              <exclusions>
                  <!--版本较低,1.3.0,因此排除-->
                  <exclusion>
                      <artifactId>seata-spring-boot-starter</artifactId>
                      <groupId>io.seata</groupId>
                  </exclusion>
              </exclusions>
          </dependency>
          <dependency>
              <groupId>io.seata</groupId>
              <artifactId>seata-spring-boot-starter</artifactId>
              <!--seata starter 采用1.4.2版本-->
              <version>${seata.version}</version>
          </dependency>
      </dependencies>
    
  • 修改bootstrap.yml配置

    #以 leadnews-user服务为例  其它一样
    spring:
    application:
      name: leadnews-user # 服务名称
    profiles:
      active: dev # 开发环境配置
      ip: 192.168.200.130  # 环境ip地址
    cloud:
      nacos:
        discovery: # 注册中心地址配置
          server-addr: ${spring.profiles.ip}:8848
          namespace: ${spring.profiles.active}
        config: # 配置中心地址配置
          server-addr: ${spring.profiles.ip}:8848
          namespace: ${spring.profiles.active}
          file-extension: yml # data-id 后缀
          name: ${spring.application.name} # data-id名称
          shared-configs: # 共享配置
            - data-id: share-feign.yml # 配置文件名-Data Id
              group: DEFAULT_GROUP   # 默认为DEFAULT_GROUP
              refresh: false   # 是否动态刷新,默认为false
            - data-id: share-seata.yml # 配置文件名-Data Id
              group: DEFAULT_GROUP   # 默认为DEFAULT_GROUP
              refresh: false   # 是否动态刷新,默认为fals
    
  • 加上seata提供的全局事务管理注解 @GlobalTransactional 注解, 开启全局事务

    云存储解决方案

    阿里云对象存储服务(Object Storage Service,简称OSS)为您提供基于网络的数据存取服务。
    阿里云OSS将数据文件以对象(object)的形式上传到存储空间(bucket)中。

  • 开通OSS

  • 创建存储空间
  • 创建文件目录

    OSS starter工具封装

    heima-leadnews-basic 模块,在当前模块下创建 heima-file-spring-boot-starter子模块,
    添加依赖

    <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-autoconfigure</artifactId>
    </dependency>
    <!--OSS-->
    <dependency>
      <groupId>com.aliyun.oss</groupId>
      <artifactId>aliyun-sdk-oss</artifactId>
      <version>3.10.2</version>
    </dependency>
    <dependency>
      <groupId>com.google.guava</groupId>
      <artifactId>guava</artifactId>
           <version>21.0</version>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-configuration-processor</artifactId>
      <optional>true</optional>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    </dependencies>
    

    创建包com.heima.file
    资料文件夹下导入 service和 config包下的内容:
    结构如下:
    image.png
    在resources目录下新建 META-INF/spring.factories 配置文件

    org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
    com.heima.file.service.impl.OSSAliyunFileStorageService
    

    wemedia-service 添加OSS配置

          <dependency>
              <artifactId>heima-file-spring-boot-starter</artifactId>
              <groupId>com.heima</groupId>
              <version>1.0-SNAPSHOT</version>
          </dependency>
    

    配置中心nacos添加 share-file.yml 共享配置

    #OSS配置
    file:
    oss:
      bucket-name: <替换成自己的>
      access-key-id: <替换成自己的> 
      access-key-secret: <替换成自己的>
      endpoint: oss-cn-shanghai.aliyuncs.com
      web-site: <替换成自己的>
      proxy-username: aliyun-sdk-java
      socket-timeout: 10000
      idle-connection-time: 10000
      connection-request-timeout: 4000
      max-connections: 2048
      max-error-retry: 5
      white-list: 127.0.0.1
      connection-timeout: 10000
      prefix: material
    

    bucket就是我们刚刚申请的,在它的概览页面 有对应的外网访问地址前缀,贴到配置中 记得加上http://开头 和 斜杠结尾哦
    image.png
    bootstrap.yml新增共享配置

    spring:
    cloud:
      nacos:
        config: # 配置中心地址配置
          shared-configs: # 共享配置
            - data-id: share-file.yml # 配置文件名-Data Id
              group: DEFAULT_GROUP   # 默认为DEFAULT_GROUP
              refresh: false   # 是否动态刷新,默认为false
    

    自媒体用户登录 (wm_user)

    • 在网关里定义一个全局过滤器必须携带token才能进入(白名单列外),token有没有过期等

      • 校验参数,判断name在数据库有没有
      • password使用工具类进行加密(加密方式是(password+盐)用MD5进行加密),然后判断password加密后的跟数据库对比
      • 如果一致颁发token

        自媒体网关和获取登录用户

        1. 上传图片需要携带token
        2. 首先请求到网关服务,解析token是否有效,如果有效,解析后把用户数据设置到下一级请求的header中
        3. 在自媒体微服务中使用过滤器解析header中的数据,拿到用户数据,使用threadlocal设置到当前线程中
        4. 在具体业务代码中可以从当前线程threadlocal中获取用户

          素材管理(wm_material)

      • 图片上传

        • 参数校验,检查用户是否登录
        • 解析图片是否是正确格式(jpg,jpeg,png,gif结尾)
        • 给图片拼接一个新的名字(怕名字重复吧之前的图片覆盖)存放到数据库和oss中
      • 素材列表加载
        • 参数校验,检查用户是否登录,分页校验
        • 根据传过来的参进行分页查询
        • 判断是否收藏如果收藏根据收藏查询降序
        • 把图片url都加上webSite然后存到结果中
        • 响应封装参数
      • 图片删除
        • 参数校验,检查用户是否登录
        • 判断图片如果当前图片被引用,则不能删除(拿图片的名称去wm_news表中去查询图片字段(count)如果count>0那么就是被引用了)
        • 删除id
        • 返回参数
      • 收藏与取消图片
        • 参数校验,检查用户是否登录
        • 检查是否是收藏着收藏或取消收藏
        • 修改状态字段进行修改
        • 返回参数