SSO单点登录

微服务和session存储的问题

  • session工作机制:用户登录验证后服务器生成相关session,返回客户端特定的sessionId,即Cookies,下次客户端携带Cookies进行访问即可免登录
  • 使用session的问题:跨服务器无法共享本地内存中存储的session
  • 解决方案:使用redis缓存服务器进行存储session,由redis对session进行管理
  • 缺点:redis需要大量存储空间

JWT

  • JWT工作机制,服务器不对用户信息进行保存,返回加密且携带用户信息的JWT,用户自己携带JWT即Token,二次登录时前端LocalStorey发送请求时放入请求头提交Token,后端过滤器会先对JWT进行解析,解析完成后整个项目就知道了该用户的权限状态,后续service和controller即可提供springsecurityApi查询该用户权限

MQ消息队列

  • 解耦:解耦生产者和消费者的过耦合- 功能:解耦生产者和消费者的过耦合
    远端调用:生产者调用的函数方法里面包含消费者服务器的相干信息,消费者频繁切换造成生产者代码频繁修改,MQ服务器作为中间人解耦两者关系,接收生产者群发消费者
  • 消峰:把请求放入MQ消息服务器,避免高并发打垮数据库
  • 异步调用
    发送消息后不等待远端调用返回,直接继续进行自己的代码

Rabbitmq消息收发的六种模式

  • 队列参数详解
    //连接
    ConnectionFactory f = new ConnectionFactory();
    f.setHost("192.168.64.140");
    f.setPort(5672);
    f.setUsername("guest");
    f.setPassword("guest");
    Channel c = f.newConnection().createChannel();
    //创建队列 helloworld
    名称 是否持久化消息队列到内存 是否独占消息通道 其他配置(map类型)
    c.queueDeclare("helloworld",false,false,false,null);

  • 快速启动 rabbitmq -r start

简单模式

  • 工作原理轮询,每次分配一个消息
  • 缺点,当一个消费者服务器繁忙时依旧会分配任务而不是分配给空闲消费者

工作模式

  • 多消费者默认是轮询
  • 工作原理:空闲优先,设置为手动确认模型,然后自定义一次性最多分配到多少个消息,rabbitmq会自动分配给空闲服务器,对于没有空闲服务器的情况下rabbitmq会停止分配消息
  • 缺点,没有持久化消息队列任意导致消息队列的消息在rabbitmq宕机或重启时丢失。

交换机群发模式

  • 消费者上线要自带消息队列 消费者可以设置关键词进行过滤
    1. 不使用独享队列/交换机默认简单模式和工作模式都是轮询要使用交换解决群发,广播的问题
    2. 因为消费者可能随时离开所以用的是非持久化随机队列 名称随机

RPC远程调用

商城实战rabbitmq

  1. 添加pom 配置yml 自动化生成队列
  2. 去除原有的SQL存储操作
  3. 同1
  4. 创建一个制动注入的监听类用于监听,里面写监听方法并自动存入消息,调用service服务
  5. serviceImpl服务取出存入队列的数据。进行数据存储操作

https://gitcode.net/weixin_38305440/jsd2209/-/tree/master/project/rabbitmq/src/main/java/m1
https://gitcode.net/weixin_38305440/jsd2208/-/blob/master/%E7%AC%94%E8%AE%B0/Rabbitmq.md

从零开始创建微服务项目(非教程向)

创建父级Maven项目

    • spring boot版本
    • 配置相关依赖
      小心:配置了子类一定会用,隐式的,子类无需二次配置
    • 配置版本锁
      配置了子类不一样会用

      创建子类Modle项目

    • 父子互关联
      改parent那行为父类的自己说明
    • 同级相关
      调用方添加依赖即可
    • 删除test和其他不用模块比如启动器和静态资源

创建错误类

    • 枚举错误类
      单纯枚举类 加个标准的getter
    • Josn返回结果类
      只是一个自定义的简单类,实例化时赋值变量message和status
      真实的josn格式是靠mvc框架实现的
    • 自定义运行时错误类
      单纯继承了runtimeException
      有message和code参数
      message用于调用父类的构造函数时赋值message变量
      errorCode单纯是给自定义的errorCode变量赋值
    • exception全局错误处理器类
      @ExceptionHandler通过这个标签配置要主动捕获的异常类 然后没什么特别的
      就和普通的handler方法一样,只不过把业务的调用换成了错误的打印
      把成功的Josn静态方法换成了失败的Josn静态方法 返回的都是josn对象

配置yml

    • 服务器相关:端口
    • mybatis相关:驼峰 二缓
    • knife4j API文档:
    • spring: 配置文件启用

配置dev yml

    • 生产者业务modle需要额外配置mysql数据库连接、 nacos、 生产者还需要Dubbo

配置pom

    • 业务生产者

创建config文件

    • knife4j默认配置cv
    • 同级Modle扫包配置

创建service层

    • 接口:@事务标签
    • impl实现类:@service标签 @Slf4j日志标签

创建controller层

    • 类:@restController @Slf4j日志标签 @RequestMapping全局路径设置 @Api文档名称
    • 方法API文档三剑客 @ApiOperation@ApiOperationSupport@ApiImplicitParam + 请求post/get

配置nacos相关

    • 当然你需要添加依赖

      com.alibaba.cloud
      spring-cloud-starter-alibaba-nacos-discovery
    • 而且需要yml配置
      spring:
      application:
      name: nacos-business # 定义当前服务名称
      cloud:
      nacos:
      discovery:
      server-addr: localhost:8848 # 指定正在运行的Nacos服务器的位置
      sentinel:
      transport:
      dashboard: localhost:8080 # Sentinel仪表台的ip:端口
      port: 8722 # 是localhost的8722 这个端口真正参与当前项目的限流措施

cart业务开发:

    • 其他内容:pom父子相认/添加依赖,修改yml配置文件 参考上文
    • 例外: 作为cart业务 必须要pom添加mybatis依赖和配置config文件 注意扫包路径的修改
      knif4j api文档:调整业务handler扫包路径 非常重要!
      knif4j api文档: 次要 主机名 组名 描述 简介
      mybatis :mapper包的扫描路径
    • 业务三层: mapper持久层, service服务层, handler业务层 本地test文档test略过
    • 错误:
      未开启nacos将导致knife4j api无法启动 空指针异常

Dubbo

  • 快速上手
    1. 消费者想要调用生产者的功能模块或者方法就需要提前引入这个方法和模块
    2. 默认的pom依赖引入将会导入大量不必要文件
    3. 将生产者拆分为父类下的俩个小modle,一个只包含接口的service modle和一个包含其他功能的webapi modle,service model的pom最小依赖只包含common类因为接口有传入类型
    4. api modle:pom 剪切父类依赖后额外添加dubbo依赖/service modle依赖(逻辑接口),yml配置dubbo配置,
    5. 复制父类文件,修改config mapperConfig/knife4jConfig 1. 配置文件
    6. 去除父类src,test,target
    7. IMPL添加DubboService标签(激活方法到nacos),生产者启动类添加@EnableDubbo,
    8. 启用RPC服务@DubboReferance 自动注入

seata 事务回滚

  • 原理
    1. seata 有TL,带有GlobalTransactional标签方法启动时TL会自动把与之相关的全部数据库操作添加到一个组中,由RL收集各个模块数据库处理结果,若全成功RL通知所有模块提交数据库,若失败就全部按照各种的undolog表回滚。
  • 快速上手
    1. 生产者消费者pom均添加依赖 seata及其seata依赖 config文件配置seata
    2. 生产者不要添加seata的子依赖否则数据库配置找不到报错
    3. 生产者事务发起点impl方法添加@GlobalTransactional 启动事务一致性

Sentiel 限流

  • 快速上手
    1. pom+yml+impl方法上写标签@SentinelResource
    2. 消费者运行服务(注册)后才能被sentiel服务发现,(重要)才能在sentielweb 网页控制设置
    3. @SentinelResource标签需要配置限流的错误方法名,类需要新增错误方法

网关

  • 解释
    1. 安全性,过滤器更安全
    2. 负载均衡,自动分配服务
  • 快速上手
    1. 配置gate 项目 pom + yml 即可
    2. uri 不是 url!
    3. 重启gateway项目
    4. 自动设置代理和主动设置代理url

elasticsearch搜索引擎

  • 解释
    1. 关系型数据库的常规索引不能快速进行模糊查询,使用elasticsearch的倒序分词索引进行查询比较快
  • 快速上手
    1. 无需pom yml
    2. 配置ik中文分词插件
    3. 这玩意没有数据库表取而代之的是数据段?

SpringData

  • 解释
    1. elasticsearch添加数据非常麻烦需要通过Socket套接字,之前是借助tmocat实现的
    2. 借助SpringData可以快速实现批量写入读取elasticsearch的数据
  • 快速上手
    1. 配置pom依赖 和yml
    2. 和普通业务一样也是需要service接口及标准类的pojo。
    3. 不需要impl实现类。
    4. 接口类需要继承ElasticsearchRepository<Item,Long>接口,无需添加额外方法父类即可拥有有常用的elasticsearch服务代码 单写读 多写读

快捷键合集

  • shift + F6 重命名
  • shift + alt + ctrl + c 复制包名
  • ctrl + alt + s 搜索快捷面板
  • inspection + UID = 序列化自定义uuid alt + enter = 插入序列化uuid
  • cmd 文件开头字母 + tab = 快速补全

经验

  • commons是必不可少的,因为错误类,commons也有不少依赖
  • 除了service几乎所有类都有knife4j api依赖
  • 除了service几乎所有类都有nacos/dubbo 来注册服务和远程调用
  • service是依赖最少的
  • 父类容易写掉版本文件只有property文件
  • ym文件没有配置但添加了pom依赖会造成大量warning knife4j一个error
  • mybatis pom添加依赖后是需要进行数据库连接的
  • 应当删除webapi的test

csmall项目相关

迁移jwt认证模块

  • pom依赖 jjwt fastjson security
  • 错误处理:serviceCode 码
  • 错误处理:globalHander
  • loginPricple类
  • 主要文件:filter过滤器
  • 主要文件:securityConfig配置类(密码模块移除)

mapper规范

  • 拿去标准对象的方法名统一为:getStandardById(service也是)

globle hander规范

  • 一般fail类型 统一返回范式类型为

handler规范

  • 主要getmapping和postmapping0

PASSMAll

  • 默认用户登录 所有页面均可访问
  • 去掉默认登录页面 所有页面开启权限检测 白名单除外
  • 和框架的loadUserByUsername方法对接(根据框架方法给的用户名自己去拿或者新建userDeteil对象并返回,框架帮你做验证这就是security框架的验证原理) 案例:在对接框架方法时 创建自定义对象

Redis repository

  • Redis三种数据的CRUD 一般value ,list ,set
  • repository层的简单实现 list() 2种 save 2种 get 一种
  • 预加载 清理redis 预加载list到redis内存
  • 定时任务

一些前端细节

  • 如何跳转页面
    function{
    this.$router.push("add-new-2")
    }
    router.push() 

    前缀相同仅添加url最后的名称即可不要加/

  • 如何在页面跳转时保持侧边栏选中不变 修改页面的router的default-active配置
            <el-menu
              router
              :default-active="activeRoute"
              class="el-menu-vertical-demo"
              background-color="#222c32"
              text-color="#fff"
              active-text-color="#fff">
  • 如何使用localStory保存对象数据
    localStorage.setItem("key",Object) 加this前缀会报错无法识别
    localStorage.getItem("key")
    JSON.stringify(Object)
    JOSN.parse(ObjectString)

今天做了什么2023.2.5

  • 编辑原来的商城项目

DTO Standard VO ,Standart 和 数据库表的属性 完全一致, VO 给用户看的(创建修改等属性)不需要给用户看, DTO用户输入 除VO中不给看的也一般不会要求输入,另外id,部分程序控制属性等即使给看也不要求输入

  • 一般情况下服务端如果请求失败要返回错误信息,但是对于无要求返回参数数据的情况下成功不返回成功信息交由前端处理。
  • crud中 change remove delete 都至少要提供id 而select 查列表不提交任何参数 所以是get请求

2023.2.3今天做了什么

Mistake

bigInt对应的属性类型 应该是Long

对客户端的的数据

  • 数据使用

不信任客户端传入数据,接收客户端数据需要进行检查

能不用客户数据实现功能就尽量不要使用

  • 数据封装的原则

多次复用或属性较多可以考虑封装

Vue :安装和运用三方依赖

事务完整性注释@Transctional

  • 功能

保证事务的完整性,事务是指两次及其以上的数据库CRUD操作,要么同时完成要么同时失败。

该标签通过感知到RunTimeExcepution的抛出来回滚事务操作,意思是如果你的逻辑业务操作失败,并没有抛出RunTimeExcepution那么就无法触发回滚操作事务一致性也无法保证。

  • 配置

该标签可以通过

Transactional

Spring框架的作用

  • 自动创建类对象@ComponentScan

spring框架会对添加了@componentScan的配置类,配置类是指添加了@configuration的类,进行扫描,扫描@componentScan标签配置的包,及其子孙包中添加了@component注解的类,并能够自动创建他们的对象。

如果没有对@componentScan注解进行配置那么默认扫描该配置类所在包及其子孙包。

@component注释的衍生注释有@controller@service@repository(和SQL操作有关的类),@Configuration(其他功能类,自带@component注释)几者功能等价,此上还有springMVC的@RestController@RestControllerAdvice @ControllerAdvice 等,但是其功能差不多均基于@component注释。

@springBootApplication也自带此标签

  • 自动创建对象@Bean

在添加了@Configuration注释标签的类中对方法添加@Bean注释标签,该方法会自动调用并获取到该方法的返回对象 当使用@AutoWired标签时

对于无法编辑的三方类,只能通过@Bean来自动创建

  • 单例模式(spring框架默认自动创建的对象模式)

无论何时该类只提供唯一一个实例

饿汉模式:无论是否需要,提前准备(spring框架默认)

懒汉模式:需要时,再二次判断和创建

  • 自动装配

@AutoWired 先匹配类型,再匹配名称

@Resource先匹配名称,再匹配类型

一个类使用了@component一类的注释,可以在@Component标签里面设置(直接写String类型)自动装配时对象使用的名字,如果没有那么,默认取类名全小写。

@Service("makeTomato")
public class makeTomato implements IcookService {
    xxx
}

@AutoWired多个匹配类时不管是哪个自动装配注解标签都需要类型和名称都匹配。

一旦注解写了名,那么就没有默认名了,用小写类名来区分就不行了

两种方法,要么controller里面@Qualifier写名称筛选要么Impl实现类@Primary首选标记

@Service("makePotato")
@Primary
public class makePotato implements IcookService {
    xxx
}
@AutoWired
@Qualifier("@makeTomato")
public class getFoodController {
    @Resource(name = "makeTomato")
    IcookService anywords;
}

@AutoWired单个匹配类时略过名称匹配

@Resource 多个匹配类时不管是哪个自动装配注解标签都需要类型和名称都匹配。 @Resource (name="xxx")

public class getFoodController {
    @Resource(name = "makeTomato")
    IcookService anywords;
}

@Resource 单个匹配时无需 名称匹配(但你不要设置name)

public class getFoodController {
    @Resource
    IcookService anywords;
}