tomcat tomcat 之filter filter的基本功能大家都是清楚的,本节不赘述,本文主要讲述filter 是否可修改response及如何修改response 通常我们理解tomcat的调用流程是 clinet -> filter -> service | clinet <- filter < - - 实际的处理流程是 clinet -> filter -> service | filter < - - clinet <
geek 并发编程之限流算法 计数限流 最简单的限流算法就是计数限流了,例如系统能同时处理100个请求,保存一个计数器,处理了一个请求,计数器加一,一个请求处理完毕之后计数器减一。 每次请求来的时候看看计数器的值,如果超过阈值便拒绝处理。 非常的简单粗暴,计数器的值要是存内存中就算单机限流算法。存中心存储里,例如 Redis 中,集群机器访问就算分布式限流算法。 优点就是:简单粗暴,单机在 Java 中可用 Atomic 等原子类、分布式就 Redis incr。 缺点就是:假设我们允许的阈值是1万,此时计数器的值为0, 当1万个请求在前1秒内一股脑儿的都涌进来,这突发的流量可是顶不住的。缓缓的增加处理和一下子涌入对于程序来说是不一样的。 固定窗口限流算法
geek 并发设计模式 Immutability模式:如何利用不变性解决并发问题? Copy-on-Write模式:不是延时策略的COW 线程本地存储模式:没有共享,就没有伤害 Guarded Suspension模式:等待唤醒机制的规范实现 Balking模式:再谈线程安全的单例模式 Thread-Per-Message模式:最简单实用的分工方法 Worker Thread模式:如何避免重复创建线程? 两阶段终止模式:如何优雅地终止线程? 生产者-消费者模式:用流水线思想提高效率 Immutability模式:如何利用不变性解决并发问题? 利用 Immutability 模式解决并发问题,也许你觉得有点陌生,其实你天天都在享受它的战果。Java 语言里面的 String 和 Long、
mysql mysql 之 auto increment 下一次自增id可通过show create table table1查看,另外可通过以下系统参数设置递增数值 show variables like '%auto_inc%'; auto_increment_increment 2 auto_increment_offset 1 auto_increment_offset 和 auto_increment_increment是两个系统参数,分别用来表示自增的初始值和步长,默认值都是1。 备注:在一些场景下,使用的就不全是默认值。比如,
k8s containerd基础命令 列表namespace ctr ns ls 查看镜像 查看default ns镜像 ctr images ls 查看某ns下的镜像 ctr -n k8s.io images ls 镜像标记 ctr -n k8s.io images tag registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.2
k8s ansible快速搭建k8s1.24.2 github地址 https://github.com/clkevin/k8s-ansible release-1.24分支 准备工作 节点准备,可增减node节点,要求2c 2g 20g+,内核5以上 10.0.2.11 k8s-master 10.0.2.10 k8s-node1 10.0.2.12 k8s-node2 环境准备(以下操作针对master节点) 按上述节点名称在k8s-master中配置各节点,
linux linux ssh 免密登陆 配置免密登陆 创建目录 mkdir .ssh 创建密钥ssh-keygen -t rsa -C "test@sina.com" id_rds-私钥 id_rsa.pub-公钥 config 配置ssh 连接需要的信息,配置的ssh客户端 Host k8s-master HostName 10.0.2.10 User root Port 22
git 解决阿里云无法访问github 首先在 https://www.ipaddress.com 找到 github.com对应的IP地址。 将解析加入/etc/hosts中,然后就可以git clone代码了。 如果过段时间地址失效了,更换就好了。 参考
k8s k8s通过二进制升级1.24版本 准备 节点准备 10.0.2.7 k8s-master 10.0.2.8 k8s-node1 10.0.2.9 k8s-node2 网络准备 节点 cidr:10.0.2.0/24 service cidr: 10.2.0.0/24 podd
k8s k8s通过kubeadm升级1.24版本 背景 knative对k8s版本要求较高,另k8s不同版本之前apiversion比较乱,如crd在之前的版本中version为apiextensions.k8s.io/v1beta1,在k8s1.22版本后为apiextensions.k8s.io/v1,同时为了学习了解最新的k8s功能,故将k8s版本升级为1.24, 本文采用kubeadm的方式安装 节点准备 准备三个节点 k8s-master 10.0.2.4 k8s-node1 10.0.2.5 k8s-node2 10.0.2.6
istio k8s1.24安装istio1.14 istio版本 根据istio与k8s版本关系我们需要在k8s1.24版本上安装1.14的istio。本篇以1.14.3为例 k8s1.24安装文档参考 下载 https://github.com/istio/istio/releases 1.14.3版本 安装 安装istioctl 解压缩istio-1.14.3-linux-amd64.tar.gz cp bin/istioctl /usr/bin/ istioctl version
linux virtaulbox虚拟机扩容 初始创建virtaulbox虚拟机时,设置存储容量过小,如果重新创建,那么上面已经构建的功能全部需要重新搞,故可考虑直接扩容虚拟机 创建磁盘 检查 启动虚拟机。 输入命令:lsblk 看到我们刚刚创建的物理磁盘sdb . NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sdb 8:16 0 10G 0 disk sr0 11:0 1 1024M 0 rom
linux virtualbox 网络 静态ip 在通过virtaulbox搭建虚拟机时,网络配置是绕不开的功能,我们可选择NAT,即配置一个全局的NAT网络,在虚拟节node上选择NAT并配置全局的NAT网络配置,有时当启动node后,节点上无ip,这时可手动修改网络配置 # vi /etc/sysconfig/network-scripts/ifcfg-enp0s3 BOOTPROTO 的值修改为 static (设置静态 IP 模式) ONBOOT 的值修改为 yes (开机自启动) 添加 IP,GATEWAY,NETMASK,DNS 等信息 IP gateway等信息需要与全局的Nat网络对应 然后执行service
k8s istio 1.4版本安装 版本 1.4版本对应k8s 1.15 helm 2.14.3 k8s与istion版本关系见https://istio.io/latest/docs/releases/supported-releases/#support-status-of-istio-releases 下载 https://github.com/istio/istio/releases [1.4版本](wget https://github.com/istio/istio/releases/
linux linux 之后台执行checkstatus #! /bin/bash function checktcpcode() { listen_num=$(ss -lnpt|grep "$1"|wc -l) #$1获取参数中的检查端口 # echo $listen_num if [ $listen_num -eq 0 ];then # 如果不存在监听则返回0 否则返回1 return 0 fi return 1 } function check(
java jackson value deserialize int to boolean 问题 在开发过程中,发现某个api在请求时传的是Integer,在另一个服务接收时,通过Boolean接收的,并且能正常转换为Boolean,故复现一下该问题,并探究下问题根本 依赖 <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.
java java – 为什么JVM CMS(并发标记和清除)需要两次暂停GC? cms过程 这在HotSpot内存管理白皮书中得到了很好的解释: A collection cycle for the CMS collector starts with a short pause, called the initial mark, that identifies the initial set of live objects directly reachable from the application code. Then,
mysql mysql Communications link failure 原因 mysql连接错误 复现 启动服务 请求接口,调用mysql获取数据 stop mysql 请求接口报错 启动mysql 请求接口,未自动恢复,仍报错Communications link failure 解决方案 使用DruidDataSource使用com.mysql.jdbc.Driver 当创建失败时,会通过com.alibaba.druid.pool.DruidDataSource$CreateConnectionThread循环创建连接,间隔时间为timeBetweenConnectErrorMillis直到获取到正常的连接 使用DruidDataSource使用com.p6spy.engine.spy.P6SpyDriver
redis redis库存方案 场景说明 设计秒杀活动时,因需要保证在高并发场景下库存不会超卖,或 抢券不会超量抢券的情况,可使用redis的decr功能 ,但是如果仅仅简单的使用decr,针对以下场景会有问题 剩余数量为1 线程1 decr 数量剩余0 线程2 decr 数量剩余-1 响应失败 线程1 因后续功能异常通过incr 归还数量 线程3 decr 数量剩余-1 响应失败 上述场景中,最后一个库存未使用便已不可用,在高并发场景下浪费的库存会较多,针对以上问题有以下两个方案 方案 方案1 当decr 结果小于0时,通过incr归还数量后返回失败 此方案的弊端是需要调用两次redis
技术问题总结 记录一次sim环境消费不到消息的问题 问题 在sim环境中,生产的消息已发送至中间件服务,但是无消费者进行消费 而sim环境是有对应的节点的 DD trace染色 在DD中所有的请求及mq均通过trace染色&sidecar方式实现的,该方案可解决多服务并行测试的问题 即,存在一套基准环境sim13,当某个服务上sim时,拉取一个新的环境如sim110,针对该环境的请求及mq消息trace均会染色为s110xxxx,当该服务请求其它服务时,请求该服务的基准环境,同样会染色trace,而其它服务基准环境sidecar收到请求后会判断是否存在sim110环境,如果存在,则转发;如果不存在,则转发给sim13基准环境处理请求 mq消息大概原理同上 生产段流量染色:在生产消息的时候统一通过设置消息的属性properties(map类型)值,来标记当前消息所属客户端环境 消费端环境标示:mq proxy会根据消息的客户端标识,
other hbase简单命令 客户端登陆hbase # 执行/usr/local/hbase/bin目录下的hbase命令 ./hbase shell 查看有哪些表 > list > describe 'AgentInfo' 查询数据 # 扫描 scan 'AgentInfo',{LIMIT =>1} ROW COLUMN+CELL \x00-9012\x00\x00\x00\x00\x00\x00\x00\x00\
k8s k8s之metrics etcd metrics curl http://localhost:2379/metrics k8s metrics kubectl get --raw /metrics clone prometheus-operator git clone https://github.com/coreos/prometheus-operator.git Prometheus Operator引入的自定义资源 Prometheus ServiceMonitor Alertmanager 除了k8s原生Resource资源以外(如 pod service deployment等)
mysql mysql查看当前运行的程序 命令 show processlist:根据不同的账号权限可以看到所有用户的,当前用户的对应的连接。只有100条 show full processlist:展示所有的连接数据 sql select id, db, user, host, command, time, state, info from information_schema.processlist where command != 'Sleep' and db='lts' order by time
java tomcat网络模型 Tomcat启动流程 tomcat中基本所有的组件均通过LifecycleMBeanBase管理,在启动时,依次调用该LifecycleMBeanBase实现类所管理的其它组件的start方法,实际调用为startInternal()方法 其中tomcat中的容器实现的是LifecycleMBeanBase的子类ContainerBase,在ContainerBase.startInternal()方法中会依次启动 Cluster,Realm,子容器,Pipleline等 selector.select(1000)。当 Poller 启动后因为 selector 中并没有已注册的 Channel,所以当执行到该方法时只能阻塞。所有的 Poller 共用一个 Selector,其实现类是 sun.nio.ch.EPollSelectorImpl