首页 文章 精选 留言 我的

精选列表

搜索[维护升级],共10010篇文章
优秀的个人博客,低调大师

小小的日常维护,Magic-1.0.5 发布

本次更新如下: 1. 添加了对PosrgreSQL的分页支持。 2. 在使用ConditionBuilder时可以只查一条数据。 3. 对查询入参的处理方式换成了反射处理,这样可以保持原类型。 4. 去除了ConcurrentTaskSync的回调,因为意义不大,不如在runner里直接try catch。 Magic是Magician旗下的一个工具包,支持并发处理、生产者与消费者模型、数据库操作等. 01 数据库操作 首先需要创建一个Spring的JdbcTemplate对象 @Resource private JdbcTemplate jdbcTemplate; 单表查询 // 创建查询条件 ConditionBuilder conditionBuilder = ConditionBuilder.createCondition() .add("age = ?", "300") .add(" order by age desc", Condition.NOT_WHERE); // 执行查询操作 List<DemoPO> demoPOS = MagicDBUtils.get(jdbcTemplate) .select("m_user_info", conditionBuilder, DemoPO.class); 单表插入 // 创建要插入的对象和值 DemoPO demoPO = DemoPO.builder() .id(UUID.randomUUID().toString()) .age(18) .content("哈哈哈") .amount(new BigDecimal("10000")) .length(new BigInteger("10000000000")) .createTime(new Date()) .updateTime(new Date()) .build(); // 执行插入操作 MagicDBUtils.get(jdbcTemplate).insert("m_user_info", demoPO); 单表更新 // 创建修改条件 ConditionBuilder = conditionBuilder = ConditionBuilder.createCondition() .add("id = ? and age = ?", "00df4362-d7ad-48d2-8bcb-05cf859b7e64", 500); // 需要修改的字段和对应的值 DemoPO demoPO = DemoPO.builder() .age(122) .content("嘿嘿嘿") .amount(new BigDecimal("100002.33")) .length(new BigInteger("100000000002")) .createTime(new Date()) .updateTime(new Date()) .build(); // 执行修改操作 MagicDBUtils.get(jdbcTemplate).update("m_user_info", demoPO, conditionBuilder); 单表删除 // 创建删除条件 ConditionBuilder = conditionBuilder = ConditionBuilder.createCondition() .add("id = ?", "00df4362-d7ad-48d2-8bcb-05cf859b7e64"); // 执行删除操作 MagicDBUtils.get(jdbcTemplate).delete("m_user_info", conditionBuilder); 自定义SQL查询 DemoPO demoPO = DemoPO.builder() .age(122) .build(); MagicDBUtils.get(jdbcTemplate).selectList("select * from m_user_info where age > {age}", demoPO, DemoPO.class); 自定义SQL分页 // 查询参数 PageParamModel pageParamModel = PageParamModel .getPageParamModel(1, 10) .setParam( DemoPO.builder() .age(10) .build() ); // 执行查询操作 PageModel<DemoPO> pageModel = MagicDBUtils.get(jdbcTemplate).selectPage("select * from m_user_info where age > {age}", pageParamModel, DemoPO.class); 02 并发处理任务 MagicDataProcessing.getConcurrentTaskSync() .setTimeout(1000) // 超时时间 .setTimeUnit(TimeUnit.MILLISECONDS) // 超时时间的单位 .add(() -> { // 添加一个任务 // 在这里可以写上任务的业务逻辑 }) .add(() -> { // 添加一个任务 // 在这里可以写上任务的业务逻辑 }) .start(); 03 并发处理List,Set等所有Collection类集合里的元素 // 假如有一个List需要并发处理里面的元素 List<String> dataList = new ArrayList<>(); // 只需要将他传入syncRunner方法即可,每个参数的具体含义可以参考文档 MagicDataProcessing.getConcurrentCollectionSync() .syncRunner(dataList, data -> { // 这里可以拿到List里的元素,进行处理 System.out.println(data); }, 10, 1, TimeUnit.MINUTES); // 也可以用syncGroupRunner方法,每个参数的具体含义可以参考文档 MagicDataProcessing.getConcurrentCollectionSync() .syncGroupRunner(dataList, data -> { // 这里是每一组List for(String item : data){ // 这里可以拿到List里的元素,进行处理 System.out.println(data); } }, 10, 1, TimeUnit.MINUTES); 04 生产者与消费者 // 创建一组生产者与消费者,支持多对多 MagicDataProcessing.getProducerAndConsumerManager() .addProducer(new MagicianProducer() { // 添加一个生产者(可以添加多个) @Override public void producer() { // 查询这张表里符合条件的数据 List<Object> dataList = selectList(); // 然后将他推送给消费者 this.publish(dataList); } }).addConsumer(new MagicianConsumer() { // 添加一个消费者(可以添加多个) @Override public void doRunner(Object data) { // 处理生产者发来的数据 System.out.println(data); } }).start(); 因同名软件太多,选择关联软件时无法分辨,所以选了自己的另一个项目。 本项目的链接如下: github:https://github.com/JMagician/Magic gitee:https://gitee.com/jmagician/Magic

优秀的个人博客,低调大师

OpenNJet 支持维护 Proxy_protocol V2

NGINX 向云原生演进,All in OpenNJet proxy_protocol_V2功能 背景 proxy_protocol 介绍: 代理协议(Proxy protocol),是HAProxy的作者Willy Tarreau于2010年开发和设计的一个Internet协议,通过为tcp添加一个很小的包头信息,来方便的传递客户端信息(协议栈、源IP、目的IP、源端口、目的端口等),在网络情况复杂又需要获取用户真实IP时非常有用。 代理协议分为V1和V2两个版本,V1是人类易读的,V2是二进制格式的,并且支持tlv 功能。 v1介绍 : Proxy protocol V1的格式如下: PROXY 协议栈 源IP 目的IP 源端口 目的端口 rn 例如: PROXY TCP4 192.168.0.1 192.168.0.11 56324 443\r\n GET / HTTP/1.1\r\n Host: 192.168.0.11\r\n \r\n v2 介绍 : 相比V1,v2利用二进制格式以实现更高的解析效率,并可以增加特定的扩展属性(TLV) 在标准的地址信息后,如果有额外的数据,则该数据是TLV数组。每个tlv结构包括类型(type),length,value。 其中如下的类型数值已经被标准化,应用应该遵循该type的含义,不应用作他途。 #define PP2_TYPE_ALPN 0x01 #define PP2_TYPE_AUTHORITY 0x02 #define PP2_TYPE_CRC32C 0x03 #define PP2_TYPE_NOOP 0x04 #define PP2_TYPE_UNIQUE_ID 0x05 #define PP2_TYPE_SSL 0x20 #define PP2_SUBTYPE_SSL_VERSION 0x21 #define PP2_SUBTYPE_SSL_CN 0x22 #define PP2_SUBTYPE_SSL_CIPHER 0x23 #define PP2_SUBTYPE_SSL_SIG_ALG 0x24 #define PP2_SUBTYPE_SSL_KEY_ALG 0x25 #define PP2_TYPE_NETNS 0x30 常见应用: 传递client的real ip(尤其是非http类的应用,http类可以用x-forward-realip等header传递)。 代理协议版本2 支持额外的TLV 字段。他可以被前端ssl协议卸载器转发客户端证书信息转发到后端非http 协议的后端服务器。VerneMQ MQTT 代理就是示例之一,它可以利用代理协议版本2,获取客户端的证书的详细信息,进行身份授权。 用于在K8s环境中,ingress 对非Http 协议的ssl 终止。 GCP/amazon/arure 利用特定TLV 实现负载均衡。 2. 模块说明 OpenNJet在兼容nginx的v1版本发送及解析的基础上,实现了发送protocol v2 ,及自定义TLV发送的能力。 3. 配置说明: 该配置在stream 模块生效。 必填 配置说明 proxy_protocol 是 开启proxy_protocol proxy_pp2 是 开启proxy_protocol v2。 on 开启, off 关闭 proxy_pp2_set_tlv 否 proxy_pp2_set_tlv key value 格式。key 是 16 进制(两位,要避免和标准的冲突,)。 value 可以是常量,变量。例如:proxy_pp2_set_tlv 0x31 test; 获取:$proxy_protocol_tlv_0x31 前缀变量。注意:包含前面的源ip,目标ip,源端口,目标端口,以及tlv 值,总长度不能超过 4096 4. 应用实例 OpenNJet Sidecar 应用v2传递原始目的地址 业务流程: 1.在K8s环境中,client通过域名访问一个服务(例如, http请求 “api.test.com:8080”), 把请求发往service对应的service_ip, 防火墙劫持该请求,重定向到本地监听15001 端口的sidecar进程处理。 2.egress sidecar 是一个4层代理,可以识别出http流量,并把http流量转发到本地的“egress policy”做进一步处理。 3.egress policy是个7层的代理server,它会挑选合适的后端真实的server地址,(此例中, server instance1, ip:10.0.30.1 或 instance2, ip:10.0.30.2). 假设选中server1后 ,它会连接 10.0.30.1:8080,并发送请求。 3.1 请求到10.0.30.1后, 入向的防火墙规则控制把请求都重定向到“ingress sidecar”,它也是一个4层代理 ,监听15006. 同时,防火墙把原始目的端口 (8080)记录在ip 包头(tcp option)里 。 4.ingress process 也必须挑选出http请求,转发给ingress policy,后者是一个7层代理,监听8086 5.ingress policy 在分析内容,并处理后,应该转发到原始的目的端口8080(阶段4.2), 由于ingress sidecar是个4层带来,不会修改http协议,因此,无法把8080这个信息传递给ingress policy。 解决方案: Ingress sidecar在发送请求到 ingress policy时(步骤4.2),通过代理协议,在TCP连接的最开始传递该信息。ingress policy通过标准的NJet变量方式获取。 Ingress sidecar配置 stream { server { listen 15006 ; njtmesh_dest on; #参考下面该指令的备注 proxy_protocol on; #开启protocol 功能 proxy_pp2 on; #开启protocol V2功能 proxy_pp2_set_tlv 0x41 $njtmesh_port; #设置tlv 字段名,以及值 proxy_pass 127.0.0.1:90; } } Ingress policy的配置 http { server { listen 8086 proxy_protocol; server_name server-90; location /{ #todo: 其他的业务配置指令 proxy_pass 127.0.0.1:$proxy_protocol_tlv_0x41; } } } 注:# njtmesh_dest NJet自定义指令,是用于获取firewall规则设置的原始目标信息的指令,开启后,可以通过$njtmesh_port 获取原始的目标端口,同样$njtmesh_ip,可以获得原始的目的地址。 5. 参考及致谢 Open NJet同nginx一样,通过变量访问传递的信息, http://nginx.org/en/docs/http/ngx_http_core_module.html#var_proxy_protocol_tlv_ 部分代码参考了 https://github.com/dedok/nginx-stream-proxy-protocol-v2 ,在此表示感谢 nginx 商业版本有模块 https://nginx.org/en/docs/http/ngx_http_proxy_protocol_vendor_module.html ,可以解析云服务商如GCP/amazon/Azure的自定义TLV,用于更好的LB控制,但未见设置模块。 协议rfc参考: https://www.haproxy.org/download/1.8/doc/proxy-protocol.txt OpenNJet 最早是基于 NGINX1.19 基础 fork 并独立演进,具有高性能、稳定、易扩展的特点,同时也解决了 NGINX 长期存在的难于动态配置、管理功能影响业务等问题。 邮件组 官网

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册