IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> 开课吧项目的总结以及读《图解HTTP》的总结 -> 正文阅读

[网络协议]开课吧项目的总结以及读《图解HTTP》的总结

开课吧项目的总结以及读《图解HTTP》的总结

一、搭建注册配置中心

1、 Nacos与Eureka均提供注册中心和服务治理功能,以下为两者差异和选型方案。

功能差异
模块NacosEureka说明
注册中心服务治理基本功能,负责服务中心化注册
配置中心Eureka需要配合Config实现配置中心,且不提供管理界面
动态刷新Eureka需要配合MQ实现配置动态刷新,Nacos采用Netty保持TCP长连接实时推送
可用区AZ对服务集群划分不同区域,实现区域隔离,并提供容灾自动切换
分组Nacos可用根据业务和环境进行分组管理
元数据提供服务标签数据,例如环境或服务标识
权重Nacos默认提供权重设置功能,调整承载流量压力
健康检查Nacos支持由客户端或服务端发起的健康检查,Eureka是由客户端发起心跳
负载均衡均提供负责均衡策略,Eureka采用Ribion
管理界面Nacos支持对服务在线管理,Eureka只是预览服务状态
部署安装
模块NacosEureka说明
MySqlNacos需要采用MySql进行数据进行持久化
MQEureka需要采用MQ进行配置中心刷新
配置中心Eureka结合Config或者Consul实现配置中心
配置文件在线编辑本地文件或者Git远程文件Eureka结合Config或者Consul
集群Nacos需要配置集群ip再启动
稳定及扩展性
模块NacosEureka说明
版本1.0.01.9.9Eureka2.0已停止开发,Nacos处于1.x-2.0开发
厂商阿里巴巴NetflixNetflix已长期用于生产,阿里刚起步
生产建议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等那些财大气粗的当然不在乎这点钱啦,对一般的小企业还是需要考虑一下的,一年费用在几千到几十万不等。

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-09-06 11:28:49  更:2021-09-06 11:30:44 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 23:39:18-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码