• 关于

    路径保护是什么

    的搜索结果

回答

404是你路径有问题,web.xml配置了会默认的 你的index.jsp页面放在哪? userAction返回success后找不到index.jsp,如果index.jsp是放在WEB-INF下的话它就是受保护的应该改为 WEB-INF/pages/index.jsp其中pages是我的index.jsp是放在pages中的如果 你不是的话就WEB-INF/index.jsp。如果还是出错的话web.xml中该为classpath:bean.xml去掉*号 没找jsp路径,加上文件夹,404就是没有找到, 项目启动时控制台有没有输出映射了哪些路径? 你的index.jsp放在WEB-INF是受保护的不能直接访问,要么你把index放在WEB-INF外面,有么用struts2访问路径配成WEB-INF/index.jsp 问题已经解决了。原先是用的eclipse的用户库导的jar文件,然后一直报错。后来将jar文件全部放入lib文件夹下,就好了。我也不知道原理是什么 404是你路径问题。你这个情况应该是哪里没有配置对若有需要可以远程你

爱吃鱼的程序员 2020-06-23 01:11:23 0 浏览量 回答数 0

问题

如何整合WAN和因特网云服务?

elainebo 2019-12-01 21:04:06 10065 浏览量 回答数 0

问题

Ubuntu上的ASP.NET Core 2.2 Web应用程序-如何实施数据保护

祖安文状元 2020-01-05 19:05:24 1 浏览量 回答数 1

阿里云试用中心,为您提供0门槛上云实践机会!

0元试用32+款产品,最高免费12个月!拨打95187-1,咨询专业上云建议!

问题

Ubuntu上的ASP.NET Core 2.2 Web应用程序-如何实施数据保护

祖安文状元 2020-01-05 19:04:24 0 浏览量 回答数 1

问题

云服务市场数据类服务教程导读

elinks 2019-12-01 21:15:23 8676 浏览量 回答数 0

问题

Windows系统服务器报错com surrogate已停止工作的解决办法是什么

boxti 2019-12-01 21:32:15 2051 浏览量 回答数 0

问题

学姐学长们有哪些职场成长晋升相关的书籍值得推荐?

琛琛轴子 2020-09-06 23:14:41 6 浏览量 回答数 0

问题

性能优化总结:CPU和Load、NIO以及多线程:报错

kun坤 2020-06-07 21:31:24 0 浏览量 回答数 1

问题

Windows服务器日常维护策略

我的中国 2019-12-01 21:57:39 2665 浏览量 回答数 1

问题

为什么spring 基于aop 实现日志输出 定义在controller层无效

蛮大人123 2019-12-01 20:07:58 1134 浏览量 回答数 1

问题

分析型数据库数据导入任务生产指南是什么?

nicenelly 2019-12-01 21:25:51 905 浏览量 回答数 0

回答

呼叫 @中山野鬼######叫我做什么?这些都是教科书的东西。哈。。。基本无视。答的好的未必干的好,干的好的未必答的好。中国有中国的国情。如果要我回答,没有什么异议的我就不说了,我说说可能和标准答案结果不对的我的态度(当然我也不知道标准答案)。 第1题,我没什么异议。不过,在中国,非语言传递的信息,能有5%是可靠的就不错了。纸面上的东西无论再怎么正确,客户决策者的态度,不会在纸面上摆着,不吃饭,不吹牛,怎么摸的清楚? 第2题,比较扯淡,标准学院派的。因为“缺陷”的定义是动态的。同样的问题,对于不同的客户关注点是不同的。例如OA系统,报表是个大头,但对于数据库,LOG足够。即便有BUG,重要性才决定它是否算是个缺陷。这种动态的东西怎么可能后面有个基本排序原则。   例如,第4题,更接近实际情况的是a,进度问题。但我不知道上面的标准答案是什么。 例如第7题,这个题目称述有问题,因为客户在扩大项目范围时,项目经理要做的是递烟,泡澡,塞纸钱而使得甲方另起项目,而不是在原有项目中扩充,或修改合同。项目经理看到的并不是个计划的实施,而是一个合同。对合同外的描述内容,应该以增补和另立合同为主此已经超出了项目经理的职权范围。项目范围扩大65%,成本增加4倍(也就老外想的出,项目范围扩大4倍,成本增加65%倒更贴近实际,否则更本就是不能接的单子),这就不是一个项目内可接受的现实。如果甲方非要如此,还是上面的三个步骤,不然就死破脸走官司路线。公司就是关门,也不能自己贴钱这么给甲方耍,没底线的乙方,是做不成甲方认可的东西的,也是活不长久的乙方。 第8题表示,整个题目是老外出的,哈。以我的经验,大头是项目计划实施。 简答题中,第5题也是有问题的,至少我有很大异议,原型更本就不应该在项目中出现。除非原型设计就是项目本身,此时也就不存在针对项目的原型一说。 国内,很多问题不是问题,只要问题本身不是人的问题。是问题的,都是人的思想问题。国内从老板到一线员工,出了问题,感性的很多,就是屁股决定意识的很多。所以国内做项目经理,最要紧的还是靠嘴巴说。要么中国怎么“厚黑”能成个学问呢。######主要想看你对简答那块的经验######如果是简答题,上面没有说的题目我补充一下,也当给这里的朋友提点片面的意见,以后要面试或许能用上,无论正面还是反面。 1、这个题目比较虚。得看什么类型的项目。但无非是计划、实施(执行),验收,三个环节。我说了,不能出现变更,当然实际情况不能没有变更。项目经理和其他人员要和甲方互动到,形式变更实质没变更的程度才行。项目实施不存在规划问题,这个是售前的事情。计划属于售前规划后的细化。实施是计划的落地和推进。验收这块存在调整,但在计划和实施中需要提前和甲方互动,项目实施的整体其实就围绕一个核心,就是合同的履行,所以所有工作都是围绕验收来忙。 2、这个问题很小白。工期是计划时间表,工作量是执行量。两个东西毛关系没有。而且工作量和业务本身的形态有关,有些东西先进场,有些东西后才到,比如你代码没写好,测个毛啊?当然这里说的不是测试代码本身的构造,只是基于测试代码已经存在的情况。工期和工作量没有对等关系。 3、这个问题问的比较好。就我的经验,明确谈什么,这是第一。明确想要什么,这是第二。余下就是开会。开会其实有三种。一种是传达信息。一种是说服别人,一种是汇总信息。每种不一样。传达信息,确认大家明确就OK。说服别人重点不在于用谁的意见说服,重点在于大家一致认可。汇总信息重点在明确大家说清楚了该说的内容。 4、这个我个人觉得是挺白痴的问题,可能对有些企业有些项目经理的考核是需要的。这个问题如同有次我去算法的面试,有人问我XX版本管理工具会不会?确实不会。当时不仅有种弱智感,同时还有种BS惜BS的感觉。我还没无聊到靠工具来维护自己的技术水平证明的低级趣味阶段。 6、这个问题,只有一个结论。就是硬抗过去。没有它法。因为资源不足,你分包,或者卖掉都不切合实际。 7、项目经理主要做哪些内容,其实也很简单,首先是协调,组内协调,甲乙双方的协调。其次是决策调整,根据组内和甲乙双方的情况调整规划和审核内容,最后是审核阶段情况。 不能反过来做,先审核内部,再去协调和和调整。项目实施是有时间期限的,多拖一天,公司多投入一份,回款的变数也多一份。好的项目经理在于先能搞清楚哪些是需要拖的问题,哪些是需要解决的问题。前者尽快留资源准备,后者尽量掩盖以回避。 虽然上面有些话说的很负面,但实际上都是中立的话。做事情就是做事情。把事情做好皆大欢喜,而不存在什么吭蒙拐骗一说。而好和不好,对乙方就是少投入,收回款。对甲方就是保护好甲方投入的价值存在。 后面一句话可能很多人又不理解了。我先说个做人的道理,你不考虑对方,对方就不会考虑你。再简单举个例子:比如客户要上个项目,那么你搞不清楚客户上项目的更本动力在哪,你就无法从客户的角度来判断,你所带的项目,哪些是能给你客户带来价值的。哪些对他是没价值的。客户投钱,不是你的钱,也只是给你所在公司的,但是既然你是做项目经理,你就要对这笔钱的投入保护好,也就是让该展现的展现。什么是该展现的?不是客户的某个代表认为有价值的,而是确实对客户有价值的。 如果你只以客户的某个代表的喜好来判断客户(抽象的)投入的价值点,那么迟早会倒霉。如果你真从客户的角度来判断价值点,你也迟早会说服客户。###### 引用来自“中山野鬼”的答案 如果是简答题,上面没有说的题目我补充一下,也当给这里的朋友提点片面的意见,以后要面试或许能用上,无论正面还是反面。 1、这个题目比较虚。得看什么类型的项目。但无非是计划、实施(执行),验收,三个环节。我说了,不能出现变更,当然实际情况不能没有变更。项目经理和其他人员要和甲方互动到,形式变更实质没变更的程度才行。项目实施不存在规划问题,这个是售前的事情。计划属于售前规划后的细化。实施是计划的落地和推进。验收这块存在调整,但在计划和实施中需要提前和甲方互动,项目实施的整体其实就围绕一个核心,就是合同的履行,所以所有工作都是围绕验收来忙。 2、这个问题很小白。工期是计划时间表,工作量是执行量。两个东西毛关系没有。而且工作量和业务本身的形态有关,有些东西先进场,有些东西后才到,比如你代码没写好,测个毛啊?当然这里说的不是测试代码本身的构造,只是基于测试代码已经存在的情况。工期和工作量没有对等关系。 3、这个问题问的比较好。就我的经验,明确谈什么,这是第一。明确想要什么,这是第二。余下就是开会。开会其实有三种。一种是传达信息。一种是说服别人,一种是汇总信息。每种不一样。传达信息,确认大家明确就OK。说服别人重点不在于用谁的意见说服,重点在于大家一致认可。汇总信息重点在明确大家说清楚了该说的内容。 4、这个我个人觉得是挺白痴的问题,可能对有些企业有些项目经理的考核是需要的。这个问题如同有次我去算法的面试,有人问我XX版本管理工具会不会?确实不会。当时不仅有种弱智感,同时还有种BS惜BS的感觉。我还没无聊到靠工具来维护自己的技术水平证明的低级趣味阶段。 6、这个问题,只有一个结论。就是硬抗过去。没有它法。因为资源不足,你分包,或者卖掉都不切合实际。 7、项目经理主要做哪些内容,其实也很简单,首先是协调,组内协调,甲乙双方的协调。其次是决策调整,根据组内和甲乙双方的情况调整规划和审核内容,最后是审核阶段情况。 不能反过来做,先审核内部,再去协调和和调整。项目实施是有时间期限的,多拖一天,公司多投入一份,回款的变数也多一份。好的项目经理在于先能搞清楚哪些是需要拖的问题,哪些是需要解决的问题。前者尽快留资源准备,后者尽量掩盖以回避。 虽然上面有些话说的很负面,但实际上都是中立的话。做事情就是做事情。把事情做好皆大欢喜,而不存在什么吭蒙拐骗一说。而好和不好,对乙方就是少投入,收回款。对甲方就是保护好甲方投入的价值存在。 后面一句话可能很多人又不理解了。我先说个做人的道理,你不考虑对方,对方就不会考虑你。再简单举个例子:比如客户要上个项目,那么你搞不清楚客户上项目的更本动力在哪,你就无法从客户的角度来判断,你所带的项目,哪些是能给你客户带来价值的。哪些对他是没价值的。客户投钱,不是你的钱,也只是给你所在公司的,但是既然你是做项目经理,你就要对这笔钱的投入保护好,也就是让该展现的展现。什么是该展现的?不是客户的某个代表认为有价值的,而是确实对客户有价值的。 如果你只以客户的某个代表的喜好来判断客户(抽象的)投入的价值点,那么迟早会倒霉。如果你真从客户的角度来判断价值点,你也迟早会说服客户。 请问先生,这些知识或者叫经验,你是怎么学到的,或者说知道的? 我想学习你的学习能力。 ######我奇怪的是如果世上所有的项目经理都是这个标准来考核那将没有经理可言,因为这些题都是针对那些有丰富经验的项目经理,刚上任的经理能答出这些题目算见鬼了。######对单选题表示无语。###### 引用来自“李渊”的答案 引用来自“中山野鬼”的答案 如果是简答题,上面没有说的题目我补充一下,也当给这里的朋友提点片面的意见,以后要面试或许能用上,无论正面还是反面。 1、这个题目比较虚。得看什么类型的项目。但无非是计划、实施(执行),验收,三个环节。我说了,不能出现变更,当然实际情况不能没有变更。项目经理和其他人员要和甲方互动到,形式变更实质没变更的程度才行。项目实施不存在规划问题,这个是售前的事情。计划属于售前规划后的细化。实施是计划的落地和推进。验收这块存在调整,但在计划和实施中需要提前和甲方互动,项目实施的整体其实就围绕一个核心,就是合同的履行,所以所有工作都是围绕验收来忙。 2、这个问题很小白。工期是计划时间表,工作量是执行量。两个东西毛关系没有。而且工作量和业务本身的形态有关,有些东西先进场,有些东西后才到,比如你代码没写好,测个毛啊?当然这里说的不是测试代码本身的构造,只是基于测试代码已经存在的情况。工期和工作量没有对等关系。 3、这个问题问的比较好。就我的经验,明确谈什么,这是第一。明确想要什么,这是第二。余下就是开会。开会其实有三种。一种是传达信息。一种是说服别人,一种是汇总信息。每种不一样。传达信息,确认大家明确就OK。说服别人重点不在于用谁的意见说服,重点在于大家一致认可。汇总信息重点在明确大家说清楚了该说的内容。 4、这个我个人觉得是挺白痴的问题,可能对有些企业有些项目经理的考核是需要的。这个问题如同有次我去算法的面试,有人问我XX版本管理工具会不会?确实不会。当时不仅有种弱智感,同时还有种BS惜BS的感觉。我还没无聊到靠工具来维护自己的技术水平证明的低级趣味阶段。 6、这个问题,只有一个结论。就是硬抗过去。没有它法。因为资源不足,你分包,或者卖掉都不切合实际。 7、项目经理主要做哪些内容,其实也很简单,首先是协调,组内协调,甲乙双方的协调。其次是决策调整,根据组内和甲乙双方的情况调整规划和审核内容,最后是审核阶段情况。 不能反过来做,先审核内部,再去协调和和调整。项目实施是有时间期限的,多拖一天,公司多投入一份,回款的变数也多一份。好的项目经理在于先能搞清楚哪些是需要拖的问题,哪些是需要解决的问题。前者尽快留资源准备,后者尽量掩盖以回避。 虽然上面有些话说的很负面,但实际上都是中立的话。做事情就是做事情。把事情做好皆大欢喜,而不存在什么吭蒙拐骗一说。而好和不好,对乙方就是少投入,收回款。对甲方就是保护好甲方投入的价值存在。 后面一句话可能很多人又不理解了。我先说个做人的道理,你不考虑对方,对方就不会考虑你。再简单举个例子:比如客户要上个项目,那么你搞不清楚客户上项目的更本动力在哪,你就无法从客户的角度来判断,你所带的项目,哪些是能给你客户带来价值的。哪些对他是没价值的。客户投钱,不是你的钱,也只是给你所在公司的,但是既然你是做项目经理,你就要对这笔钱的投入保护好,也就是让该展现的展现。什么是该展现的?不是客户的某个代表认为有价值的,而是确实对客户有价值的。 如果你只以客户的某个代表的喜好来判断客户(抽象的)投入的价值点,那么迟早会倒霉。如果你真从客户的角度来判断价值点,你也迟早会说服客户。 请问先生,这些知识或者叫经验,你是怎么学到的,或者说知道的? 我想学习你的学习能力。 吹水的说一句,无论你信不信,曾经在一家公司,我只是个技术人员。做算法写代码。不过平时对于公司管理的东西也带这思考。公司整体的每月运营支出,我的估算和外面朋友做的调研基本上接近。我觉得没什么刻意学吧,如同你对数字感兴趣,对很多数学问题就会很敏感。如果你对管理有兴趣,对很多组织化的东西就会很敏感。沉淀久了,多少也能算水多。。。 ######学习了######请参考 信息系统项目管理师 这本教材,虽然这是理论,现实项目中不一定这样,但是你要去应聘一个比较大的项目的项目经理时,还是要有一定的理论支撑的,项目越大作用越明显######哈。水平的深度是由理论的高度决定的嘛。希望我关于对学院派的鄙夷不要误导大家理解理论。######嗯 项目越大越明显######PMP例题?######这个是考试题,不是面试题######回复 @dedenj : 呵呵 专业的PM 这是基础######个人觉得,如果我去应聘PM,别人甩一张这个试卷来,我直接闪人。至少说明一点,这个公司的HR不知道到底如果招聘PM。。 我们不是来考PM证的,要考证至少要加几题,PM主要职责是什么,关键路径和成本控制,沟通原则,呵呵######就是面试时做的一份简单试卷

kun坤 2020-06-08 11:13:54 0 浏览量 回答数 0

问题

关于 PHP 的编译和执行分离:报错 

kun坤 2020-06-08 16:00:00 1 浏览量 回答数 1

问题

Android安全开发之通用签名风险

移动安全 2019-12-01 21:14:31 4210 浏览量 回答数 1

问题

如何查看已保存的密码 密码数据保存在哪里了? 加密后的数据的安全性如何? 可以绕过保护机制么? 结论

kun坤 2020-06-07 16:45:49 4 浏览量 回答数 1

回答

PHP的编译并不是很耗时 我之前的文章也介绍过, PHP的编译是线性的编译过程, 不做任何优化, 所以这个过程非常之快. 而编译和执行分离这个特性的提出着认为分离以后, 可以省掉编译过程, 会有很大的性能提升开发速度 PHP的一个优点就是开发/部署/调试非常方案, 更改立即见效, 而如果我们采用了编译/执行分离以后, 那么更改就需要首先编译, 然后部署, 然后才能生效, 这对于开发来说, 并不是什么好事我们有APC/Zend O+等第三方的代码缓存工具 APC等第三方的代码缓存工具(Opcodes Cache)已经相对比较成熟, 并对开发者透明, 大家只要在服务器上安装了APC, 就可以得到编译/执行分离的性能提升. 比如编译/执行分离这个方案是有人在做的, 但是还不成熟等等 要实现编译和执行分离, 其实我们借助APC就能做到, APC提供了一族apc_bin_dump, apc_bin_load函数, 能把Opcodes缓存导出到外部文件中 经过我对apc_bin系列函数的重新梳理, 修复以后, 这部分功能现在终于可以正常工作了, 那么基于这些函数, 我们就可以实现编译执行分离 思路很简单, 在本地通过apc_bin_dumpfile把我们的php文件, 导出成bin文件, 然后在服务器上通过apc_bin_loadfile来读取这些bin文件. 就可以实现编译和执行分离啦, 一个简单的示意代码如下: $ find ./ -name "*.php" -exec php -r "apc_bin_dumpfile(array('{}'), array(), '{}' . '.bin');" \; 然后在服务器端的文件自动加载部分 <?php function __autoload($name) { /*首先计算出文件名字*/ $file = 根据类名得到PHP文件路径(); if (!file_exists($file)) { //文件不存在, 说明我们还没有load过, 那么创建一个空文件. file_put_contents($file, ''); apc_bin_loadfile($file . '.bin'); } else { //我们已经load过了, 理论上应该已经被服务器的APC缓存处理Cache住了. } include ($file); } 当然, 这里只是一个简单的示意, 如果要实际使用, 你还要考虑缓存被换出的可能, 那么一个解决方案就是设置俩个自动加载函数, 第一个如上, 第二个如果被调用, 就说明缓存被换出, 导致include了一个空文件, 于是就再次load一次bin文件就可以了 当然, 你也可以把所有的文件打包到一个bin文件中, 然后只load一次, 后续就交给服务器上的APC Cache来做就可以了. 但是这里有一个要注意的点就是, 那么对于这部分希望代码保护功能的人来说, 就可以使用APC来免费的完成这些事情了. 不过, 这个方案确实有点丑陋, 后续可以考虑在APC上增加直接对bin文件的支持. 

一枚小鲜肉帅哥 2020-05-31 20:56:17 0 浏览量 回答数 0

问题

Android共享文件的Runtime权限

sunny夏筱 2019-12-01 20:58:02 5548 浏览量 回答数 0

问题

【精品问答】Java必备核心知识1000+(附源码)

问问小秘 2019-12-01 22:00:28 870 浏览量 回答数 1

回答

服务器常被攻击表明很可能存在安全漏洞,建议及时查找漏洞,安装补丁、升级系统,并做好服务器的日常防护。 1.设置复杂密码 不要小看密码设置,其对于保持在线安全和保护数据至关重要。创建复杂的云服务密码,字符越多,电脑就越难猜出。特殊字符、数字和字母的随机组合要比姓名或生日更强。 2.杀毒和高防应用 为服务器建立多道防线,杀毒程序通常可以在病毒感染电脑前识别并清除掉。专业的高防服务是应对攻击的最好办法,推荐西部数码的ddos高防,可有效防御各类ddos攻击。 3.保持备份和更新 保持应用程序更新到最新版。如果网站是基于WordPress的,建议把不使用的插件卸载或完全删除,而不只是禁用。在更新之前备份重要数据。另外,仔细检查文件权限,谁有何种级别的权限。 4.部署SSL证书 网站最好使用SSL证书。超过一半以上的网站已经加密了,不要落下。在网页上如需提交敏感信息,优先检查网站域名前是否是https。浏览器会在这种链接前显示一个绿色锁图标。 5.数据库避免敏感信息 存在数据库里的身份证和银行卡信息是易受攻击和盗取的目标。所以,建议不要把此类信息存储在数据库中。 服务器安全这问题,很重要,之前服务器被黑,管理员账号也被篡改,远程端口也登陆不了了。,在网上搜索了一些服务器安全设置以及防黑的文章,对着文章,我一个一个的设置起来,费了好几天的时间才设置完,原以为会防止服务器再次被黑,没想到服务器竟然瘫痪了,网站都打不开了,无奈对服务器安全也是一窍不通,损失真的很大,数据库都损坏了,我哪个后悔啊。娘个咪的。最后还是让机房把系统重装了。找了几个做网站服务器方面的朋友,咨询了关于服务器被黑的解决办法,他们建议找国内最有名的服务器安全的安全公司来给做安全维护,找了sinesafe,服务器被黑的问题,才得以解决。 一路的走来,才知道,服务器安全问题可不能小看了。经历了才知道,服务器安全了给自己带来的也是长远的利益。 希望我的经历能帮到楼主,帮助别人也是在帮助我自己。 下面是一些关于安全方面的建议! 建站一段时间后总能听得到什么什么网站被挂马,什么网站被黑。好像入侵挂马似乎是件很简单的事情。其实,入侵不简单,简单的是你的网站的必要安全措施并未做好。 一:挂马预防措施: 1、建议用户通过ftp来上传、维护网页,尽量不安装asp的上传程序。 2、定期对网站进行安全的检测,具体可以利用网上一些工具,如sinesafe网站挂马检测工具! 序,只要可以上传文件的asp都要进行身份认证! 3、asp程序管理员的用户名和密码要有一定复杂性,不能过于简单,还要注意定期更换。 4、到正规网站下载asp程序,下载后要对其数据库名称和存放路径进行修改,数据库文件名称也要有一定复杂性。 5、要尽量保持程序是最新版本。 6、不要在网页上加注后台管理程序登陆页面的链接。 7、为防止程序有未知漏洞,可以在维护后删除后台管理程序的登陆页面,下次维护时再通过ftp上传即可。 8、要时常备份数据库等重要文件。 9、日常要多维护,并注意空间中是否有来历不明的asp文件。记住:一分汗水,换一分安全! 10、一旦发现被入侵,除非自己能识别出所有木马文件,否则要删除所有文件。 11、对asp上传程序的调用一定要进行身份认证,并只允许信任的人使用上传程序。这其中包括各种新闻发布、商城及论坛程 二:挂马恢复措施: 1.修改帐号密码 不管是商业或不是,初始密码多半都是admin。因此你接到网站程序第一件事情就是“修改帐号密码”。帐号 密码就不要在使用以前你习惯的,换点特别的。尽量将字母数字及符号一起。此外密码最好超过15位。尚若你使用 SQL的话应该使用特别点的帐号密码,不要在使用什么什么admin之类,否则很容易被入侵。 2.创建一个robots.txt Robots能够有效的防范利用搜索引擎窃取信息的骇客。 3.修改后台文件 第一步:修改后台里的验证文件的名称。 第二步:修改conn.asp,防止非法下载,也可对数据库加密后在修改conn.asp。 第三步:修改ACESS数据库名称,越复杂越好,可以的话将数据所在目录的换一下。 4.限制登陆后台IP 此方法是最有效的,每位虚拟主机用户应该都有个功能。你的IP不固定的话就麻烦点每次改一下咯,安全第一嘛。 5.自定义404页面及自定义传送ASP错误信息 404能够让骇客批量查找你的后台一些重要文件及检查网页是否存在注入漏洞。 ASP错误嘛,可能会向不明来意者传送对方想要的信息。 6.慎重选择网站程序 注意一下网站程序是否本身存在漏洞,好坏你我心里该有把秤。 7.谨慎上传漏洞 据悉,上传漏洞往往是最简单也是最严重的,能够让黑客或骇客们轻松控制你的网站。 可以禁止上传或着限制上传的文件类型。不懂的话可以找专业做网站安全的sinesafe公司。 8. cookie 保护 登陆时尽量不要去访问其他站点,以防止 cookie 泄密。切记退出时要点退出在关闭所有浏览器。 9.目录权限 请管理员设置好一些重要的目录权限,防止非正常的访问。如不要给上传目录执行脚本权限及不要给非上传目录给于写入权。 10.自我测试 如今在网上黑客工具一箩筐,不防找一些来测试下你的网站是否OK。 11.例行维护 a.定期备份数据。最好每日备份一次,下载了备份文件后应该及时删除主机上的备份文件。 b.定期更改数据库的名字及管理员帐密。 c.借WEB或FTP管理,查看所有目录体积,最后修改时间以及文件数,检查是文件是否有异常,以及查看是否有异常的账号。 如果服务器系统多了好多用户,不是被攻击。而是服务器被入侵、被黑了。服务器装完系统后,立即打补丁,并关闭不必要的服务和进程。修改服务器为复杂密码,并修改服务器的远程密码;安装服务器安全狗、网站安全狗等防护软件。 来源于网络,供您参考,如若满意,请点击右侧【采纳答案】,如若还有问题,请点击【追问】 希望我的回答对您有所帮助,望采纳! ~ O(∩_∩)O~

保持可爱mmm 2019-12-02 02:24:17 0 浏览量 回答数 0

回答

项目中用到了FastDFS来做文件存储。最近重构的时候,因为经常处于移动办公的状态,所以访问公司的服务器不是很方便,所以感觉有必要在本机上搭建一套FastDFS的测试环境。 FastDFS是什么? FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服务,如相册网站、视频网站等等。 FastDFS为互联网量身定制,充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标,使用FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务。 FastDFS里面有两种角色:Tracker、Storage。Tracker主要做调度工作,在访问上起负载均衡的作用。Storage存储节点存储文件,完成文件管理的所有功能:存储、同步和提供存取接口,FastDFS同时对文件的meta data进行管理。所谓文件的meta data就是文件的相关属性,以键值对(key value pair)方式表示,如:width=1024,其中的key为width,value为1024。文件meta data是文件属性列表,可以包含多个键值对。 Docker方式 因为之前用Docker用的比较多,所以首先想到的是用Docker来运行FastDFS。上hub.docker.io上找了找镜像,最后选择了luhuiguo/fastdfs这个镜像。很快写了一个docker-compose脚本: 1version: '3.3' 2services: 3 tracker: 4 image: luhuiguo/fastdfs 5 ports: 6 - "22122:22122" 7 command: 8 - tracker 9 volumes: 10 # let container use same timezone as host 11 - /etc/localtime:/etc/localtime 12 - /opt/docker/fastdfs/tracker:/var/fdfs 13 storage: 14 image: luhuiguo/fastdfs 15 ports: 16 - "23000:23000" 17 links: 18 - tracker 19 command: 20 - storage 21 environment: 22 TRACKER_SERVER: 192.168.255.199:22122 23 GROUP_NAME: group1 24 volumes: 25 - /etc/localtime:/etc/localtime 26 - /opt/docker/fastdfs/storage:/var/fdfs 执行起来,看起来也是正常的。但是使用程序访问的时候却失败了。抛出了异常:java.net.SocketTimeoutException: connect timed out。通过跟踪代码发现了原因:使用docker的时候,storage向tracker汇报的地址是docker内部的地址,而这个地址在Mac本机是无法直接访问的。通过代码访问Tracker的时候返回的地址就是docker内部的地址,自然会出现SocketTimeoutException了。 1.1 network host模式 因为知道docker有host这一网络模式,可以使docker容器使用与宿主机一样的网络。感觉上这样或许可以解决上面的问题,而且镜像的说明中也提到了这一点。于是加上了network_mode: host。但是启动之后发现还是一样的错误。经过搜索找到了原因: **Mac上的Docker实际上是通过虚拟化方式运行在Mac系统上的。通过xhyve技术模拟出来一台Linux主机,然后在其中跑Docker进程。当使用host模式跑的时候,docker使用的是这个虚拟出来的Linux主机的网络作为Host网络,无法直接使用Mac主机的网络。因此依然无法连接是正常的。**也就是说,在Mac主机上,host这种网络是无法使用的。 本机编译执行 既然使用Docker无法运行FastDFS,那只能通过编译源码来运行了。最新版本的FastDFS已经可以直接在Mac上编译了(不需要修改源码)。因此这种方法也不难。主要步骤如下: 2.0 关闭系统保护 从OSX 10.11开始,Mac对关键目录进行了保护(例如:/bin, /usr/bin等)。而要编译FastDFS却是要安装文件到/usr/bin等目录下,所以首先需要禁用系统保护。关闭的方法如下: 重启系统,重启的过程中按住Command+R进入Recovery模式; 从菜单中选择“终端”或“Terminal”进入命令行模式; 输入命令csrutil disable关闭保护模式,然后输入reboot重启系统即可。 2.1 libfastcommon FastDFS依赖于libfastcommon,因此需要首先编译、安装libfastcommon,步骤如下: 1unzip libfastcommon-1.0.35.zip 2cd libfastcommon-1.0.35 3./make.sh 4./make.sh install 2.2 fastdfs FastDFS源码通过Github下载。下面以最新的5.10为例。编译、安装步骤如下: 1unzip fastdfs-5.10.zip 2cd fastdfs-5.10 3./make.sh 4./make.sh install 安装成功后,FastDFS相关的可执行文件被安装到/usr/bin目录下。相关的配置文件被放在/etc/fdfs下,这和在Linux上安装的结果是一样的。 2.3 启动tracker 下面首先启动Tracker服务。首先准备存储数据的目录,Tracker将会在该目录中保存运行时信息以及日志文件: 1mkdir -p /opt/tools/fastdfs/tracker 2chown -R cap:cap /opt/tools/fastdfs/tracker 然后准备配置文件,从sample文件复制一份以便修改: 1cd /etc/fdfs 数控等离子切割机 数控等离子切割机 2cp tracker.conf.sample tracker.conf 然后修改配置文件/etc/fdfs/tracker.conf,在Mac上单机安装只需要修改base_path,修改成上面刚刚创建的目录: 1base_path=/opt/tools/fastdfs/tracker 然后启动fastdfs,启动完成之后应该占用了22122端口: 1/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf 2netstat -nl | grep 22122 启动服务使用如下命令: 1/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf start 停止服务可以使用如下命令: 1/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf stop 2.4 启动storage 首先还是准备目录供Storage节点使用: 1mkdir -p /opt/tools/fastdfs/storage 2chown -R cap:cap /opt/tools/fastdfs/storage 准备配置文件: 1cp storage.conf.sample storage.conf 修改配置文件: 1# 基本路径,日志等存储在该目录下 2base_path=/opt/tools/fastdfs/storage 3# 存储目录,可以存在多个。FastDFS会按照调度方法使用这些不同的目录。默认使用Round Robin调度方法。 4store_path0=/opt/tools/fastdfs/storage 5# 如果部署集群的话,只要多写几个tracker_server就可以了。 6tracker_server=192.168.255.199:22122 启动服务可以使用如下命令: 1/usr/bin/fdfs_storaged /etc/fdfs/storage.conf start 停止服务命令: 1/usr/bin/fdfs_storaged /etc/fdfs/storage.conf stop

凹凹凸曼 2020-06-16 19:09:32 0 浏览量 回答数 0

回答

说明: 1、测试版本无需登录,运行后直接进入主界面,但是首次运行会提示用户配置参数; 2、根据提示,点击左上角菜单“设置——系统设置”,按照界面要求,逐项完成本地监测路径的设置,远程OSS节点选择、AccessKey设置,获取对应的Bucket列表,设置路径(此处路径可以为空)等,完成本地文件夹和远程OSS的绑定; 3、根据提示,点击左上角菜单“设置——加载配置”,以使刚做的配置生效; 4、然后点击菜单下面的toolBar(不好意思,这里未做图片,大家先凑合用吧),第一个按钮是启动文件监测,第二个按钮是暂停文件监测; ——到这里,你就可以实现本地文件夹到远程OSS的文件同步了; 其它的功能,比如同步策略、设置线程数、同步成功后是否删除本地等等,同时Sync4oss附带了几个方便用户在服务器端做批量操作的小功能,比如“批量上传本地文件夹”、“批量修改HTTP头参数”、“批量复制或移动Object”等,请您体验也帮测试; ------------------------- 回 4楼(eblis) 的帖子 你好,FTP云工具经大量用户测试挺稳定的,日均上传数万都没问题的; 您遇到的问题能否联系我们详细描述?帮您解决问题! http://www.ftp4oss.com/ 首页右下角有联系方式; 或者您提供您的联系方式,我们会安排人员协助你排查问题的。 ------------------------- 回 5楼(eblis) 的帖子 你好,获取Bucket列表的时候失败,请查一下是否被360拦截了?? 360对各种软件连接OSS的连接基本都会拦截,需要你设置为白名单即可; ------------------------- 回 8楼(荆楚小霸王) 的帖子 你好,请问您这里的异常是指什么呢?能否联系我们详细描述一下,我们会努力解决的! Sync4oss灵活性比较高,相关说明近期会编制出来,供大家参考! ------------------------- 回 10楼(荆楚小霸王) 的帖子 您好,您提到的主界面的正常运行是需要您先完成系统配置,具体的就是完成本地目录和远端OSS的绑定,之后才能正常工作的; 另外,您提到的上传10G的图片是没有问题的,和你的服务器带宽关系不是很大,因为除了公网上传外,您还可以设置为内网上传,10G图片小菜一碟! ------------------------- 这个得顶上去~~~ ------------------------- 回 15楼(冲你的风) 的帖子 你好,该问题已经解决,请你重新下载程序测试,有问题联系我们客服继续反馈。 ------------------------- 回 16楼(sheyingtg) 的帖子 该问题需要你正确输入OSS的AccessKey的ID和Secret,以获取Bucket列表~~~ 使用上有问题的,请多测试几次或者联系我们的技术客服,谢谢支持! ------------------------- 回 17楼(ijijni) 的帖子 理论上,Sync4oss这个同步或镜像工具是可以满足你的要求; 但是,还需要根据你的实际情况分析; 同步你的网站到OSS这个没问题; 而你的网站直接从OSS读取相关文件,只要你的网站支持即可~~~ ------------------------- 回 18楼(sheyingtg) 的帖子 用户您好,我们的技术客服反馈过来,和您配合查找过问题,你每次批量上传图片,我们的Sync4oss同步工具都能准确的监测到,并且也确实实时同步工作了,但是您的网站编辑器每次总会占用若干图片,导致我们程序读取失败; 本次我们改进这块的逻辑,您再试试能否解决你的这个问题,你可以随时和我们客服保持联系~~~  多谢支持! ------------------------- 回 23楼(有事请留言) 的帖子 嗯嗯,我们抓紧进度,感谢支持! ------------------------- 目前正在小范围进行核心同步功能的内测,内测结束后将尽快发布正式版本,敬请期待,谢谢大家支持! ------------------------- 11月29日,Linux版本的Sync4oss程序内测版本发布(标准C的程序,理论上兼容所有的Linux操作系统);Linux系统需要安装Curl; ------------------------- 回 28楼(碧血微剑) 的帖子 目前是测试版,我们会在过期之前,提前发布正式版本,我们还会维持很长一段时间免费的;即使以后可能收费的话也都是几十块钱的价位; ------------------------- 回 29楼(脑门王) 的帖子 文件过滤的功能在当前测试版未实现,计划在正式版本里面会提供,敬请期待; ------------------------- 回 33楼(兜里有糖哦) 的帖子 关闭putty之类的远程控制软件的时候,发现Sync4oss工具就停止了    这个时候,您需要把当前运行的Sync4oss工具的程序挂起,并转为后台运行即可;    方法一、简要方法挂起程序转后台运行: 通过以下4个步骤 1、ctrl+z    //挂起当前任务 2、jobs -l    //查看当前任务的编号 3、bg  %n   //将编号为n的任务转后台运行 4、disown -h %1   这样就可以后台运行,可以关闭putty工具了 方法二、利用功能强大的Linux远程工具Screen的虚拟终端(可以支持后台运行,还可以再次调用查看程序运行情况): 方法三、Linux系统的远程桌面; ------------------------- 回 35楼(兜里有糖哦) 的帖子 Windows和Linux两类操作系统都能支持~~~ ------------------------- 回 38楼(遨游美食) 的帖子 你好,可以联系我们的技术客服详细了解一下你的问题,看看是哪里出现了不兼容,以便解决; 目前对于Linux和Windows两个版本的软件,都在若干个正式运行的网站中运行,稳定性没问题; ------------------------- 回 39楼(碧血微剑) 的帖子 sync4oss 的程序正常,请你检查一下是不是论坛帖子的最新版本 也可以联系我们的技术客服配合你检查一下问题所在,以便解决; ------------------------- 回 42楼(秦皇) 的帖子 你好,请确认你的配置是否正确,查看的OSS路径是否正确; 如果还有问题,请联系我们的技术客服协助你配置; 多谢支持! ------------------------- 回 43楼(abua) 的帖子 你好,是误报不是病毒,只要是从我们发布在阿里云的帖子下载或者由我们工作人员发送的软件,即请放心使用! 对于我们现已发布的几款Windows平台下的软件,目前采用的保护手段就是用“Sixxpack24”做了加壳处理(因为C#的程序不加壳的话太容易被反编译了),我们在2014年1月份登陆云市场的时候也已经对杀毒软件误报的事做了论坛发帖说明、在软件包里面也有杀软误报说明,希望广大用户的理解,当然随着我们经验的积累,我们也正计划采用其它方法来取代备受诟病的“ Sixxpack24 ”加壳。 这个是2014年1月4日发布在阿里云论坛的一个安全提示说明: http://bbs.aliyun.com/read/150244.html 这个是2014年1月6日发布在阿里云论坛的一个安全处理说明: http://bbs.aliyun.com/read/150306.html Sixxpack的说明:百度或Google搜索Sixxpack可以看到该软件是一种加壳保护程序,而非病毒;由于加壳后部分杀毒软件无法脱壳而直接把采用类似加壳技术的软件全部判断为潜在威胁并拦截; 感谢理解与支持! ------------------------- 回 48楼(秦皇) 的帖子 你好,该版本已过试用期了,请你用最新版本的可执行程序覆盖即可(配置文件不覆盖,免去重新配置); 相关解决方案在用户内测群里都提供了~~ 多谢支持!

ftp4oss 2019-12-02 00:18:20 0 浏览量 回答数 0

问题

【阿里云产品公测】以开发者角度看ACE服务『ACE应用构建指南』

mr_wid 2019-12-01 21:10:06 20092 浏览量 回答数 6

回答

Spring Cloud 学习笔记(一)——入门、特征、配置 0 放在前面 0.1 参考文档 http://cloud.spring.io/spring-cloud-static/Brixton.SR7/ https://springcloud.cc/ http://projects.spring.io/spring-cloud/ 0.2 maven配置 org.springframework.boot spring-boot-starter-parent 1.5.2.RELEASE org.springframework.cloud spring-cloud-dependencies Dalston.RELEASE pom import org.springframework.cloud spring-cloud-starter-config org.springframework.cloud spring-cloud-starter-eureka 0.3 简介 Spring Cloud为开发人员提供了快速构建分布式系统中的一些通用模式(例如配置管理,服务发现,断路器,智能路由,微代理,控制总线,一次性令牌,全局锁,领导选举,分布式 会话,群集状态)。 分布式系统的协调引出样板模式(boiler plate patterns),并且使用Spring Cloud开发人员可以快速地实现这些模式来启动服务和应用程序。 它们可以在任何分布式环境中正常工作,包括开发人员自己的笔记本电脑,裸机数据中心和受管平台,如Cloud Foundry。 Version: Brixton.SR7 1 特征 Spring Cloud专注于为经典用例和扩展机制提供良好的开箱即用 分布式/版本配置 服务注册与发现 路由选择 服务调用 负载均衡 熔断机制 全局锁 领导人选举和集群状态 分布式消息 2 原生云应用程序 原生云是应用程序开发的一种风格,鼓励在持续交付和价值驱动领域的最佳实践。 Spring Cloud的很多特性是基于Spring Boot的。更多的是由两个库实现:Spring Cloud Context and Spring Cloud Commons。 2.1 Spring Cloud Context: 应用上下文服务 Spring Boot关于使用Spring构建应用有硬性规定:通用的配置文件在固定的位置,通用管理终端,监控任务。建立在这个基础上,Spring Cloud增加了一些额外的特性。 2.1.1 引导应用程序上下文 Spring Cloud会创建一个“bootstrap”的上下文,这是主应用程序的父上下文。对应的配置文件拥有最高优先级,并且,默认不能被本地配置文件覆盖。对应的文件名bootstrap.yml或bootstrap.properties。 可通过设置spring.cloud.bootstrap.enabled=false来禁止bootstrap进程。 2.1.2 应用上下文层级结构 当用SpringApplication或SpringApplicationBuilder创建应用程序上下文时,bootstrap上下文将作为父上下文被添加进去,子上下文将继承父上下文的属性。 子上下文的配置信息可覆盖父上下文的配置信息。 2.1.3 修改Bootstrap配置文件位置 spring.cloud.bootstrap.name(默认是bootstrap),或者spring.cloud.bootstrap.location(默认是空) 2.1.4 覆盖远程配置文件的值 spring.cloud.config.allowOverride=true spring.cloud.config.overrideNone=true spring.cloud.config.overrideSystemProperties=false 2.1.5 定制Bootstrap配置 在/META-INF/spring.factories的key为org.springframework.cloud.bootstrap.BootstrapConfiguration,定义了Bootstrap启动的组件。 在主应用程序启动之前,一开始Bootstrap上下文创建在spring.factories文件中的组件,然后是@Beans类型的bean。 2.1.6 定制Bootstrap属性来源 关键点:spring.factories、PropertySourceLocator 2.1.7 环境改变 应用程序可通过EnvironmentChangedEvent监听应用程序并做出响应。 2.1.8 Refresh Scope Spring的bean被@RefreshScope将做特殊处理,可用于刷新bean的配置信息。 注意 需要添加依赖“org.springframework.boot.spring-boot-starter-actuator” 目前我只在@Controller测试成功 需要自己发送POST请求/refresh 修改配置文件即可 2.1.9 加密和解密 Spring Cloud可对配置文件的值进行加密。 如果有"Illegal key size"异常,那么需要安装JCE。 2.1.10 服务点 除了Spring Boot提供的服务点,Spring Cloud也提供了一些服务点用于管理,注意都是POST请求 /env:更新Environment、重新绑定@ConfigurationProperties跟日志级别 /refresh重新加载配置文件,刷新标记@RefreshScope的bean /restart重启应用,默认不可用 生命周期方法:/pause、/resume 2.2 Spring Cloud Commons:通用抽象 服务发现、负载均衡、熔断机制这种模式为Spring Cloud客户端提供了一个通用的抽象层。 2.2.1 RestTemplate作为负载均衡客户端 通过@Bean跟@LoadBalanced指定RestTemplate。注意URI需要使用虚拟域名(如服务名,不能用域名)。 如下: @Configuration public class MyConfiguration { @LoadBalanced @Bean RestTemplate restTemplate() { return new RestTemplate(); } } public class MyClass { @Autowired private RestTemplate restTemplate; public String doOtherStuff() { String results = restTemplate.getForObject(" http://stores/stores", String.class); return results; } } 2.2.2 多个RestTemplate对象 注意@Primary注解的使用。 @Configuration public class MyConfiguration { @LoadBalanced @Bean RestTemplate loadBalanced() { return new RestTemplate(); } @Primary @Bean RestTemplate restTemplate() { return new RestTemplate(); } } public class MyClass { @Autowired private RestTemplate restTemplate; @Autowired @LoadBalanced private RestTemplate loadBalanced; public String doOtherStuff() { return loadBalanced.getForObject(" http://stores/stores", String.class); } public String doStuff() { return restTemplate.getForObject(" http://example.com", String.class); } } 2.2.3 忽略网络接口 忽略确定名字的服务发现注册,支持正则表达式配置。 3 Spring Cloud Config Spring Cloud Config提供服务端和客户端在分布式系统中扩展配置。支持不同环境的配置(开发、测试、生产)。使用Git做默认配置后端,可支持配置环境打版本标签。 3.1 快速开始 可通过IDE运行或maven运行。 默认加载property资源的策略是克隆一个git仓库(at spring.cloud.config.server.git.uri')。 HTTP服务资源的构成: /{application}/{profile}[/{label}] /{application}-{profile}.yml /{label}/{application}-{profile}.yml /{application}-{profile}.properties /{label}/{application}-{profile}.properties application是SpringApplication的spring.config.name,(一般来说'application'是一个常规的Spring Boot应用),profile是一个active的profile(或者逗号分隔的属性列表),label是一个可选的git标签(默认为"master")。 3.1.1 客户端示例 创建以Spring Boot应用即可,添加依赖“org.springframework.cloud:spring-cloud-starter-config”。 配置application.properties,注意URL为配置服务端的地址 spring.cloud.config.uri: http://myconfigserver.com 3.2 Spring Cloud Config 服务端 针对系统外的配置项(如name-value对或相同功能的YAML内容),该服务器提供了基于资源的HTTP接口。使用@EnableConfigServer注解,该服务器可以很容易的被嵌入到Spring Boot 系统中。使用该注解之后该应用系统就是一个配置服务器。 @SpringBootApplication @EnableConfigServer public class ConfigApplicion { public static void main(String[] args) throws Exception { SpringApplication.run(ConfigApplicion.class, args); } } 3.2.1 资源库环境 {application} 对应客户端的"spring.application.name"属性 {profile} 对应客户端的 "spring.profiles.active"属性(逗号分隔的列表) {label} 对应服务端属性,这个属性能标示一组配置文件的版本 如果配置库是基于文件的,服务器将从application.yml和foo.yml中创建一个Environment对象。高优先级的配置优先转成Environment对象中的PropertySource。 3.2.1.1 Git后端 默认的EnvironmentRepository是用Git后端进行实现的,Git后端对于管理升级和物理环境是很方便的,对审计配置变更也很方便。也可以file:前缀从本地配置库中读取数据。 这个配置库的实现通过映射HTTP资源的{label}参数作为git label(提交id,分支名称或tag)。如果git分支或tag的名称包含一个斜杠 ("/"),此时HTTP URL中的label需要使用特殊字符串"(_)"来替代(为了避免与其他URL路径相互混淆)。如果使用了命令行客户端如 curl,请谨慎处理URL中的括号(例如:在shell下请使用引号''来转义它们)。 Git URI占位符 Spring Cloud Config Server支持git库URL中包含针对{application}和 {profile}的占位符(如果你需要,{label}也可包含占位符, 不过要牢记的是任何情况下label只指git的label)。所以,你可以很容易的支持“一个应用系统一个配置库”策略或“一个profile一个配置库”策略。 模式匹配和多资源库 spring: cloud: config: server: git: uri: https://github.com/spring-cloud-samples/config-repo repos: simple: https://github.com/simple/config-repo special: pattern: special*/dev*,special/dev* uri: https://github.com/special/config-repo local: pattern: local* uri: file:/home/configsvc/config-repo 如果 {application}/{profile}不能匹配任何表达式,那么将使用“spring.cloud.config.server.git.uri”对应的值。在上例子中,对于 "simple" 配置库, 匹配模式是simple/* (也就说,无论profile是什么,它只匹配application名称为“simple”的应用系统)。“local”库匹配所有application名称以“local”开头任何应用系统,不管profiles是什么(来实现覆盖因没有配置对profile的匹配规则,“/”后缀会被自动的增加到任何的匹配表达式中)。 Git搜索路径中的占位符 spring.cloud.config.server.git.searchPaths 3.2.1.2 版本控制后端文件系统使用 伴随着版本控制系统作为后端(git、svn),文件都会被check out或clone 到本地文件系统中。默认这些文件会被放置到以config-repo-为前缀的系统临时目录中。在Linux上,譬如应该是/tmp/config-repo- 目录。有些操作系统routinely clean out放到临时目录中,这会导致不可预知的问题出现。为了避免这个问题,通过设置spring.cloud.config.server.git.basedir或spring.cloud.config.server.svn.basedir参数值为非系统临时目录。 3.2.1.3 文件系统后端 使用本地加载配置文件。 需要配置:spring.cloud.config.server.native.searchLocations跟spring.profiles.active=native。 路径配置格式:classpath:/, classpath:/config,file:./, file:./config。 3.2.1.4 共享配置给所有应用 基于文件的资源库 在基于文件的资源库中(i.e. git, svn and native),这样的文件名application 命名的资源在所有的客户端都是共享的(如 application.properties, application.yml, application-*.properties,etc.)。 属性覆盖 “spring.cloud.config.server.overrides”添加一个Map类型的name-value对来实现覆盖。 例如 spring: cloud: config: server: overrides: foo: bar 会使所有的配置客户端应用程序读取foo=bar到他们自己配置参数中。 3.2.2 健康指示器 通过这个指示器能够检查已经配置的EnvironmentRepository是否正常运行。 通过设置spring.cloud.config.server.health.enabled=false参数来禁用健康指示器。 3.2.3 安全 你可以自由选择任何你觉得合理的方式来保护你的Config Server(从物理网络安全到OAuth2 令牌),同时使用Spring Security和Spring Boot 能使你做更多其他有用的事情。 为了使用默认的Spring Boot HTTP Basic 安全,只需要把Spring Security 增加到classpath中(如org.springframework.boot.spring-boot-starter-security)。默认的用户名是“user”,对应的会生成一个随机密码,这种情况在实际使用中并没有意义,一般建议配置一个密码(通过 security.user.password属性进行配置)并对这个密码进行加密。 3.2.4 加密与解密 如果远程属性包含加密内容(以{cipher}开头),这些值将在通过HTTP传递到客户端之前被解密。 使用略 3.2.5 密钥管理 配置服务可以使用对称(共享)密钥或者非对称密钥(RSA密钥对)。 使用略 3.2.6 创建一个测试密钥库 3.2.7 使用多密钥和循环密钥 3.2.8 加密属性服务 3.3 可替换格式服务 配置文件可加后缀".yml"、".yaml"、".properties" 3.4 文本解释服务 /{name}/{profile}/{label}/{path} 3.5 嵌入配置服务器 一般配置服务运行在单独的应用里面,只要使用注解@EnableConfigServer即可嵌入到其他应用。 3.6 推送通知和总线 添加依赖spring-cloud-config-monitor,激活Spring Cloud 总线,/monitor端点即可用。 当webhook激活,针对应用程序可能已经变化了的,配置服务端将发送一个RefreshRemoteApplicationEvent。 3.7 客户端配置 3.7.1 配置第一次引导 通过spring.cloud.config.uri属性配置Config Server地址 3.7.2 发现第一次引导 如果用的是Netflix,则用eureka.client.serviceUrl.defaultZone进行配置。 3.7.3 配置客户端快速失败 在一些例子里面,可能希望在没有连接配置服务端时直接启动失败。可通过spring.cloud.config.failFast=true进行配置。 3.7.4 配置客户端重试 添加依赖spring-retry、spring-boot-starter-aop,设置spring.cloud.config.failFast=true。默认的是6次重试,初始补偿间隔是1000ms,后续补偿为1.1指数乘数,可通过spring.cloud.config.retry.*配置进行修改。 3.7.5 定位远程配置资源 路径:/{name}/{profile}/{label} "name" = ${spring.application.name} "profile" = ${spring.profiles.active} (actually Environment.getActiveProfiles()) "label" = "master" label对于回滚到之前的版本很有用。 3.7.6 安全 通过spring.cloud.config.password、spring.cloud.config.username进行配置。 答案来源于网络

养狐狸的猫 2019-12-02 02:18:34 0 浏览量 回答数 0

问题

云效快速入门

行者武松 2019-12-01 21:57:06 1576 浏览量 回答数 0

问题

PHP环境安全加固

正禾 2019-12-01 22:10:17 3281 浏览量 回答数 0

问题

怎样实现数据存储的管理维护

elinks 2019-12-01 21:14:17 9098 浏览量 回答数 0

问题

IHS性能优化调优建议

夏天的日子 2019-12-01 21:13:24 5138 浏览量 回答数 0

回答

Nacos 服务发现提供与其他服务发现产品不太一样的机制以及概念,在这里稍作介绍,下文中的内容都会多次提到这里介绍的概念,因此掌握这些概念,对于用好 Nacos 服务发现至关重要。 不同于 Consul, Eureka, Nacos 的服务发现使用的领域数据模型是服务 - 集群 - 实例这样的三层结构。最上面是服务,注册端(服务发布者)和订阅端(服务消费者)使用服务来与其他服务做区分,服务发现中,服务是必须指定的。集群则是中间一层,一个服务又会划分为多个集群,每个集群都有它的自定义配置,Nacos 提供了一个默认集群和相应的默认配置,在不需要多集群的场景下,可以不用指定集群。最下一层是实例,每个集群又会包含多个实例,这样对服务进行发现时,可以发现多个集群的所有实例,也可以指定集群,来发现特定集群的实例。 环境准备 首先,需要有一个 Nacos Server 部署起来,目前 Nacos 支持单机模式,也支持集群模式,部署文档可以参考 Nacos 快速入门。然后添加 Nacos 客户端最新版本依赖: <dependency> <groupId>com.alibaba.nacos</groupId> <artifactId>nacos-client</artifactId> <version>[latest-version]</version></dependency> 你可以配置从中央仓库直接依赖,也可以将 Nacos 最新源码下载下来,本地构建客户端版本。 Hello World 我们先来进行一个最简单的服务注册与发现。Nacos 支持从客户端注册服务实例和订阅服务,具体步骤如下: 配置 Nacos 客户端 Properties:Properties properties = new Properties();properties.setProperty(PropertyKeyConst.SERVER_ADDR, "127.0.0.1:8848"); 创建 Nacos Naming 客户端:NamingService namingService = NacosFactory.createNamingService(properties); 注册一个实例:namingService.registerInstance("nacos.test.1", InetAddress.getLocalHost().getHostAddress(), 8080); 查找这个服务的实例:System.out.println(namingService.getAllInstances("nacos.test.1")); 至此一个最简单的 Nacos 服务发现的使用已经完成了。这里要对一些细节稍作解释。首先在第一步中,属性 PropertyKeyConst.SERVER_ADDR 表示的是 Nacos 服务端的地址,这个地址的格式为 IP:port,IP:port。对于单机版,只需要指定一个 IP:port。甚至您可以将端口省略,这样将会访问 Nacos 的默认端口 8848。在第二步中,将创建一个 NamingService 实例,客户端将为该实例创建单独的资源空间,包括缓存、线程池以及配置等。Nacos 客户端没有对该实例做单例的限制,请小心维护这个实例,以防新建了多于预期的实例。第三步注册服务中,使用的是最简单的 API 注册方式,只需要传入服务名、IP、端口就可以。第四步是获取服务下的所有实例列表,包括健康和不健康的。 构建自定义实例 在一些场景中,我们希望注册的实例中,有一些能够被分配更多的流量,而另外一些分配较少的流量,或者能够传入一些实例的元信息存储到 Nacos 服务端,例如 IP 所属的应用或者所在的机房,这样在客户端可以根据服务下挂载的实例的元信息,来自定义负载均衡模式。别担心,我们有另外的注册实例接口,让你可以在注册的时候指定实例的属性: /** * Register a instance to service with specified instance properties * * @param serviceName name of service * @param instance instance to register * @throws NacosException / void registerInstance(String serviceName, Instance instance) throws NacosException; 这个方法可以在注册服务的时候,传入一个 Instanc 实例,而在 Instance 实例中,可以设置实例的若干属性: public class Instance { /* * Unique ID of this instance. / private String instanceId; /* * Instance ip / private String ip; /* * Instance port / private int port; /* * Instance weight / private double weight = 1.0D; /* * Instance health status / @JSONField(name = "valid") private boolean healthy = true; /* * Cluster information of instance / @JSONField(serialize = false) private Cluster cluster = new Cluster(); /* * Service information of instance / @JSONField(serialize = false) private Service service; /* * User extended attributes / private Map<String, String> metadata = new HashMap<String, String>(); ....} 其中,InstanceId 是由服务端生成返回给客户端,用于唯一标识该实例。IP、端口是实例的基本属性,除此之外,还有 weight 权重,可以设置该实例所分配流量的多少,这应该也比较好理解,权重越大,实例分配的流量就会越大。healthy 字段代表该实例是否健康,这个值也是由服务端返回给客户端的。cluster 和 service 分别表示该实例对应的集群和服务的一些信息,这些信息会在下面做介绍。最后是实例的元数据,这个元数据一个 String 对 String 的 Map。那么可以用如下代码来注册一个自定义实例: Instance instance = new Instance();instance.setIp(InetAddress.getLocalHost().getHostAddress());instance.setPort(8080);instance.setWeight(100);Map<String, String> metadata = new HashMap<String, String>(16);metadata.put("app", "nacos");metadata.put("site", "beijing");instance.setMetadata(metadata);namingService.registerInstance("nacos.test.1", instance); 构建自定义集群 Nacos 引入了集群的概念,在服务这个维度下面,可以对服务下的实例列表再做个划分。这在阿里巴巴内部非常普遍。一个典型的场景是这个服务下的实例,需要配置多种健康检查方式,有一些实例使用 TCP 的健康检查方式,另外一些使用 HTTP 的健康检查方式。另一个场景是,这个服务下挂载的机器分属不同的环境,我们希望能够在某些情况下(包括演练)将某个环境的流量全部切走,这样可以通过配置一个环境属于一个集群,来做到一次性切流。 在客户端构建自定义集群,有一些陷阱需要小心。当前我们只有注册实例的接口,实例内部的 cluster 字段可以配置集群的属性。但是多个实例之间如果配置了不同的集群属性,这时候会发生什么呢?Nacos 只会接受第一次注册该集群所传入的集群属性,也就是说,先注册的实例,获得优先权,将它对应的集群信息注册到 Nacos 服务端。只有 Nacos 服务端已经存在该集群的配置,后续的注册请求里的集群信息,都会被忽略。为了确保你的应用保持预期的行为,请务必让同一个集群下的实例使用相同的集群配置。 下面来看看可以为集群定义哪些配置: public class Cluster { /* * Name of belonging service / private String serviceName; /* * Name of cluster / private String name = ""; /* * Health check config of this cluster / private AbstractHealthChecker healthChecker = new AbstractHealthChecker.Tcp(); /* * Default registered port for instances in this cluster. / private int defaultPort = 80; /* * Default health check port of instances in this cluster. / private int defaultCheckPort = 80; /* * Whether or not use instance port to do health check. / private boolean useIPPort4Check = true; private Map<String, String> metadata = new HashMap<String, String>(); ...} 首先是集群对应的服务名,用来表示该集群所属的服务;然后是集群的名字、健康检查方式、默认的端口、默认的健康检查端口以及是否使用是的端口做健康检查。我们先来说简单的,默认端口表示注册时实例默认的端口,这个在客户端并没有体现,但是当使用 API 注册实例的时候,端口是可以不传入的,此时就会用这个默认端口作为实例的端口。然后是默认的健康检查端口,当健康检查方式中没有配置端口时,就会用这个端口来和实例通信,进行健康检查。下一个属性是是否使用实例端口做健康检查,如果设为 true,则会使用实例注册的端口来和实例进行通信。最后一个属性是集群的元数据,Nacos 支持多个维度的元数据,实例支持,集群支持,下面介绍的服务属性也支持。 健康检查方式,客户端心跳是一种模式,由客户端主动上报健康状态。服务端检测是另外一种模式,Nacos 目前支持三种:TCP、HTTP 和 MYSQL。TCP 方式会从 Nacos 服务端建立一个连接到实例,如果连接建立成功,则表示该实例健康。HTTP 方式则会从 Nacos 服务端想实例发起一个 HTTP 请求,可以配置的属性有访问的相对路径,访问的 HTTP 头部,这个头部使用竖线进行分割,以及预期的请求返回码,默认为 200: private String path = "";private String headers = "";private int expectedResponseCode = 200; MYSQL 健康检查方式,则可以让 Nacos 往实例执行一条 MySQL 命令,可以配置的属性有用户名、密码和执行的命令。执行结果如果不抛异常,则表示实例健康: private String user;private String pwd;private String cmd; 构建自定义服务 同理,服务也可能需要自定义的配置,Nacos 的服务随着实例的注册而存在,并随着所有实例的注销而消亡。目前除了使用 HTTP API 可以修改服务的属性外(这将在未来的篇章中进行介绍),就只能使用注册实例时传入服务属性来进行服务的自定义配置。这里的服务与 Consul 或者 Eureka 不同,Consul 与 Eureka 的服务其实就是指的实例,而每个实例有一个服务名,通过这个服务名来获取相同服务名下的实例列表,服务本身并不是一个数据实体。在真正的生产环境中,我们认为服务本身也是具有数据存储需求的,例如作用于服务下所有实例的配置、权限控制等。虽然有一些配置可以放到实例级别,例如健康检查是否开启。但是当服务的规模成千上万后,想要整体修改这些实例的健康检查开关,就是一个繁重的运维操作。另一些配置,例如下文会提到的健康保护阈值,是一定是一个服务只有一个唯一的值的,多个值将会造成逻辑上的冲突。 /* * Service name / private String name; /* * Protect threshold / private float protectThreshold = 0.0F; /* * Application name of this service / private String app; /* * Service group which is meant to classify services into different sets. / private String group; /* * Health check mode. / private String healthCheckMode; private Map<String, String> metadata = new HashMap<String, String>(); 服务的属性存储在 Service 类中,自上而下,依次是服务的名称、服务的健康保护阈值、服务的应用名、服务的分组、服务的健康检查模式以及服务的元数据。相关概念这里不再做一一陈述,你可以参考 Nacos 官网 概念介绍。这里要提到的是服务的健康保护阈值,在阿里巴巴内部,这个值被广泛的设置和调优。在这里对该属性的初衷做一个简单的介绍。分布式服务场景下的一个问题是在部分实例不健康的情况下,是否能够将流所有流量引向其他健康实例?在一些情况下,这可能造成雪崩效应。即本来健康的实例被多余的流量冲击,也变得不健康,然后导致健康的实例越来越少,最后整个服务崩溃。此时可以使用这个健康保护阈值,当健康实例与所有实例的比例小于这个值的时候,则认为所有实例都是健康的,这样虽然部分流量流向了不健康的实例,但是剩余健康的实例还是能够正常访问的。 服务发现 Nacos 的服务发现,有主动拉取和推送两种模式,这与一般的服务发现架构相同。在拉取方式中,提供了三个方法,一个是查询所有注册的实例,一个是只查询健康且上线的实例,还有一个是获取一个健康且上线的实例。一般情况下,订阅端并不关心不健康的实例或者权重设为 0 的实例,但是也不排除一些场景下,有一些运维或者管理的场景需要拿到所有的实例。目前的版本同时还支持根据服务端设定的负载均衡策略,来查询单个可用的实例。就好像 DNS 解析一样,虽然每次都返回一个后端 IP,但是整体可以保证域名挂载的所有 IP 会按照一定的策略都能够被客户端解析到。 /* * Get all instances of a service * * @param serviceName name of service * @return A list of instance * @throws NacosException /List<Instance> getAllInstances(String serviceName) throws NacosException;/* * Get qualified instances of service * * @param serviceName name of service * @param healthy a flag to indicate returning healthy or unhealthy instances * @return A qualified list of instance * @throws NacosException /List<Instance> selectInstances(String serviceName, boolean healthy) throws NacosException;/* * Select one healthy instance of service using predefined load balance strategy * * @param serviceName name of service * @return qualified instance * @throws NacosException /Instance selectOneHealthyInstance(String serviceName) throws NacosException; 前两个查询方法会返回所有实例的列表,这允许用户通过额外的工作,将实例的权重或者元数据运用到负载均衡中。对于一般的微服务场景,针对每个实例轮询,这样已经足够了。事实上,不管是在 Eureka 还是 Consul 里,其原生客户端都是只负责服务的发现,并不支持负载均衡。这样就需要第三方的 ribbon 或者 fabio 来完成负载均衡工作,此时它们的负载均衡,是完全放在客户端的。 Nacos 也会支持客户端侧的负载均衡,并支持用户扩展的负载均衡策略。不过在阿里巴巴内部,通常只需要由服务端来配置负载均衡策略,所有的调用端不区分业务的使用同一套负载均衡策略。因为实际上,调用端往往并不关心自身访问的服务的流量分配,而只需要一个可用的服务节点就可以了。而服务提供端,则由于其部署规模很大和部署环境的复杂,需要对环境信息敏感的流量分配以及对流量的绝对控制权。这时,往往需要提供端审慎的配置好统一的负载均衡策略,来保证所有订阅端按照这个策略来进行访问。 除了主动查询实例列表,Nacos 还提供订阅模式来感知服务下实例列表的变化,包括服务配置或者实例配置的变化。可以使用下面的接口来进行订阅或者取消订阅: /* * Subscribe service to receive events of instances alteration * * @param serviceName name of service * @param listener event listener * @throws NacosException /void subscribe(String serviceName, EventListener listener) throws NacosException;/* * Unsubscribe event listener of service * * @param serviceName name of service * @param listener event listener * @throws NacosException */void unsubscribe(String serviceName, EventListener listener) throws NacosException; 控制台使用 Nacos 0.3.0 版本上线了控制台,作为生产环境基本的运维工具,服务发现也通过控制台释放了部分的运维能力。虽然控制台承担的是运维为主的工作,但是开发人员也需要通过控制台来查看当前服务的注册状态和健康状态等,服务发现的控制台页面介绍可以参考 https://nacos.io/en-us/blog/discovery-console.html。虽然这篇文章中的一些页面通过社区的反馈而做了细微的调整,但是通过这篇文章应该可以掌握怎么使用服务发现的控制台了。控制台的启动方式也很简单,将 Nacos 安装包下载安装启动(安装教程)之后,直接访问:http://localhost:8848/nacos/index.html 即可打开最新的控制台界面。 小 结 Nacos 目前的版本,集成了服务发现和配置管理的基本能力以及部分高级特性。作为最小生产可用版本,Nacos 未来还会继续开放新特性,结合 SpringCloud、K8S、Dubbo 等生态,为开发者提供极致易用和稳定的服务管理和配置管理能力。在可预期的几个版本内,将会支持元数据的管理及 DNS 的服务发现。争取将使用 Nacos,作为服务发现和配置管理选型的最佳实践。 答案来源网络,供参考,希望对您有帮助

问问小秘 2019-12-02 03:00:16 0 浏览量 回答数 0

问题

Android API兼容性指南

mqc 2019-12-01 21:00:01 2106 浏览量 回答数 0

回答

不良的编程习惯TOP1:粘贴复制 在学生时代,我们都知道抄袭是不对的。但在工作中,这方面的规则还很模糊。虽然有些代码块是不能盗用的——不要把专有代码拷贝到你的堆栈中,尤其是这些代码有标记版权信息。这种时候你应该编写自己的版本,老板付你薪水就是要做正事的。 但是当原始创作者想要共享代码时,问题就变得复杂了。这些共享代码也许放到了某个在线编程论坛上,也许它们是带有许可证(BSD,MIT)的开放源代码,允许使用一到三个函数。你使用这些共享代码是没有问题的,而且你上班是为了解决问题,而不是重新发明轮子。 大多数情况下,复制代码的优势非常明显,小心对待的话问题也不大。至少那些从靠谱的来源获得的代码已经被大致“检查“过了。 问题的复杂之处在于,这些共享代码是否存在一些未发现的错误,代码的用途或底层数据是否存在一些特别的假设。也许你的代码混入了空指针,而原始代码从未检查过。如果你能解决这些问题,那么就可以理解为你的老板得到了两位程序员共同努力的成果。这就是某种形式的结对编程,而且用不着什么高大上的办公桌。 不良的编程习惯TOP2:非函数式代码 在过去十年间,函数范式愈加流行。喜欢用嵌套函数调用来构建程序的人们引用了很多研究成果。这些研究表明,与旧式的变量和循环相比,函数式编程代码更安全,错误更少,而且可以随程序员的喜好任意组合在一起。粉丝们十分追捧函数式编程,还会在代码审查和拉取请求中诋毁非函数式方法。关于这种方法的优势,他们的观点其实并没有错。 但有时你需要的仅仅是一卷胶带而已。精心设计并细心计划的代码需要花费很多时间,不仅需要花费时间想象,还需要构建和之后导航的时间。这些都增加了复杂性,并且会花费很多的时间与精力。开发漂亮的函数式代码需要提前做计划,还要确保所有数据都通过正确的途径传递。有时找出并更改变量会简单得多,可能再加个注释说明一下就够了。就算要在注释中为之后的程序员致以冗长而难懂的歉意,也比重新设计整个系统,把它扳回正轨上要省事得多。 不良的编程习惯第 3 位:非标准间距 软件中的大多数空格都不会影响程序的性能。除少数使用间距指示代码块的语言(如 Python)外,大多数空格对程序行为的影响为零。尽管如此,仍然有一些得了强迫症的程序员会数空格,并坚持认为它们很重要。曾有这样一位程序员以最严肃的口吻告诉我的老板,说我正在写“非标准代码”,还说他一眼就看出来了。我的错咯?因为我没在等号的两侧放置空格,违反了 ESLint space-infix-ops 规则[1]。 有时候你只要操心那些更深层的内容就行了,谁管什么空格的位置。也许你担心数据库过载,也许你担心空指针可能会让你的代码崩溃。一套代码中,几乎所有的部分都比空格更重要,就算那些喜欢走形式的标准委员会写出来一大堆规则来限制这些空格或制表符的位置,那又如何呢。 令人欣喜的是,网上可以找到一些很好用的工具来自动重新格式化你的代码,让你的代码遵守所有精心定义的 linting 规则。人类不应该在这种事情上浪费时间和脑细胞。如果这些规则这么重要,我们就应该用工具来解决这些问题。 不良的编程习惯第 4 位:使用 goto 禁止使用 goto 的规则可以追溯到许多结构化编程工具还没有出现的时代。如果程序员想创建一个循环或跳转到另一个例程,则需要键入 goto,后跟一个行号。多年之后,编译器团队开始允许程序员使用字符串标签来代替行号。这在当时被认为是一项热门的新特性。 有的人把这样做法的结果称为“意大利面条式代码”。因为以后没人能读懂你的代码,没人搞得清楚执行路径。成为一团混乱的线程,缠结在一起。Edsger Dijkstra 写过一篇题为“我们认为 goto 声明是有害的”的一篇文章[2],号召大家拒绝使用这个命令。 但是绝对分支并不是问题所在,问题在于它产生的那堆纠缠的结果。一般来说,精心设计的 break 或 return 能提供有关该位置的代码执行情况的非常清晰的陈述。有时,将 goto 添加到一个 case 语句中所生成的东西与联 if-then-else 块的相比,结构更正确的列表理解起来更容易。 也有反例。苹果 SSL 堆栈中的“goto fail”安全漏洞[3]就是一个很好的例子。但是,如果我们谨慎地避免 case 语句和循环中出现的一些问题,我们就可以插入很好用的绝对跳转,使代码读者更容易理解正在发生的事情。有时我们可以放一个 break 或 return,不仅更简洁,而且大家读起来更愉快,除了那些讨厌 goto 的人们。 不良的编程习惯第 5 位:不声明类型 热爱类型化语言的人们有他们的理由。当我们为每个变量的数据类型添加清晰的声明时,我们会编写更好,错误更少的代码。花点时间来阐明类型,就可以帮助编译器在代码开始运行之前标记出愚蠢的错误。这可能会很痛苦,但也会有回报。这是一种编程的笨办法,就是为了避免错误。 时代变了。许多较新的编译器已经足够聪明了,它们可以在查看代码时推断出类型。它们可以在代码中前后移动,最后确认变量应该是 string 或 int,抑或是其他类型。而且,如果推断出来的这些类型没法对齐,则编译器会给出错误标志。它们不需要我们再类型化变量了。 换句话说,我们可以省略一些最简单的声明,然后就能轻松节省一些时间了。代码变得更简洁,代码读者也往往能猜出 for 循环中名为 i 的变量是一个整数。 不良的编程习惯第 6 位:溜溜球代码 程序员喜欢将其称为“yo-yo 代码”。首先,这些值将存储为字符串,然后将它们解析为整数,接下来将它们转换回字符串。这种方法效率极低。你几乎能感受到一大堆额外负载让 CPU 不堪重负的样子。能快速编写代码的聪明程序员会调整自己的代码架构,以最大程度地减少转换。因为他们安排好了计划,他们的代码也能跑得更快。 但不管你信不信,有时溜溜球代码也是有意义的。有的时候,你需要用一个可以在自己的黑匣子里搞定一大堆智能操作的库。有的老板花了很多钱,请好多天才做出来这么一个库。如果这个库需要字符串形式的数据,那么你就得给它字符串,就算你最近刚把数据转换为整数也得再转回去。 当然,你可以重写所有代码以最大程度地减少转换,但这会花费一些时间。有时,代码多运行一分钟、一小时、一天甚至一周也是可以接受的,因为重写代码会花费更多时间。有时候,增加技术债务要比重新建立一笔技术债的成本更低些。 有时这种库里面不是专有代码,而是你很久以前编写的代码。有时,转换一次数据要比重写该库中的所有内容更省事。这种时候你就可以编写悠悠球代码了,不要怕,我们都遇到过这种事情。 不良的编程习惯第7位:编写自己的数据结构 有一条标准规则是,程序员在大二学完数据结构课程后,再也不要编写用于存储数据的代码了。已经有人编写过了我们所需要的所有数据结构,并且他们的代码经过了多年的测试和重新测试。这些结构与语言打包在一起,还可能是免费的。你自己写的代码只会是一堆错误。 但有的时候数据结构库的速度有点缓慢。有时候我们被迫使用的标准结构并不适合我们自己的代码。有时,库会要求我们在使用它的结构之前重新配置数据。有时,这些库带有笨重的保护,还有一些诸如线程锁定之类的特性,而我们的代码并不需要它们。 发生这种情况时就该编写我们自己的数据结构了。有时我们自己的结构会快很多,还可能让我们的代码更整洁,因为我们不需要一大堆额外的代码来重新精确地格式化数据。 不良的编程习惯第 8 位:老式循环 很久以前,创建 C 语言的某人想将所有抽象可能性封装在一个简单的构造中。这个构造开始时要做一些事情,每次循环都要做一些事情,所有事情都完成时还有一些方法来提示我们。当时,这似乎是一种拥有无限可能性的完美语法。 此一时彼一时,如今一些现代评论者只看到了其中的麻烦,发生的事情太多了,所有这些可能性既可能向善也可能作恶。这种构造让阅读和理解代码变得非常困难。他们喜欢更加函数式的的范式,其中没有循环,只有应用到列表的函数,还有映射到某些数据的计算模板。 有时无循环方法更简洁,尤其是当我们只有一个简单的函数和一个数组的时候。但还有些时候,老式的循环要简单得多,因为它可以做更多事情。例如,当你找到第一个匹配项后就立刻停止搜索,这样的代码就简单得多。 此外,要对数据执行多项操作时,映射函数会要求更严格的编码。假设你要对每个数字取绝对值,然后取平方根,最快的方案是先映射第一个函数,然后映射第二个函数,将数据循环两次。 不良的编程习惯第 9 位:在中间打破循环 从有一天开始,一个规则制定小组宣布每个循环都应该有一个“不变项”,就是一个在整个循环中都为真的逻辑语句。当不变量不再为真时,循环就结束了。这是处理复杂循环的好方法,但会带来一些令人抓狂的约束,例如禁止我们在循环中间使用 return 或 break。这条规则是禁止 goto 语句规则的子集。 这个理论很不错,但它通常会导致代码变得更复杂。考虑以下这种简单的情况,其中会扫描一个数组,找出通过测试的一个条目: while (i<a.length){ ... if (test(a[i]) then return a[i]; ... } 喜欢循环不变项的人们宁愿我们添加另一个布尔变量,将其称为 notFound,然后这样用它: while ((notFound) && (i<a.length){ ... if (test(a[i])) then notFound=false; ... } 如果这个布尔名称取得很合适,那就会是一段自我注释得很好的代码。它可以让大家理解起来更容易。但这也增加了复杂性。这还意味着要分配另一个局部变量并阻塞一个寄存器,编译器可能没那么聪明,没法修复这个错误。 有时使用 goto 或 jump 会更简洁。 不良的编程习惯第10位:重载运算符和函数 一些有趣的语言会让你绕一些大弯子,比如说重新定义看起来应该是常量的元素值。拿 Python 来说,至少在 2.7 版及更低版本中,它允许你键入 TRUE=FALSE。这不会引发某种逻辑崩溃,也不会导致宇宙的终结;它只是交换了 TRUE 和 FALSE 的含义。你还可以使用 C 预处理器和其他一些语言来玩这种危险的游戏。还有一些语言允许你重新定义加号之类的运算符。 有时候,在一大段代码中重新定义一个或一些所谓常量,结果效率会更高。有时,老板会希望代码执行完全不同的操作。当然,你可以检查代码,逐一更改对应的部分,也可以干脆重新定义现实来节省时间。别人会觉得你是天才。用不着重写庞大的库,只需翻转一下即可。 这里也许应该划一条底线。无论这种做法多有意思,看起来多聪明,你都不应该在家里做实验。这太危险了——我是认真的。

茶什i 2019-12-30 11:01:01 0 浏览量 回答数 0
阿里云大学 云服务器ECS com域名 网站域名whois查询 开发者平台 小程序定制 小程序开发 国内短信套餐包 开发者技术与产品 云数据库 图像识别 开发者问答 阿里云建站 阿里云备案 云市场 万网 阿里云帮助文档 免费套餐 开发者工具 企业信息查询 小程序开发制作 视频内容分析 企业网站制作 视频集锦 代理记账服务 2020阿里巴巴研发效能峰会 企业建站模板 云效成长地图 高端建站