分类: Uncategorized

  • ChinaHadoop携手图书云打造大数据主题图书馆 免费企业图书馆 私人图书馆 共享图书更加便捷高效 扫码即刻开启图书共享时代

     

    图书云为共享图书平台,通过图书云微信公众号可将自己的闲置图书共享出来,建立自己的微信私人共享图书馆,可与附近的朋友、同事、好友、群友、同学、邻居、俱乐部成员等分享自己的图书!也许,自己沉睡的图书是他人成长的阶梯!通过图书云,可以打造私人图书馆、企业图书馆、小区图书馆​!

    本次ChinaHadoop携手图书云活动分为微信私人图书馆与企业图书馆两大活动主题!关注图书云公众号可开通私人图书馆,将自己的图书共享到平台,就近分享,特别适合​邻居、同事共享图书!动手能力强的可以自行扫码探索!想先了解的,可以扫码后,看看ChinaHadoop为图书云开设的介绍​!

    一、私人图书馆

    每个IT人士,或多或少都会有些​图书,这些书一点也不便宜!尤其是外文原版图书,看完也舍不得丢了,当废品卖了,更是​心疼!建立一个自己的私人小图书馆,让朋友邻居借着看,感觉就是不​一样!

    1.1 巧用扫码录入

    图书云支持扫码录入图书,扫图书的条形码,可直接将图书录入到平台,结合lbs技术,可让周围的朋友看到自己的图书!快速高效录入!

    1.2 巧用书单码

    图书云书单码是私人图书馆的快速入口,分享给朋友后,可让朋友进入到自己的私人图书馆中,浏览图书清单!支持分享到朋友圈,与圈里的​小伙伴共同图书!

    1.3 实时微信提醒

    关注图书云公众号之后,一旦有小伙伴相中的图书,能收到微信的实时提醒​!通过图书云小程序,可与借书的小伙伴进行实时文字聊天​!约时间、约地点,完成一次图书的​借阅!

    二、图书云企业图书馆

    图书云支持企业微信,通过图书云企业微信入口,可由企业微信管理员开通图书云企业微信功能,还未开通企业微信的企业负责人,可直接通过以下二维码​进行开通!非企业微信管理人员,无法直接开通,需要找管理员扫码开通!图书云​企业版,也是免费的!

    图书云不仅支持私人图书馆、企业图书馆,也支持更多应用场景,可建立社区图书馆、微群图书馆、俱乐部图书馆、社区图书馆!更多的应用​场景等着大家去发现!ChinaHadoop欢迎各位小伙伴共享Hadoop大数据图书,共同建立以大数据为主题的线上​虚拟图书馆!

    图书云  共享创建价值

    ​

  •  

    有人的地方,就有江湖,有输入框的地方,就有注入风险!有输入框的地方,就有敏感词!敏感词就像一个平台杀手,可能直接导致平台被封锁!

    敏感词是一个APP、一个网站、一个内容平台的“杀手”,危害程度杀伤力相当大。将一个文本中的敏感词过滤掉,是一个合法合规平台所必须使用的技术。敏感词的过滤算法是关键词查找、过滤打码的过程,可有效结合时间复杂度高效的树型结构进行算法设计与实现!

    敏感词可能是脏话,也可能是不同文化背景下的禁词,也可能是政治敏感词汇,等等,敏感词可能导致平台遭受法律或政策的制约。举个简单的例子,非法涉黄的网站可能直接被取消网站备案,无法在中国大陆访问。不做敏感词的后果是相当严重的。

    做为一个程序员,一个开发工程师,一定要掌握敏感词算法么?工程师分为很多派系,对于做搜索的工程师,算法,b树,敏感词过程,应该要从底层,从设计到实现都不能放过!做为应用工程师(小白程序员),能掌握算法原理,并能使用,我觉得就好了,树叶有专攻!来来来,来一段算法描述。目前查到的敏感词过滤算法。

    一、敏感词少的情况

    如果敏感词少的话,就直接使用replace,indexOf等等来搞定吧,只是这种情况存在的可能性太小了。敏感词可以说是很多很多。不过,不讲究效率的地方,能实现业务要求的话,使用这种方式也可以。

    二、敏感词较多的情况

    敏感词受政治、人文、种族各种因素影响,词汇量较多,要做到全面的过滤,自然要考虑考虑算法的设计,以保证过滤的高效性。在这里介绍网上流行的一种敏感词过滤算法。深入了解专业算法已经超出了本文的范畴,请自行找其他资料查看。网上流传的算法,主要是将敏感词库放到树型数据结构中,将带过滤的文本投射到敏感词树上,命中的就是踩到敏感词。用树型结构体加速匹配速度。

    2.1 构建敏感词树

    什么是树?主要是树型结构在时间复杂度上有优势。详细了解时间复杂度与树型算法,关注公众号回“算法”!今天不展开介绍树型结构。构建敏感词树型结构体,可以通过第三方库来完成,有现成的。回复公众号“敏感词库”可获取相关信息。如图所示,我们构建了一棵敏感词树,这棵树有傻子、傻逼、傻逼人三个敏感词​。

    2.2 投射文本

    把文本填充到敏感词树上,就能直观的看到哪些敏感词覆盖到了。如果有人在平台发布违禁信息,可以快速识别出来。在这里使用投射文本描述,只是为了描述算法,具体实现就看代码。如图所示,投射到树上文本“傻逼”,就是被发现的​敏感词。

    敏感词过滤算法的核心就是这两步!一棵敏感词树,一次投射文本,就能把敏感词全遍找过来,高效​!

    今天的算法分享就要告一段落了,赶紧播放赞助商广告!

    http://www.jishudao.com/2019/07/26/bad_words/

  • JAX-WS RI 2.2.9 Java WebService Timeout时间设置

     

    JDK1.8 +Tomcat环境,采用以下配置实现了超时配置,且验证有效。

    bindingProvider.getRequestContext().put("com.sun.xml.internal.ws.connect.timeout", 30000); bindingProvider.getRequestContext().put("com.sun.xml.internal.ws.request.timeout", 60000);

    给人感觉,有多种不同的实现!小红帽RedHat给出的示例是针对JBoss,看起jdk有些不一样。

    public void testConfigureTimeout
    (
    ) throws Exception
    {
       //Set timeout until a connection is established
       (
    (BindingProvider)port)
    .
    getRequestContext
    (
    )
    .
    put
    (
    "javax.xml.ws.client.connectionTimeout"
    , "6000"
    )
    ;
    
       //Set timeout until the response is received
       (
    (BindingProvider) port)
    .
    getRequestContext
    (
    )
    .
    put
    (
    "javax.xml.ws.client.receiveTimeout"
    , "1000"
    )
    ;
    
       port.
    echo
    (
    "testTimeout"
    )
    ;
    }
    代码看起来跟引入的包名匹配度高,但是实测不生效。
    而Github上的资料显示,不同的环境下,采用的配置有些不一样,也没有一个统一的标准。
    A little overview of several implementations: // Weblogic JAX-WS properties ((BindingProvider) port).getRequestContext().put(“com.sun.xml.ws.connect.timeout”, timeout); ((BindingProvider) port).getRequestContext().put(“com.sun.xml.ws.request.timeout”, timeout); // JDK JAX-WS properties ((BindingProvider) port).getRequestContext().put(“com.sun.xml.internal.ws.connect.timeout”, timeout); ((BindingProvider) port).getRequestContext().put(“com.sun.xml.internal.ws.request.timeout”, timeout); // JBOSS CXF JAX-WS properties, warning these might change in the future (CXF-5261) ((BindingProvider) port).getRequestContext().put(“javax.xml.ws.client.connectionTimeout”, timeout); ((BindingProvider) port).getRequestContext().put(“javax.xml.ws.client.receiveTimeout”, timeout);
    小节,对于JAX-WS的超时配置,需要依据自身的环境配置来决定。默认的超时时间是30s连接,响应超时是60s,这个可以参与apache cfx官网。未验证。
    参考
    http://cxf.apache.org/docs/client-http-transport-including-ssl-support.html#ClientHTTPTransport(includingSSLsupport)-Example   搜索一下timeout可以查找到配置说明。
    Attribute Description
    ConnectionTimeout Specifies the amount of time, in milliseconds, that the client will attempt to establish a connection before it times out. The default is 30000 (30 seconds). 
    0 specifies that the client will continue to attempt to open a connection indefinitely.
    ReceiveTimeout Specifies the amount of time, in milliseconds, that the client will wait for a response before it times out. The default is 60000. 
    0 specifies that the client will wait indefinitely.
  • WebService传奇故事 这是.Net、Java、C++语言的大战, 也是微软 与 IBM等厂商的PK,于是小白爬坑之路开始

    说到WebSerivce,会想到很久很久前的SOAP,第一次看到的时候,觉得就一个神马。在.Net环境下使用过,导入WebService,直接使用,似乎也是很实用的一种跨平台跨系统的操作体验。单纯在.net体系,是感受不到WebService的阵痛,在java下,才是WebService爬坑的最佳土壤。这个故事的主题在于java与.net两个平台实现的差异,在于厂商实现的异常。

    一、.Net vs Java

    相比较于java,.net体系下的WebService,选择更单一,用ms的就好,直接用ide导入webservice。玩java的话,axis1,axis2,ide导入,wsimport命令生成,还有wsdl2java命令。

    二、厂商之争

    就实战经验来看,不同的厂商对soap的实现,还有差异。.net发起的soap报文是<soap>开头,而java发起soap发起了soapenv报文。导致跨平台调用的时候出现问题。

    方案一 ide导入

    直接使用eclipse导入WebService,同样的方式导入,STS却导入不了。所以实操过程中,选择eclipse导入。针对java平台的WebService调用,调用正常。但是调用一个神秘的WebService,一直报soap报文格式不对。如果没有记错的话,当时eclipse导入WebService,生成的是axis1的实现。网查axis1对于soap请求头处理,就是一个Bug。所以方案一,被丢掉了。

    方案二 前辈方案+axis2

    想着axis1搞不了的事情,兴许axis2能做。当被告之有方案借鉴时,感觉看到了希望。不过,没有看到操作手册,也不知道代码是怎么生成的。从包引用上来讲,用的是axis2,这个就是为什么有axis2方案尝试的原因了。也是迷惑人的地方。因为引入的包,压根没有使用到。但是从代理类的生成风格上来讲,还是具备排版精良的影响。使用axis2的代理类生成工具,生成完代理类之后,吓死了,感觉生成的代码就是一团芝麻糊,于是,直接丢掉了。为什么别人生成的axis2代理类这么优秀,而我生成的惨不忍睹?

    方案三 wsimport方案

    绕了半圈,回到了java sdk自带的wsimport,直接在命令行输入wsimport,会有提示。存放代理类的文件夹不存在的话,还不给生成,这个有点小小的坑!

    D:\>wsimport缺少 WSDL_URI​​用法: wsimport [options] <WSDL_URI>​\其中 [options] 包括:  -b <path>                 指定 jaxws/jaxb 绑定文件或附加模式                            (每个 <path> 都必须具有自己的 -b)  -B<jaxbOption>            将此选项传递给 JAXB 模式编译器  -catalog <file>           指定用于解析外部实体引用的目录文件                            支持 TR9401, XCatalog 和 OASIS XML 目录格式。  -d <directory>            指定放置生成的输出文件的位置  -encoding <encoding>      指定源文件所使用的字符编码  -extension                允许供应商扩展 - 不按规范                            指定功能。使用扩展可能会                            导致应用程序不可移植或                            无法与其他实现进行互操作  -help                     显示帮助  -httpproxy:<host>:<port>  指定 HTTP 代理服务器 (端口默认为 8080)  -keep                     保留生成的文件  -p <pkg>                  指定目标程序包  -quiet                    隐藏 wsimport 输出  -s <directory>            指定放置生成的源文件的位置  -target <version>         按给定的 JAXWS 规范版本生成代码                            默认为 2.2, 接受的值为 2.0, 2.1 和 2.2                            例如, 2.0 将为 JAXWS 2.0 规范生成兼容的代码  -verbose                  有关编译器在执行什么操作的输出消息  -version                  输出版本信息  -wsdllocation <location>  @WebServiceClient.wsdlLocation 值  -clientjar <jarfile>      创建生成的 Artifact 的 jar 文件以及                            调用 Web 服务所需的 WSDL 元数据。  -generateJWS              生成存根 JWS 实现文件  -implDestDir <directory>  指定生成 JWS 实现文件的位置  -implServiceName <name>   生成的 JWS 实现的服务名的本地部分  -implPortName <name>      生成的 JWS 实现的端口名的本地部分​\扩展:  -XadditionalHeaders              映射标头不绑定到请求或响应消息不绑定到                                   Java 方法参数  -Xauthfile                       用于传送以下格式的授权信息的文件:                                   http://username:password@example.org/stock?wsdl  -Xdebug                          输出调试信息  -Xno-addressing-databinding      允许 W3C EndpointReferenceType 到 Java 的绑定  -Xnocompile                      不编译生成的 Java 文件  -XdisableAuthenticator           禁用由 JAX-WS RI 使用的验证程序,                                   将忽略 -Xauthfile 选项 (如果设置)  -XdisableSSLHostnameVerification 在提取 wsdl 时禁用 SSL 主机名                                   验证​\示例:  wsimport stock.wsdl -b stock.xml -b stock.xjb  wsimport -d generated http://example.org/stock?wsdl

    照着命令行的提示来,就能生成代理类了。

    采用wsimport生成的代理类竟然跟4年前同事留下的对接项目代码是一样的,于是修改<soapenv>就有着落了。实战证明,前辈们留下的代码管用。关键的代码就是自己实现一个报文处理的Handler,然后在Soap代理类调用时,先设置Handler!

    wsInstance = new WS();        wsInstance.setHandlerResolver(portInfo -> {          List<Handler> handlerList = new ArrayList<>();          handlerList.add(new SOAPEnvelopeHandler());          return handlerList;        });

    关注本公众号,输入soap获得SOAPEnvelopeHandler详细讲解。

    方案不足之处

    采用wsimport生成的代理类指定了wsdl位置,这个看起来怪怪,但是这种方案能修改soap请求报文,可以默认接受了这个让人心头有点痒痒的方案。

    WebService优化

    采用单例优先代练类的创建,能提升压测值。在未使用单例优化时,空接口也无法通过5000/min压测,采用单例优化后,可以通过。最终的优化方案为:

    1. 能缓存的,使用redis缓存60秒。过压测。
    2. 不能缓存的,过不了压测,限制每分钟调用频率。

    受控环境下的WebService联调技术

    如果开发机器不能直接调用对方的WebService,如何进行快速联调呢?关注本公众号,回复信息wsdebug,获取实战经验分享。

    WebService与区服切换

    回复信息switcharea,获取实战经验分享。

    思考

    今天的思考题:sonarqube报很多漏洞很多bug的代码是不是好代码?请留下您的思考答案。

    结束语

    WebService从诞生到现在,越来越不受待见了,越来越多的人喜欢采用更轻量级的WebAPI来代替WebService,采用JSON,采用更加透明的跨平台方案。但是WebService并没有死,因为生成代码还是一个优点。如果再次在java平台下对接WebService,请优先考虑jdk自带的wsimport进行代理类生成,可通过自定义SOAPHandler达到更好的兼容性。如有更好的方法,请留言告之。

    关注公众号 看同行经验分享

  • 图书云企业版上线 免费开启知识型企业 打造强有力的软实力 企业与员工共成长 增加中小企业核心竞争力

     

    图书云企业版上线了!免费!​免费!图书云携手企业微信为中小企业提供企业共享图书服务,一键安装即刻拥有一个企业共享图书馆,企业员工均可参与图书共享,不仅提高了企业员工的知识水平,更能为企业核心竞争力打下更为牢固的​基石!

    如何使用图书云企业版?

    通过识别图书云二维码,可开通图书云与微信联合打造的专属客户端,苹果、安卓、Windows、mac均能免费享受共享图书服务!未开通企业微信的用户,可以依照引导注册并开通。已有企业微信的企业,可直接开通。遇到开通问题,还可以联系图书云客户,通过图书云公众号留言所遇到的问题,能得到专属服务!

    图书云企业版​怎么收费?

    图书云是为中小企业提供的图书共享平台,免费开通与使用!图书云有多家赞助商提供赞助支持,也欢迎有实力的企业提供赞助支持​。

    可否​定制?

    图书云可以提供定制服务,需要收取适当的定制服务费,可留言​商议。或通过文章尾部的约吗小程序活动报名​图书云定制服务。

    ​

  • 有人的地方就有江湖,有代码的地方就有Bug!压测如同照妖镜 妖怪哪里逃! 业务代码、核心代码、机器配置通通无处遁形 藏得再深,藏得再久,也逃不出压测的猛烈攻击!压测实战分享

    压测如同照妖镜 妖怪哪里逃! 业务代码、核心代码、机器配置通通无处遁形 藏得再深,藏得再久,也逃不出压测的猛烈攻击!压测实战分享是这阵子感触比较深的!压测在于暴力,在于并发,在于无情。一个铁的事实标准摆在面前,从配置到代码,从业务到核心,从cpu到硬盘,从网络到逻辑,方方面面,能争取一秒算一秒,能榨一毫秒算一毫秒!压测能把潜伏在系统里的深层Bug暴露出来,经典到格致,让人难以忘却所在所闻!下面从几个方面分享一下。

    一、压测反推工程结构

    压测与代码工程结构的千丝万缕关系。从压测的角度来看,代码至少要分成两部分,一是可控代码,简单的说,就是项目中的业务代码,因为是自己写的,所以可控性很强,压测的时候,可以针对性优化;二是不可控代码,像调用的第三方接口,这种没法自主控制。如图示,agent中存放与第三方交互的代理类。压测的时候,区分开可控代码与不可控代码。可控的代码就自己优化 ,不可控的代码,如果是公司团队提供的,就去沟通一下吧,对于外部公司的Agent,那真的是超级不可控了,直接忽略吧。在工程结构上来分析,建议Agent的异常要及时抓住并记一条神奇的【甩锅】日记,看看日志,就能快速定伴Agent对应的团队人员,找到快速处理问题。最好,把第三方的交互统一加上try-catch,记下异常。这样子,可控与不可控就划得很清楚了。

    二、不要迷信核心代码

    使用核心代码公共类库是一件很开心的事情,省下很多不必要的时候,省下的不仅是时间,更是一堆堆重复代码,可以让人关注业务。然后,千万不要迷信核心类库的代码,所谓有人的地方就有江湖,有代码的地方就有Bug。

    这次压测,压到一个神奇的核心库Bug。具体表现为,controller捕获了2%左右的失败,有时候又没有错,这个错误一直在0%到2%的样子。为了查这个压测失败的问题。查看失败日志,能定位到Ip获取环节。但是不知道为什么会失败,断点调试,一切都是正常的,只是压测的时候,总能重现异常。

    难道核心库有问题?这个简直不敢想,对于核心库,一直以来都是膜拜啊,拿来用,没有想过核心库会有Bug。但是面对压测的数据,又没法排除核心库的嫌疑,只能对核心库代码进行排查了。

    如果构建核心库的时候,把源代码打进去,我觉得对于使用者来讲,绝对是一个福音。可惜我面对的这个核心库没有,还好之前把源代码打进去了。单个调试一切显示正常,压根调试不出任何问题。简单就是诡异到头了。

    肿么办,抓掉几根头发后,突然灵光一闪。直接把代码Copy出来,将ip获取的代码逻辑加上步骤日志,从第一步到第六步,一一打出来,进行压测,日志显示,所ip获取的时候,步骤都是正常的。但是期间能出现还是出现了异常。看步骤的话,从request中取ip的代码逻辑并没有出现bug。面对诡异的压测结果,那就再想想。

    看样子,从reqeust中取ip的逻辑没有问题,那就把取ip的地方加上try-catch抓一下日志。果真发现Bug了,使用ip的时候,出现了ip为空,导致异常了。

    再往回看代码,发现static,发现new,一下子,抓到了Bug,这可是14年种下的bug,19年才来杀。这段代码的bug,可以描述为static误用。来来,展示一下bug的样子,希望你不要写出这种级别的bug,不好发现,不好杀,sonarqube查不出来,普通使用,一切正常,只有压测才会现形。花了8个小时才杀,不要问我为什么花了这么多时间。当核心代码在sonarqube的检查下,呈现出很多bug,很多坏外道。核心类库,想说爱你不容易~

    static误用示范public class Ip{
     private string address; 
     private int ipNumber; 
     private Ip ip;  
    private Ip(){   
     //sonarqube说禁止外面创建实例  
    }  
    public static getIp(Request reqeust){   
     ip = new Ip();   
     ....    ...    
    //相信我,这里是复杂的ip识别与获取逻辑
    ...    
    ...  
    }  
    public String getIpString(){
         return ip.address;  
    }}

    压测的时候,不要迷信核心类库,把工程分成三大块,业务代码,核心类库,agent,对应三种不可控级别的代码。业务代码自己搞定,核心类库慎重的找人处理,并[AT]尽量多的人,Agent找人处理或者直接排除掉。

    三、压测与机器配置

    机器本身配置不行的话,压测就凉凉了。同事测试了机器硬盘读写性能,发现硬盘读写就把时间消耗没了,更不要谈压测业务代码了。提供一台标准的压测机器,是合理的前提。压测不过,不仅仅是代码,这一压,也得看机器本身性能。

    压测就像一面照妖镜,英雄不问出处,是驴是马,拉出来溜溜就知道了。面对事实的标准,如何才能将压测做得更好呢?

    1、压测环境与压测要匹配

    在一个标准性能环境下,达到一个预期的压测值。这个标准环境,比如cpu,硬盘读写性能,可以是一个标准的。或者拿一个基准接口进行压测定值,先测算出环境本身适合的压测值。这样子,压测才能正常的进行。

    2、压测环境最好有多个

    接口多,接口要一个一个压,一个环境不好并行压。能有多个环境最好。不知道下次压测能不能实现,毕竟要有机器。

    3、核心类库必过压测

    核心类库都过不了压测的,放在核心类库里,这个有点点坑啦。又要用核心类库,又要过压测,没解。核心类库打上源代码,压测的时候,还可以用源代码进行压测调试。但是希望是通过压测的才放进核心类库,不要等业务代码进行压测的时候,再来找出核心类库的Bug.

    4、核心类库必过sonarqube

    为什么又扯到sonarqube,其实这个工具的强大之处在于,能分析出很多坏味道与bug,人不同于工具,工具在于将所有可性能全面覆盖分析,人没人注意到的地方,sonarqube可以注意到。这次压测就发现,核心库代码的规范性,并没有想像的美好。sonarqube找出了一堆坏味道,还有bug.

    这次压测实战,感觉收获还是很大的。对于工程结果的理解,对于异常的捕获处理,对于核心库的优化改进,都有了新的认识,对于压测,也有了自己一套方案。希望你也能从中学到宝贵的经验!

    关注公众号,我的经验就是你的经验!