栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

tensquare学习随记

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

tensquare学习随记

tensquare学习随记 一、后台“频道”

​ 系统中数据的类型就是“频道”,例如博客中有不同的类型,例如python、Java、php等等,这些若只有一种后台管理员去维护,则可能出现管理员雾里看花的结果,所以需要将不同的博客划分为不同的频道,让不同的管理员管理自己擅长的“频道”。

二、传统系统与互联网系统的区分

​ 传统系统与互联网系统最根本的区别就是并发量,互联网系统的并发量远远大于传统系统。

​ 面向群体:传统的系统往往面向的是基数小的群体,例如公司的OA系统、CRM客户关系管理系统、ERP资源管理平台等等,而互联网系统则大多面向所有群体,例如淘宝、微信、抖音等等。

​ 技术方面,传统的系统使用的技术大多是SSM等框架,而互联网系统对于并发量高,使用的大多是集群分布式为主的spring cloud 、dubbo等等。

三、REST风格开发——等幂性与安全性

使用RESTful来搭建系统,同样的url,不同的请求方法,请求的入口不同。以下是通常情况下的结果:

Get 主要用于查询操作select , 安全且等幂

POST 主要用于添加insert操作 ,不安全且不等幂

PUT 主要用户修改操作,不安全且等幂

DELETE 主要用户删除delete操作,不安全且等幂

等幂

是指前端相同的请求,不管请求几次结果都是一样的。

对于PUT请求方式,有时候也会出现不等幂的情况:例如当系统使用第三方服务时——eg支付,用户支付后,第三方服务突然崩溃了,而本系统订单到达超时时间,将订单状态置为支付失败之后,第三方系统修复了,将支付成功发送给系统,系统将其再一次修改为支付成功。

如何使的不等幂变成等幂?

对于insert请求:

  • 设置全局唯一id
  • 先查询在决定是否insert
  • 创建一个去重表(redis)当缓存中存在时,不执行
  • 使用toker -->比较前后台的token是否相同,相同不执行

对于update请求

  • 多版本控制,当用户请求的数据的版本小于或等于将被修改的版本,解决修改,例如git、svn
  • 数据库——乐观锁、悲观锁
  • 使用状态码,eg status==0 执行,status == 1不执行
四、常见的请求状态码 ① 客户方错误

100 继续
101 交换协议

② 成功

200 OK
201 已创建
202 接收
203 非认证信息
204 无内容
205 重置内容
206 部分内容

③ 重定向

300 多路选择
301 永久转移
302 暂时转移
303 参见其它
304 未修改(Not Modified)
305 使用代理

④ 客户方错误

400 错误请求(Bad Request)
401 未认证
402 需要付费
403 禁止(Forbidden)
404 未找到(Not Found)
405 方法不允许
406 不接受
407 需要代理认证
408 请求超时
409 冲突
410 失败
411 需要长度
412 条件失败
413 请求实体太大
414 请求URI太长
415 不支持媒体类型

⑤ 服务器错误

500 服务器内部错误
501 未实现(Not Implemented)
502 网关失败
504 网关超时
505 HTTP版本不支持

五、雪花算法生成id结构

雪花id生成算法是推特开发的id生成算法,该算法将生成64bit的数据,其中第1bit不使用,第242(41bit)bit用于时间戳,第4352(10bit)用于工作的机器id,最后的12喂为序列号。

一个机器在每ms中能生成1024个不同的id,若在该ms请求超过4096,则剩余的请求将等待下一毫秒。

一共可以搭建1024个工作机器

六、spring boot 内置的数据源

spring boot内置的数据源是:HikariCP;

HikariCP是一款高效率的数据库连接池,其速度优于阿里的druid,但是其安全性却低于后者。

选择:

需求对于安全性要求不高,对效率有一定的要求的考虑HikariCP

对于安全性要求较高的则使用druid.

spring boot 更改数据源

在配置数据源时指定type属性;

spring:
  application:
    name: tensquare-article  #服务名
  datasource:     #数据库连接四大属性 ,springboot 如果不配置数据源 默认会使用HikariCP
    driver-class-name: com.mysql.jdbc.Driver
    username: root
    password: root
    url: jdbc:mysql://192.168.200.135:3306/tensquare_article?characterEncoding=utf-8
    type: com.alibaba.druid.pool.DruidDataSource  #配置springboot使用连接数为druid
七、Mybatis plus 分页条件查询功能实现 Mybatis plus的优点(面试)

Mybatis plus与mybatis是出自同一个公司,且Mybatis plus是对mybatis的二次封装和扩展,

完全继承了mybatis的所有特性是以面向对象的方式操作数据库,

最少依赖,仅仅依赖mybatis与mybatis-spring

性能损耗小,启动即会自动注入基本的crud性能无损耗,直接面向对象操作

自动热加载,大大减少重启web服务器时间,提高开发效率。

避免sql注入,内置SQL注入内容剥离器,预防SQL攻击

Mybatis plus的配置
# Mybatis-Plus 配置
mybatis-plus:
  #  mapper-locations: classpath:/mapper
@Configuration
public class MybatisPlusConfig {
    
    @Bean
    public PaginationInterceptor creaePaginationInterceptor(){
        return new PaginationInterceptor();
    }
}

通过EntityWarpper(条件) 与 Page(分页参数:页码,数量)对象作为参数

 @Override
    public Page findByPage(Map map, Integer page, Integer size) {
        //设置查询条件
        EntityWrapper wrapper = new EntityWrapper<>();
        Set keySet = map.keySet();
        for(String key : keySet){
            //判断参数不为空
            
            //第一个参数是判断是否将条件添加到查询条件中。实现动态sql
            wrapper.eq(map.get(key) != null,key,map.get(key));
        }
        //设置分页参数
        Page pageData = new Page(page,size);
        //执行查询
        List list = articleDao.selectPage(pageData, wrapper);
        pageData.setRecords(list);
        //返回
        return pageData;
    }
细节

​ 对于作为条件且繁多的参数,若使用pojo来存储,在进行条件设置时,需要逐一的遍历对象中的属性或者通过反射技术去获取对象的所有属性后一个个的循环判断,这样虽然也能实现功能,但是却不高效,可以使用集合来接收参数,这样可以直接的获取键值来循环设置,方便快捷。

八、spring boot 对于公共异常类的处理

在以往的项目中对于异常的处理大多是在controller层中进行try-cache,这样就使得代码冗余,复用性不高。

spring boot中可以设置公共异常处理类,过程如下:

创建公共异常处理类,使用@ControllerAvtice声明

@ExceptionHandler(value = Exception.class) 用于指定处理何种类型及其子类型的异常

@ControllerAdvice  //声明此类用于处理异常
public class baseExceptionHandler {
    @ExceptionHandler(value = Exception.class)
    @ResponseBody
    public Result handler(Exception e){
        if(e instanceof  NullPointerException){
            System.out.println("这是一个空指针异常");
        }
        System.out.println("处理异常");
        return new Result(false, StatusCode.ERROR,e.getMessage());
    }·
}

若需要判断特定类型的异常,可以一直else if 下去

if(e instanceof  NullPointerException){
	System.out.println("这是一个空指针异常");
}
九、maven 的scope回顾
  • compile : 默认值,在编译、运行、测试均有效,且传递依赖
  • test: 只在测试时有效,不传递依赖
  • provided:在编译、测试时有效,在运行时无效,不传递依赖
  • runtime : 只在运行、测试时有效,传递依赖
十、lombok简化开发

Lombok是一款非常实用Java第三方工具,它可以帮助开发人员消除Java的冗长代码,尤其是对于简单的Java对象(POJO)。

使用需要安装lombok插件以及将setting -->compile–>注解扫描开启并在项目中添加lombokjar包,scope设置为commpile


    org.projectlombok
    lombok
    1.18.2
    provided

本人不推荐使用lombok

代码侵入性高。破坏封装性,对于不熟悉lombok的人可能会踩坑,例如使用@Data注解时会自动生成equals方法,但是,其并不比较继承的父类的属性,若需要比较父类属性则需再添加一个注解 @EqualsAndHashCode(callSuper=tue) 默认为false

十一、解决跨域请求问题——指定域访问

再controller中添加:@CrossOrigin //跨域问题处理,加入即支持跨域

@CrossOrigin //跨域问题处理,加入即支持跨域

指定域访问,配置

在controller类上面加上以下配置,代表只允许http://cas.baidu.com和http://do.baidu.com访问

@CrossOrigin(origins = {"http://cas.baidu.com","http://do.baidu.com"})
十二、微服务的划分标准

微服务名词的提出者在其论文中提出微服务的划分并没有明确的标准。

  • 技术
  • 功能 : 文章微服务、问答微服务等等
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/314773.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号