- 博客(609)
- 收藏
- 关注
原创 使用FlinkCDC从mysql同步数据到ES,并实现数据检索
随着公司的业务量越来越大,查询需求越来越复杂,mysql已经不支持变化多样的复杂查询了。于是,使用cdc捕获MySQL的数据变化,同步到ES中,进行数据的检索。
2024-03-22 08:45:46 1081
原创 使用SpringAOP+Caffeine+Redis实现本地缓存与多级缓存
*** 本地缓存// 过期时间 默认10分钟 long expired() default 600;// key创建器 String keyGenerator() default "org.springframework.cache.interceptor.KeyGenerator";/*** 本地缓存// 过期时间 默认10分钟 long expired() default 600;
2024-03-22 08:44:24 460
原创 OpenResty使用Lua大全(十二)实战: 动手实现一个网关框架
统一入口;安全:黑名单、权限身份认证;限流:实现微服务访问流量计算,基于流量计算分析进行限流,可以定义多种限流规则;缓存:数据缓存;日志:记录日志;监控:记录请求响应数据,api耗时分析,性能监控;重试:异常重试;熔断:降级。安装依赖1)OpenResty: 版本应在1.9.7.3+需要编译OpenResty时添加2)lor框架3)MySQL数据库名:orange安装mysql数据库执行相应的版本的数据库脚本。
2024-03-20 08:37:41 1005
原创 OpenResty使用Lua大全(十一)实战: nginx实现接口签名安全认证
我们会发现,如果我获取了你完整的链接,一直使用你的key和sign和一样的参数不就可以正常获取数据了!是的,仅仅是如上的优化是不够的。如上,优化后的请求多了key和sign参数,这样请求的时候就需要合法的key和正确签名sign才可以获取产品数据。通过上面的案例,我们可以看出,安全的关键在于参与签名的secret,整个过程中secret是不参与通信的,上述的Sign签名的方式能够在一定程度上防止信息被篡改和伪造,保障通信的安全,这里使用的是MD5进行加密,这样就算被人拿走完整的请求链接也是无效的。
2024-03-20 08:36:58 872
原创 OpenResty使用Lua大全(十)实战: Lua + Redis 实现动态封禁 IP
为了方便管理和共享,我们通过 Nginx+Lua+Redis 的架构实现 IP 黑名单的功能。为了封禁某些爬虫或者恶意用户对服务器的请求,我们需要建立一个动态的 IP 黑名单。在http部分,配置本地缓存,来缓存redis中的数据,避免每次都请求redis。1、在操作系统层面,配置 iptables,拒绝指定 IP 的网络请求;3、在应用层面,在请求服务之前检查一遍客户端 IP 是否在黑名单。对于黑名单之内的 IP ,拒绝提供服务。
2024-03-19 08:24:17 390
原创 OpenResty使用Lua大全(九)实战:nginx-lua-redis实现访问频率控制
set_by_lua,rewrite_by_lua,access_by_lua,content_by_lua等方法。我们用redis的key表示用户,value表示用户的请求频次,再利用过期时间实现单位时间;在高并发场景下为了防止某个访问ip访问的频率过高,有时候会需要控制用户的访问频次。现在我们要求10秒内只能访问10次frequency请求,超过返回403。这个配置,放在server部分,让所有的location 适用就行了。当然这只是简单的限流小实验,使用开源网关可以实现更复杂的限流。
2024-03-19 08:23:38 744
原创 OpenResty使用Lua大全(八)OpenResty执行流程与阶段详解
之前也介绍过。语境:http阶段:loading-config当nginx master进程在加载nginx配置文件时运行指定的lua脚本,语境:http阶段:starting-worker在每个nginx worker进程启动时调用指定的lua代码。用于启动一些定时任务,比如心跳检查,定时拉取服务器配置等等;此处的任务是跟Worker进程数量有关系的,比如有2个Worker进程那么就会启动两个完全一样的定时任务。
2024-03-18 08:43:38 1322
原创 OpenResty使用Lua大全(七)OpenResty使用全局缓存
Nginx是一个Master进程多个Worker进程的工作方式,因此我们可能需要在多个Worker进程中共享数据。使用来实现全局内存共享。
2024-03-18 08:43:03 910
原创 OpenResty使用Lua大全(六)OpenResty发送http请求
ngx.location.capture 方法就是发起http的请求,但是它只能请求 内部服务,不能直接请求外部服务。编辑nginx.conf配置文件,配置一下路由,定义有个两个服务请求 商品服务请求和订单服务请求。可很多时候我们会要求商品请求 是不对外暴露的,也就是用户无法直接访问商品服务请求。刚才我们请求外部请求,是写死了q=iphone,那我们用capture传参。不能直接发起外部请求,我们需要通过内部请求中用反向代理请求发起外部请求。—>这种数据截断的原因只可能是因为子请求发生了不可恢复的错误,
2024-03-15 08:40:53 1023
原创 OpenResty使用Lua大全(五)OpenResty中使用MySQL
客户端目前还没有提供预编译SQL支持(即占位符替换位置变量),我们编写个案例,操作mysql数据库,编辑test.lua。默认安装OpenResty时已经自带了mysql模块。连接池和之前Redis客户端完全一样。进行字符串转义,防止sql注入;这样在入参时记得使用。
2024-03-15 08:40:21 678
原创 OpenResty使用Lua大全(四)OpenResty中使用Redis
redis的连接是tcp连接,建立TCP连接需要三次握手,而释放TCP连接需要四次握手,而这些往返时延仅需要一次,但A,B业务共用了连接池,很有可能 B业务拿到的 A业务使用的连接,而此连接操作的数据库db1;如果当前连接不是从内建连接池中获取的,该方法总是返回 0 ,也就是说,该连接还没有被使用过。注意:我们如何知道,redis连接对象是从连接池中获取的,还是新创建的连接呢?以后应该复用TCP连接,此时就可以考虑使用连接池,即连接池可以复用连接。1、连接池是每Worker进程的,而不是每Server的;
2024-03-14 08:26:53 981
原创 OpenResty使用Lua大全(三)OpenResty使用Json模块解析json
引入cjson.safe 模块接口,该接口兼容 cjson 模块,并且在解析错误时不抛出异常,而是返回 nil。这个是因为对于 Lua 本身,是把数组和哈希键值对融合到一起了,所以他是无法区分空数组和空字典的。web开发过程中,经常用的数据结构为json,openresty中封装了json模块。pcall 接收一个函数和要传递给后者的参数,并执行,执行结果:有错误、无错误;2)table所有键为数组型键值对时,会当作数组看待,空位将转化为null。执行效果,没有系统错误,返回了nil。
2024-03-14 08:26:12 866
原创 OpenResty使用Lua大全(二)在OpenResty中使用Lua
ngx.var.arg_strider的值为”1”,而ngx.req.get_uri_args[“strider”]的值为table [“1”, “2”, “3”, “4”]。重写阶段、访问限制阶段、内容处理阶段,这几个阶段都是独立的,就像Servlet也有不同的生命周期,不同的阶段处理不同的相关的业务。ngx.var.arg_xx与ngx.req.get_uri_args[“xx”]两者都是为了获取请求uri中的参数。对于应用开发,一般使用 ngx.INFO 到 ngx.CRIT 就够了。
2024-03-13 08:21:42 888
原创 OpenResty使用Lua大全(一)Lua语法入门实战
一)lua介绍1993 年在巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de Janeiro in Brazil)诞生了一门编程语言,发明者是该校的三位研究人员,他们给这门语言取了个浪漫的名字——Lua,在葡萄牙语里代表美丽的月亮。事实证明她没有糟蹋这个优美的单词,Lua 语言正如它名字所预示的那样成长为一门简洁、优雅且富有乐趣的语言。
2024-03-13 08:20:53 826
原创 使用AOP+SPEL实现业务日志收集
*** 日志注解User , // 用户 Role , // 角色 Order , // 订单 Product , // 产品 } /*** 操作的动作,如增、删、改等/*** 操作的业务类型,如用户、角色、订单等/*** 操作的用户的ID(Spel)/*** 操作的资源的ID(如订单id)/*** 操作之前的原数据(SpEL)/*** 操作之后的新数据(SpEL)/*** 日志注解。
2024-03-07 13:53:42 400 1
原创 Atomikos详解:数据库XA规范与Atomikos使用与源码分析
*** 定义两个数据源,分别对应两个数据库} /*** 定义两个数据源,分别对应两个数据库} }/*** 定义两个数据源,分别对应两个数据库} /*** 定义两个数据源,分别对应两个数据库} }/*** 定义两个数据源,分别对应两个数据库} /*** 定义两个数据源,分别对应两个数据库} }
2024-03-07 13:53:03 1181
原创 ClickHouse安装、简介及使用
ClickHouse是一个用于联机分析(OLAP)的列式数据库管理系统(DBMS)。OLAP(On-line Analytical Processing):联机分析处理。OLAP场景要求在大型数据集上对具有以下特征的复杂分析查询数据集可能是海量的——数十亿或数万亿行数据组织在包含许多列的表中只选择几列来回答任何特定的查询结果必须以毫秒或秒为单位返回读多于写。将数据批量/实时写入后,后续可以进行任意维度的灵活搜索、洞察等。大宽表。一张存在N多列的表,平时使用时可能只用到其中的部分字段。
2024-03-04 16:15:30 1113
原创 Flink时间语义&WindowAPI&Watermark详解:时间与乱序对实时处理的影响
event time:事件/数据真正产生的时间,这个时间一旦产生了,肯定就不变了。(进Flink之前就已经存在了)process time:事件/数据处理的世界,这个时间是不确定的,跟处理服务器的时间相关。(比如说每小时处理一次,这一小时内的数据都会在整点处理)(优点:性能好,低延迟;缺点:结果是不确定的)(比如说,10::59:20产生的数据,正常是在10-11点的窗口内,但是由于网络抖动、服务器等原因在11点之后执行)所以,如果不关注准确度的话,就可以使用process time处理,因为性
2024-03-04 16:14:51 987
原创 Springboot中ApplicationContextInitializer的使用及源码分析
ApplicationContextInitializer接口的执行时机:用于在刷新之前初始化Spring ConfigurableApplicationContext的回调接口。通常在需要对应用程序上下文进行一些中使用。例如,。ApplicationContextInitializer接口只有一个方法,实现该方法会获得一个ConfigurableApplicationContext的回调。3、ApplicationContextInitializer的常用用法(1)注册BeanFactoryPostP
2024-02-28 15:43:46 1093
原创 Springboot外部化配置详解与源码分析
如果有两者的配置文件.properties和YAML格式放在同一个位置,.properties优先考虑。Springboot配置属性加载顺序从上到下依次加载,后加载的同名配置会覆盖之前的。).如果您仍然希望使用构造函数注入其他bean,则配置属性bean必须用。默认情况下,当指定的配置数据位置不存在时,Spring Boot将引发。如果希望指定一个位置,但允许它不存在,可以使用。多文档属性文件通常与激活属性结合使用,例如。对应第十条,当应用程序启动时,任何。中,它是一个抽象类,有许多实现。
2024-02-28 15:43:10 709
原创 Springboot应用执行器Actuator源码分析
通过各种方式定义的Endpoint,创建为WebMvcEndpointHandlerMapping,进行Web映射。Actuator是Springboot提供运行时数据交互的规范。它覆盖应用内心戏、环境配置、度量指标、敏感操作。交互方式为Http Web或者JMX。注册Endpoint为Mvc映射。
2024-02-26 22:19:55 1001
原创 架构设计实践:熟悉架构设计方法论,并动手绘制架构设计图
需求是贯穿整个研发、架构设计生命周期的。以下是架构的V型图,从左往右是从业务需求到架构设计,最底下是产品开发到逐层的功能验证。当一个需求完成以后,我们会有新的需求进行迭代,然后不断地循环这个过程。1、明确公司业务战略,明确业务需求和非业务需求。2、了解行业标准、限制和质量要求。3、搞明白公司目前IT状态和架构状况。(已有的架构图、设计文档、资产)3、产出系统上下文。4、产出用例模型。5、找出公司/业内的所有资产(将狗资产、方法论的资产),输入到整个架构设计的环节中。
2024-02-26 22:19:18 1270 1
原创 IaaS、PaaS、SaaS架构设计分析,彻底吃透云平台
特定行业的应用,而且这种行业具有一定的普遍性,通过一定的业务娃爱宝,通过一定的行业标准,可以简化一个企业从无到有,从小到大,从弱到强的发展周期。每个企业只要专注于自己的核心业务,对非核心业务比如客户管理、大数据分析、办公管理系统等等,都外包给SaaS平台。还有一些通用的前端业务、人工智能、大数据等核心难点功能,也都可以使用SaaS平台。如果说IaaS是云平台的过去式,PaaS就是云平台的现在式,SaaS才是云平台的未来式。
2024-02-21 17:31:29 848
原创 从浅入深认识云,云平台架构的设计:上云,你准备好了吗?
云是一种比喻说法,就像我们平时看到的云一样,高出不胜寒,站在云端往下看,一切都很渺小。同样的,在云上部署你的应用,可以享受云端很多企业的经验总结,很多坑已经早就被排除掉了。这些企业、软件、系统,会集结成一套标准的套路来使用,所以,就像站在巨人的肩膀上,站在最高点来观察从开发到发布到运维的全过程。云,同样有敏捷的感觉,从发布到弹性伸缩,又高又快。云,主要指基于云计算和云服务的应用。云服务通常涉及通过互联网来提供动态易扩展且经常是虚拟化的资源,如IT和软件、互联网相关服务,甚至其他服务。
2024-02-21 17:30:41 1135
原创 Flink从入门到实践(三):数据实时采集 - Flink MySQL CDC
注意MySQL的版本,本次是使用MySQL8.0进行演示。同时,Flink支持很多数据库的cdc。同时也要对应好版本,我们本次使用Flink是1.18,同时FlinkCDC也是3.0版本System . out . println("数据库:" + split [ 1 ]);System . out . println("表:" + split [ 2 ]);
2024-02-08 10:23:23 2507
原创 Flink从入门到实践(二):Flink DataStream API
/ num>@Override@Override// 最终执行的方法,输出到终端});
2024-02-08 10:22:48 1744
原创 做好技术选型:用合适的技术做合适的事(干货满满)
根据实际业务管理的需要,对硬件、软件以及所要用到的技术进行规格的选择。狭义上的技术选型:团队决定选用哪种技术去解决业务问题。(某种语言、某种框架去开发项目)广义上的技术选型:泛指项目实施过程中的各种技术决策。(制定技术AB方案选其中一套,每个技术决策都是技术选型)在决定采纳某个技术之前,一定要做好调研,并尝试小规模引入,积累经验,经过验证后再大规模采用。总结一下技术选型的简单过程;解决了那些问题;是否达到了预期;哪些地方是值得改进的。如果落地失败,总结失败的原因是什么;总结如何防止再犯;
2024-01-29 14:13:59 1319
原创 响应式架构设计:性能更高更快的架构模式(框架部分后续再完善)
对刺激(请求)进行快速响应。对事件(event)立即响应。(事件驱动的自然特性使得反应能够立即加载实时,通过避免对共享资源的争用实现可扩展性)对失败(failure)立即响应。(在任何级别都可以建立一个能够实现失败恢复的弹性系统)对用户立即响应。(无论工作在何种负载下,都要满足用户对响应时间的要求)在java.util.concurrent.Flow包下:FlowAPI与Reactive Streams Specification相对应。
2024-01-29 14:12:59 767
原创 领域驱动设计(DDD)详解:微服务拆分神器
(写和读的责任分离)Command:执行动作,返回void。(行动可能会改变聚合、实体、值对象的内容)Query:只查询,不修改对象状态。适用CQRS的风格:事件驱动系统风格、管道过滤器风格。领域驱动设计中,对外提供功能的只有聚合根的功能,聚合根里面的实体尽量只对聚合根提供服务。聚合根的子对象,尽量都用实体对象封装。
2024-01-22 14:55:21 1230
原创 单元化(Set)架构设计详解:异地多活、突破扩展上限的优选方案
扩展性意味着,系统有可伸缩性/弹性,度量增加系统处理能力的指标。扩展性并不单单是系统能力本身,而是伸缩性&性能&成本等的综合考量的结果。系统处理能力(系统性能):延迟 - 系统处理单词请求所需时间;吞吐量 - 单位时间内系统处理次数。吞吐量越高越好,延迟越低越好。高伸缩性:添加资源就可以应对处理能力需求增长;意味着用户/流量/数据增长,性能指标不下降。伸缩性差:单用户性能正常;用户增长后性能指标下降;性能提升的成本高。
2024-01-22 14:54:17 1187
原创 微服务架构设计核心理论:掌握微服务设计精髓
单体应用时代,全都耦合在一起,牵一发而动全身。所有功能一起上线一起回滚。代码复杂度混乱。微服务时代,业务模式糙快猛,敏捷编程。小步快跑,独立演进,独立部署,快速迭代。团队赋能(每个微服务有各自团队)。边界清晰,以大化小-服务拆分,三高应用-分治。
2024-01-15 21:54:07 1306
原创 分布式架构理论:从头梳理分布式架构的重难点
在一个高可用系统中,当联系着的节点断开联系时(网络等问题),本来为一个整体的系统,分裂成两个独立节点,两个节点开始争抢共享资源造成系统混乱、数据损坏的现象,成为“脑裂”。热点数据:在极短时间内被频繁的高并发访问的数据。(爆款商品、秒杀)在真正的热点数据面前,即便是缓存也是扛不住的。(单机10万QPS,并且无法所有数据做缓存)对于秒杀商品,其实是预知的热点,可以预料到的热点其实不存在技术问题。对系统影响最大的是不可预知的热点,比如说微博热搜。
2024-01-15 21:53:10 1065
原创 Python自带的GUI库:Tkinter库使用手册(未完善)
Tkinter 使用纯 Python 语言开发,与 C/C++ 开发的 Qt 框架相比,Tkinter 有自身的局限性,比如性能、功能丰富程度等都不及 Qt,因此它只适合开发一些简单的程序,比如计算器的界面,或者一个简易的聊天窗口等。Tkinter(即 tk interface,简称“Tk”)本质上是对 Tcl/Tk 软件包的 Python 接口封装,它是 Python 官方推荐的 GUI 工具包,属于 Python 自带的标准库模块,当您安装好 Python 后,就可以直接使用它,而无须另行安装。
2024-01-09 09:12:20 917
原创 架构设计模式详解:夯实架构设计的基础
层:软件的逻辑单元。每一层都有特定的功能。组件被分配到不同层。将系统按照之策拆分和组织。上层依赖于直接下层。(下层不可以依赖于上层,不可以跨层访问)高层表示规则,底层实现细节。逻辑内聚自治分组。依据组织职责分工。根据每层的需求各自选定。借鉴成功案例。部署方式局限,选定技术栈。事件驱动架构模式是一种异步分发事件的架构模式。用于高扩展且低耦合的系统。事件为核心,一系列解耦的、单一功能的事件处理器。微内核,就是核心功能资源封装。提供可插拔功能扩展的插件。核心系统提供的接口及版本。
2024-01-02 09:10:34 1047
原创 架构设计的核心:从多个维度理论分析
如果我们选择了 CA 而放弃了 P,那么当发生分区现象时,为了保证 C,系统需要禁止写入,当有写入请求时,系统返回 error(例如,当前系统不允许写入),这又和 A 冲突了,因为 A 要求返回 no error 和 no timeout。对于多数大型互联网应用的场景,主机众多、部署分散,分区容忍性是基本要求,否则就失去了价值,而且现在的集群规模越来越大,所以节点故障、网络故障是常态,而且要保证服务可用性达到N个9,即保证P和A,舍弃C(退而求其次保证最终一致性)。开发活动中的生产率和质量是可量度的。
2024-01-02 09:09:19 959
原创 微服务系统架构设计:基本原则与理论分析
无状态(stateLess),也就是上下文并没有依赖。比如说用户登录状态Session,单机环境下,Session存在服务器本地,用户每次登录需要获取到当前登录的用户信息,这就叫有状态。这样的话,该服务就无法做到横向扩容,增加一个服务节点之后无法做到服务节点之间的Session共享。解决方案也很简单,将Session存储到一个公共存储空间即可比如redis。再比如本地缓存。单机环境下,如果数据库响应过慢,通常会将部分热点数据保存在服务的内存中,但是增加服务节点之后同样会导致多个节点中的内存数据不一致。
2023-12-25 21:00:54 452
原创 python使用easyocr识别文字,准确率超高!
下载检测模型:CRAFT,然后下载 zh_sim_g2(中文语言) 和 english_g2(英文语言)即可,如果你有其它语言需要识别也可下载其它语言。解压后的.pth文件放入。
2023-12-25 21:00:03 681
原创 盘点大部分程序员(架构师)都会走的弯路(有则改之无则加勉)
很多程序员,其实并不是出身于BAT等大厂,而是在一些中小厂为公司为自己发光发热。一边努力学习着技术,一边应对着工作中不停的CRUD、应对着产品经理不断变化的需求。有时候静下来也会迷茫:自己怎么才能突破当前的舒适圈?自己这几年来所做所学所用是不是正确的方向?今天咱们就一起梳理一下,那些大部分程序员都会走的弯路(不服来辩~)。
2023-12-16 20:59:40 270 1
java覆写jar包代码不生效
2022-08-26
java==比较int值问题
2022-08-19
TA创建的收藏夹 TA关注的收藏夹
TA关注的人