首页 文章 精选 留言 我的

精选列表

搜索[第二期热点征文-编程语言],共10000篇文章
优秀的个人博客,低调大师

【热点】探探的微服务架构

最近在很多场合都听到探探这样一款App:云栖大会、微服务案例分享、脱口秀大会等等,老司机们一定知道我在说啥,作为国内版的Tinder,它在系统设计上还是借鉴了许多老大哥的想法。 探探的功能可以简单概述为四个部分:用户配置文件管理、个性化推荐匹配、配对服务和实时消息服务。简单地说个人配置文件就是每个用户的介绍,主要存储的是用户照片或视频,毕竟人类是视觉动物,尤其是对于第一印象,照片的上限是9张;推荐服务根据筛选条件(性别,年龄,距离,爱好等)从活跃用户中推荐匹配者;配对服务即双方都有意向,对方将进入自己的匹配用户名单,即服务端的通讯录列表,男性的匹配成功率在0.1%,即每一千次右划能配对成功一次,当然这也看头像和区域哈(当然女性玩家会高出几百倍);最后是实时通讯服务,即点到点即时聊天,不能添加第三方更不能组群^.^ ![1](https://yqfile.alicdn.com/079bac1a750a4671fa046dc036d4c6d733b124c5.jpeg) 好了,先说第一项功能,探探的客群还是以大陆地区为主,即便如此,图片和小视频的存储量也是相当惊人的,如何确定这些对象在服务端的存储方式,究竟是用文件还是块存储呢?相对于文件存储,块存储的优势在于以下三点: 1. 易编辑:块存储的表结构可以方便用户提取任意数据块进行编辑; 2. Transaction保证:变更需要commit并确认操作成功; 3. 索引功能:可以提升搜索效率。 5. 便于做访问控制 平心而论,照片一般作为一个整体文件被添加或替换,所以前两个特点的应用场景并不多,而且在实际操作中,很少有用户会给照片添加各种元数据(拍摄时间,地点,圈头像等等),甚至连照片名字都是一串数字,常规搜索都词不达意,更别说特征搜索了。因此看起来唯一有用的功能只剩访问控制了。我们再来看看文件存储的优势: 1. 便宜 2. 访问迅速:不需要遍历表把所有数据块拼起来,一般只需要建立用户--图片--存储位置的单表就可以了。 ![2](https://yqfile.alicdn.com/106bc97dee33fa3216278f15f6241bfeba312749.png) 3. 可通过CDN进一步提升访问速度,CDN可以很好地缓存多媒体文件。 ![3](https://yqfile.alicdn.com/594e5d93a91d19544c028316b26350a98c78c71e.jpeg) 下面进入我们的正题,首先我们该如何对用户的配置文件进行微服务拆分?主要考虑有以下几点。 用户访问配置文件(记录用户的基本信息,昵称、地区、爱好等等)需要提供秘钥(为提高安全级别可以将密码替换成令牌),如果我们直接将配置文件与用户对接,那势必别的服务都需要与配置文件建立连接以获取验证信息。但很多情况是不必要的,例如即时通讯跟用户的配置文件毫无关系。基于此我们需要建立一个应用网关服务,专门用来核实用户身份。 配置文件是否要和用户的照片库关联,目前看来似乎只有进入用户账号才能看到该用户的照片,但是从长远来看,不排除会将所有照片进行AI分析,以开发更多客群服务,所以这部分在实际操作中,探探还是将其拆分了。 因此配置文件拆分后的微服务就如下图所示。 ![4](https://yqfile.alicdn.com/6b6a5cc59eb4ab63d42f214d8e24dee29fec90e3.png) 配对服务的业务逻辑是,如果你喜欢我,我也喜欢你,双方就加入到各自的通讯录里,不然你就再也不会浏览到该用户。用户的配置文件跟配对服务没有关系,配对数据库只记录任意通过验证的两个ID之间的双向选择关系,一旦双向选择了,就配对成功,当然如果一方取消配对也会实时地删除双方通讯录。因此可以简单理解为下面的微服务架构。 ![5](https://yqfile.alicdn.com/45e510207c69f10e4f19d6767902d1e57e4e9ac7.png) 关于即时聊天服务,小编已经在微信的微服务中介绍过了,这里需要注意的是HTTP是客户端到服务端的单向通信服务,作为即时通讯来说,不可能让用户每次登陆才能查看到未读消息,因此这里需要建立XMPP通讯协议来使服务端可以主动发消息给客户。 ![6](https://yqfile.alicdn.com/12e3a7237a3f2f27cf54c1436925dbf3cc4d8ddd.jpeg) 综上所述:探探的微服务从前至后包括了:网关服务、配置文件、图片库、配对服务、全网配对数据库(由于数据量的关系,这部分很可能对数据进行了切片,将不同地域的用户放在不同地区的数据库里)、会话服务、会话数据库、消息数据库。 各位观众如果有想了解的互联网公司的架构,可私信小编,我们可以一起探讨一下。

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

技术热点:Android hook技术浅析

前言 xposed框架 xposed,主页:http://repo.xposed.info/module/de.robv.android.xposed.installer 是个开源的框架,在github上有源码的,直接下载apk后安装激活就可以使用,很多地方有这方面的教程,针对不同的手机架构,有大牛做了针对性的修改。可以在论坛中进行搜索 通过替换/system/bin/app_process程序控制zygote进程,使得app_process在启动过程中会加载XposedBridge.jar这个jar包,从而完成对Zygote进程及其创建的Dalvik虚拟机的劫持。 Xposed在开机的时候完成对所有的Hook Function的劫持,在原Function执行的前后加上自定义代码。 很多人将这个框架用在对android的私有化定制上面,其实在android安全测试方面这个框架提供了很大的便利,xposed主要是对方法的hook,在以往的重打包技术中,需要对smali代码的进行修改,修改起来比较麻烦。 利用xposed框架可以很容易的获取到android应用中的信息,比如加密私钥、salt值等等,不需要饭编译获取密钥转换算法、不需要了解密钥保存机制,直接hook函数,获取输入输出就可以。 原理 在Android系统中,应用程序进程都是由Zygote进程孵化出来的,而Zygote进程是由Init进程启动的。Zygote进程在启动时会创建一个Dalvik虚拟机实例,每当它孵化一个新的应用程序进程时,都会将这个Dalvik虚拟机实例复制到新的应用程序进程里面去,从而使得每一个应用程序进程都有一个独立的Dalvik虚拟机实例。这也是Xposed选择替换app_process的原因。 Zygote进程在启动的过程中,除了会创建一个Dalvik虚拟机实例之外,还会将Java运行时库加载到进程中来,以及注册一些Android核心类的JNI方法来前面创建的Dalvik虚拟机实例中去。注意,一个应用程序进程被Zygote进程孵化出来的时候,不仅会获得Zygote进程中的Dalvik虚拟机实例拷贝,还会与Zygote一起共享Java运行时库。这也就是可以将XposedBridge这个jar包加载到每一个Android应用程序中的原因。XposedBridge有一个私有的Native(JNI)方法hookMethodNative,这个方法也在app_process中使用。这个函数提供一个方法对象利用Java的Reflection机制来对内置方法覆写。有能力的可以针对xposed的源码进行分析,不得不说,作者对于android的机制和java的了解已经相当深入了。 简单实例 很简单的一个android登入代码: 很简单的就是判断下用户输入的用户名和密码是正确,这里做个简单的演示,将用户输入的用户名和密码信息hook出来不管正确与否 简单说下xposed模块的开发,首先需要的是导入api,具体的可以参考:https://github.com/rovo89/XposedBridge/wiki/Using-the-Xposed-Framework-API 在manifest中定义 声明这个是xposed模块,名称为hook test 并且使用api版本号是82 下面创建运行时候的hook代码: 看代码中的注释,主要是三个方法的调用,handleLoadPackage,主要是获取到android包的相关信息,这里由于只是对logintest进行hook,做下简单的判断。 findAndHookMethod 是主要的hook入口,里面几个参数分别为包名,classloader,hook的函数名,参数类型(这个比较容易出错,比如list类型写为List.class),回调函数 回调函数中比较重要的:beforeHookedMethod和afterHookedMethod,一个是在函数运行前劫持掉,一个是hook后放行,实例中对用户输入的字段进行劫持打印,后面将参数之改为正确登入用户名和密码,这样在app中输入任何字符都能登入成功 frida Hook框架 Frida是一款基于python + javascript 的hook框架,通杀android\ios\linux\win\osx等各平台,由于是基于脚本的交互,因此相比xposed和substrace cydia更加便捷,本文重点介绍Frida在android下面的使用。 Frida的官网为:http://www.frida.re/ 安装 安装Frida非常简单,在pc端直接执行 pipinstallfrida 即可 在Android设备需要导入frida的服务端,需要root你的手机 运行 设备上运行frida-server: 电脑上运行adb forward tcp转发: 27042端口用于与frida-server通信,之后的每个端口对应每个注入的进程。 运行如下命令验证是否成功安装: $frida-ps-R 正常情况应该输出进程列表如下: Hook模块的编写 hook的主要模块是js编写的,利用javascript的api与server进行通信 下面结合一个真实例子进行简单的介绍,首先是测试代码: 反编译获取app中的核心函数 对于上面的js代码,其实就是调用app中的某个函数,比如sign值生成函数,加密解密函数,不需要自己单独的去分析算法流程,分析key值在哪,直接调用app的相应函数,让app帮我们完成这些工作。 这里我们分析的app是友宝,这是一款饮料售货机,当时抓包看到提货的时候是只有个订单id的,猜想是不是遍历订单的id,支付成功但是没有取货的订单会不会响应请求,自己掉货出来。 下面对友宝的订单进行分析过程 1.抓取支付订单成功链接 分析: sign是校验值,主要是防止订单伪造的,orderid是产生的支付订单id,这个主要是防止伪造用 2.反编译友宝app 找到morder/shipping所在的包为:com/ub/main/d/e.class 其中localStringBuffer存储的就是url中的参数信息,该请求查找到的代码在a() 生成签名的函数在com/ub/main/d/e.class中的b函数 最后加上sign值,发送请求 3.可以反编译出他的sign计算方法,也可以直接调用b函数来产生sign值,后来发现app会自动取时间戳,我们就不需要给他array型的参数 直接调用a函数,把orderId给他,让他直接return一个值出来就好了,就有了上面的js代码 4. 自动化的批量处理 看代码 构造了一个类,后面直接fuzz uid就可以了,提取里面的sign值拼接到post数据中去。 可以产生的post请求和抓到的数据包的请求是完全一样的,但是并没有测试成功,分析原因有可能是订单id和用户的id有所绑定。 不过学习到了怎样通过frida对app进行分析。 复杂参数的hook 如果遇到函数的参数类型是数组、map、ArrayList类型的,首先目标MyClass类的fun1函数,声明如下: 解决方法: 用Xposed自身提供的XposedHelpers的findClass方法加载每一个类,然后再将得到的类传递给hook函数作参数! 具体实现可参考链接,大牛讲的很清楚。 参考链接 https://xianzhi.aliyun.com/forum/read/611.html http://www.freebuf.com/articles/terminal/56453.html http://bbs.pediy.com/showthread.php?t=202147&page=2 来源:51CTO

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

#2020征文-其它#鸿蒙IDE(DevEco Studio)gradle下载缓慢,咋办

目录: 基于鸿蒙的电子词典项目来了!可以搜索无限单词哦! 调试鸿蒙App源代码的两种方式 开发跨设备的鸿蒙(HarmonyOS)App 我们知道,DevEco Studio是基于IntelliJ IDEA社区版二次开发的,所以免不了要使用Gradle完成项目的构建工作。不过由于国内众所周知的原因,在DevEco Studio中下载Gradle非常慢(并不是无法访问,而是非常慢,而且还经常timeout),所以在网上有很多帖子给出了不同的解决方案。本文先列举一些典型的解决方案。 方案1:使用国内的maven库地址 找到build.gradle文件,然后修改或添加buildscript和allprojects,修改后的代码如下: repositories { maven{url 'http://maven.aliyun.com/nexus/content/groups/public/'} maven { url "https://jitpack.io" } google() } dependencies { classpath 'com.android.tools.build:gradle:3.1.2' } } allprojects { repositories { maven{url 'http://maven.aliyun.com/nexus/content/groups/public/'} google() } } 方案2:事先下载好gradle 下载好的文件是gradle-6.3-all.zip,然后将该文件放在特定的目录。目录的位置与操作系统有关。 Windows下的位置:C:\Users\用户名.gradle macOS下的位置:/Users/用户名/.gradle Linux下的位置:/home/用户名/.gradle 读者根据自己使用的OS进入不同位置的.gradle目录,然后再进入该目录下的wrapper/dists子目录。会看到“gradle-版本号-all”格式 的目录,例如,下图是我的macOS上的目录结构。 然后进入gradle-6.3-all目录(最新的DevEco Studio使用的是gradle6.3),会看到一个由字母和数字组成的目录,如b4awcolw9l59x95tu1obfh9i8,这个目录与gradle版本和路径有关。所以不同版本和路径的gradle,目录名不同。现在将我们下好的gradle-6.3-all.zip文件复制到该目录。再次用DevEco Studio重新打开HarmonyOS工程,就会非常快的同步gradle。这是因为DevEco Studio会优先在特定目录搜索gradle的zip文件是否存在,如果存在,就直接使用了,如果不存在,才会从网上下载。 不过有时特定的gradle目录还没有生成,我们也不知道要将gradle-6.3-all.zip或类似的文件放到哪里,所以也可以采用另外一种方法,换个下载更快的地址。 打开HarmonyOS工程,找到<工程根目录>/gradle/wrapper/gradle-wrapper.properties文件,会看到一个distributionUrl属性,该属性默认指向gradle的官网,可以将其换成国内的地址,或干脆自己用apache、nginx等服务器自己搭建一个本机下载服务,如我将其换成了如下的地址: http://127.0.0.1/gradle-6.3-all.zip 现在再重新打开HarmonyOS工程,就会非常快速地下载(由于是在本地下载,所以在1s之内就能完成gradle的下载任务)和同步gradle及其相关配置了。不过这里还有一个问题,我再创建新的HarmonyOS工程,岂不是还要改一遍这个文件,非常麻烦。所以为了一劳永逸,干脆改一下DevEco Studio的模板。 首先进入<DevEco Studio根目录>/plugins/harmony目录,这是DevEco Studio的插件目录。在该目录下继续找到lib/templates/gradle/wrapper/gradle/wrapper/gradle-wrapper.properties文件,该文件就是每次创建HarmonyOS工程时的gradle-wrapper.properties文件,打开该文件,将distributionUrl改成http://127.0.0.1/gradle-6.3-all.zip即可。然后重新启动DevEco Studio。再创建新的HarmonyOS工程,就会自动使用新的gradle下载地址了。由于此前已经下载了gradle,所以即使不启动本机的http服务器,仍然能快速使用gradle。 作者:李宁 想了解更多内容,请访问: 51CTO和华为官方战略合作共建的鸿蒙技术社区https://harmonyos.51cto.com

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

【AWS征文】AWS安全加固-Fortinet AWS 安全解决方案

作者:昱坤 在公有云方案日益火爆的今天,公有云应用越来越广泛。随之而来的,公有云也遇到了一些挑战:  传统数据中心产品不一定支持云环境 传统的产品不一定支持云弹性的部署以及模块化的部署 云架构的部署思路与传统物理环境部署环境完全不同 传统的安全防护很难在多云环境提供统一安全解决方案 遇到最多的问题就是:我们云环境一定要和物理数据中心架构一样 而在企业进行公有云迁移时对于安全和自动化的要求,AWS上有了新的安全自动部署方案: 在该方案中,可以将防火墙部署在Transit VPC中,以实现VPC与VPC间/VPC与Internet间等的安全加固需求。此文仅介绍Fortinet AWS 的安全解决方案。 Fortinet云部署实例要求 如果要在AWS上部署FortiGate-VM,那么实例需要满足以下要求: Fortinet常见云部署模式 针对AWS云上部署,Fortinet提供两种常见的部署方案: NGFW 和ELB部署形式  两个AZ的FW与WAF工作在AA模式 入向流量通过ELB负载分摊 FW开启NGFW威胁检测功能 FW将流量映射至内部ELB FQDN NGFW以及WAF 和ELB部署形式  FW与WAF完全集成将HTTP转至WAF WAF对HTTP流量进行深度检测 WAF将HTTP流量映射至内部ELB 在该部署模式下,三明治式的部署架构是部署WAF的最佳实践: 入向流量通过ALB负载,并基于内容分流; WAF专注于管理高级WEB安全配置; 两种高级防御模式 • 黑名单提供特征库防御,IP信誉库,HTTP协议规范,防病毒.DLP,高级防御规则,高级APT防护等功能 • 白名单提供网站详细参数设定,扫描报告导入,应用自学,Bot机器学习,参数机器学习等功能云部署的高可用性 Fortinet云部署HA有两种方案: 方案一:  由于AWS VPC中不支持二层协议,所以不能在AWS中运行VRRP HA使用主备模式部署在相同AZ,心跳使用3层 根据事件或SLA自动切换主备 主备切换会自动调用AWS API,备设备将主设备上的secondary IP和EIP切换至备设备 同时备设备将指向主设备网卡的下一条指向自己 方案二:  FortiGate部署在两个不通的可用区,子网信息并不相同 通过Fortinet利用AWS的原生服务AWS API Gateway、Cloudwatch、Lambda构建了一套自动切换VPC路由表的解决方案 当FortiGate自己发现故障,会通过联动API Gateway触发Lambda切换VPC路由表 当Cloud Watch发现设备故障,同样会触发Lambda切换VPC路由表自动扩展模式 自动扩展模式: 在面向公网侧部署NLB,保障公网IP可以透传到FortiGate侧 CloudWatch持续监控FortiGate CPU及MEM信息触发Lambda Lambda在Autoscale成员中增加FW并通过API通知FW同步配置 FW同步完配置通过API通知Lambda Lambda更新ELB配置 DynamoDB存储Autoscaling 状态信息 支持PAYG,Hybrid部署

资源下载

更多资源
Mario

Mario

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

腾讯云软件源

腾讯云软件源

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

Nacos

Nacos

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

WebStorm

WebStorm

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

用户登录
用户注册