无奈何杨(wnhyang)

I will keep to fight

个人博客:无奈何杨(wnhyang)

个人语雀:wnhyang

共享语雀:在线知识共享

Github:wnhyang - Overview


起因

突然接收到XX给的任务,要将一批IP数据处理一下,将IP对应的省市区解析出来,很急!

已知我这边有一个IP解析接口,提供了IP解析到国家省市区ISP等的能力,而且支持批量查询,但问题是仅仅有接口的形式,没有管理应用将接口利用起来,要使用的恐怕也只能是发接口,而且XX提供的数据有极大可能是Excel格式。另外XX没有说明解析后的数据怎么给出来,如果是Excel最好就是将数据放在一行标记为省市区就好。这么看来只能是临时开发来完成了,经过分析此时已经有了大致的思路了。

果然!拿到的数据是xls格式,大致如下。共有几百条。

a b c ip
123 234 345 127.0.0.1

那就动手开发吧!从接受到任务到结束大概用了40分钟,这不是炫耀什么,毕竟使用AI可能会更快更好,但这毕竟是临时做的,完成的也还可以,我还挺欣慰的。

思路

任何临时紧急的任务,第一目标都应该在时间要求内是完成它,所以总体思路就是先完成后优化。

其实做起来也很简单

1、整理原始数据,也可以叫做数据清理。

2、读IP数据

3、整合请求,发接口进行IP解析

4、解析数据补充在原数据上

5、输出

这里提供了示例数据,IP数据来源于在线ip地址随机生成器 - JSON中文网,其他数据都是随机生成,一共270条。

阅读全文 »

个人博客:无奈何杨(wnhyang)

个人语雀:wnhyang

共享语雀:在线知识共享

Github:wnhyang - Overview


参考

什么是支付风控?包含哪些环节?

支付风险智能风控应用与评估指引

交易事件及其生命周期

交易事件就是交易,如:登录、注册、转账等,而且这些还只是大类,通常转账有手机号转账、银行卡号转账等,币种又有人民币、外币、数字人民币等,这只是从方式、币种区分,其实还有很多,而且流程是相对复杂的。

以下仅是随意的例子,不可深究。

image

要在转账中加入风控一定也是了解转账的整体流程的。

从风控业务的角度出发,接入风控的交易数据就可以称为交易事件🤝

虽然说是这么说,风控的接入要熟悉整个交易流程,但是为了简化,其实是可以把所有交易分为事前事中事后的。

事前事中事后风控

阅读全文 »

个人博客:无奈何杨(wnhyang)

个人语雀:wnhyang

共享语雀:在线知识共享

Github:wnhyang - Overview


参考

【相见欢】Spring MVC 源码剖析(五) —— 消息转换器 HttpMessageConverter | 芋道源码 —— 纯源码解析博客

Spring boot 中时间类型的序列化与反序列化 - 掘金

Spring boot 中 Jackson 的常用配置

Failed to deserialize java.time.LocalDateTime

这是web开发中常见的一个错误,无法完成LocalDataTime的反序列化。

这是怎么回事?

其实这个问题在于LocalTimeLocalDateLocalDateTime的序列化上。

这就要从SpringMVC说起了!

Spring MVCSpring Framework 的核心组件之一,与其他模块(如 Spring BootSpring DataSpring Security 等)一起构成了完整的 Spring 生态系统。

Spring MVCWeb开发中极其重要,其设计思想是非常值得学习的。

关于SpringMVC的学习可以参考以下文章

Category: Spring-MVC | 芋道源码 —— 纯源码解析博客

请求报文在传输中是要进行序列化和反序列化的,有大致经历了如下流程。

image

其中这个HttpMessageConver是这个过程中的关键,这个接口继承树如下图。

阅读全文 »

个人博客:无奈何杨(wnhyang)

个人语雀:wnhyang

共享语雀:在线知识共享

Github:wnhyang - Overview


参考

探索集群 · Elasticsearch 中文文档

https://www.elastic.co/guide/en/elasticsearch/reference/8.14/fix-common-cluster-issues.html

Elasticsearch运维指南-腾讯云开发者社区-腾讯云

elasticsearch重启后,unassigned索引重新分片失败YELLO、RED恢复处理_es报错分片失败-CSDN博客

磁盘空间不足导致 Elasticsearch 锁定索引无法写入数据 | Anonymity94

Elasticsearch - 随笔分类 - 散尽浮华 - 博客园

尤其是最后这个链接非常建议看一下,太棒了!

命令

小提示

在请求后加上?v触发详细响应信息,拼上?prettyjson美化。

如:curl -X GET localhost:9200/_cat/nodes?pretty响应为

1
2
3
192.168.168.100 66 99 4 0.45 0.22 0.22 mdi - node-2
192.168.168.101 57 99 4 0.35 0.21 0.21 mdi * node-1
192.168.168.102 52 99 4 0.20 0.15 0.18 mdi - node-3

改命令为:curl -X GET localhost:9200/_cat/nodes?v&pretty后响应为

可以看到已经有头信息了。

1
2
3
4
ip         				heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name
192.168.168.100 60 99 4 0.36 0.21 0.22 mdi - node-2
192.168.168.101 56 99 4 0.36 0.23 0.22 mdi * node-1
192.168.168.102 52 99 4 0.13 0.13 0.18 mdi - node-3

常用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# 集群健康检查
curl -X GET localhost:9200/_cluster/health

# 集群设置
curl -X GET localhost:9200/_cluster/settings

# 节点查看
curl -X GET localhost:9200/_cat/nodes

# 所有索引查询
curl -X GET localhost:9200/_cat/indices

# 指定索引设置查询
curl -X GET lcoalhost:9200/${my_index}/_settings

# 所有分片查询
curl -X GET localhost:9200/_cat/shards

# 指定索引分片查询
curl -X GET localhost:9200/_cat/shards/${my_index}

# 所有别名查询
curl -X GET localhost:9200/_cat/aliases

# 指定别名查询
curl -X GET localhost:9200/_cat/aliases/${my_aliases}

# 磁盘使用情况
curl -X GET localhost:9200/_cat/allocation

# 筛选未分配的分片
curl -X GET localhost:9200/_cat/shards?v | grep UNASSIGNED

# 查看allocation失败原因
curl -X GET localhost:9200/_cluster/allocation/explain?pretty

检查集群状态

通常使用curl -X GET localhost:9200/_cluster/health?pretty检查es集群状态,如下面的响应数据。

阅读全文 »

个人博客:无奈何杨(wnhyang)

个人语雀:wnhyang

共享语雀:在线知识共享

Github:wnhyang - Overview


简介

标题其实是不准确的,了解过的会知道在LiteFlow2.12.0已经有了决策路由的特性,但我为什么标题这么讲呢?且往下看。

因为这篇文章LF的重磅特性预告:决策路由,我一直期待着决策路由功能的发布,终于有一天它发布了!

决策路由特性来袭,LiteFlow大版本2.12.0发布,Make your code amaing!

虽然这次是大更新,发布的不只是决策路由,但是我心心念念的决策路由并没有我期待的那样好用,因为这个版本的路由是全局匹配,没有分组或分级的概念,在实际使用中并不那么好用。虽然能通过一些代码来实现类似的分组功能,但是肯定不如框架实现的好,同时也不想因此将代码来回变动,所以通过社区向作者提意见,正好作者早有此想法,非常nice!

这次规则引擎LiteFlow发布v2.12.1版本,有多猛用过才知道2.12.1版本带来此功能,我也默默的将许久未编辑的《LiteFlow大版本2.12.0发布,决策路由发布》的文章重命名了标题《规则引擎LiteFlow发布v2.12.1版本,决策路由特性》。

参考

🏖概念以及介绍 | LiteFlow

2.12.0升级指南 | LiteFlow

决策路由

说明

关于LiteFlow,不想再过多介绍了。之前的文章也有说明了风控系统之普通规则条件,使用LiteFlow实现

非常推荐通过官网来学习,很有帮助!

路由嘛,知道Nginx吧,可以理解为location的配置,不知道Nginx,类比微服务网关也一样。

2.12.0版本加入了路由特性,新增了routebody标签。

阅读全文 »

个人博客:无奈何杨(wnhyang)

个人语雀:wnhyang

共享语雀:在线知识共享

Github:wnhyang - Overview


简介

前面有风控系统之普通规则条件,使用LiteFlow实现,介绍了普通规则条件,并给出简单的示例实现。

这篇就此进行扩展,介绍其他规则条件。

说白了,规则条件就是条件,而且并不局限于规则之中,简单讲就是if()括号里的内容,用于判断规则是否需要执行,是规则极其重要的部分。

规则条件有很多种,他们看似相同,却又不同。作为程序员,应该具备逻辑抽象的思维,通过设计将其统一整合起来。

阅读全文 »

个人博客:无奈何杨(wnhyang)

个人语雀:wnhyang

共享语雀:在线知识共享

Github:wnhyang - Overview


简介

前有文章MybatisPlus-Generator自定义模版生成CRUD、DTO、VO、Convert等介绍如何使用MybatisPlus-Generator自定义模版生成CRUDDTOVOConvert等代码。这次加入了导入导出Excel的接口,并提供最为简单的交互式Web用于生成代码。当然之前的生成方式同样可用,本篇文章就介绍一下如何使用。

GitHub - wnhyang/crud-quickstart

Gitee - wnhyang/crud-quickstart

配置与启动

项目启动其实是用不到数据源配置的,但并没有删除,这样方便直接填入基础的信息。

1
2
3
4
5
6
spring:
datasource:
url: jdbc:mysql://localhost:3306/xxx
username: wnhyang
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver

启动即可

填写生成配置

1、填写数据库信息

默认读取的是项目启动配置,可直接修改其他数据源,MySQL支持最好。

这里注意下jdbcUrl,填写到端口就可以,比如jdbc:mysql://localhost:3306

image
阅读全文 »

个人博客:无奈何杨(wnhyang)

个人语雀:wnhyang

共享语雀:在线知识共享

Github:wnhyang - Overview


复杂的项目常常会涉及到多数据源的配置,解决方案也是有很多。但这篇文章不是讲这个的,而是纯粹的数据源管理,通过数据源配置,获取数据库信息、表信息、数据等等,更像是超级简单的数据库管理工具(DbeaverNavicat等)。

这个有什么应用呢?

1、一些后台类系统常需要查数功能,这个就可以用到。有人问了我们有DbeaverNavicat还需要这个?确实,有专业的数据库管理工具,这个就显得非常鸡肋了。但是数据库通常是由专业的DBA管理的,账号和权限都是受管控的,而且数据库账号通常无法和后台类系统用户权限关联,所以这个就显得有点用处了。

2、作为外部数据源,有时候系统本身的数据不够用,或者说是有局限性,希望能够接上外部更加丰富数据,这时也是可以应用的。

3、代码生成器

4、等

数据库信息

因为JDBC,数据源的配置包含jdbcUrlusernamepassworddriverClassName就可以建立数据库的连接了。

阅读全文 »

个人博客:无奈何杨(wnhyang)

个人语雀:wnhyang

共享语雀:在线知识共享

Github:wnhyang - Overview


简介

GitHub - wnhyang/geoHelper

无奈何杨/geoHelper

geoHelper整合了身份证、手机号、IPGPS解析方法,基于内存提供离线高性能解析服务。

身份证/手机号解析服务

IP/GPS解析服务,ip2region,逆地理编码

数据来源

数据 来源
行政区划 GitHub - modood/Administrative-divisions-of-China
手机号 GitHub - EeeMt/phone-number-geo
IP 狮子的魂/ip2region
geo 中国城市坐标(最全最完整)

身份证解析

适用国内身份证解析,作为Hutool.IdcardUtil的扩展,加入AdocUtil,意为中国行政区划工具。

方法包括:

  • getProvince 获取省份
  • getProvinceName 获取省份名称
  • getCity 获取城市
  • getCityName 获取城市名称
  • getArea 获取区县
  • getAreaName 获取区县名称
  • getPca 获取省市区

当然基于GitHub - modood/Administrative-divisions-of-China可以扩展到乡级(乡镇街道)、 村级(村委会居委会),那么数据量会大一些,可以将数据存储在数据库中使用。

阅读全文 »

个人博客:无奈何杨(wnhyang)

个人语雀:wnhyang

共享语雀:在线知识共享

Github:wnhyang - Overview


简介

放在前面,怕有些人看不下去错过,整合了身份证/手机号/IP/GPS解析的工具将在下一篇文章推出,并将全部数据和代码放在GithubGitee上。

接着前一篇的的身份证/手机号解析服务,其四者难度对比是这样的,身份证 < 手机号 < IP < GPS。也比较好理解,毕竟是从点到线再到面,难度可想而知。GPS用词可能不当,我还是解释一下,这里的意思是指通过经纬度解析到行政区划/地理信息,也可以讲是逆地理编码。

身份证和手机号都相对简单,数据本身不大,而且规则也比较清晰,所以比较容易。相比之下IPGPS的难度就大了太多了,IPv4v6已经是数据量的极大扩展,而且这些数据很难获取,对于ISP拥有的IP范围匹配又是很大的难题,是需要算法设计的。好像我一直都是这样,简单的事做着没意思,困难的事情又不知道怎么做,还没开始就准备放弃了。就跟打游戏一样,碾压式的赢没有快感,被碾压的输又没有乐趣,只有均式相持拼尽全力的赢才是畅快。回到正题,身份证和手机都是有规律的,不管是数据的管理和搜素算法都可以自己做。而对于IP,首先数据量就比较大,数据存储、读取、检索都是考虑的点。这还只是谈到了IP解析,GPS的解析就更复杂了。把IP数据比做标尺上的刻度的话,GPS数据就是组成标尺分子原子,只是个小小比喻不用在意😂毕竟数据量从有限的线升级为无限的面,而且经纬度是针对的是地球这个不规则的球体,人类又将不规则的大陆海洋划分为更多密密麻麻的不规则多边形,所有的不规则多边形又是由众多经纬度的点连线划分出来的,想想就知道有多复杂了。

IP解析

首先就要谈谈这个IP解析,真的搞的我头都要炸了。

历程,1、为了简单方便,直接寻找性能和准确性都不错的api调用;2、发现这些api要么有限制,要么要认证,数据还不是很满意,而且性能不能达到我的要求(30ms以内);3、发现一些免费有趣的api,开始跑偏,玩了起来;4、发现狮子的魂/ip2region这个项目,其提供了IP数据存储和检索的离线解析方案,由此想尝试自己的离线IP解析;5、数据从哪里搞呢,本身狮子的魂/ip2region项目中已经提供了一份数据,但数据比较简单,不大够用,其实项目已经提供了数据修改更新的方法,但认为手动补充有比较麻烦,所以又琢磨起数据源。

阅读全文 »
0%