Caddy超越Nginx,下一代Web服务器?
Nginx是一款非常流行的Web服务器,在Github上已有16K+Star,我们经常用它来做静态资源托管或反向代理。最近发现了一款全新的Web服务器Caddy,Star数超越Nginx,标星38K+Star。试用了一下Caddy,发现它使用起来比Nginx优雅多了,功能也很强大,推荐给大家!
项目地址:https://github.com/caddyserver/caddy官方文档:https://caddyserver.com/
简介Caddy是一款功能强大,扩展性高的Web服务器,目前在Github上已有38K+Star。Caddy采用Go语言编写,可用于静态资源托管和反向代理。
Caddy具有如下主要特性:
对比Nginx复杂的配置,其独创的Caddyfile配置非常简单;
可以通过其提供的Admin API实现动态修改配置;
默认支持自动化HTTPS配置,能自动申请HTTPS证书并进行配置;
能够扩展到数以万计的站点;
可以在任意地方执行,没有额外的依赖;
采用Go语言编写,内存安全更有保证。
安装首先我们直接在CentOS 8上安装Caddy,使用DNF工具安装无 ...
Supervisor安装与配置
简介Supervisor(http://supervisord.org/ )是用Python开发的一个client/server服务,是Linux/Unix系统下的一个进程管理工具,不支持Windows系统。它可以很方便的监听、启动、停止、重启一个或多个进程。用Supervisor管理的进程,当一个进程意外被杀死,supervisort监听到进程死后,会自动将它重新拉起,很方便的做到进程自动恢复的功能,不再需要自己写shell脚本来控制。
因为Supervisor是Python开发的,安装前先检查一下系统否安装了Python2.4以上版本。下面以CentOS7,Python2.7版本环境下,介绍Supervisor的安装与配置步聚。
supervisor 安装yum install epel-release yum install python-pippip install supervisor
supervisor安装完成后会生成三个执行程序:supervisortd、supervisorctl、echo_supervisord_conf,分别是supervisor的守护进 ...
实战 ELK 优雅管理服务器日志
简介在后端开发日常工作中,定位排查问题或是了解系统某些方面的情况时,会遇到以下的场景:
查询接口请求的日志。
查询服务的日志。
统计接口的每日调用数量以及时间分布。
统计接口每日的用户数量。
ELK(Elasticsearch + Logstash + Kibana)平台很好的完成了上述工作,并且提供了友好便利的用户界面,普遍应用于生产日志的查询分析中。ELK一句话概括:用Logstash收集日志或者数据到Elasticsearch存储起来并建立相关索引,再利用Kibana查询界面到Elasticsearch上提供的索引进行查询和统计。
Logstash
Logstash 主要用于收集服务器日志,它是一个开源数据收集引擎,具有实时管道功能。Logstash可以动态地将来自不同数据源的数据统一起来,并将数据标准化到所选择的目的地。
Logstash 收集数据的过程主要分为以下三个部分:
输入(input):数据往往都是以不同的形式、格式存储在不同的系统中,而Logstash支持从多种数据源中收集数据(File、Syslog、MySQL、消息中间件等等)。
过滤器(filt ...
用好SpringBoot内置工具类
断言
断言是一个逻辑判断,用于检查不应该发生的情况
Assert 关键字在 JDK1.4 中引入,可通过 JVM 参数-enableassertions开启
SpringBoot 中提供了 Assert 断言工具类,通常用于数据合法性检查
// 要求参数 object 必须为非空(Not Null),否则抛出异常,不予放行// 参数 message 参数用于定制异常信息。void notNull(Object object, String message)// 要求参数必须空(Null),否则抛出异常,不予『放行』。// 和 notNull() 方法断言规则相反void isNull(Object object, String message)// 要求参数必须为真(True),否则抛出异常,不予『放行』。void isTrue(boolean expression, String message)// 要求参数(List/Set)必须非空(Not Empty),否则抛出异常,不予放行void notEmpty(Collection collection, String messag ...
限流组件设计实战
为什么要限流互联网系统通常都要面对高并发请求(如秒杀、抢购等),难免会对后端服务造成高压力,严重甚至会导致系统宕机。为避免这种问题通常会添加限流、降级、熔断等能力,从而使系统更为健壮。
Java领域常见的开源组件有Netflix的hystrix,阿里系开源的sentinel(以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性)等,都是蛮不错的限流熔断框架。
限流维度QPS和连接数控制设定IP维度的限流,也可以设置基于单个服务器的限流。在真实环境中通常会设置多个维度的限流规则,比如设定同一个IP每秒访问频率小于10,连接数小于5,再设定每台机器QPS最高1000,连接数最大保持200。
小知识:
吞吐量(TPS):指系统在单位时间内处理请求的数量。
QPS 每秒查询率(Query Per Second):对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准(类似于TPS,只是应用于特定场景的吞吐量)。
传输速率有的网站在这方面的限流逻辑做的更细致,比如普通注册用户下载速度为100k/s,购买会员后是10M/s,这背后就是基于 ...
Druid监控统计数据源
Druid 简介Druid 首先是一个数据库连接池,但它不仅仅是一个数据库连接池,还包含了一个 ProxyDriver,一系列内置的 JDBC 组件库(可以让程序员实现一些特殊的需求),一个 SQL Parser。在 Java 的世界中 Druid 是监控做的最好的数据库连接池,在功能、性能、扩展性方面,也有不错的表现
Druid 可以做什么?
数据库密码加密。直接把数据库密码写在配置文件中,这是不好的行为,容易导致安全问题,DruidDruiver 和 DruidDataSource 都支持 PasswordCallback。
替换其他 Java 连接池,Druid 提供了一个高效、功能强大、可扩展性好的数据库连接池。 可以监控数据库访问性能,Druid 内置提供了一个功能强大的 StatFilter 插件,能够详细统计 SQL 的执行性能,这对于线上分析数据库访问性能有很大帮助。
SQL 执行日志,Druid 提供了不同的 LogFilter,能够支持 Common-Logging、Log4j 和 JdkLog,可以按需要选择相应的 LogFilter,监控应用的数据库访问情 ...
几行事务代码,让我赔了16万
前几天在某平台看到一个技术问题,很有意思啊。涉及到的两个技术点,大家平时开发使用的也比较多,但是属于一个小细节,深挖下去,还是有点意思的。
来,先带你看一下问题是什么,同时给你解读一下这个问题,首先,这位同学给出了一个代码片段:
他说他有一个 func 方法,这个方法里面干了两件事:
1.先查询数据库里面的商品库存。
2.如果还有库存,那么对库存进行减一操作,模拟商品卖出。
对于第二件事,提问的同学其实写了两个操作在里面,所以我再细分一下:
2.1 对库存进行减一操作。
2.2 在订单表插入订单数据。
很显然,这两个操作都会对数据库进行操作,且应该是原子性的操作。所以,在方法上加了一个@Transactional注解。
接着,为了解决并发访问的问题,他用 lock 把整个代码包裹了起来,保证在单体结构下,同一时刻只有一个请求能去执行减少库存,生成订单的操作。非常的完美。
首先,先把大前提申明一下:MySQL数据库的隔离机制使用的是可重复读级别。
这个时候,问题就来了。
如果是高并发的情况下,假设真的就有多个线程同时调用func方法。要保证一定不能出现超卖的情况,那么 ...
Java 实现人脸识别功能
环境准备
本地配置:
配置环境(推荐jdk8,mysql5.7,maven3,idea)
引擎库libarcsoft_face、libarcsoft_face_engine、libarcsoft_face_engine_jni。把dll或so文件拷贝到java.library.path所包含的路径下,注意区分X86和X64,和当前jdk版本一致。
人脸识别SDK人脸识别技术是很复杂的,自己用Java手撕一个识别算法有点不切实际,毕竟实力不允许我这么嚣张,还是借助三方的SDK吧!
找了一圈发现一个免费的人脸识别SDK: ArcSoft,地址:https://ai.arcsoft.com.cn。
官网首页 -> 右上角开发者中心 -> 选择“人脸识别” -> 添加SDK,会生成APPID、SDK KEY后续会用到,根据需要选择不同的环境(本文基于windows环境),然后下载SDK是一个压缩包。
Java项目搭建
下载demo项目
github地址:https://github.com/xinzhfiu/ArcSoftFaceDemo,本地搭建数据库,创建表: ...
如何校验两个文件内容是否相同
今天做文件上传功能,需求要求文件内容相同不能重复上传。感觉这个需求挺简单的就交给了一位刚入行的新同学。等合并代码的时候发现这位同学居然用文件名称相同和文件大小相同作为两个文件相同的依据。这种条件判断可靠吗?
从概率上来说遇到两个文件名称和大小都一样的概率确实太小了。这种判断放在生产环境中也可以稳定的跑上一阵子,不过即使再低的可能性也是有可能的,如果能做到100%就好了。
文件摘要校验我相信同学们都下载过一些好心人开发的小工具,有些小工具会附带一个校验器让你校验附带提供的checksum值,防止有人恶意篡改小工具,保证小工具可以放心使用。
如果两个文件的内容相同,那么它们的摘要应该是相同的。这个原理能不能帮助我们鉴定两个文件是否相同呢?
Java实现文件摘要/** * 提取文件 checksum * * @param path 文件全路径 * @param algorithm 算法名 例如 MD5、SHA-1、SHA-256等 * @return checksum * @throws NoSuchAlgorithmException the no such algori ...
别再说不会解决 "跨域" 问题啦
什么是“跨源”其实我们平常说的跨域是一种狭义的请求场景,简单来说就是“跨“过浏览器的同源策略去请求资“源”,所以我们叫它“跨源”也没啥问题。那么“跨源”,源是什么? 浏览器的同源策略什么是同源?
const url = 'https://www.google.com:3000'
比如上面的这个 URL,协议是:https,域名是 www.google.com,端口是 3000。不同源了会怎么样?会有很多限制,比如:
Cookie,LocalStorage,IndexDB 等存储性内容无法读取
DOM 节点无法访问
Ajax 请求发出去了,但是响应被浏览器拦截了
为什么要搞个这么个东西来限制?基于安全考虑,没有它,可能会遇到:
Cookie劫持,被恶意网站窃取数据
更容易受到 XSS,CSRF 攻击
无法隔离潜在恶意文件
… …
所以得有。正是因为浏览器同源策略的存在,Ajax请求有可能在发出去后就被拦截了,它还会给你报个错:
✘ Access to XMLHttpRequest at 'xxx' from origin ...