首页 文章 精选 留言 我的

精选列表

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

小小的日常维护,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 长期存在的难于动态配置、管理功能影响业务等问题。 邮件组 官网

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

天了噜,Java 8 要停止维护了!

前些天的中兴事件,已经让国人意识到自己核心技术的不足,这次的 JDK 8 对企业停止免费更新更是雪上加霜。。 以下是 Oracle 官网提示的 JDK8 终止更新公告。 image 原文内容:Oracle will not post further updates of Java SE 8 to its public download sites for commercial use after January 2019. Customers who need continued access to critical bug fixes and security fixes as well as general maintenance for Java SE 8 or previous versions can get long term support through Oracle Java SE Advanced, Oracle Java SE Advanced Desktop, or Oracle Java SE Suite. For more information, and details on how to receive longer term support for Oracle JDK 8, please see the Oracle 翻译 2019年1月之后,Oracle将不会在其网站上发布Java SE 8商业使用的进一步更新下载。那些需要持续获取安全的bug修复和安全补丁以及Java SE 8或以前版本的稳定性支持可以通过Oracle Java SE高级版,Oracle Java SE高级桌面,或Oracle Java SE套件。有关更多信息以及如何获得Oracle JDK 8长期支持的详细信息,请参阅Oracle支持路线图。 公开更新路线图如下: image *:表示支持的最晚日期; ** 和 ***:大概意思就是这是一个周期很短的版本,用户很快会切换到另外一个可用的更新版; ****:Oracle在2017年12宣布了会发布更简单快速的发布路线图,将在2018年9月开始生效。 Java支持路线图如下: image 说那么多,简短来说就是 Java 8 在 2O19 年 1 月之后不再免费向企业提供更新,想要更新就得付钱或者升级到 Java 9 之上。。 现在要做的就是赶紧熟悉 Java 9,不然就付费吧,妈蛋,Java 8 相信很多人到现在都没用熟。。。 Java要被 Oracle 玩死了吗?大家有何感想? 扫描关注我们的微信公众号,干货每天更新。 image

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

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等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册