
服务器
文章平均质量分 83
ssehs
对知识的有效整理
目标是否有价值
过程是否有方法
结果是否有指标
理论联系实际
实事求是
勇于实践
对比预期
动脑思考
发现问题
总结规律
改进实践
技术是一种思想
技术是一种生产力
技术没有银弹
展开
-
graalvm+spring-cloud-gateway打造又快又小的类nginx本地网关
java本地网关原创 2023-01-14 22:30:29 · 1476 阅读 · 6 评论 -
springboot-集成flink最佳实践和打包部署
spring-boot集成flink原创 2022-11-27 21:01:06 · 6291 阅读 · 1 评论 -
project-reactor-常见问题汇总
reactor常见问题原创 2022-11-25 20:29:10 · 1080 阅读 · 1 评论 -
mybatis-使用拦截器实现审计功能
前言后台开发中,一般的业务表都有创建人,创建时间,修改人,修改时间等业务字段,这些业务字段的值没有特别的逻辑,只是对当时的操作人和操作时间的一个记录。如果每个表格的增删改查,都去修改的这些值的话,难免会影响主业务逻辑的阅读。那么有没有一个统计的方法,自动地去赋予这些值,而不用在业务代码上进行干预呢?JPA也提供了类似的审计功能。拦截器思路就是使用mybatis拦截器,每次和数据库通信前,在拦截器中自动赋予这些值。使用注解标记字段spring data中定义几个注解,来表明一个字段是需要审计的原创 2022-04-08 04:00:00 · 2558 阅读 · 0 评论 -
spring-prometheus的指标含义
前言spring-boot作为一个长时间运行的服务,需要也应该能采集到一些指标来反映系统自身的运行状态。下面就spring-boot输出的一些指标分类说明。依赖spring-boot开启指标采集需要加入prometheus依赖。指标处理nametypedatahttp_server_requests_secondssummaryhttp_server_requests_seconds_count{exception=“None”,method=“GET”,outcome=原创 2022-04-05 17:02:27 · 10289 阅读 · 0 评论 -
webflux-如何使用netty处理请求
前言不知道从哪个版本起,spring推出了webflux框架,内置netty处理http请求,代替原有的tomcat内置服务器。那么webflux的基本概念和原理又是什么呢?阅读源码的一般方法准备源码从spring initializr创建样板项目,并添加如下依赖。implementation 'org.springframework.boot:spring-boot-starter-actuator'implementation 'org.springframework.cloud:spr原创 2022-02-08 22:12:14 · 2827 阅读 · 0 评论 -
java-进程和线程原理及应用
前言进程和线程作为操作系统的基本对象,理解它们有助于更好的编写可靠高效的代码。进程一个程序在操作系统中执行后,运行起来的单元就是进程。一个程序可以多次执行,运行出多个进程。比如google浏览器,每次执行都会打开一个进程,这个进程为用户提供浏览网页服务。线程操作系统最小的执行单元,也是操作系统任务调度的最小单元。线程的创建new,Runnable,ExecutorService线程的信息线程的信息可以通过java.lang.Thread类获取。线程的优先级线程是由操作系统调度的,而操作原创 2022-02-06 21:03:21 · 3744 阅读 · 0 评论 -
mysql-怎样处理未来生效或失效的数据
前言有些数据需要到未来某个时刻生效或失效,比如双十二的价格,这些数据会提前存在业务表中,之后不断用定时任务去扫描这些数据,如果存在要生效或失效的,就取出来处理。简单来说,就是定时用sql来查询这些数据。另外,也可以用redis存储这些数据,定时去redis取这些数据。sql扫描给时间字段添加索引,提高sql查询的效率。alter table XXX add index idx_time_field (time_field)如果数据量特别大的话,建议分页查询,避免一次查询把内存撑爆。select原创 2022-02-06 19:12:44 · 549 阅读 · 0 评论 -
java-限流算法
前言由于服务器资源的有限性,需要对请求的速度以及数量做限制,防止过多的请求导致服务器崩溃。一旦服务器接收请求的数量超过给定最大值或请求的速度大于服务器处理的速度,应当主动拒绝掉这些请求,来保证服务器自身的健康和稳定。单机版限流单机版限流就是对单个服务做限流。目前用得比较多的就是guava的RateLimiter限流算法了,一起看看吧。guava继承关系图guava的关系比较简单限流器可睡眠的计时器普通计时器滴答器用于获取当前时间组合关系图一把锁和一个睡眠计时器。流程图原创 2021-11-28 19:46:13 · 931 阅读 · 0 评论 -
spring-security的基本概念和原理
前言Servlet安全性:宏观视图本节讨论基于Servlet的应用程序中的Spring Security高层架构。我们在引用的“身份验证、授权、防止攻击保护”部分中构建这种高层次的理解。Filters的回顾Spring Security的Servlet支持基于Servlet Filter,因此首先了解Filter的作用是有帮助的。下图显示了单个HTTP请求的处理程序的典型分层。客户端向应用程序发送请求,容器创建一个FilterChain,其中包含Filter和Servlet,该Servlet应该原创 2021-06-14 21:35:04 · 674 阅读 · 0 评论 -
spring-验证、数据绑定和类型转换
前言数据填充将验证视为业务逻辑有利有弊,Spring为验证(和数据绑定)提供了一种不排除其中任何一种的设计。具体来说,验证不应该绑定到web层,而且应该易于本地化,而且应该可以插入任何可用的验证器。考虑到这些问题,Spring提供了一个Validator契约,它既基本又在应用程序的每一层都非常有用。数据绑定对于将用户输入动态绑定到应用程序的域模型(或用于处理用户输入的任何对象)非常有用。Spring提供了恰当命名的DataBinder来完成这一任务。Validator和DataBinder组成了val原创 2021-03-13 13:13:43 · 398 阅读 · 1 评论 -
spring-aop切面
前言切面(Aspect)是类(Class)的一个补充,两者正交互补,让spring的Ioc容器功能得到大大的增强。使用Spring进行面向方面的编程面向方面编程(AOP)是对面向对象编程(OOP)的补充,它提供了考虑程序结构的另一种方式。在OOP中模块化的关键单元是类,而在AOP中模块化的单元是方面。方面支持对跨多种类型和对象的关注点(如事务管理)进行模块化。(在AOP文献中,这种关注通常被称为“横切”关注。)Spring的一个关键组件是AOP框架。虽然Spring IoC容器不依赖于AOP(这意味原创 2021-02-17 22:02:41 · 1627 阅读 · 0 评论 -
redis-各种数据类型和类比
前言redis提供丰富的数据接口,那么这些数据结构可以类比jdk中的哪些数据结构呢?原创 2020-11-21 20:26:49 · 168 阅读 · 0 评论 -
mysql-一些常识
前言对软件系统的理解和认知,决定了开发者使用它们的高度,下面来简单聊聊关于mysql的一些常识。编码utf8mb4(most bytes 4)才是真正的utf8。时间戳修改字段为当前时间戳,需要用alter table change column语法。ALTER TABLE `table` CHANGE COLUMN `column` `column` DATETIME NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'comment';ALTER TABLE `原创 2020-11-08 12:04:55 · 195 阅读 · 0 评论 -
java-jdk中的工具使用介绍
前言原创 2020-11-08 12:01:11 · 681 阅读 · 0 评论 -
spring cloud-基本架构
前言spring cloud是把大的服务分解为小的服务,形成一个分布式的集群,各个服务之间相互依赖,由注册中心统一管理,网关统一发布,配置中心统一配置。总体形成以下的架构图:原创 2020-10-17 19:53:45 · 175 阅读 · 0 评论 -
redis-分布式锁的使用方法
前言但单机环境,锁的实现基本上是java的JUC框架和synchronized volatile等关键字。整个JUC框架包含了基本的抽象类(AQS)和锁的实现类(ReentrantLock)以及并发工具类(CountDownLatch、CyclicBarrier和Semaphore等),这些都为日常开发中对于过程同步问题提供了不少的便利。在分布式系统中,有些过程也需要同步,然后串行执行。那么有没有好用的框架可以提供这种便利性呢?答案是有的,那就是spring-integration的spring-inte原创 2020-10-17 19:51:31 · 334 阅读 · 2 评论 -
JPA-常见的优化点
前言JPA作为主流的持久层框架,被广大程序员所使用,基本的使用方法请参考JPA的常见用法。虽然JPA在编码上提供了很多的便利,但是其接口提供的插入数据的方法效率非常低,下面就简单介绍下效率低的原因和解决办法。save和saveAll方法单从方法签名来看,save方法用来插入单个数据,而saveAll方法插入多个数据。但是仔细看saveAll的方法实现,会发现saveAll里面是循环调用save方法来插入数据,所以很自然地以为saveAll和save方法插入数据的时间差不多。但是实际测试的结果却表明两者原创 2020-10-17 18:59:26 · 3080 阅读 · 1 评论 -
docker-部署logstach
前言logstach是一个采集日志的框架,本文介绍如何在docker上部署logstash系统。更多信息请参考官方文档。管道配置必须将管道配置放在Logstash可以找到的位置。默认情况下,容器将在/usr/share/logstash/pipeline/中查找管道配置文件。在本例中,我们使用绑定装载的卷通过docker run命令提供配置:docker run --rm -it -v ~/pipeline/:/usr/share/logstash/pipeline/ docker.elastic原创 2020-10-04 20:16:23 · 785 阅读 · 0 评论 -
docker-部署kibana
前言kibana是elasticsearch可视化工具,能够方便地使用elasticsearch的搜索数据,下面详细介绍如何使用docker安装kibana。更多信息请参考官方教程。拉取镜像docker pull docker.elastic.co/kibana/kibana:7.9.2在Docker上运行Kibana进行开发Kibana可以快速启动并连接到本地Elasticsearch容器用于开发或测试使用以下命令:docker run --link YOUR_ELASTICSEARCH_C原创 2020-10-04 20:15:46 · 1409 阅读 · 0 评论 -
docker-部署Elasticsearch
前言Elasticsearch是一款开源的搜索引擎框架,提供强大的搜索功能。下面简单介绍如何使用docker来部署Elasticsearch。更多信息请参考官方文档。原创 2020-10-04 20:15:21 · 843 阅读 · 1 评论 -
docker-部署filebeat
前言filebeat是一个轻量级的日志收集工具,相比logstash,功能更加单一,但是占用的资源较小,下面介绍如何使用docker来部署filebeat。更多信息请参考官方文档。拉取镜像docker pull docker.elastic.co/beats/filebeat:7.9.2运行Filebeat设置运行Filebeat设置命令将创建索引模式和负载可视化,指示板和机器学习工作。运行这个命令:docker run \docker.elastic.co/beats/filebeat:7原创 2020-10-04 17:40:02 · 4966 阅读 · 0 评论 -
wsl-常见问题
基于wsl2的docker如何迁移镜像文件默认基于wsl2的docker desktop的镜像是有wsl2管理的,而wsl2一般在c盘。当下载的镜像多了之后,就会把C盘爆满。具体解决方法参考:github解决方法。原创 2020-10-04 11:56:31 · 3370 阅读 · 1 评论 -
docker-日志文件
前言部署docker的服务器,好好的磁盘突然就满了。从根目录查看每个文件夹和文件大小,发现是/var/lib/docker/containers下的容器的日志文件占了大量的磁盘空间,单单一个容器的日志就占了40G的24G。使用du -sh *来查看当前目录的所有文件和文件夹大小配置docker单个容器的日志大小既然找到了原因,解决方法自然明确了:限制docker单个容器的日志文件大小。compose.yml文件配置定义日志文件的大小,参考官网。logging: driver:原创 2020-09-11 20:24:36 · 602 阅读 · 0 评论 -
jedis-事务和锁
前言通过使用事务,可以保证想要执行的多个命令要么全部被执行,要么一个都不执行。下面演示如何用jedis进行事务操作。样本代码直接开启事务开启并提交事务void testTransaction() { Transaction transaction = pool.getResource().multi() for (int i = 0; i < 100; i++) { transaction.set("transaction" + i, "transaction原创 2020-08-30 18:10:29 · 280 阅读 · 0 评论 -
jedis-pipeline批量操作
前言redis作为一个缓存服务器,每个命令都要经过网络才能到达服务器。而命令在网络传输的过程中必然消耗时间,如果命令在网络传输的时间和命令执行的时间在一个数量级(甚至更多)的话,会造成大量的无效时间浪费。为了解决这个问题,redis引入了pipeline的概念,即把多个命令打包一起发送服务器,然后把多个结果一起返回。下面演示如何使用jedis进行pipeline批量操作。样本代码单条发送void testNormal() { long s = System.currentTimeMillis原创 2020-08-29 17:38:34 · 1410 阅读 · 0 评论 -
spring-单元测试概要
前言原创 2020-08-19 10:09:48 · 220 阅读 · 0 评论 -
wsl-windows subsystem for linux环境搭建
前言现在windows系统除了装虚拟机运行linux环境之外,还可以创建wsl来运行linux环境。apt加速sudo cp /etc/apt/sources.list /etc/apt/sources.list.bakdeb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiversedeb-src http://mirrors.aliyun.com/ubuntu/ bionic main restri原创 2020-08-08 22:24:12 · 200 阅读 · 0 评论 -
cloud-追踪中心
前言在一个分布式系统中,服务之间相互依赖调用。一个请求有时需要经过几次转发之后才能到达最终的处理服务。这样,每个请求经过了哪些服务,每个服务消耗了多长时间,是后台开发人员迫切关系的问题。zipkin就是这样的一个分布式追踪系统。术语Span:基本工作单位。例如,发送RPC是一个新跨度,就像发送对RPC的响应一样。span由一个惟一的64位ID标识,并由另一个64位ID标识该span所在的跟踪。Span还有其他数据,比如描述、带时间戳的事件、键值注释(标记)、产生它们的跨越的ID和进程ID(通常是IP地原创 2020-07-14 14:48:26 · 158 阅读 · 0 评论 -
cloud-配置中心
前言每个spring-boot程序都依赖于一些特定的第三方数据源,在一个分布式系统中,需要有一个这样的数据源服务器,其他的微服务能够从这个数据源拿到最新的数据。spring cloud中实现这个功能的组件就是spring cloud config server。spring cloud config serverSpring Cloud配置服务器为外部配置(名称-值对或等效的YAML内容)提供了基于HTTP资源的API。通过使用@EnableConfigServer注释,服务器可以嵌入到Spring引原创 2020-07-13 15:47:35 · 1051 阅读 · 0 评论 -
Spring Cloud Bus-用法和意义
前言Spring Cloud Bus用轻量级消息代理连接分布式系统的节点。然后可以使用此代理广播状态更改(如配置更改)或其他管理指令。一个关键的想法是,总线就像一个扩展的Spring引导应用程序的分布式执行器。不过,它也可以用作应用程序之间的通信通道。该项目为AMQP经纪人或Kafka提供启动器作为运输工具。快速启动如果Spring Cloud Bus检测到自己在类路径上,那么它通过添加Spring Boot autconfiguration来工作。要启用总线,请将A或B添加到依赖项管理中。其余的工作原创 2020-07-13 11:17:17 · 5309 阅读 · 1 评论 -
cloud-网关
前言分布式系统中,网关是非常重要的角色。一个优秀的网关需要提供以下的特性:构建于Spring Framework 5、Project Reactor和Spring Boot 2.0之上。能够匹配任何请求属性上的路由。谓词和过滤器是特定于路由的。Hystrix断路器集成。Spring Cloud发现客户端集成。易于编写谓词和过滤器。请求速率限制。路径重写。spring cloud gatewayspring cloud gateway就是这样一个满足上诉所有特性的网关。下面是基本的配原创 2020-07-11 10:50:05 · 424 阅读 · 0 评论 -
mongodb-聚合管道
管道MongoDB聚合管道由多个阶段组成。每个阶段在文档通过管道时转换文档。管道阶段不需要为每个输入文档生成一个输出文档;例如,有些阶段可能会生成新的文档或过滤掉文档。管道阶段可以在管道中出现多次,但$out、$merge和$geoNear阶段除外。有关所有可用阶段的列表,请参见聚合管道阶段。MongoDB在mongo shell中提供db.collection.aggregate()方法和用于运行聚合管道的聚合命令。例如,聚合管道的使用,请考虑使用用户首选项数据和邮政编码数据集进行聚合。从Mon原创 2020-07-03 10:17:27 · 372 阅读 · 0 评论 -
mongodb-聚合查询
前言原创 2020-07-03 10:14:50 · 382 阅读 · 5 评论 -
mysql-内置函数
前言日常情况下,需要进行一些复杂的查询,常规的字段选择和参数比较不再能满足需求。这时候,就需要mysql函数来支持。有人说,把数据查询到内存在处理不是一样的吗?这么做也可以实现效果,但是有很大的缺陷,最明显的就是数据量大的时候会占用太多的内存和较多的网络数据传输量;其次是mysql内置函数经过了很多优化,性能会好一些。最新最全的mysql函数请参考mysql函数。下面就常用的mysql函数进行说明。表达式可以在SQL语句中的多个地方使用,例如在SELECT语句的ORDER BY或HAVING子句中,在原创 2020-06-22 17:53:26 · 313 阅读 · 0 评论 -
redis-存储n个键rdb文件的大小
前言使用jedis,测试下redis的rdb文件大小和键数量之间的关系。结果键的个数rdb文件大小耗时1000069K11026ms100000947K108313ms100000010615K1018632ms10000000107294K2~3h可视化rdb文件和键数量的关系...原创 2020-06-15 07:48:21 · 805 阅读 · 0 评论 -
JPA-Criteria API进行条件查询,更新和删除
前言随着JPA(java persistence api)的使用越来越广泛,传统的Java Persistence Query Language (JPQL) 查询暴露出诸多的缺点。最明显的是,Java 编译器不能在编译时发现 JPQL 字符串的语法错误,只能等到运行时执行了JPQL语句才抛出运行时异常。为了弥补JPQL的缺点,推出了新一代查询API:Criteria API。Criteria API支持在运行时动态构建查询,还支持构建可由编译器验证的类型安全的查询。编译器无法验证JPQL查询的正确性,原创 2020-05-28 17:33:13 · 6773 阅读 · 0 评论 -
docker-容器时区和宿主时区不一致的解决方法
前言部署完容器后,查看宿主的时间(date命令)如下:Mon May 18 10:30:38 CST 2020查看容器的时间是:Mon May 18 02:35:01 UTC 2020可以看出两者的时区不一样,宿主是CST,而容器默认是UTC。解决方法参考构建时指定时区使用docker run命令或者在Dockerfile中或者yml文件中指定TZ环境变量。docker rundocker run -e TZ=Asia/Shanghai ...DockerfileFROM o原创 2020-05-21 13:52:26 · 1298 阅读 · 0 评论 -
Doug Lea-Java并发结构
前言java并发结构讲述了Java的并发的基本概念和组件,是java并发的基本对象。原文请参考原文。原创 2020-04-27 22:53:03 · 508 阅读 · 0 评论 -
reactive streams-响应式流
前言响应式流的网址是Reactive Streams。官方给出的目标是:响应性流是为异步流处理提供无阻塞回压的标准。这包括针对运行时环境(JVM和JavaScript)以及网络协议的工作。目前,JDK给出了java.util.concurrent.Flow接口来进行响应式编程。但是由于完全更新到JDK9还需要一段时间,所以需要开源的版本支持。响应式流规范响应式流给出一套接口规范,grad...原创 2020-04-25 22:29:49 · 2540 阅读 · 0 评论