随着项目都迁移到了dotnet core下,阿里的支付宝也需要随着项目迁移。之前在.Net Framework下用到了阿里提供的AopSdk和F2FPay两个程序集,支付宝官方提供的只支持Framework,不过还好提供了源码的下载。

本着不重复造轮子的想法,先NuGet搜了下,已经有不少实现了,仔细比较了下,最终选择了AliPay.AopSdk.Core。主要原因是在git上开源,再有就是用的人也比较多。

AliPay.AopSdk.Core项目本身很优秀,与阿里官方的Sdk基本完全一致,主要是变更了一些命名不规范的方法。很快修改完成,简单的测试了下就上线了,却不想留了个坑。

上线不久,所有用户无法支付了。登陆服务器(CentOS 7)报的异常是Too many open files in system,额,查下看看先。

ps -ef | grep dotnet 找出服务的pid,这里是14689

cat /proc/14689/limits  看看系统的限制

Max open files 4096  话说已经不少了呀

lsof -p 14689 | wc -l  统计下一共打开了多少,一看,霍,真不少满了

lsof -p 14689  看下都是哪些,发现有大量的未销毁的TCP链接

看着IP比较眼熟,似乎是阿里的,ping 下支付的服务域名 openapi.alipay.com,嗯,就是它,至此定位到了问题。

先紧急处理下,重启支付的服务,然后做下配置,把Max open files放大些。因为我的服务是用systemctl管理的,所以只需要配置 xxx.service就好。

在[Service]下面增加一行配置

LimitNOFILE=10240

重启服务后,重新拿到pid,看下limits,嗯,生效了

先扛着用下,然后来分析问题。

庆幸自己选择了开源的项目,很容易看代码。

这两句,作者实现了池,导致的。然后才回头开始看项目的文档,使用说明中用DI注入了一个IAopClient的单例,额,我是每次new出来的,所以xxxxxxxx。

至此似乎解决了,但完全没有。这个项目单例注入,已经固定了支付宝的商户号等参数,但我实际的业务需要多个支付宝账户,每次根据取到商户号来赋值。

处理思路:

本来想做个工厂,自己实现个单例,根据不同的商户号返回不同IAopClient的实现实例。仔细一想以为商户比较多,仍然存在大量的不必要的链接。最后决定,自己拿阿里的源码,改个core的版本吧。还是重复造轮子了。说干就干,先下个最新的源码,我这里是alipay-sdk-net-core-3.2.0,新建个dotnet core的Library,把需要的文件copy进来(主要是去掉了Test目录),编译下,报错。源码中包含了Jayrock,用来处理JSON,git上看了下,好老的项目,已经停止更新了,不知道为什么阿里还在用。不过还好NuGet装下System.Configuration.ConfigurationManager就一切ok了。还有些warning暂时没有理会。本机测试下(windows 10),一切OK。放到测试服务器(CentOS 7)上测试下,额,报错“您使用的私钥格式错误,请检查RSA私钥配置,charset = utf-8“,这是什么鬼。看看源码,不知所踪。这下比较麻烦了,本机没问题,远程测试环境不行,目测肯定是系统的差异了。脑子里蹦出来的办法--远程调试。嗯,没错,就这么弄(具体远程调试另一篇文档)。最后发现,果然是操作系统的差异,RSACryptoServiceProvider这个类,只支持windows系统。找到问题就好办了,替换掉。具体实现嘛懒了懒,直接拿的Alipay.AopSdk.Core项目中的实现。publish一个版本,到测试服务器上,嗯,问题解决。

非常感谢Alipay.AopSdk.Core项目作者,源码提供了很大的帮助。

参考资料:

https://github.com/dotnetcore/Alipay.AopSdk.Core

可以使用的版本

https://github.com/draweye/AopSdkCore

最新文章

  1. Android 5.X新特性之为RecyclerView添加下拉刷新和上拉加载及SwipeRefreshLayout实现原理
  2. 洛谷P1288 取数游戏II[博弈论]
  3. Promise 使用心得
  4. TO~亲爱的自己
  5. JavaWeb基础:Servlet Request
  6. Inno Setup 插件大全
  7. ASP.NET MVC中使用ASP.NET AJAX异步访问WebService
  8. codeforces #310 div1 A
  9. 制作一个类似苹果VFL的格式化语言来描述UIStackView
  10. Emit学习(1)-Emit概览
  11. rebase
  12. openstack controller ha测试环境搭建记录(三)——配置haproxy
  13. VI 摘要
  14. C专家编程阅读笔记
  15. python批量启动多线程
  16. 垃圾回收(GC Garbage collection)
  17. centos上ftp服务器的简易安装部署
  18. Android 开发笔记
  19. Internet Explorer 6 的15个讨厌的bug和简单的解决方法
  20. spring boot下mybatis遇到No operations allowed after connection closed.

热门文章

  1. PHP 高级面试题 - 如果没有 mb 系列函数,如何切割多字节字符串
  2. 从游击队到正规军(二):马蜂窝旅游网的IM客户端架构演进和实践总结
  3. clientHeight—scrollHeight—offsetHeight三者的区别
  4. 利用shell脚本快速定位日志
  5. zabbix 监控项报"Value "(No info could be read for "-p": geteuid()=1002 but you should be root"
  6. .NET 使用OLEDB导入Excel数据
  7. LOAD_DLL_DEBUG_EVENT 时读取 DllName
  8. SEH hook 的一种方法
  9. python执行shell实时输出
  10. Java性能之synchronized锁的优化