
获得徽章 1
- #青训营笔记创作活动#
2月23 打卡day9
debug代码是一个常用而且很常见的技能,但是不是每个人都能很有效率的debug代码...
有一些idea隐藏的debug方式,虽然一些人不关注,但是有用并且能极大提升效率
文章主要介绍一些一些在实际项目中相对有用的可以提升debug能力的一些经验。最后如果说实在是有问题,但是又没办法进入调试模式,可以考虑arthas的trace和watch。
展开评论点赞 - #青训营笔记创作活动#
2月22日 打卡day8
问:为什么用公钥加密,却不能用公钥解密?
答:因为大数取模运算是不可逆的,因此他人无法暴力解密。但是结合欧拉定理,我们可以选取出合适的p(公钥), q(私钥), N(用于取模的大数),让原本不可逆的运算在特定情况下,变得有那么点“可逆”的味道。数学原理决定了我们用公钥加密的数据,只有私钥能解密。反过来,用私钥加密的数据,也只有公钥能解密。展开评论点赞 - #青训营笔记创作活动#
2月21日 打卡day7
问:给开源库提pr拢共分几步?
答:找仓库,找Issues,申请帮忙解决,fork,clone,check,code,push,CI,提pr。一共十步评论点赞 - #青训营笔记创作活动#
2月20日 打卡day6
hertz-jwt 是 Hertz 众多外部扩展组件之一,Hertz 丰富的扩展生态为开发者带来了很大的便利,值得你在本文之外自行探索评论点赞 - #青训营笔记创作活动#
2月19日 打卡day5
Hertz社区提供了 reverseproxy 拓展做反向代理,除了基本使用功能,还支持了自定义指定转发客户端,修改响应方法等功能,同时也支持在中间件中使用。评论点赞 - #青训营笔记创作活动#
2月18日 打卡day4
1. 在 range 迭代中,得到的值其实是元素的一份值拷贝,更新拷贝并不会更改原来的元素,而且拷贝的地址并不是原有元素的地址。应该使用索引直接访问。
2.要复制一个Slice,最好使用Copy函数。
3.new 的作用是初始化一个指向类型的指针;make 的作用是为 slice,map 或 chan 初始化展开评论点赞 - #青训营笔记创作活动#
2月17日 打卡day3
状态码5xx一般不由服务端发送,因此服务端本身,并不会有5xx的日志信息。状态码一般由nginx这样的反向代理服务器发送。
如果发现502,优先通过监控排查服务端应用是否发生过崩溃重启,如果是的话,再看下是否留下过崩溃堆栈日志,如果没有日志,看下是否可能是oom或者是其他原因导致进程主动退出。如果进程也没崩溃过,去排查下nginx的日志,看下是否将请求打到了某个不知名IP端口上了
展开评论点赞 - #青训营笔记创作活动#
2月16日 打卡day2
1. DHCP协议学习
1. DHCP协议定义了联网设备联网后动态申请IP地址的规则
2. DHCP分为四个阶段:Discover,Offer, Request和ACK(如果曾经链接过某网络,再次申请链接时,优先使用原来的IP,因此只需要经历三四阶段)
3. DHCP是应用层协议,需要用到广播功能,使用的是UDP协议
4. 获得IP后,会发送3次无偿APR报文,报文中包含本设备mac地址和申请到的IP地址,目的是通知本文段其他设备缓存该地址和防止IP冲突
2. 手机扫码登陆是如何实现的之websocket协议
1. 扫码登陆的难点在于如何实现服务器推送数据给客户端
2. 基于HTTP协议的实现方式
1. 轮询请求:短时间内重复请求服务器数据,手机扫码发送数据后,服务器即可发送响应报文,最长“卡顿”时间为重复请求之间的间隔时间
2. 长轮询请求:每次请求服务器时间拉长,超时后重发请求,则有几率在超时前获得服务器的响应报文
3. 基于websocket协议的实现方式
1. HTTP协议的实现方式本质上还是“请求-应答”模式,未能真正实现服务器推送功能,适用于简单请求场景,对于复杂大量服务器推送场景,轮询请求耗费大量资源,且实时性较差。
2. 虽然名字带了个socket,但其实socket和websocket之间毫无关系,websocket也是应用层协议
3. websocket只有在建立连接时才用到了HTTP,协议升级转换完成后就与HTTP协议没什么关系
4. websocket完美继承了TCP协议的全双工能力,服务端可以主动发送给客户端数据,适用于需要服务器和客户端(浏览器)频繁交互的大部分场景。
3. 大部分情况下都会在UDP的基础上做各种不同程度的应用层可靠性保证。比如王者农药用的KCP,以及最近很火的QUIC(HTTP3.0)。
展开评论点赞 - #青训营笔记创作活动#
2月15日 打卡day1
1. 学习了两个查看日志命令的常用使用(cat,tail)
2. 学习了写出漂亮代码的技巧:
- 注释的恰当用法是用来弥补我们在用代码表达意图时的失败
- try catch 内部代码抽成一个方法,防止try catch代码过长,影响阅读代码核心逻辑
- 尽量使用聚合/组合代替继承,聚合/组合的意思就是通过成员变量的方式来使用类。聚合和组合的区别就是,组合是当对象一创建的时候,就直接给属性赋值,而聚合的方式可以通过set方式来设置。
- 尽量不要用BeanUtils来拷贝属性,底层是通过反射来的拷贝属性的展开评论点赞