• 容易遗忘的知识点总结


    主要是工作中不常用,导致记得不是很清晰。但是很重要的知识点,慢慢积累...

    1.七层协议

    • 从上到下是:应用层、表示层、会话层、传输层、网络层、数据链路层、物理层;
    • 协议类型:
    应用层中,有FTP:文件传输协议;  http:超文本传输协议;  SMTP:邮件传输协议;  DNS:域名系统;
    传输层中,有TCP:传输控制协议;  UDP:用户数据协议
    

    2.Http的工作过程

    对于请求的地址,从地址中分离出协议名、主机名、端口、对象路径等

    1. 地址解析
      使用域名系统DNS解析域名,得到主机的IP地址

    2. 封装HTTP请求数据包
      把解析出的信息结合自己本机的信息,封装成一个HTTP请求数据包

    3. 封装成TCP包,建立TCP连接
      (三次连接)

    4. 客户机发送请求命令
      建立连接后,客户机发送一个请求给服务器,请求方式的格式为:统一资源标识符(URL)、协议版本号,后面是MIME信息。

    5. 服务器响应

    6. 服务器是否关闭TCP连接
      若在请求头中加入了Connection:keep-alive,则表示仍然保持连接


    3.API网关的作用

    身份验证、监控、负载均衡、缓存、请求分片与管理、静态响应处理、限流控制等

    • 性能:API网关高可用,负载均衡,容错机制。
    • 安全:权限身份认证、脱敏,流量清洗,后端签名(保证全链路可信调用),黑名单(非法调用的限制)。
    • 日志:日志记录(spainid,traceid)一旦涉及分布式,全链路跟踪必不可少。
    • 缓存:数据缓存。
    • 监控:记录请求响应数据,api耗时分析,性能监控。
    • 限流:流量控制,错峰流控,可以定义多种限流规则。
    • 灰度:线上灰度部署,可以减小风险。路由:动态路由规则。

    Nginx和Api Gateway的说明

    Nginx和Api gateway在功能上是有一些重叠的,都可以做服务转发。但是网关在大型微服务系统中是一个很重要的角色

    • Api网关是转为网关的角色而设计的,功能强大,在大型系统开发中基本上都会选用次组件
    • Nginx只能实现一些上面说的部分用牛奶,一般都是选用Nginx做静态资源缓存和前端调用接口的负载均衡

    总结:现在前后端分离的系统一般都会如下设计:Nginx做静态资源服务器,前端页面调用后端接口时先请求到Nginx,Nginx做负载君合路由到后端网关,然后网关做请求身份验证,日志记录等操作,再转发业务处理接口,处理完返回数据。


    4.拦截器和过滤器的区别

    Filter过滤器:本质是基于函数回调
    1.修改字符编码(CharacterEncodingFilter)、在过滤器中修改HttpServletRequest的一些参数
    2.过滤低俗文字、危险字符
    3.对URL地址做处理
    缺点:只能对controller请求进行拦截,对于其他直接访问的静态资源的请求无法进行拦截处理。

    Interceptor拦截器:本质是基于Java的反射机制
    1.Filter能做的都可以做
    2.在请求前和请求后都可以拦截,比较灵活。


    5.关于前端提交格式【Content-Type】与后端接受格式 互相对应点

    1. 前端格式为 Content-Type:application/x-www-form-urlencoded;charset=UTF-8 时(表单提交方式),
      后端接受时,在路径的RequestMapping上,加上consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE;接受的参数可以通过@RequestParam成功获取(不可用@RequestBody接受),后端如下图:

    采用其他格式或参数接受,会报如下错误,Content type 'application/x-www-form-urlencoded;charset=UTF-8' not supported

    1. 当前端格式为 Content-Type:application/json 时(Payload提交方式),后端接受方式为 consumes = MediaType.APPLICATION_JSON_VALUE,参数可通过@RequestBody接受,如下所示:

    注:@RequestParam和@RequestBody接受参数,@ReqeustParam底层是通过request.getParameter方式获得参数的,get和post提交都可以接受到;@RequestBody接受的是json对象的字符串,而不是json对象。


    6. 运算符

    关于运算符,总是容易混淆和遗忘。特总结如下:

    1. 位运算符
    • & 与运算符:参与运算的两个值,如果两个相应位都是1,则该位的结果位1,否则为0;
    • | 或运算符:参与运算的两个值,如果其中有一个位是1,则该位的结果为1,否则为0;
    • ^ 异或运算符:当两对应的位相异时,结果为1;
    • ~ 取反运算符:对数据的每个二进制为取反,即把1改为0,把0改为1;
    • << 左移运算符:各二进制位全部左移若干位,由“<<” 右边的数指定移动的位数,高位丢弃,低位补0;相当于乘以2的n次方
    • >> 右移运算符:与左移刚好相反。例:11 >> 2,11右移2位,11的二进制为:1011,右移的结果为:0010,即对应的十进制为2。右移n位相当于除以2的n次方,值取商,余数舍弃。
    • >>> : 无符号右移,忽略符号位,空位都以0补齐

    不断积累中,未完待续...


    若觉得博文不错或对你有帮助,请点击【推荐】,感谢你的支持

    本文来自博客园,作者:黄小葱,转载请注明原文链接:https://www.cnblogs.com/sun-flower1314/p/15233497.html

  • 相关阅读:
    Redis分布式锁实现
    mysql索引命中规则
    spring注解原理
    img 标签访问图片返回403forbidden
    根据注解修改属性的值
    通过反射改变对象的属性
    利用反射获取类或者方法或者字段上的注解的值
    什么时候出现死锁,如何解决?mysql 引擎? 多个like or 查询sql如何优化?什么是常量池?for条件执行顺序
    jvm 基础
    为什么要用jvm .
  • 原文地址:https://www.cnblogs.com/sun-flower1314/p/15233497.html
Copyright © 2020-2023  润新知