关于轻量云服务器端口的踩坑记录
先说结论:(腾讯云)轻量云服务器的端口放行必须要在(腾讯云)服务器控制台放行,在其它地方使用命令放行是无法生效的!
由于我之前一直的在控制台放行的,所以没注意到这个问题,最近使用命令放行时才注意到这个问题。
下面直接看我的实际测试吧:
查看防火墙开放端口,可以看到15672是开放的:
然后我们访问15672端口,发现是不能访问的:
进一步测试,直接关闭防火墙:
然后去腾讯云控制台开放端口:
再次访问,可以成功访问:
淘宝(原) npm 域名即将停止服务!
正如在《淘宝 NPM 镜像站喊你切换新域名啦》 中预告的那样:
http://npm.taobao.org 和 http://registry.npm.taobao.org 将在 2022.05.31号停止服务。
域名切换规则:
http://npm.taobao.org => http://npmmirror.com
http://registry.npm.taobao.org => http://registry.npmmirror.com
因此,有强依赖老域名的各位开发者请尽快更新到新域名,可能受到的影响和处理方式:
企业用户需要联系 网管/IT/SRE 更新防火墙白名单。
存量应用的 lock 文件,开发者需要自行执行 sed 等指令去替换或重新生成。
本地 npmrc 里面的 registry 地址(如果有,则)需要开发者自行更新。
开发者自己的 CL 工具 或 平台应用 里面写死的地址,需开发者自己更新并部署。
cnpm cli / nrm 等工具,对应的社区同学已经提 PR 更新,大家重新安装最新版本即可。(如发现遗漏麻烦知会下我们)
BTW:我们新的 ...
轮询、长轮询、长连接、WebSocket
前言实现即时通讯常见的有四种方式,分别是:轮询、长轮询(comet)、长连接(SSE)、WebSocket。
轮询很多网站为了实现推送技术,所用的技术都是轮询。轮询是在特定的的时间间隔(如每1秒),由客户端浏览器对服务器发出HTTP请求,然后由服务器返回最新的数据给客户端的浏览器。
优点:后端编码比较简单缺点:这种传统的模式带来很明显的缺点,即客户端的浏览器需要不断的向服务器发出请求,然而HTTP请求可能包含较长的头部,其中真正有效的数据可能只是很小的一部分,显然这样会浪费很多的带宽等资源。
长轮询客户端向发起一个到服务端的请求,然后服务端一直保持连接打开,直到数据发送到客户端为止。
优点:避免了服务端在没有信息更新时的频繁请求,节省流量
缺点:服务器一直保持连接会消耗资源,需要同时维护多个线程,而服务器所能承载的 TCP 连接是有上限的,所以这种轮询很容易导致连接上限。
长连接客户端和服务端建立连接后不进行断开,之后客户端再次访问这个服务端上的内容时,继续使用这一条连接通道
优点:消息即时到达,不发无用请求
缺点:与长轮询一样,服务器一直保持连接是会消耗资源的,如果有大量的长连接 ...
WebSocket
前言名词解释HTTP:HTTP是应用层协议(在传输层使用 TCP,在网络层使用 IP 协议),是一种无状态(即每个请求都是一个新的请求)、无连接(每次连接只处理一个请求)协议,但是HTTP仍然可以借助Cookie(客户端数据储存)和Session(服务端数据储存)实现长连接(HTTP的长连接需要在请求头中加入Connection:keep-alive )。整个通信过程,客户端(浏览器)向服务端发送请求,服务端接收请求并返回响应信息。
Socket:与HTTP不一样,Socket不是一种协议,而是传输层的一种接口((应用程序与网络协议栈进行交互的接口),它是对 TCP/IP 协议的封装。
WebSocket:WebSocket和HTTP一样是应用层的协议。但是WebSocket是一种双向通信协议,是一种有状态协议。在WebSocket中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。
长连接:
建立连接后不管是否使用,都保持TCP连接。但是长连接并不是永久连接。如果一段时间(可以在请求头中设置)内未发送请求,连接仍会断开。
过程:建立连接– ...
MyBatis拦截器
前言Mybatis拦截器注解的基本写法格式为:
123@Intercepts({ @Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class})})
说明:@Intercepts:标识该类是一个拦截器@Signature:拦截器相关属性设置
type拦截器的类型,总共有4种,按照执行的先后顺序为:
Executor:拦截执行器的方法。
ParameterHandler:拦截参数的处理。
ResultHandler:拦截结果集的处理。
StatementHandler:拦截Sql语法构建的处理,绝大部分我们是在这里设置我们的拦截器。
method可被拦截的方法,按照拦截器的不同类型,总共有下面这些方法:
拦截的类型
拦截的方法
Executor
update, query, flushStatements, commit, rollback,getTransaction ...
统一异常处理及返回结果
前言简单回顾下异常分类:
非受检异常:运行时异常
受检异常:编译时异常
异常的处理通常有两种方式:
第一种就是在当前类使用try-catch捕获异常并直接处理
另一种就是不在当前类处理,使用throws抛给上一级处理
如果在每个异常处都进行try-catch处理的话,无疑会造成代码的臃肿,且不够美观。所以,一般来说除非的必须在在当前类处理的异常,否则都会向上抛出,直到抛到controller层为止,在controller层进行统一的异常处理(不处理的话,再往上抛就抛到前端去了)。
统一进行异常处理的常见方式有两种:1. 使用注解 或者 2. 使用(AOP)拦截器
统一返回结果既然要统一进行异常处理了,自然需要统一下数据结果的返回格式,这里建议使用一个实体类进行处理,更加的可控易于管理修改。在实体类中对数据的返回格式进行下规范:
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263import io. ...
Java Stream流
前言
与IO流的 Input/Output Stream 不同,Stream 流操作是一个单向的数据处理操作,它不负责数据的储存。可以将Stream流看做是对集合操作功能的增强,可以对集合的各种高效、便利的聚合操作( 类似SQL语句一样的操作, 比如filter,map,sorted等)。同时配合Lambda表达式,极大的提升代码的优雅度。Stream流不同于其他集合框架,它也不是某种数据结构,它并不会存储元素,而是按需计算,这让它使用起来更像一个高级的迭代器。Stream不会改变数据源,通常情况下会产生一个新的集合或一个值。
一个标准的Stream流流程:
数据源(创建流) -> 数据处理 / 转换(中间操作) -> 结果处理(终端操作)
中间操作会再次返回一个流,所以我们可以链接多个中间操作;终端操作是对流操作的一个结束动作,一般返回 void或者一个非流的结果。Stream流具有延迟执行特性,也就是说中间操作不会立即执行,只有调用终端操作的时候,流才会开始中间操作(遍历、映射、过滤等)。并且Stream流提供了并行操作方式,在使用并行计算方式时数据会被自动分解 ...
Lambda表达式
基本用法Lambda表达式本质:用作接口的实现(其实就是把之前实现接口的步骤简化了)。接口必须是函数式接口
一句话说明函数式接口:接口只有一个抽象方法函数式接口可以使用@FunctionalInterface注解进行校验,非函数式接口使用此注解会报错
-> :Lambda操作符->的左边:Lambda形参列表(即抽象方法中的形参列表)->的右边:Lambda体(即重写后的抽象方法体)格式:
1234567 <函数式接口> <变量名> = (参数1, 参数2...) -> { //方法体 }; // 或者 <函数式接口> <变量名> = (参数1, 参数2...) -> 表达式;
参数个数可为0至n个。多个参数需要用逗号,——分割。当参数个数为1时,括号可省略;当参数个数为0时,括号不可省略;参数前可以不加参数类型(不加会自动推导)。
Lambda 体,可以是一个表达式,也可以是语句块;如果是多条语句,需要使用大括号{}包裹;如果只有一条语句则可省 ...
Java将文件下载至浏览器
IO流示例:Java下载网络资源文件到浏览器
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263 public void toDownload(HttpServletResponse response, HttpServletRequest request){ ServletOutputStream outputStream = null; InputStream inputStream = null; try { // 下载地址 String downloadUrl = "https://app.nlark.com/yuque-desktop/1.1.4/Yuque-1.1.4.exe"; // 获取文件后缀名(如果可以获取到的话,不能获取到的话就直接 ...
跨域网络资源文件下载
问题正常情况下是无法发送跨域请求下载文件的。以下载语雀为例:可以看到直接访问下载地址会报跨域错误
解决这个时候我们就可以通过nginx配置代理转发请求完成下载:
123location ^~ /yuque/ { proxy_pass https://app.nlark.com/yuque-desktop/;}
说明:当我们像本地发送/yuque/的请求时,nginx会转发请求(注意:末尾必须要加/不然就是代理请求,加了后才是转发请求),会将/yuque/转发成下面的https://app.nlark.com/yuque-desktop/
然后我们重新写下载请求:
123var xhr = new XMLHttpRequest();xhr.open("GET", "/yuque/1.1.4/Yuque-1.1.4.exe", true);xhr.send();
这次我们不直接访问语雀下载地址了,而是访问我们的本地地址,然后nginx会将我们的请求进行转发,将/yuque/转发为https://app.nlark.c ...