Teleport 简易堡垒机系统
简介Teleport是一款简单易用的堡垒机系统,具有小巧、易用、易于集成的特点,支持RDP和SSH协议的跳转和管理。
Teleport由两大部分构成:
跳板核心服务
WEB操作界面
Teleport非常小巧且极易安装部署:仅需一分钟,就可以安装部署一套您自己的堡垒机系统!!
开源协议使用Apache-2.0开源协议
界面展示
功能概述特点极易部署
简洁设计,小巧灵活,无额外依赖,确保您可以在5分钟内完成安装部署,开始使用。
安全增强
配置远程主机为仅被您的teleport服务器连接,可有效降低嗅探、扫描、暴力破解等攻击风险。
单点登录
只需登录您的teleport服务器,即可一键连接您的任意远程主机,无需记忆每台远程主机的密码了。
按需授权
可以随时授权指定运维人员访问指定的远程主机,也可随时回收授权。仅仅需要几次点击!
运维审计
对远程主机的操作均有详细记录,支持操作记录录像、回放,审计工作无负担。
功能登录登录方式
管理员登录
用户登录
登录验证方式
账号/密码登录
身份验证器登录
忘记密码
通过邮箱重置密码
手动重置管理员密码
...
TLog轻量级分布式日志标记追踪神器
TLog简介
TLog通过对日志打标签完成企业级微服务的日志追踪。它不收集日志,使用简单, 产生全局唯一的追踪码。除了追踪码以外,TLog还支持SpanId和上下游服务信息 标签的追加。
为用户使用方便而设计,提供完全零侵入式接入方式,自动探测项目中使用的RPC框架和日志框架, 进行字节码的注入完成系统级日志标签的追加。
TLog适配了市面上主流的RPC框架:dubbo,dubbox,spring cloud的open feign。
TLog提供Javaagent,字节码注入,日志框架适配三种接入模式,无论是哪一种,都保证了无性能损耗。支持在业务异步线程,线程池,日志异步输出这几种场景下追踪不中断。
项目特性
通过对日志打标签完成轻量级微服务日志追踪
提供三种接入方式:javaagent完全无侵入接入,字节码一行代码接入,基于配置文件的接入
支持常见的log4j,log4j2,logback三大日志框架,并提供自动检测,完成适配
支持Spring Cloud Gateway和Soul网关
适配HttpClient和Okhttp的http调用标签传递
支持三种任务框架,JDK的Time ...
服务端如何高效的处理重复请求
对于一些用户请求,在某些情况下是可能重复发送的,如果是查询类操作并无大碍,但其中有些是涉及写入操作的,一旦重复了,可能会导致很严重的后果,例如交易的接口如果重复请求可能会重复下单。
重复的场景有可能是:
黑客拦截了请求,重放;前端/客户端因为某些原因请求重复发送了,或者用户在很短的时间内重复点击了;网关重发等等
利用唯一请求编号去重你可能会想到的是,只要请求有唯一的请求编号,那么就能借用Redis做这个去重——只要这个唯一请求编号在redis存在,证明处理过,那么就认为是重复的
代码大概如下:
String KEY = "REQ12343456788";//请求唯一编号long expireTime = 1000;// 1000毫秒过期,1000ms内的重复请求会认为重复long expireAt = System.currentTimeMillis() + expireTime;String val = "expireAt@" + expireAt;//redis key还存在的话要就认为请求是重复的Boolean firstS ...
抛弃FastDFS!拥抱MinIO实现分布式文件服务
什么是MinIO?Minio是个基于Golang编写的开源对象存储套件,基于Apache License v2.0开源协议,虽然轻量,却拥有着不错的性能。它兼容亚马逊S3云存储服务接口。可以很简单的和其他应用结合使用,例如NodeJS、Redis、MySQL等。
应用场景MinIO的应用场景除了可以作为私有云的对象存储服务来使用,也可以作为云对象存储的网关层,无缝对接Amazon S3或者MicroSoft Azure。
特点
高性能:作为一款高性能存储,在标准硬件条件下,其读写速率分别可以达到55Gb/s和35Gb/s。并且MinIO支持一个对象文件可以是任意大小,从几kb到最大5T不等。
可扩展:不同MinIO集群可以组成联邦,并形成一个全局的命名空间,并且支持跨越多个数据中心。
云原生:容器化、基于K8S的编排、多租户支持。
Amazon S3兼容:使用 Amazon S3 v2 / v4 API。可以使用Minio SDK,Minio Client,AWS SDK 和 AWS CLI 访问Minio服务器。
SDK支持:
GO SDK:https:/ ...
Tomcat + Nginx 实现负载均衡
Tomcat 简介
Tomcat 是一个免费的开源的 Serlvet 容器,它是 Apache 基金会的 Jakarta 项目中的一个核心项目;
由 Apache,Sun 和其它一些公司及个人共同开发而成。
与传统的桌面应用程序不同,Tomcat 中的应用程序是一个 WAR(Web Archive)文件。
WAR 是 Sun 提出的一种 Web 应用程序格式,与 JAR 类似,也是许多文件的一个压缩包。
安装 Tomcat 服务准备工作:
主机名
操作系统
IP地址
Tomcat-A
CentOS 7.x
192.168.1.1
安装配置 Tomcat
安装 JDK:下载地址(需要创建 Oracle 账号)
[root@Tomcat-A ~]# lsanaconda-ks.cfg apache-tomcat-8.5.16.tar.gz jdk-8u91-linux-x64.tar.gz[root@Tomcat-A ~]# tar zxf jdk-8u91-linux-x64.tar.gz[root@Tomcat-A ~]# mv jdk1.8.0_91/ /us ...
线程数据交换、工作窃取算法,你懂吗?
最近栈长面试了一个 5 年经验的 Java 程序员,简历和个人介绍都提到了精通 Java 多线程,于是我就问了几个多线程方面的问题:
实现多线程有哪几种方式,如何返回结果?
多个线程如何实现顺序访问?
两个线程如何进行数据交换?
如何统计 N 个线程的运行总耗时?
如何将任务拆分成多个子任务执行,最后合并结果?
大概问了他这几个问题,答的并不是太好,3、4、5 题都没有真正答上来,其实这几个问题在 JDK 包中都有答案,但他给的是他个人临时思考的方案,而且我个人觉得可能行不通。
工作 5 年了,这几个题都答不好,有点说不过去,我真是醉了。。
实现多线程有哪几种方式,如何返回结果?
继承Thread类
看jdk源码可以发现,Thread类其实是实现了Runnable接口的一个实例,继承Thread类后需要重写run方法并通过start方法启动线程。
继承Thread类耦合性太强了,因为java只能单继承,所以不利于扩展。
实现Runnable接口
通过实现Runnable接口并重写run方法,并把Runnable实例传给Thread对象`,Thread的st ...
Spring-Retry 循环重试框架
简介在日常的一些场景中,很多需要进行重试的操作。而spring-retry是spring提供的一个基于spring的重试框架,非常简单好用。
Spring应用导入maven坐标<dependency> <groupId>org.springframework.retry</groupId> <artifactId>spring-retry</artifactId></dependency>
调用类@Slf4jpublic class RetryDemo { public static boolean retryMethod(Integer param) { int i = new Random().nextInt(param); log.info("随机生成的数:{}", i); if (1 == i) { log.info("为1,返回true." ...
Java线程池ThreadPoolExecutor类使用详解
在《阿里巴巴java开发手册》中指出了线程资源必须通过线程池提供,不允许在应用中自行显示的创建线程,这样一方面是线程的创建更加规范,可以合理控制开辟线程的数量;另一方面线程的细节管理交给线程池处理,优化了资源的开销。而线程池不允许使用Executors去创建,而要通过ThreadPoolExecutor方式,这一方面是由于jdk中Executor框架虽然提供了如newFixedThreadPool()、newSingleThreadExecutor()、newCachedThreadPool()等创建线程池的方法,但都有其局限性,不够灵活;另外由于前面几种方法内部也是通过ThreadPoolExecutor方式实现,使用ThreadPoolExecutor有助于大家明确线程池的运行规则,创建符合自己的业务场景需要的线程池,避免资源耗尽的风险。
下面我们就对ThreadPoolExecutor的使用方法进行一个详细的概述。
首先看下ThreadPoolExecutor的构造函数
public ThreadPoolExecutor(int corePoolSize, ...
优惠券系统设计思想
场景电商大厂常见促销手段:
优惠券
拼团
砍价
老带新
优惠券的种类
满减券
直减券
折扣券
优惠券系统的核心流程发券
发券的方式:同步发送 or 异步发送
领券
谁能领?
所有用户 or 指定的用户
领取上限
一个优惠券最多能领取多少张?
领取方式
用户主动领取 or 自动发放被动领取
用券
作用范围
商品、商户、类目
计算方式
是否互斥、是否达到门槛等
需求拆解商家侧
创建优惠券
发送优惠券
用户侧
领取优惠券
下单
使用优惠券
支付
服务服务结构设计
优惠券系统设计技术难点
券的分布式事务,使用券的过程会出现的分布式问题分析?
如何防止超发?
如何大批量给用户发券?
如何限制券的使用条件?
如何防止用户重复领券?
存储表单设计券批次(券模板)指一批优惠券的抽象、模板,包含优惠券的大部分属性。
如商家创建了一批优惠券,共1000张,使用时间为2022-11-11 00:00:00 ~ 2022-11-11 23:59:59,规定只有数码类目商品才能使用,满100减50。
券发放到用户的一个实体,已与用户绑定。
...
如何优雅的自定义 ThreadPoolExecutor 线程池
概述java 中经常需要用到多线程来处理一些业务,非常不建议单纯使用继承Thread或者实现Runnable接口的方式来创建线程,那样势必有创建及销毁线程耗费资源、线程上下文切换问题。同时创建过多的线程也可能引发资源耗尽的风险,这个时候引入线程池比较合理,方便线程任务的管理。
java中涉及到线程池的相关类均在 jdk 1.5 开始的java.util.concurrent包中,涉及到的几个核心类及接口包括:Executor、Executors、ExecutorService、ThreadPoolExecutor、FutureTask、Callable、Runnable等。
JDK 自动创建线程池的几种方式都封装在Executors工具类中:
newFixedThreadPool
使用的构造方式为
new ThreadPoolExecutor(var0, var0, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue())
设置了corePoolSize=maxPoolSize,keepAliveTime=0(此时该参数没作用 ...