于帅的博客


本站和网页 https://yusure.cn/ 的作者无关,不对其内容负责。快照谨为网络故障时之索引,不代表被搜索网站的即时页面。

于帅的博客
首页
后端
PHP
Golang
Java
Python
Kafka
前端
JavaScript
CSS
数据库
MySQL
MongoDB
Redis
运维
Linux
BSD
Windows
Nginx
Raspberry
个人笔记
在线工具
关于
宝塔 Linux 面板配置计划任务
后端,PHP
2022-02-19
暂无评论
背景
如果在宝塔直接配置命令,默认是使用 root 权限执行的,如果执行的脚本是框架内的命令会导致 log 文件权限有改变,使项目不稳定,出现一些 permission denied 类似错误, Laravel Thinkphp 框架均有影响。
正确的姿势是使用 www 账号执行命令。
命令笔记
su -c "cd /www/wwwroot/xxx && /www/server/php/73/bin/php think clean_job" -s /bin/sh www
Linux curl 测速笔记
Linux,运维
2022-02-19
暂无评论
背景
测试服务器与目标接口直接的耗时,一般没有图形化工具,这时候就需要用 curl 命令来测试了
命令笔记
测试服务器与目标接口之间耗时
curl -o /dev/null -s -w 'DNS:%{time_namelookup}\nConnect:%{time_connect}\nStart:%{time_starttransfer}\nTotal:%{time_total}\nSpeed:%{speed_download} byte/s' https://myip.ipip.net/
curl with HTTP proxy (使用HTTP代理)
curl -o /dev/null -s -w 'DNS:%{time_namelookup}\nConnect:%{time_connect}\nStart:%{time_starttransfer}\nTotal:%{time_total}\nSpeed:%{speed_download} byte/s' -x 120.25.xxx.xx:59394 https://myip.ipip.net/
测试服务器与 HTTP proxy 是否连通,如果是通的,会显示 proxy IP
curl -x 120.25.xxx.xx:59394 https://myip.ipip.net/
Response 字段含义
DNS:0.030
Connect:0.064
Start:0.398
Total:0.398
Speed:175.000 byte/s
time_connect 建立到服务器的 TCP 连接所用的时间
time_starttransfer 在发出请求之后,Web 服务器返回数据的第一个字节所用的时间
time_total 完成请求所用的时间
time_namelookup DNS解析时间,从请求开始到DNS解析完毕所用时间(记得关掉 Linux 的 nscd 的服务测试)
speed_download 下载速度,单位-字节每秒。
Debugging Tips: HttpServletRequest 中获取所有参数
后端,Java
2021-07-19
暂无评论
起因
业务需要跟第三方厂商进行 OAuth 对接,在开发者平台有个授权页面,授权之后如果成功就会拿到 accessToken,问题就出在获取的时候失败了。
过程
获取 Token 报错,首先检查入参是否有问题,OAuth 工程是用的 spring security,记录日志用了 AOP 去实现的,但是切入有点靠后,记录的都是成功的完整参数,所以查看日志就没用了。
通过查看源码找到了原始入参在这里,先在本地构造个参数缺失请求,自己打印下 request 内容找找看,通过 IDEA 可以查看到内容。
package org.springframework.security.oauth2.provider.client;
public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response)
throws AuthenticationException, IOException, ServletException {
继续上生产环境把 Arthas 挂上,开始抓入参,启动 Arthas 用启动 JVM 同一个用户才可以。
获取 HttpServletRequest 所有参数用到的方法:
request.getParameterMap();
request.getParameterNames();
前置操作都准备好了,上生产抓参数命令:
watch org.springframework.security.oauth2.provider.client.ClientCredentialsTokenEndpointFilter attemptAuthentication 'params[0].getParameterMap()' -x 3
再次触发请求,抓到入参如下,发现是缺少 client_secret 参数,到这为止就清楚问题所在了。
总结
IDEA 中 debug 查看 request 的 parameter 姿势
request->request->request->request->request->coyoteRequest->parameters->paramHashValues
request->request->request->request->request->inputStream->ib->coyoteRequest->parameters->paramHashValues
AOP 打印日志不能太靠后,这样导致失败请求都无法记录,无法快速重现定位问题。
HttpServletRequest 中每个方法的注释需要去过一遍,留点记忆。
《码农翻身》读书笔记
个人笔记
2020-05-04
暂无评论
前言
五一假期期间在家休息,把《码农翻身》二刷了一遍,之前很久也看过一遍但是刷第二遍还是有很大的收获,特别是 Java 技术栈相关的部分,有些话都是作者的一些经验总结,感觉很有必要摘录下来细品一番。
摘录
CPU
CPU 必须把数据装载到寄存器中才能进行运算
CPU 的运行速度快的丧心病狂,但是它能做的事情却简单得令人发指,主要有以下4种:
(1) 从内存的某个格子中读取数据,放入自己内部的寄存器 Rx
(2) 把 Rx 中的数据写入内存的某个格子中(会覆盖原有的数据)
(3) 进行数学计算和逻辑运算
(4) 根据条件进行跳转
对于那些大神级别程序员来说,汇编语言也是小菜一碟。Ken Thompson 和 Dennis Ritchie 不就用汇编语言写了第一版的 UNIX 操作系统吗?求伯君不就用汇编语言写了 WPS 吗?
Java注解
元注解:可以认为是注解的注解
@Target 表示该注解的应用目标,可以是类、方法、方法参数等;
@Retention 表示这个注解要保留到什么时候,可以只在源码中,或者在 .class 文件中,或者在运行时。
对于 @Controller @RequestMapping @Transactional 这样的注解,大家更喜欢和 Java 方法写在一起,显得简单而直观。
泛型
Java 泛型的限定符还支持 super,Comparable 应该写成 Comparable <? super T?>
协议
计算机所有问题都可以通过增加一个中间层来解决
Java JNI(Java Native Interface),可以用C语言来实现,然后在Java中封装一下。
Spring 的本质
我们在进行软件系统设计的时候,一项非常重要的工作就是把一个大系统按业务功能分解成一个个低耦合、高内聚的模块,分而治之。
什么是框架
  先学了 Java SE,把集合、线程、反射、I/O、泛型、注解之类的基础知识学了一遍。
  你如果对Java后端感兴趣,那还有更多东西可学。用框架实现了业务只是很小一方面,还有系统架构设计、缓存、性能、高可用性、分布式、安全、备份等很多内容。你学得越多,就会发现无知的领域更多,所谓学无止境,就是如此。
HTTP Server
我这样的英语水平,这几十页的英文 HTTP 协议我不吃、不喝、不睡两天也看不完。死猪不怕开水烫,慢慢磨吧。
Build 的演进之路
  大部分人只会抱怨项目很无趣,没有挑战,遇到问题也只会安于现状。只有少数人会发现工作中的“痛点”,并且真正动手解决它,给公司带来价值。这是提高自己,让自己和别人区分开来的重要方法。
再见!Bug
  每个程序员都梦想从头写一个东西,不愿意读别人的代码,甚至同行相轻,瞧不起别人的代码。但实际情况是,自己重写一遍,不见得比现在已经运行的代码好到那里去,甚至更差!除非你了解了所有的细节,用大量的时间仔细规划、小心编程,但是现实中哪有时间让你这么玩啊?
让人怀疑的C语言
  由于太底层,刚接触计算机的学生也不能写出操作系统、数据库、中间件等系统级软件,哪怕写一个简单的、粗糙的软件也难。只能写一点与数据结构相关的小程序,再加上被指针不断地“蹂躏璀璨”,很容易丧失斗志。
  其实学习是一个螺旋上升的过程,在这个上升的过程中,成就感很重要,直接决定了一个人能不能继续学习下去。我在刚学习C语言的过程中就因为没有成就感,差点放弃了。
  通常来说,带图形界面的程序容易激发成就感。所以,我认为C语言不太适合入门。虽然C语言不适合入门,但还是应该学习一下,因为C语言太贴近硬件了,能帮助你理解程序在机器层面到底是怎么工作的。
  想想看,自己用C语言写一个小的Web服务器、简单的数据库、简单的分布式文件管理系统,是不是也很酷?更重要的是,系统级编程博大精深,并且非常稳定,值得深入研究,成为专家。
赖以谋生的Java
《Effective Java》
《Java 编程思想》
《Java 核心技术》
《深入Java虚拟机》
《深入理解Java虚拟机》
  不仅看书,还去读 JUnit源码、Spring 源码、Hsqldb源码、Jive 源码,再加上工作中写的大量代码,终于可以得心应手地使用 Java 编程了。
  后来我明白了,Java 最适合的还是后端编程,别让它干那些它不想干也干不好的事情,如桌面编程。
  后端编程还有很多事情需要处理,像负载均衡、灾难恢复、缓存、消息、分布式、数据备份、搜索等。后端的技术还是相对稳定的,这些知识介于业务层和系统层之间,值得发掘和积累。
  很多时候用 Java 解决一个问题,基本上就只有那么一种方案,照着规矩做就是了。Java 本身的特点也适合大型项目的合作开发。
优雅的Ruby
  动态语言由于缺乏静态检查,所以只好把运行时的检查写好,这就是单元测试。对 Ruby 来说,测试代码量和业务代码量 1:1 是非常正常的事情,有的甚至是 2:1,动态语言都有这样的劣势,但我们主要还是要利用它们的优点,让我们的编程生活更加舒适,不是吗?
老司机的精进
  凡事必先骑上虎背,有了问题的引导,你会疯狂地学习,迅速地提升自己。
  对于性格内向的程序员,很多时候你认为基本准备好了其实就够了,凡事必先骑上虎背,勇敢地迈出去,努力地争取一下,你就会发现自己登上了更高一层的台阶。
好奇心
  对于程序员,如果你看到新技术、新产品没有像小孩看到新玩具那样两眼放光,没有立刻在自己电脑上试试的冲动,你就需要仔细考虑一下是否真的对软件开发有兴趣。如果根本没兴趣,那不要浪费时间,还是趁早转行,有更多适合你的职业在等着你。
  没有好奇心,就不愿意学习新技术。一名架构师,如果没有对技术的敏感度和前瞻性,一直抱着一套技术架构不变,估计很快就会被淘汰。所以对技术的好奇心/兴趣是一切的基础。
  很多人会语法,也懂框架,但是在基本功上却不过关,因而只能在初级程序员上踏步。
  这个基本功的训练就是数据结构和算法,我的经验是多做习题,让这种思维在脑子里固化,以后的编程就可以信手拈来了。
透彻理解技术的本质
只是学会使用是不行的,不但要知道 How,还要知道 Why。
停下来,思考,才是进步的本质。
写出漂亮的代码并不容易
需要思路清晰
有良好的编程基础
有优秀的抽象能力
对一门语言的熟练掌握
学习Java开发的可以思考一下为什么 Spring 有 Controller、ViewResolver 这样的概念?
技术领导力
  要用技术的影响力来领导人,而不是威权和职位。换句话说,就是要能让技术人员服你。有了技术影响力,你在团队里发出的声音才会被倾听、被尊重。但影响力不是很快就建成的,这是一个漫长的过程:你解决了一道技术难题,你提出的方案被证明可行……
对自己狠一点,开始写作吧
  如果你们把一门技术通俗易懂地给别人讲明白,那就说明你已经掌握了。这种“转教别人(Tech others)”的方法属于主动学习,效率是最高的。但是在工作和生活当中,你是很少有机会去给别人讲授的。既然没法给别人讲,那就退而求其次吧,把自己的理解写出来。
  有人可能要问了:我也可以按照这个思路去学习,为什么要写下来呢?原因很简单,不写出来,很容易放弃深度思考。你会觉得,我已经知道是怎么回事儿了————其实一些关键的细节被大脑给忽略了。
  我们已经进入了一个碎片化的时代,我们的大脑已经养成了碎片化文化的习惯,一天不看碎片化的信息就觉得不舒服,这样下去会慢慢地丧失深度思考的能力。写作会逼着你思考,梳理知识体系,防止自己被碎片化所填满。
好的程序员都是代码喂出来的,动手实践必不可少,所以我还经常写代码。
优秀和平庸的差别可能就是那一点点坚持吧!坚持不懈地做一件事,每天前进一点点,最后量变会发生质变。
Java 静态(static)方法读取 Nacos 配置中心
后端,Java
2020-03-19
2 条评论
为了降成本节省服务器资源,需要将配置中心从 Apollo 切换到 Nacos,因为注册中心是 Nacos 直接复用集群即可。
问题描述
util 里面获取配置的方法都是 static 静态方法,这就导致了 @Value 根本获取不到 Nacos 里面的配置,所有都改成非静态方法改动很大,很不实际,对调用方很不友好。
尝试过程
查了很多关于Nacos 获取配置中心的资料,资料都很浅显,都是在一个 controller 里面获取,关于静态方法获取的资料找到篇是用 @PostConstruct 注解一个方法将变量赋值给一个 static 变量,这种方法还真行,不过缺点很明显,参数只会在进程启动的时候加载进去,配置中心修改之后并不会生效,需要重启进程才会生效,没有什么价值。
解决方案
试了很多方案都行不通,于是请教组内老司机帮忙协助,在静态方法用 SpringBeanUtil.getBean(AppConfig.class) 这个方法先实例化 bean,然后用 bean 去调用里面的动态方法,是的,获取配置里面的方法还是换成了动态的,这样才方便获取到 @Value 的值,但是用来给业务层调用的方法依然是 static,对业务层调用无影响。
Nacos 配置中心接入流程梳理
官方文档:https://nacos.io/zh-cn/docs/quick-start-spring-cloud.html
- 阅读全文 -
友情链接
酷壳 – CoolShell.cn
韩天峰(Rango)的博客
风雪之隅
信海龙的博客
架构师于元大
鞠老师的 Blog
郑晓_个人博客
PHP--海滨
鲁ICP备16002281号
随机文章
PHP大神的十大优良习惯CentOS禁止ping以及开启ping的方法PHP中使用cURL实现Get和Post请求的方法Centos设置网络连接Linux(Ubuntu CentOS) 安装 Java JDKApache Kafka 安装步骤根据两点间的经纬度计算距离docker 清理 /var/lib/docker/aufs 目录记一次 Laravel MethodNotAllowedHttpException 问题排查Linux 平台安装 MongoDB
热门标签
PHPmysqlcurlswoole采集javascriptwampwindowssublimenginxhtml提取页面正则爬虫http状态码gitiiswin2003linuxsession