开课吧项目的总结以及读《图解HTTP》的总结
一、搭建注册配置中心
1、 Nacos与Eureka均提供注册中心和服务治理功能,以下为两者差异和选型方案。
功能差异
模块 | Nacos | Eureka | 说明 |
---|
注册中心 | 是 | 是 | 服务治理基本功能,负责服务中心化注册 | 配置中心 | 是 | 否 | Eureka需要配合Config实现配置中心,且不提供管理界面 | 动态刷新 | 是 | 否 | Eureka需要配合MQ实现配置动态刷新,Nacos采用Netty保持TCP长连接实时推送 | 可用区AZ | 是 | 是 | 对服务集群划分不同区域,实现区域隔离,并提供容灾自动切换 | 分组 | 是 | 否 | Nacos可用根据业务和环境进行分组管理 | 元数据 | 是 | 是 | 提供服务标签数据,例如环境或服务标识 | 权重 | 是 | 否 | Nacos默认提供权重设置功能,调整承载流量压力 | 健康检查 | 是 | 是 | Nacos支持由客户端或服务端发起的健康检查,Eureka是由客户端发起心跳 | 负载均衡 | 是 | 是 | 均提供负责均衡策略,Eureka采用Ribion | 管理界面 | 是 | 否 | Nacos支持对服务在线管理,Eureka只是预览服务状态 |
部署安装
模块 | Nacos | Eureka | 说明 |
---|
MySql | 是 | 否 | Nacos需要采用MySql进行数据进行持久化 | MQ | 否 | 是 | Eureka需要采用MQ进行配置中心刷新 | 配置中心 | 是 | 否 | Eureka结合Config或者Consul实现配置中心 | 配置文件 | 在线编辑 | 本地文件或者Git远程文件 | Eureka结合Config或者Consul | 集群 | 是 | 是 | Nacos需要配置集群ip再启动 |
稳定及扩展性
模块 | Nacos | Eureka | 说明 |
---|
版本 | 1.0.0 | 1.9.9 | Eureka2.0已停止开发,Nacos处于1.x-2.0开发 | 厂商 | 阿里巴巴 | Netflix | Netflix已长期用于生产,阿里刚起步 | 生产建议 | 否 | 是 | Nacos0.8以前不可用于生产,建议生产采用Nacos1.0,便于节省配置中心集群和服务管理 | 未来发展 | 是 | 否 | Nacos 2.0主要关注在统一服务管理、服务共享及服务治理体系的开放的服务平台的建设 |
选型建议
采用Eureka方案的考虑
- 想用Spring Cloud原生全家桶
- 想用本地文件和Git作为配置管理的,将配置与服务分开管理
- 考虑短期的稳定性
采用Nacos方案的考虑
- 想在线对服务进行上下线和流量管理
- 不想采用MQ实现配置中心动态刷新
- 不想新增配置中心生产集群
- 考虑引入Spring Cloud Alibaba生态
2、Nacos注册配置中心简述
本项目采用Nacos的方案,附Nacos使用简述链接:
https://blog.csdn.net/zhhxf521/article/details/120101895
二、spring boot添加数据校验
1、实体类添加校验规则
2、controller中添加校验条件
3、校验规则说明
3.1 值校验
@Null注解
被注解的元素必须为null
@Null(message = "必须为null")
private String username;
@NotNull注解
被注解的元素必须不为null
@NotNull(message = "必须不为null")
private String username;
@NotBlank注解
验证注解的元素值不为空(不为null、去除首位空格后长度为0) ,并且类型为String。
@NotBlank(message = "必须不为空")
private String username;
@NotEmpty注解
验证注解的元素值不为null且不为空(字符串长度不为0、集合大小不为0) ,并且类型为String。
@NotEmpty(message = "必须不为null且不为空")
private String username;
@AssertTrue注解
被注解的元素必须为true,并且类型为boolean。
@AssertTrue(message = "必须为true")
private boolean status;
@AssertFalse注解
被注解的元素必须为false,并且类型为boolean。
@AssertFalse(message = "必须为false")
private boolean status;
3.2 范围校验
@Min注解
被注解的元素其值必须大于等于最小值,并且类型为int,long,float,double。
@Min(value = 18, message = "必须大于等于18")
private int age;
@Max注解
被注解的元素其值必须小于等于最小值,并且类型为int,long,float,double。
@Max(value = 18, message = "必须小于等于18")
private int age;
@DecimalMin注解
验证注解的元素值大于等于@DecimalMin指定的value值,并且类型为BigDecimal。
@DecimalMin(value = "150", message = "必须大于等于150")
private BigDecimal height;
@DecimalMax注解
验证注解的元素值小于等于@DecimalMax指定的value值 ,并且类型为BigDecimal。
@DecimalMax(value = "300", message = "必须大于等于300")
private BigDecimal height;
@Range注解
验证注解的元素值在最小值和最大值之间,并且类型为BigDecimal,BigInteger,CharSequence,byte,short,int,long。
@Range(max = 80, min = 18, message = "必须大于等于18或小于等于80")
private int age;
@Past注解
被注解的元素必须为过去的一个时间,并且类型为java.util.Date。
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@Past(message = "必须为过去的时间")
private Date createDate;
@Future注解
被注解的元素必须为未来的一个时间,并且类型为java.util.Date。
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@Future(message = "必须为未来的时间")
private Date createDate;
3.3 长度校验
@Size注解
被注解的元素的长度必须在指定范围内,并且类型为String,Array,List,Map。
@Size(max = 11, min = 7, message = "长度必须大于等于7或小于等于11")
private String mobile;
@Length注解
验证注解的元素值长度在min和max区间内 ,并且类型为String。
@Length(max = 11, min = 7, message = "长度必须大于等于7或小于等于11")
private String mobile;
3.4 格式校验
@Digits注解
验证注解的元素值的整数位数和小数位数上限 ,并且类型为float,double,BigDecimal。
@Digits(integer=3,fraction = 2,message = "整数位上限为3位,小数位上限为2位")
private BigDecimal height;
@Pattern注解
被注解的元素必须符合指定的正则表达式,并且类型为String。
@Pattern(regexp = "\\d{11}",message = "必须为数字,并且长度为11")
private String mobile;
@Email注解
验证注解的元素值是Email,也可以通过regexp和flag指定自定义的email格式,类型为String。
@Email(message = "必须是邮箱")
private String email;
三、ElasticSearch:7.6.2 实现项目搜索
附链接: https://blog.csdn.net/zhhxf521/article/details/120005094
四、mybatis-plus使用总结
4.1 wrapper介绍
Wrapper : 条件构造抽象类,最顶端父类
AbstractWrapper : 用于查询条件封装,生成 sql 的 where 条件
QueryWrapper : Entity 对象封装操作类,不是用lambda语法
UpdateWrapper : Update 条件封装,用于Entity对象更新操作
AbstractLambdaWrapper : Lambda 语法使用 Wrapper统一处理解析 lambda 获取 column。
LambdaQueryWrapper :看名称也能明白就是用于Lambda语法使用的查询Wrapper
LambdaUpdateWrapper : Lambda 更新封装Wrapper
4.2 LambdaQueryWrapper和 :: 使用案例
//1.获取分页查询的对象,链式查询
PageInfo<ProjectInfo> pageInfo = PageHelper.startPage(pageNum, pageSize).doSelectPageInfo(() -> {
//lambdaquerywrapper的写法
lambdaQuery().eq(ObjectUtil.isNotNull(status), ProjectInfo::getStatus, status)
.like(ObjectUtil.isNotNull(type), ProjectInfo::getType, type)
.lt(ObjectUtil.isNotNull(releaseTime), ProjectInfo::getReleaseTime, releaseTime)
.list();
});
//2.创建对象LambdaQueryWrapper,构建查询条件
LambdaQueryWrapper<ProjectRegister> queryWrapper = new LambdaQueryWrapper<>();
//构建查询条件
queryWrapper
.eq(ProjectRegister::getUserId, userId)
.eq(ProjectRegister::getProjectId, projectId)
.eq(ProjectRegister::getRole, projectRegister.getRole())
.eq(ProjectRegister::getRegisterStatus, projectRegister.getRegisterStatus());
//3.链式查询 返回list集合
List<ProjectRegister> list = lambdaQuery()
.eq(ProjectRegister::getUserId, userId)
.eq(ProjectRegister::getRegisterStatus, register.getRegisterStatus()).list();
4.3 QueryWrapper的使用案例
注意:不可以同 :: 一起使用
/**
* 条件构造器 查询操作
*/
@Test
void TestQueryWrapperSelect() {
//1、条件用法
List<User> userList = userMapper.selectList(new QueryWrapper<User>()
.like("email", "24252")
.between("age", 20, 22)
.or()
.eq("name", "zcx")
);
System.out.println("userList:" + userList);
//2、排序用法
List<User> users = userMapper.selectList(new QueryWrapper<User>()
.eq("nick_name", "xx")
.orderByAsc("age") //升序
// .orderByDesc("age") //降序
.last("limit 0,3") //last用法:在sql末尾添加sql语句,有sql注入风险
);
System.out.println("users:"+users);
}
五、读《图解HTTP》总结
5.1 网络基础之TCP/IP与HTTP
了解HTTP,就必须要了解些TCP/IP协议族。其实机器是很笨的,没有任何智商,想让机器之间通信,必须要有一套完整通信规则,包括如何到达通信目标,使用的传输类型,等等都需要一套规范,这一整套规范就是协议。TCP/IP协议就是其中的这么一套协议族。
TCP/IP 协议的四层分层管理 1、应用层,具体的协议有,HTTP,FTP(文件传输协议),DNS(域名系统,就是IP与域名互相转换)等。从这里可以看出HTTP协议是TCP/IP协议族的组成部分。 2、传输层,TCP(面向连接的,传输控制协议),UDP(面向无连接的,用户数据报协议)。 3、网络层,IP协议。 4、数据链路层,处理网络的硬件部分,比如,网卡,通信线路(光纤,电缆)。
如图所示的,这是整个通信过程中数据流的走向,同时经过每层协议时,都会加上相应的首部,每个首部都会有相应的功能。 各个分层之间相互协作,当一个部分出现问题,可以找到相应的层次来处理问题,而不是把整个协议都去检查一遍。 从上图也可以看出,HTTP协议作为TCP/IP协议族应用层的重要成员,在通信过程中起着非常重要的角色。
5.2 简单的HTTP协议
HTTP协议一般是用户客户端和服务器之间的通信,一般都是客户端请求,服务端响应,类似于一问一答式的通信。
就问你,这张图是不是好丑。哈哈,好吧,图虽然丑了点,但是不影响这表达的意思嘛,就是在两台机器通信时使用HTTP协议中,肯定有一方是客户端,一方是服务器。
这就是HTTP通信最基本的格式了,从1中发送请求,从2中返回响应。请求的格式是:
GET /index.htm HTTP/1.1
Host: baidu.com
这个起始行中的GET表示的是访问服务器的类型,成为请求方法,随后的字符串/index.htm指明了请求访问的资源对象,也叫请求URI,最后的HTTP/1.1表示HTTP的版本号,也是提示客户端使用的HTTP协议功能。 请求报文是由请求方法,请求URI,协议版本,可选的请求首部字段和内容实体构成。
HTTP是无状态的协议
就是在通信过程中,HTTP协议本身不对庆祝和响应的通信状态进行保存。 当新的请求发送时,并不知道上次是否已经发送类似的请求。举个例子,就是当我们登陆到一个购物网站时,当跳转到其他页面时,发出的请求也应该是保持登陆的状态才能有好的购物体验,不可能说每打开一个页面再登陆一次,这样肯定很麻烦。为了实现这种保持状态的功能,引入了Cookie功能。具体做法是在服务端引入Session功能,在服务端用Session来管理状态,生成SessionID,传给客户端,客户端将SessionID保存在Cookie中,每次请求时在Cookie中取出SessionID放入到HTTP请求中,这样服务器通过SessionID知道你以前的请求状态,是否登录过等信息。
HTTP请求方法
GET,POST,HEAD,OPTIONS,PUT,DELETE等。 GET:一般是获取资源。 POST:一般是传输实体主题,主要目的是将信息告诉服务器。 HEAD:获取报文的首部,一般不返回报文主题,确认资源URI是否有效 OPTIONS:查询针对请求URI指定的资源支持的方法。 PUT:上传文件。一般很少用。 DELETE : 删除资源,一般很少用。
5.3 HTTP首部
HTTP协议请求和响应报文中包含了HTTP首部,HTTP首部字段是构成HTTP报文中的要素之一,HTTP首部为我们提供了客户端和服务器通信时很重要的通信信息。
HTTP请求报文
请求报文中,HTTP报文有方法,URI,HTTP版本,HTTP首部字段等构成。
HTTP响应报文
响应报文中,HTTP报文由HTTP版本,状态码,HTTP首部字段构成。
HTTP首部字段结构:
首部字段名:字段值 例如:
Host:baidu.com
Cache-Control: max-age = 0
Content - Type: text/html
有的字段值可以是多个值,例如:
Keep-Alive: timeout = 15,max = 100
HTTP首部字段从上面两幅图可以看出共有4种类型。
通用首部字段
请求首部字段
响应首部字段
实体首部资源
上面4种类型都对应了好多首部字段,具体每个用法就不再具体展开细说了。 还有一些并不是HTTP协议本身的字段,但是很有用,也需要了解。比如为Cookie服务的首部字段,有Set-Cookie(响应首部字段) 和Cookie(请求首部字段),这是管理服务器和客户端之间状态的信息,它的工作机制是用户识别和状态管理。
5.4 HTTP状态码
响应报文中HTTP状态码表示了客户端HTTP请求的返回结果,得到响应的结果码,有助于了解我们请求时是否成功,如果错误了,是哪种类型的错误。状态码有5种类型,分别表示了对应的返回响应原因。
1、2XX,表示响应结果为请求被正常处理 200 OK 表示客户端发来的请求在服务端被正常处理。 204 NO Content 表示处理成功,但是响应中没有任何实体。 206 Partial Content 表示客户端进行了范围七牛,而服务器成功执行了这部分的请求。
2、3XX,表示浏览器需要执行某些特殊的处理以正确处理请求。 301 Moved Permanently 永久性重定向,表示该资源已经分配了新的URI,原来URI不再使用。 302 Found 临时性重定向,跟301类似,也是请求的资源分配了新的URI,但只是临时的,以后可能会换回来。 304 Not Modified 表示服务器允许请求访问资源,但是没有满足条件。比如你客户端需要请求一个信息,但是要求该信息是今天编辑的,但是资源里确实有该信息,只是这个信息是昨天编辑的,不符合条件,则服务器返回该状态码。
3、4XX,表示客户端是发生错误的原因所在 400 Bad Request 表示请求报文中存在语法错误。 401 Unauthorized 没有认证,表示发送的请求组要进行HTTP认证。 403 Forbidden 表示不允许访问这个资源。 404 Not Found 表示服务器无法找到请求的资源。
4、5XX 表示服务器本身发生错误。 500 Internal Server Error 表示服务器在执行时发生错误。 503 Service unavailable 表示服务器暂时处于超负荷或者正在停机维护,无法处理请求。
5.5 HTTP与HTTPS
HTTP协议虽然有相当优秀的一面,但是也并非没有缺点,因为设计很简单,没有考虑到安全方面的问题。HTTP协议有以下不足:
1、通信使用明文(不加密),内容可能会被窃听
在通信过程中,由于设备的公开性,不能保证所有环节都是安全的,因此,很有可能会被窃听,因此加密就成了通信过程中必不可少的环节。
2、不验证通信方的身份,因此可能遭遇伪装。
HTTP协议中的请求和响应是不需要验证通信方进行确认,因此任何人都可以伪装,无法辨别是否是真实的通信方。
3、无法验证报文的完整性,所以有可能篡改。
虽然在验证完整性上面有MD5等信息摘要技术,可以将信息和MD5的信息摘要码同时传递过去,但是通信过程中,这两项都有可能被同时更改,因此还是无法保证信息的完整性。 简单概括成,不加密,无法认证,没有完整性保护。鉴于HTTP的不安全性,于是就用了*HTTP+加密+认证+完整性*保护来处理这些问题,这就是HTTPS。
相信在上网过程中,会经常接触到这个https开头的网页,网址的前面还有个加锁图标,并且写着安全两个字。为什么有的网址是http开头,有的是https开头呢?为什么会有http和https的区别呢?为什么https开头的会提示安全两个字呢?这就是https的强大之处啦。 HTTPS不是新的协议,而是在HTTP协议的接口部分用了SSL和TLS协议代替了。HTTPS与HTTP在TCP/IP协议族的位置如下
既然HTTPS具有加密功能,这里先来讲点加密方法。 加密最基本的目的是两个人交流不想让第三个人知道其中的内容,加密是先有一套规则,然后在这套规则的基础上进行交流。现代加密方法中的加密算法(加密规则)一般是公开的,而加密会涉及到密钥,密钥用来加密和解密,因此密钥一般是保密的。根据密钥的不同分成把加密分成两种加密方式,一种是对称密钥加密,一种是非对称加密。 对称密钥加密意思就是加密和解密时密钥是一样的,在通信过程中,如何做好密钥不被窃听就显得很重要。而非对称加密的加密密钥和解密密钥是不一样的。通信中,用其中用加密密钥(又称公开密钥)加密信息,这个加密密钥大家都可以知道,当把信息传给我时,只有我知道解密密钥(又称私有密钥)可以解密信息。没有这个解密密钥,而只有加密密钥,想解开密文是极其困难的。
HTTPS是采用混合加密机制的
非对称加密虽然更加安全,但是加解密的时候比较复杂,一般只能用于信息量比较小的数据中,随着数据量的加大,加解密会占有更多的时间和内存。对称加密虽然在保存密钥上比较麻烦,但是处理速度比较快,适合大量数据的加密,因此利用可以利用两者各自的优势。 HTTPS在通信开始建立时使用非对称加密来进行对称加密密钥的交换,在数据通信时使用对称加密,可以提高数据传输的效率。 非对称加密的公开密钥还有一个问题,就是无法证明这个公开密钥就是真实的公开密钥。这里就相当于引入了第三方来证明我的公开密钥是正确的。这里的第三方就是数字证书认证机构(CA),这样的机构一般都是社会信用度极高的第三方机构。
证明服务器是合法的
一般服务器向第三方机构去申请证书,第三方机构先去验证这个服务器是否合法,验证完后向该服务器颁发证书,证书里有对申请的公开密钥做数字签名。客户端请求时,服务器会想客户端发送数字证书,客户端接受到证书可以对数字签名进行验证,通过之后,则服务器的公开密钥是值得信赖的。
证明客户端是合法的
上述对服务器的验证也可以用于客户端的验证,比如我们之前用过的网银什么的,有一个类似于U盘大小的东西插在电脑中,其实就是相当于客户端的证书。毕竟除了金融和保密性强的一些单位,很少会去申请客户端的证书,毕竟申请证书还是需要一大笔费用的。
当然了,HTTPS既然有这么多的优点,为什么不全部都是用HTTPS呢,事物都有两面性。确实优点不少,也有部分的缺点啦。 一是在不断的加密解密过程中需要消耗大量的内存和CPU等硬件资源。因此比一般的HTTP请求要慢2到100倍。 二是购买证书是需要花一大笔费用的,对BAT等那些财大气粗的当然不在乎这点钱啦,对一般的小企业还是需要考虑一下的,一年费用在几千到几十万不等。
三方就是数字证书认证机构(CA),这样的机构一般都是社会信用度极高的第三方机构。
证明服务器是合法的
一般服务器向第三方机构去申请证书,第三方机构先去验证这个服务器是否合法,验证完后向该服务器颁发证书,证书里有对申请的公开密钥做数字签名。客户端请求时,服务器会想客户端发送数字证书,客户端接受到证书可以对数字签名进行验证,通过之后,则服务器的公开密钥是值得信赖的。
证明客户端是合法的
上述对服务器的验证也可以用于客户端的验证,比如我们之前用过的网银什么的,有一个类似于U盘大小的东西插在电脑中,其实就是相当于客户端的证书。毕竟除了金融和保密性强的一些单位,很少会去申请客户端的证书,毕竟申请证书还是需要一大笔费用的。
当然了,HTTPS既然有这么多的优点,为什么不全部都是用HTTPS呢,事物都有两面性。确实优点不少,也有部分的缺点啦。 一是在不断的加密解密过程中需要消耗大量的内存和CPU等硬件资源。因此比一般的HTTP请求要慢2到100倍。 二是购买证书是需要花一大笔费用的,对BAT等那些财大气粗的当然不在乎这点钱啦,对一般的小企业还是需要考虑一下的,一年费用在几千到几十万不等。
|