022-2345 2937
185 2247 0110
business@forenose.com
QQ:2779623375
用户QQ群3:606835039
用户QQ群4:795287153
订阅号
服务号
客服微信:qianxiu0106
ForeSpider
数据采集引擎
科技资讯:
科技学院:
科技百科:
科技书籍:
网站大全:
软件大全:
atlassian.forceSchemaUpdate | |||
---|---|---|---|
1.0 | false | atlassian-config | 在默认的情况下,Confluence 只会在侦测到数据库更新后才会运行数据库 schema 更新。这个标志位将会强制 Confluence 在启动的时候对 schema 进行更新。 |
confluence.home | |||
1.0 | 任何文件系统路径 | Confluence and atlassian-config | 如果这个属性被设置,Confluence 将会忽略 confluence-init.properties 属性文件中配置的信息,使用你在启动的时候指定的路径为 Confluence Home 目录。 |
confluence.dev.mode | |||
1.0 | false | Confluence | 针对 Confluence 开发人员,启用更多的 debugging 选项(这个也可能会修改 spring bean 的默认 lazy 初始化方式,将会增加启动时间)。请不要在生产环境中启用这个选项。 |
confluence.disable.mailpolling | |||
2.4 | false | Confluence | 如果设置为 "true",将会阻止 Confluence 从已经归档的空间中获得邮件。通过 WEB 界面的 "check for new mail" 进行手动操作依然可用。这个配置将不会影响发送邮件。 |
confluence.i18n.reloadbundles | |||
1.0 | true | Confluence | 设置这个属性将会导致 Confluence 在每次国际化(internationalized )字符查找的时候载入 i18n 资源。这个在对翻译进行测试的时候会非常有用,但是会导致 Confluence 实例 运行缓慢 ( insanely slowly )。 |
confluence.ignore.debug.logging | |||
1.0 | true | Confluence | 当 Confluence 检测到 DEBUG 级别的日志被启用了,Confluence 将会输出服务器的错误信息(DEBUG 级别的日志将会显著的降低服务器性能)。设置这个选项将会输出所有的错误信息。 |
confluence.jmx.disabled | |||
3.0 | false | Confluence | 如果被设置为 "true",将会禁用 Confluence 的 JMX 监控。这个与在 WEB-INF/classes/jmxContext.xml 设置 "enabled" 属性是一样的。 |
confluence.optimize.index.modulo | |||
2.2 | 20 | Confluence | 在索引进行优化之前刷新索引的次数。 |
confluence.plugins.bundled.disable | |||
2.9 | false | Confluence | 启动 Confluence 的时候不绑定插件。在 Confluence 开发环境中进行快速启动会显得很有效,能够加快启动速度,但是启动的时候绑定插件是 Confluence 一些核心功能所需要的。这个属性不应该在 Confluence 生产环境中设置。 |
atlassian.indexing.contentbody.maxsize | |||
3.0 | 1048576 | atlassian | 当文件上传后,文件的内容被解压并且进行索引,这个功能允许用户不但可以对文件名进行搜索还可以对文件内容进行搜索。 如果解压的内容文件大小超过了设定的值(默认为 1 MB),文件的内容还是会被索引和查找,但是文件将不会显示在查找结果中。增加这个限制值,将会是查询结果的显示变得缓慢。请参考 Configuring Attachment Size 页面中的更多信息。 |
atlassian.mail.fetchdisabled | |||
3.5 | false | Confluence | 为 IMAP 和 POP 禁用邮件过滤服务 |
atlassian.mail.senddisabled | |||
3.5 | false | Confluence and atlassian-mail | 禁用发送邮件 |
atlassian.disable.caches | |||
2.4 | true | atlassian-plugins, atlassian-cache-servlet | 设置这个属性将会禁用 conditional get 和 expires:一些 WEB 资源的头部(headers )。这个将会显著降低用户的使用体验,但是在开发环境中就显得非常有用,如果你经常修改一些静态资源但是你又不想持续的刷新你浏览器的缓存。 |
confluence.html.encode.automatic | |||
2.9 | Confluence | 设置这个属性将会强制 antixss 编码打开或关闭,将会覆盖 settings 中的设置。默认的表现针对 Confluence 的版本不同而不同。 | |
org.osgi.framework.bootdelegation | |||
2.10 | empty | atlassian-plugins | Comma-separated 为 OSGi 插件提供包的的列表名。基本上当 Confluence 进行 profiling 的时候是需要的。例如:"com.jprofiler. ,com.yourkit. "。 |
confluence.diff.pool.size | |||
3.1 | 20 | Confluence | 当前最大不同的数量。如果超过了这个值,其他通过 RSS 创建的 diffs 将会忽略和日志(RSS 请求还是会显示成功,但是将会丢失 diffs 信息)。 |
confluence.diff.timeout | |||
3.1 | 1000 | Confluence | 在比较 2 个页面版本的时候,diff 操作王朝等待的时间(毫秒)。在这个时间内完成否则将会显示错误信息。 |
confluence.html.diff.timeout | |||
4.0 | 10000 | Confluence | 在比较 2 个页面版本的时候,diff 操作完成等待的时间(毫秒)。在这个时间内完成否则将会显示取消并显示错误信息。 |
atlassian.user.experimentalMapping | |||
2.10 | false | Confluence | 设置这个属性将会修改本地用户和本地用户组之间的关系来避免在向本地系统中导入大量用户产生的性能问题。请注意,设置这个选项为启用的话将会降低其他用户管理功能的速度。我们建议仅仅在向系统中大量导入用户和用户组出现性能出现问题的时候才启用这个选项。请参考 CONF-12319 ,针对这个问题在 Confluence 3.1.1 中我们已经修复了。 |
confluence.import.use-experimental-importer | |||
3.2 | false | Confluence | 设置这个属性来修改 Confluence 使用 测试 XML 导入器(Experimental XML Importer)。这个被设置为能更稳定的导入数据到 Confluence 中,但是在 Confluence 3.2 发布的时候,这个导入功能未测试大数据量的导入,所以也不提供支持。 |
atlassian.webresource.disable.minification | |||
3.3 | false | atlassian-plugins | 禁用 Confluence 服务器的 JavaScript 和 CSS 资源自动压缩。 |
index.queue.thread.count | |||
3.3 | See "Effect" | Confluence | 设置重新索引可以使用的线程数量大小。这个值可以被设置为从 1 到 50 (包括 50)。例如,最小一个线程但是最多不超过 50 个线程。这个配置没有默认值。例如: 如果你没有设置 index.queue.thread.count ,这个线程值被用来计算需要的线程,基于需要重新索引的对象和可用的进程(最多可用设置 50 可用的线程)。 如果设置 index.queue.thread.count=2 ,那么只有 2 个线程被在重新索引的时候使用(与被重新索引的对象和可用的进程的数量无关)。 如果设置 index.queue.thread.count=200 ,那么 10 个进程(最多允许的数量)将会被在重新索引的时候使用。 注意:从 Confluence 3.3 到 5.6 最多进程的数量是 10。 |
index.queue.batch.size | |||
3.3 | 1500 | Confluence | 索引可以使用的批次。减少这个值将会降低索引时候的系统消耗,但是会增加索引所需要的系统时间让索引将会花费更多的时间。增加这个值将会让索引更快的完成,但是也会增加系统的复杂,降低系统性能。通常的情况下,这个设置不需要进行修改。 |
password.confirmation.disabled | |||
3.4 | false | Confluence | 这个属性将会禁用密码校验功能,这个功能能够为 Confluence 提供额外的安全性。当这个参数不设置的时候,Confluence 将会对下面的操作 不进行 密码校验: administrative actions ,修改电子邮件地址和 Captcha for failed logins 。如果你使用的是用户授权的话,禁用这个密码校验功能就比较有用。 |
confluence.browser.language.enabled | |||
3.5 | true | Confluence | 如果设置这个属性为 "false",将会禁用侦测浏览器头部(headers)的语言配置,在早期 Confluence 的发行版本中被用来重置 Confluence 的表现。设置这个属性为 "true" 的话,将会启用侦测浏览器使用的语言。Confluence 将会根据侦测到的语言来设置 Confluence 的 UI 表现。请参考 Edit Your User Settings 文档中的内容来了解用户语言是如何设置的。 |
upm.pac.disable | |||
Universal Plugin Manager 1.5 | false | Universal Plugin Manager (UPM) | 当这个属性设置为 ture 的话 UPM 将不会尝试访问 The Atlassian Marketplace 。这个配置在你的 Confluence 服务器不能访问互联网的时候比较重要。请参考 UPM documentation 页面获得更多的有效信息。 |
confluence.reindex.documents.to .pop | |||
3.5.9 | 20 | Confluence | 在进行全部重索引的时候确定一个线程可以索引多少对象。请注意,这个参数不包括附件。 |
confluence.reindex.attachments.to .pop | |||
3.5.9 | 10 | Confluence | 在进行全部重索引的时候确定一个线程可以索引多少附件。 |
confluence.upgrade.active.directory | |||
3.5.11 | false | Confluence | 强制 Confluence 将任何 LDAP 目录都合并为 AD(Active Directory),而不是紧急依赖查找用户属性中的 sAMAccountName 。如果你是从 Confluence 3.5 之前的版本进行升级的话就非常有用,需要使用一个属性而不是 sAMAccountName 来定义你的用户,同时查找 LDAP: error code 4 - Sizelimit Exceeded 在你日志中的错误。请参考 Unable to Log In with Confluence 3.5 or Later Due to 'LDAP error code 4 - Sizelimit Exceeded 页面中的内容来获得更多的信息。 |
confluence.context.batching.disable | |||
4.0 | false | Confluence | 为在上下文(contexts )中的 Web 资源(例如,编辑者,主页,管理员)禁用批量。如果你需要对 javascript 或 CSS 中的错误进行调试,这个参数非常有用。 |
com.atlassian.logout.disable.session.invalidation | |||
4.0 | false | Confluence | 在退出登录的时候禁用会话校验。在 4.0 的时候,默认我们定义的是校验 JSession 被指派给客户端的会话,在用户退出登录的时候。如果这个参数被设置为 true,那么会话将会保持激活(但是用户已经退出登录了)。如果你使用的是外部授权系统,这个设置可能会保持系统的正常工作,但是基本上这个应该是不需要的。 |
officeconnector.spreadsheet.xlsxmaxsize | |||
4.0.5 | 2097152 | Office Connector | 当使用 viewxls 宏的时候,确定 Excel 文件中识别的最大字节。如果设置为 null 的话,默认的参数为 2 MB。请参考 CONF-21043 页面中的内容。 |
com.atlassian.confluence.extra.calendar3.display.events.calendar.maxpercalendar | |||
200 | Team Calendars | 确定没一个日历中可以存储的最多的事件数量。这个参数只在 Team Calendars 插件安装在你 Confluence 站点后有效。 | |
com.atlassian.confluence.allow.downgrade | |||
4.3.2, 5.0-OD-10 | false | Confluence | 允许你的 Confluence 在新版本的 home 目录配置下启动。请注意,Confluence 不支持在这个配置下运行。你应该明白这个配置将会导致严重的问题,有可能会导致 Confluence 无法启动。请参考 After Downgrading, Confluence Will No Longer Run 页面获得详细信息。ils. |
confluence.skip.reindex | |||
false | 当这个参数设置为 true 的时候,允许 Confluence 在 Confluence 升级的时候跳过重构搜索索引。当你的站点很大,内容很多的时候,这个配置很有用。你可以在升级的时候不对索引进行重构,在升级完成后才对索引进行重构。 | ||
reindex.thread.count | |||
5.2 | Confluence | 针对 one-off reindex 设置使用的线程数量。这个值可以设置数量为 1 到 50(包括 50),例如最少 1 个线程,最多不超过 50 线程被使用。这里没有默认值的设置。这个系统配置不影响 Confluence 增加的索引。 | |
reindex.attachments.thread.count | |||
5.2 | 4 | Confluence | 针对附件的重新索引,设置可以使用的线程数量,这个设置运行你降低系统资源在对内容进行索引的时候的消耗。 |
atlassian.confluence.export.word.max.embedded.images | |||
5.2 | 50 | 这个属性限制你在将 Confluence 页面导出为 Word 文档的时候包含图片的数量。当你导出的页面有大量的图片的时候,这些图片将会首先被载入到内存中,可能会导致你系统出现内存溢出的错误。如果你需要导出的页面有大量图片的话,你可以使用这个系统参数临时增加导出数量大小的限制。 | |
confluence.mbox.directory | |||
5.4.1 | Confluence | 在你 Confluence 中设置 mailboxes 可以导入到 Confluence 中的路径(针对使用 Confluence Mail Archiving 插件)。Mailboxes 不能从其他位置中导入。我们推荐 Confluence 管理在 Confluence 的 Home 目录中创建一个特殊的目录来针对这个操作。在你对这个参数正确设置之前,Mail 是不能导入到系统中的。 | |
confluence.search.max.results | |||
5.5 | 1000 | Confluence | 设置这个参数将会设置 Confluence 查找将要返回的最大数量。 |
confluence.upgrade.recovery.file.enabled | |||
5.5 | true | Confluence | 在默认的情况,Confluence 将会在升级之前创建一个备份文件。如果你的 Confluence 站点的数据库数量比较庞大,同时你又是使用的是数据库备份的方式来对你的 Confluence 备份的话,这个功能可以安全的关闭。将这个属性设置为 false 的话,Confluence 将会在升级之前不会创建一个系统的备份。 |
confluence.junit.report.directory | |||
5.5 | Confluence | 这个属性将会设置 Confluence 服务器的 JUnit 报表从哪个目录导入(针对使用 JUnit Report 宏)。如果这个属性不设置的话,不会使用其他的目录进行导入。我们推荐 Confluence 管理在 Confluence 的 Home 目录中创建一个特殊的目录来针对这个操作。在你对这个参数正确设置之前,JUnit 的测试结果文件不能导入到系统中的。 | |
officeconnector.textextract.word.docxmaxsize | |||
5.5.3 | 16777216 | Confluence | 当一个文件被上传,这个文件将会被解压后索引。这个允许人们不仅仅可以对文件名进行查找还可以对文件里面的内容进行查找。 Confluence 将会对 Word 文档中的内容进行解压,但是可以解压的 Word 文档大小有限制(默认限制为 16MB)。这样的设置可能导致你只有部分文件内容可以检索到。请参考页面 Configuring Attachment Size 来获得更多的信息。 |
cluster.login.rememberme.enabled | |||
5.6 | False | 在集群环境下,设置这个属性为 True 后,将会在登录界面中启用 'Remember Me' 选择对话框。这个选择不推荐在集群的环境下使用,所以在默认的情况下这里设置为禁用的(例如: 'Remember me' 启用的话,用户可以在不同节点之间进行转换)。 这个设置不对对独立进程安装的 Confluence 产生影响。 | |
confluence.cluster.hazelcast.listenPort | |||
5.6 | 5801 | 在集群环境下,这个属性仅仅被用于重置 Hazelcast 将要绑定的默认端口。例如,如果这个端口不可用或者你需要在同一个主机上运行多个节点(不推荐这样做)。默认设置为 5801。 | |
confluence.document.conversion.threads | |||
5.7 | Confluence | 在文件转换服务中可以使用的线程数量,这个数量是动态计算的,基于实例支票的内存数量的大小和 CPU 内核的数量(通常是 4 到 6 个内核)。这个属性可以被用来修改默认的线程数量。减少这个线程数量可以解决OOME 问题,增加线程数量能够缓解文档在队列中等待的时间过长的问题。 | |
confluence.document.conversion.threads.wait | |||
5.7 | 1000 | Confluence | 设置这个属性可以设置转换队列中的最大数量。当达到最大转换数量的时候,任何文件转换的请求将会被丢弃。 |
confluence.cluster.node.name | |||
5.7 | Confluence | 设置这个属性可以在数据中心集群模式下的每一个节点一个可读的名字(在页脚显示电子邮件通知)。如果这个属性不设置,Confluence 将会自己为每一个节点指定一个 ID。 | |
confluence.document.conversion.fontpath | |||
5.8.7 | Confluence | 当你添加其其他使用的字体然后准备读取文件的时候,设置这个属性来定义目录(在预览和缩略图中)。 当你打算使用特定的字体或者在多字节字符中(例如 日文,中文)预览文件的时候比较有用。 | |
confluence.document.conversion.words.defaultfontname | |||
5.8.7 | Confluence | 设置这个属性来设置在 Confluence 中生成 Word 文档使用的默认字体( .doc 和 .docx )。 仅仅指定字体的名字(不是路径)。 | |
confluence.document.conversion.slides.defaultfontname.regular | |||
5.8.7 | Confluence | 设置这个属性来设置在 Confluence 中生成 Powerpoint 文档使用的默认字体( .ppt 和 .pptx )。 仅仅指定字体的名字(不是路径)。 | |
confluence.document.conversion.slides.defaultfontname.asian | |||
5.8.7 | TakaoPGothic | Confluence | 设置这个属性来设置在 Confluence 中生成 Powerpoint 文档有关亚洲字体使用的默认字体( .ppt 和 .pptx )。 仅仅指定字体的名字(不是路径)。 |
confluence.document.conversion.slides.defaultfontname.symbol | |||
5.8.7 | Confluence | 设置这个属性来设置在 Confluence 中生成 Powerpoint 文档有关符号字体使用的默认字体( .ppt 和 .pptx )。 这个将会用于 bullets 和其他符号,当 Symbol 没有找到的时候。 仅仅指定字体的名字(不是路径)。 | |
confluence.clickjacking.protection.disable | |||
5.8.15 | false | Confluence | 安全特性将会阻止 Confluence 被嵌入到 |
confluence.cluster.index.recovery.query.timeout | |||
5.9.1 | 10 | 在 Confluence 数据中心模式,这里设置的是时间(秒),被用于确定 Confluence 节点需要被重新索引等待另外一个索引的快照,在另一个索引尝试放弃恢复之前。 | |
confluence.cluster.index.recovery.generation.timeout | |||
5.9.1 | 120 | 在 Confluence 数据中心模式,这里设置的是时间(秒),被用于确定 Confluence 节点需要被重新索引等待另外一个索引的快照,在另一个索引尝试放弃恢复之前的超时时间。 | |
confluence.cluster.index.recovery.num.attempts | |||
5.9.1 | 1 | 在 Confluence 数据中心模式,这里设置的是时间(秒),被用于确定 Confluence 节点需要被重新索引等待另外一个索引的快照,在另一个索引尝试放弃恢复之前的尝试参数。设置这个属性为 0 的话将会禁用从节点中恢复索引(例如,当你期望强制一个节点在启动的时候自动重建自己的索引)。 | |
com.atlassian.confluence.officeconnector.canary.memory_value | |||
5.9.1 | 1024 | Confluence | 设置 Office Connector Canary 处理进程可用的内存(GB),在导入 Word 选项的时候,内存的设置已知可能会导致一些问题。请参考 JVM crashes during Import from Word in Confluence 知识库中的内容。 |
com.atlassian.confluence.officeconnector.canary.timeout | |||
5.9.1 | 120000 | Confluence | 设置 Office Connector Canary 处理进程的超时时间(毫秒),在导入 Word 选项的时候,相关处理进程的一些设置已知可能会导致一些问题。请参考 JVM crashes during Import from Word in Confluence 知识库中的内容。 |
atlassian.plugins.enable.wait | |||
5.9.5 | 300 | 设置这个属性将会增加等待插件启动的默认时间。这个属性配置对你在插件启动的时候因为时间原因一些插件原因导致 Confluence 不能启动的问题进行修正。 | |
confluence.cluster.hazelcast.max.no .heartbeat.seconds | |||
5.9.7 | 30 | Confluence | 在 Confluence 数据中心环境下,这个被设置多长时间(秒),Confluence 的节点将会与集群进行联系确定是否从集群中移除。请参考 balancing uptime and data integrity 页面中的内容。 |
confluence.startup.remigration.disable | |||
5.10.8 | False | 当你的 Confluence 在创建新页面版本的时候不停的出现问题,你可以设置这个参数为 true。这个是因为在创建新页面版本的时候 Confluence 可能尝试在每次插件安装或者更新的时候合并页面中不是 Wiki 标记的内容。请参考 CONFSERVER-37710 页面中的内容来获得更多的信息。 | |
cluster.safety.time.to.live.split.ms | |||
6.0.0 | 60000 | 在 Confluence 数据中心,这个数值是时间(毫秒),允许集群安全任务将会等待允许节点重新加入到集群中,在分离项目被侦测到以后。如果集群安全数字在这次后能在缓存中找到,这个节点将会被删除。 | |
confluence.cph.max.entries | |||
6.0.0 | 2000 | Confluence | 当你拷贝一个页面和页面子节点的时候允许最大数量的页面可以被拷贝。增加这个数量当你需要拷贝的页面数量超过了设定值的话。 |
confluence.cph.batch.size | |||
6.0.0 | 10 | Confluence | 当你拷贝一个页面和页面子节点的时候每个批次可以拷贝的页面数量。当你在拷贝页面或者页面子节点的时候遇到了问题的话,可以考虑增加这个设置值。 |
synchrony.port (formerly known as reza.port) | |||
6.0.0 | 8091 | 这个是同步的端口。有关协同编辑服务运行使用的端口。你需要在端口 8091 不能使用的时候考虑修改这个端口。针对 Confluence 的数据中心环境,这个属性的设置请参考 Configuring Synchrony for Data Center 页面中的内容。 针对 6.0.4,Confluence服务器将会同时接受 reza.port or synchrony.port . | |
synchrony.memory.max (formerly reza.memory.max) | |||
6.0.0 | 1g | 在同步编辑(Synchrony)服务加载的服务器可以使用最大的 heap 内存大小(Xmx)。如果你需要增加或者减少 heap 大小的话,你可以修改这个属性的值。针对 Confluence 的数据中心环境,这个属性的设置请参考 Configuring Synchrony for Data Center 页面中的内容。 针对 6.0.4,Confluence服务器将会同时接受 reza.memory.max or synchrony.memory.max . | |
synchrony.stack.space | |||
6.0.0 | 2048k | 在同步编辑(Synchrony)虚拟机中设置 stack 的大小(Xss)。当你在同步的时候遇到堆栈错误或者内存溢出的问题的话,你可以考虑增加这个属性值。 | |
synchrony.enable.xhr.fallback | |||
6.0.0 | True | 当一个用户不能使用 WebSocket 同步编辑(Synchrony)进行连接的时候,配置一个用户的 XML HTTP Request (XHR) 回调。针对 Confluence 6.1 的版本,这个配置是默认启用的,同时仅仅在当在 WebSocket 不能使用的时候启用。你应该不需要禁用这个配置,除非你的系统支持小组明确告诉你禁用这个配置。 | |
synchrony.database.test.connection.on.checkin | |||
6.0.0 | True | 当连接需要建立连接的时候,校验数据库连接的有效性。Atlassian Support 可能建议你设置这个参数为 False,如果你在使用 Confluence 遇到了性能访问的问题,同页面编辑的频率又非常频繁的话。 | |
synchrony.proxy.enabled | |||
6.0.0 | True | 在默认的情况下,Confluence 使用一个内部代理来在 Confluence JVM 和 Synchrony JVM 之间进行通信。请参考 Administering Collaborative Editing 页面来获得有关的更多信息。 在 Confluence 6.0,设置这个属性为 true 来手动启用内部代理(如果你已经配置了方向代理,但是同时还希望使用同步代理,这个配置比较有用)。 在 Confluence 6.1 及其后续版本,这个配置 不是必要 的。Confluence 将会智能的检测在什么时候需要使用代理。 这个属性将不会对 Confluence 数据中心有影响。 | |
synchrony.bind (formerly known as reza.bind) | |||
6.0.0 | 0.0.0.0 | 在 Synchrony 监听的特定网络界面。可能你需要针对这个修改 Confluence 服务器。在 Confluence 数据中心,这个应该与 synchrony.cluster.bind 的设置相同。 针对 6.0.4,Confluence服务器将会同时接受 reza.bind or synchrony.bind 。 | |
synchrony.context.path | |||
6.0.0 | /synchrony | 这个是针对 Synchrony 使用的上下文路径。你应该不需要在你的 Confluence 服务器上对这个进行修改。 | |
confluence.flyingpdf.default.characters.per.line | |||
6.0.3 | 80 | 如果页面表格中的列名字的所有字符串超过了这个属性,Confluence 将会自动调整宽度,这样一个页面在导出为 PDF 的时候能够将页面中的的表格自适应页面。 | |
synchrony.host | |||
6.0.4 | 127.0.0.1 | Confluence 连接 Synchrony 使用的 IP 地址。在默认的情况下,这个地址为 localhost。如果你希望 Synchrony 能够通过自定义主机名或者 IP 地址进行连接的话,你需要修改这个配置。 | |
synchrony.proxy.healthcheck.disabled | |||
6.1.0 | false | Synchrony 代理健康检查被用来检查 Synchrony 代理的运行情况和响应请求的情况。这个需要一个 http 的连接。如果一个 http 的连接没有显示在你的 r server.xml 中(例如你正在使用一个 https 或者 AJP 连接),这个连接检查将会返回错误,尽管你的 Synchrony 代理是在正常运行的。在必要的时候,你可以使用这个属性来禁用健康检查。 | |
page.index.macro.max.pages | |||
6.1.4 | 5000 | 设置页面索引宏可以显示最大的页面数量。当你的系统中有大量数据的时候,页面索引宏(Page Index macro)能够显著降低你 Confluence 实例的响应速度并且能够导致内存溢出。如果一个空间中的页面数量超过了这个限制,页面索引宏将会显示一个页面的数量和有更多页面内容需要显示的信息。 | |
atlassian.indexing.attachment.maxsize | |||
6.2.2 | 104857600 | 当一个文件被上传,文件将会被解压后进行索引。这个将会运行文件中的内容也能够被索引,不仅仅是索引文件的名字。 如果上传的文件大小超过了设置的值(默认为 100 MB),文本文件的解压和索引将会被跳过而不进行。请参考 Configuring Attachment Size 页面中的内容来获得更多有效信息。 | |
officeconnector.excel.extractor.maxlength | |||
6.2.2 | 1048576 | 当一个文件被上传,文件将会被解压后进行索引。这个将会运行文件中的内容也能够被索引,不仅仅是索引文件的名字。 Confluence 将会仅仅对文件大小不超过设定值的 Excel 文件进行解压后索引(默认 1 MB),这意味着只有文件中的部分内容能够被索引到。请参考 Configuring Attachment Size 页面中的内容来获得更多有效信息。 | |
confluence.collab.edit.user.limit | |||
6.3.0 | 12 | 当协同编辑操作功能启用的话,这个配置将会限制每一个页面有多少用户可以同时进行编辑。如果你在编辑页面的时候发现多用户同时编辑导致了速度变慢和性能下降,缩小这个值。 | |
jobs.limit.per.purge | |||
6.4.3 | 2000 | 清理老的任务运行细节(Purge Old Job Run Details) 将会计划任务删除从数据库中的计划删除细节。 设置这个记录的数量将会修改每次进行批量操作的时候进行批量的数量。 | |
all.jobs.ttl.hours | |||
6.4.3 | 2160 | 在默认情况下 清理老的任务运行细节(Purge Old Job Run Details) 将会删除超过 90 天(或者 2160 小时),未成功(失败或者中止)计划任务细节。 设置这个属性,修改值(小时)将会修改在数据中保存为成功计划任务的细节信息。 | |
unsuccessful.jobs.ttl.hours | |||
6.4.3 | 168 | 在默认情况下 清理老的任务运行细节(Purge Old Job Run Details) 计划任务将会获取超过 7 天(或者 168 小时),未成功(失败或者中止)计划任务细节。 设置这个属性,修改值(小时)将会修改在数据中保存为成功计划任务的细节信息。 | |
atlassian.recovery.password | |||
6.6.1 | 允许一个管理员以 Confluence 恢复模式启动 Confluence,并且在启动的时候使用指定的管理员密码。如果系统管理在对系统进行导入后锁定了自己的登录用户名和密码的时候,并且还没有其他办法恢复自己的密码的时候就显得非常有用了。请参考 Restore Passwords To Recover Admin User Rights 页面获得更多的信息。 这个系统属性在系统管理员完成账号恢复后,必须马上复原。 | ||
confluence.extra.userlister.limit | |||
6.6.3, 6.7.1 | 10000 | 设置这个属性可以限制 User List macro 中可以显示的用户列表的最大数量。当你尝试显示大量用户数量的时候,这个宏已知可能会导致内存溢出错误。 | |
document.conversion.sandbox.pool.size | |||
6.10.0 | 2 | Data Center only | 当一个文档文件被插入到页面的时候,缩略图将会被自动创建并插入到页面,以便于你对内容进行编辑。同时能够在编辑器中为你提供同行查看和预览。在 Confluence 数据库中心中,这个过程在 document conversion sandbox 中进行处理。 使用这个参数可以增加 sandbox 的进程数量(可用的进程)。更多的 sandboxes 意味着更多的平行处理能力,但是也将消耗每一个节点的更多的内存和 CPU 处理资源。 |
document.conversion.sandbox.startup.time.limit.secs | |||
6.10.0 | 30 | Data Center only | 当一个文档文件被插入到页面的时候,缩略图将会被自动创建并插入到页面,以便于你对内容进行编辑。同时能够在编辑器中为你提供同行查看和预览。在 Confluence 数据库中心中,这个过程在 document conversion sandbox 中进行处理。 这个属性设置了时间数量(秒)sandbox 将会进行等待文档转换的开始,在终止这个进程之前。 |
document.conversion.sandbox.request.time.limit.secs | |||
6.10.0 | 30 | Data Center only | 当一个文档文件被插入到页面的时候,缩略图将会被自动创建并插入到页面,以便于你对内容进行编辑。同时能够在编辑器中为你提供同行查看和预览。在 Confluence 数据库中心中,这个过程在 document conversion sandbox 中进行处理。 这个属性设置了时间数量(秒)sandbox 将会等待文档被处理完成,在终止这个文档处理之前,如果在规定的时间内文档没有处理完成,那么将会把缩略图处理标记为失败。 |
sandbox.termination.tolerance | |||
6.10.0 | 5 | Data Center only | 这个属性限制了 document conversion sandbox 如何进行检查,如果请求时间被限制在指定的时间内执行(上面的 request.time.limit.secs 属性限制了时间)。这个将会通过将请求时间除以这个值进行计算。例如,如果请求时间被限制为 30 秒, tolerance 被设置为 5。sandbox 将会检查每次请求的时间是否超过了 6 秒钟。 |
document.conversion.sandbox.memory.limit.megabytes | |||
6.10.0 | 512 | Data Center only | 当一个文档文件被插入到页面的时候,缩略图将会被自动创建并插入到页面,以便于你对内容进行编辑。同时能够在编辑器中为你提供同行查看和预览。在 Confluence 数据库中心中,这个过程在 document conversion sandbox 中进行处理。 这个属性将会限制 sandbox 处理程序可以消耗的 heap 内存数量。 |
document.conversion.sandbox.log.level | |||
6.10.0 | INFO | Data Center only | 使用这个属性修改 document conversion sandbox 的日志级别为 WARNING,INFO,或者 FINE。如果你希望在 sandbox 中对问题进行诊断,这个设置能够为你提供更多信息。 |
sandbox.error.delay.millis | |||
6.10.0 | 50 | Data Center only | 针对诊断需求,这个属性设置多长时间(毫秒) document conversion sandbox 错误将会被获取。 |
document.conversion.sandbox.disable 6.10.0 false Data Center only 如果你不希望在 sandbox 中处理文档转换(创建缩略图)设置这个属性为 true。 当这个选项禁用了,文档的转换将会由 Confluence JVM 虚拟机进行处理,换句话说是由 Confluence 服务器进行处理的。 |
tomcat8w //ES// |
---|
-Xms1024m -Xmx1024m -Dsystemproperty=value 修改将会应用到新的节点中。 https://www.cwiki.us/display/CONF6ZH/Configuring+System+Properties 项目管理 2018-07-29 11:02:00 「深度学习福利」大神带你进阶工程师,立即查看>>> 在这个页面中描述 Confluence 启动时如何设置 Java 属性和其他选项。 请查看 How to fix out of memory errors by increasing available memory 页面中内容来获得如何处理 OutOfMemory 错误。 Linux 在 Linux 安装环境下配置系统属性: 编辑 (针对 Confluence 5.5 及其早期版本,这个参数是 JAVA_OPTS=) 请参考 Configuring System Properties 页面中的内容对属性参数进行配置。 添加所有的参数为空格分离列表,在引号内。 Windows (从 .bat 文件启动) 在 Windows 中当使用 .bat 文件启动的时候配置系统启动参数: 编辑 (在 Confluence 5.5 及其早期版本中,这个参数为 JAVA_OPTS=%JAVA_OPTS%) 请参考 Recognized System Properties 页面中的内容对属性参数进行配置。 所有添加的参数都使用的是空格分离列表。请确定不要修改 %CATALINA_OPTS% 字符。 https://www.cwiki.us/display/CONF6ZH/Configuring+System+Properties 项目管理 2018-07-29 10:55:01 「深度学习福利」大神带你进阶工程师,立即查看>>> 创建快捷链接 如何创建一个快捷键链接: 在屏幕的右上角单击 控制台按钮 ,然后选择 General Configuration 链接。 在左侧面板中选择 快捷链接(Shortcut Links) 。 为你的快捷链接输入一个 Key 。这个输入的快捷键链接名字将会被用来作为参考的 URL 地址。 输入 扩展的值(Expanded Value) 。这个是快捷链接使用的 URL 链接。你可以在链接中使用 '%s' 来在 URL 中指定用户输入的值的替代位置。如果你的 URL 没有 '%s' ,那么用户输入的值将会自动添加到 URL 的末尾。 输入一个 默认别名(Default Alias) 。这个将会在页面使用快捷链接的地方进行显示,用户输入的内容将会用 '%s' 取代。 选择 提交(Submit) 。 使用快捷链接 在高级( Advanced )标签页中插入链接对话框。请参考 Links 页面中的内容获得更多信息。 指定应该在快捷 URL 中显示的链接,你可以使用 (@)标记来指定快捷链接使用的 key。快捷链接的名字是大小写敏感的。所以例如使用上面列表中的 Key 的名字: 一个问题(a issue) 一个 Google 搜索(a Google search) | CONF-1000 @JIRA Atlassian Confluence @Google | http://jira.atlassian.com/secure/QuickSearch.jspa?searchString=CONF-1000 http://www.google.com/search?q=Atlassian+Confluence | CONF-1000 Atlassian Confluence@Google | 删除快捷链接 删除在 快捷键(Shortcut Links) 列表标签页中快捷键列表的内容。你需要在 Confluence 的控制台中进行操作。单击快捷链接边上 删除(Remove) 就可以了。 https://www.cwiki.us/display/CONF6ZH/Configuring+Shortcut+Links 项目管理 2018-07-29 10:55:00 「深度学习福利」大神带你进阶工程师,立即查看>>> 翻书问题或者走台阶问题: 共有n个台阶,每次只能上1个台阶或者2个台阶,共有多少种方法爬完台阶。 共有n页书,每次只能翻1页或者2页书,共有多少种方法翻完全书。 # f(n)为翻完全书的方法 # 递归写法 def f(n): if n == 1: return 1 if n == 2: return 2 if n > 2: return f(n - 1) + f(n - 2) # 迭代写法,或者叫循环写法 def f(n): res = [0 for i in range(n + 1)] res[1] = 1 res[2] = 2 for i in range(3, n+1): res[i] = res[i - 1] + res[i - 2] return res[n] # 使用缓存 cache = {} def fib(n): if n not in cache.keys(): cache[n] = _fib(n) return cache[n] def _fib(n): if n == 1 or n == 2: return n else: return fib(n-1) + fib(n-2) 二分查找 def LinearSearch(array, t): for i in range(len(array)): if array[i] == t: return True return False def BinarySearch(array, t): left = 0 right = len(array) - 1 while left <= right: mid = int((left + right) / 2) if array[mid] < t: left = mid + 1 elif array[mid] > t: right = mid - 1 else: return True return False array = list(range(100000000)) import time t1 = time.time() LinearSearch(array, 100000001) t2 = time.time() print('线性查找:', t2 - t1) t3 = time.time() BinarySearch(array, 100000001) t4 = time.time() print('二分查找:', t4 - t3) 二分查找例题(变种) 题意 [ [1, 3, 5, 7], [10, 11, 16, 20], [23, 30, 34, 50] ] 查找比如16在不在矩阵中。 解法 class Solution: # @param matrix, a list of lists of integers # @param target, an integer # @return a boolean def searchMatrix(self, matrix, target): i = 0 j = len(matrix[0]) - 1 while i < len(matrix) and j >= 0: if matrix[i][j] == target: return True elif matrix[i][j] > target: j -= 1 else: i += 1 return False 链表 链表中最简单的一种是单向链表,它包含两个域,一个信息域和一个指针域。这个链接指向列表中的下一个节点,而最后一个节点则指向一个空值。 python代码 # 链表中的节点的数据结构 class ListNode(object): def __init__(self, x): self.val = x self.next = None # 实例化 A = ListNode('a') B = ListNode('b') C = ListNode('c') A.next = B B.next = C # 这样,一条链表就形成了。 # 'a' -> 'b' -> 'c' # 遍历链表 tmp = A while tmp != None: print(tmp.val) tmp = tmp.next # 递归遍历链表 def listorder(head): if head: print(head.val) listorder(head.next) listorder(A) 例题 翻转一条单向链表。 例子: Input: 1->2->3->4->5->NULL Output: 5->4->3->2->1->NULL 解答: # Definition for singly-linked list. class ListNode(object): def __init__(self, x): self.val = x self.next = None class Solution(object): def reverseList(self, head): """ :type head: ListNode :rtype: ListNode """ dummy = head tmp = dummy while head and head.next != None: dummy = head.next head.next = dummy.next dummy.next = tmp tmp = dummy return dummy head = ListNode(1) head.next = ListNode(2) head.next.next = ListNode(3) head.next.next.next = ListNode(4) head.next.next.next.next = ListNode(5) solution = Solution() reverse_head = solution.reverseList(head) tmp = reverse_head while tmp: print(tmp.val) tmp = tmp.next 二叉树 python代码 class TreeNode(object): def __init__(self, x): self.val = x self.left = None self.right = None root = TreeNode(1) root.left = TreeNode(2) root.right = TreeNode(3) ''' 1 / \ 2 3 ''' # root就是一颗二叉树 中序遍历(先遍历左子树,再遍历根节点,再遍历右子树) # class TreeNode: # def __init__(self, x): # self.val = x # self.left = None # self.right = None def inorder(root): if root: inorder(root.left) print(root.val) inorder(root.right) 前序遍历(先遍历根节点,再遍历左子树,再遍历右子树) class TreeNode: def __init__(self, x): self.val = x self.left = None self.right = None def preorder(root): if root: print(root.val) preorder(root.left) preorder(root.right) root = TreeNode(1) root.left = TreeNode(2) root.right = TreeNode(3) preorder(root) 后序遍历(先遍历左子树,再遍历右子树,再遍历根节点) # class TreeNode: # def __init__(self, x): # self.val = x # self.left = None # self.right = None def postorder(root): if root: postorder(root.left) postorder(root.right) print(root.val) 测试程序 class TreeNode: def __init__(self, x): self.val = x self.left = None self.right = None def preorder(root): if root: print(root.val) preorder(root.left) preorder(root.right) def inorder(root): if root: inorder(root.left) print(root.val) inorder(root.right) def postorder(root): if root: postorder(root.left) postorder(root.right) print(root.val) root = TreeNode(1) root.left = TreeNode(2) root.right = TreeNode(3) root.left.left = TreeNode(4) root.left.right = TreeNode(5) root.right.left = TreeNode(6) root.right.right = TreeNode(7) preorder(root) inorder(root) postorder(root) 已知一颗二叉树的先序遍历序列为ABCDEFG,中序遍历为CDBAEGF,能否唯一确定一颗二叉树?如果可以,请画出这颗二叉树。 A / \ B E / \ C F \ / D G 先序遍历: ABCDEFG 中序遍历: CDBAEGF 后序遍历: DCBGFEA 使用程序根据二叉树的先序遍历和中序遍历来恢复二叉树。 class TreeNode: def __init__(self, x): self.val = x self.left = None self.right = None def buildTree(preorder, inorder): if len(preorder) == 0: return None if len(preorder) == 1: return TreeNode(preorder[0]) root = TreeNode(preorder[0]) index = inorder.index(root.val) root.left = buildTree(preorder[1 : index + 1], inorder[0 : index]) root.right = buildTree(preorder[index + 1 : len(preorder)], inorder[index + 1 : len(inorder)]) return root preorder_string = 'ABCDEFG' inorder_string = 'CDBAEGF' r = buildTree(preorder_string, inorder_string) preorder(r) inorder(r) postorder(r) 栈和队列 栈 python实现 class Stack(object): def __init__(self): self.stack = [] def pop(self): if self.is_empty(): return None else: return self.stack.pop() def push(self,val): return self.stack.append(val) def peak(self): if self.is_empty(): return None else: return self.stack[-1] def size(self): return len(self.stack) def is_empty(self): return self.size() == 0 s = Stack() s.push(1) s.peak() s.is_empty() s.pop() 队列 python实现 class Queue(object): def __init__(self): self.queue = [] def enqueue(self,val): self.queue.insert(0,val) def dequeue(self): if self.is_empty(): return None else: return self.queue.pop() def size(self): return len(self.queue) def is_empty(self): return self.size() == 0 q = Queue() q.enqueue(1) q.is_empty() q.dequeue() 使用队列模拟栈。 class StackByQueue(object): def __init__(self): self.stack = Queue() def push(self, val): self.stack.enqueue(val) def pop(self): for i in range(self.stack.size() - 1): value = self.stack.dequeue() self.stack.enqueue(value) return self.stack.dequeue() 使用栈模拟队列 class QueueByStack(object): def __init__(self): self.queue1 = Stack() self.queue2 = Stack() def enqueue(self, val): self.queue1.push(val) def dequeue(self): for i in range(self.queue1.size() - 1): value = self.queue1.pop() self.queue2.push(value) res = self.queue1.pop() for i in range(self.queue2.size()): value = self.queue2.pop() self.queue1.push(value) return res 插入排序 def insertSort(A): for j in range(1, len(A)): key = A[j] i = j - 1 while i >= 0 and A[i] > key: A[i + 1] = A[i] i = i - 1 A[i + 1] = key return A A = [5, 2, 4, 6, 1, 3] print(insertSort(A)) function insertSort(A) { for (j = 1; j < A.length; j++) { var key = A[j]; var i = j - 1; while (i >= 0 && A[i] > key) { A[i + 1] = A[i]; i = i - 1; } A[i + 1] = key; } return A; } var A = [5, 2, 4, 6, 1, 3]; console.log(insertSort(A)); 快速排序 def partition(A, p, r): x = A[r] i = p - 1 for j in range(p, r): if A[j] <= x: i = i + 1 A[i], A[j] = A[j], A[i] A[i + 1], A[r] = A[r], A[i + 1] return i + 1 def quickSort(A, p, r): if p < r: q = partition(A, p, r) quickSort(A, p, q - 1) quickSort(A, q + 1, r) A = [2, 8, 7, 1, 3, 5, 6, 4] quickSort(A, 0, 7) print(A) 时间复杂度 假设快速排序的时间复杂度为f(N) f(N) = 2 * f(N / 2) + O(N) f(N) = 2 * (2 * f(N / 4) + O(N/2)) + O(N) ... f(1) = O(1) 所以f(N) = O(NlogN) 在数组元素数量为n的数组里面寻找第k大的数 def partition(A, p, r): x = A[r] i = p - 1 for j in range(p, r): if A[j] >= x: i = i + 1 A[i], A[j] = A[j], A[i] A[i + 1], A[r] = A[r], A[i + 1] return i + 1 def findKthLargest(A, p, r, k): if p <= r: q = partition(A, p, r) if k - 1 == q: return A[q] elif k - 1 < q: return findKthLargest(A, p, q - 1, k) else: return findKthLargest(A, q + 1, r, k) A = [2, 8, 7, 1, 3, 5, 6, 4] ret = findKthLargest(A, 0, 7, 8) print('ret: ', ret) 项目管理 2018-07-30 20:08:05 「深度学习福利」大神带你进阶工程师,立即查看>>> 1. Dubbo是什么? Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。简单的说,dubbo就是个服务框架,如果没有分布式的需求,其实是不需要用的,只有在分布式的时候,才有dubbo这样的分布式服务框架的需求,并且本质上是个服务调用,说白了就是个远程服务调用的分布式框架(告别Web Service模式中的WSDL,以服务者与消费者的方式在dubbo上注册)。 其核心部分包含: 1. 远程通讯: 提供对多种基于长连接的NIO框架抽象封装,包括多种线程模型,序列化,以及“请求-响应”模式的信息交换方式。 2. 集群容错: 提供基于接口方法的透明远程过程调用,包括多协议支持,以及软负载均衡,失败容错,地址路由,动态配置等集群支持。 3. 自动发现: 基于注册中心目录服务,使服务消费方能动态的查找服务提供方,使地址透明,使服务提供方可以平滑增加或减少机器。 2. dubbo能做什么? 1.透明化的远程方法调用,就像调用本地方法一样调用远程方法,只需简单配置,没有任何API侵入。 2.软负载均衡及容错机制,可在内网替代F5等硬件负载均衡器,降低成本,减少单点。 3. 服务自动注册与发现,不再需要写死服务提供方地址,注册中心基于接口名查询服务提供者的IP地址,并且能够平滑添加或删除服务提供者。 Dubbo采用全Spring配置方式,透明化接入应用,对应用没有任何API侵入,只需用Spring加载Dubbo的配置即可,Dubbo基于Spring的Schema扩展进行加载。 3. dubbo的架构 dubbo架构图如下: 1. Dubbo是什么? Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。简单的说,dubbo就是个服务框架,如果没有分布式的需求,其实是不需要用的,只有在分布式的时候,才有dubbo这样的分布式服务框架的需求,并且本质上是个服务调用,说白了就是个远程服务调用的分布式框架(告别Web Service模式中的WSDL,以服务者与消费者的方式在dubbo上注册)。 其核心部分包含: 1. 远程通讯: 提供对多种基于长连接的NIO框架抽象封装,包括多种线程模型,序列化,以及“请求-响应”模式的信息交换方式。 2. 集群容错: 提供基于接口方法的透明远程过程调用,包括多协议支持,以及软负载均衡,失败容错,地址路由,动态配置等集群支持。 3. 自动发现: 基于注册中心目录服务,使服务消费方能动态的查找服务提供方,使地址透明,使服务提供方可以平滑增加或减少机器。 2. dubbo能做什么? 1.透明化的远程方法调用,就像调用本地方法一样调用远程方法,只需简单配置,没有任何API侵入。 2.软负载均衡及容错机制,可在内网替代F5等硬件负载均衡器,降低成本,减少单点。 3. 服务自动注册与发现,不再需要写死服务提供方地址,注册中心基于接口名查询服务提供者的IP地址,并且能够平滑添加或删除服务提供者。 Dubbo采用全Spring配置方式,透明化接入应用,对应用没有任何API侵入,只需用Spring加载Dubbo的配置即可,Dubbo基于Spring的Schema扩展进行加载。 3. dubbo的架构 dubbo架构图如下: 节点角色说明: Provider: 暴露服务的服务提供方。 Consumer: 调用远程服务的服务消费方。 Registry: 服务注册与发现的注册中心。 Monitor: 统计服务的调用次调和调用时间的监控中心。 Container: 服务运行容器。 调用关系说明: 0 服务容器负责启动,加载,运行服务提供者。 1. 服务提供者在启动时,向注册中心注册自己提供的服务。 2. 服务消费者在启动时,向注册中心订阅自己所需的服务。 3. 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。 4. 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。 5. 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。 dubbo的容错性显而易见,性能方面还没有还得及测,我们系统某页面需要掉5次接口,本来想建议做个缓存,但业务关系不能采纳,还需要研究下dubbo的性能调优问题 4. dubbo使用方法 Dubbo采用全Spring配置方式,透明化接入应用,对应用没有任何API侵入,只需用Spring加载Dubbo的配置即可,Dubbo基于Spring的Schema扩展进行加载。如果不想使用Spring配置,而希望通过API的方式进行调用(不推荐),后面的章节中我们会逐步剖析dubbo的使用! 项目管理 2018-07-30 10:37:00 「深度学习福利」大神带你进阶工程师,立即查看>>> 快捷链接提供了提供了一个在 Confluence 中访问从常用资源的快速方法。当你创建一个快捷链接的时候,你需要为你的快捷链接 URL 指派一个 Key,用户可以在 Confluence 中只输入这个 Key 用来替代快捷链接的完整 URL。 示例:为 Google 创建一个快捷链接 绝大部分的 Google 搜索 URL 如下所示: http://www.google.com/search?q= 。如果你希望创建一个快捷链接被用来在 Google 搜索关键字的话,每次你需要使用 http://www.google.com/search?q= searchterms ,你可以在 Confluence 中输入 [ searchterms @google ] 来替代 Google 的搜索链接。 下面是当前 Confluence( http://confluence.atlassian.com ) 网站中定义的一些快捷链接。 快捷链接可以由 Confluence 管理员通过 Confluence 管理控制台(Administration Console) 进行维护和添加。 https://www.cwiki.us/display/CONF6ZH/Configuring+Shortcut+Links 项目管理 2018-07-29 10:54:00 「深度学习福利」大神带你进阶工程师,立即查看>>> 连接的建立与终止 通过如下命令让主机svr4与bsdi发起并终止连接 下面为tcpdump输出的TCP报文段部分 每行格式为 源>目的:标志 上图中的标志的解释 第1行,1415531521:1415531521(0)表示分组的开始序号为1415531521,结束序号也为1415531521,数据字节数为0。这是连接同步请求,没有任何数据交换 第2行,ack 1415531522代表确认序号,这个值只有在ACK标志位为1时才显示 win 4096表示发送端通告的窗口大小 < mss 1024 >表示发送端指明的最大报文长度,发端不接收超过该长度的报文段 建立连接协议 三次握手: 客户端发送一个SYN段作为连接请求,初始化序号为1415531521 服务端响应一个SYN段,初始化序号为1823083521。同时发送确认报文,确认序号为 1415531521+1=1415531522 。一个SYN占用一个序号 客户端响应确认报文,确认序号为 1823083521+1=1823083522 终止连接协议 一个TCP连接是全双工,数据在两个方向传递,因此如果要关闭TCP连接,必须单独关闭两个方向的连接 四次握手: 客户端发送FIN,请求关闭连接 服务端收到FIN后,响应ACK 服务端发送FIN,请求关闭连接 客户端收到FIN后,响应ACK 之所以比连接多一次握手,是因为TCP支持半关闭,允许一边关闭连接后另一边仍能发送数据,所以无法合并报文5和报文6,两者之间仍然可能存在单向数据传输的报文。所以一旦使用了半关闭,这四次握手就会分成两个阶段执行 建立连接超时 其中第1、2次请求间隔5.8秒,第2、3次请求间隔24秒,其中tos 0x10代表telnet将IP数据报服务类型字段设为最小时延 上面显示的总耗时76秒,是因为在大多数实现中,新建连接的时间最长为75秒 BSD TCP采用500ms定时器,在初始化设置时,第一个500ms内会在任意时刻滴答一下,导致第一个间隔不是6秒而是5.8秒,但第二个间隔却是准确的24秒 最大报文段长度 MSS,表示TCP传往另一端最大数据块的长度。当建立TCP连接时,双方都要通告各自的MSS。如当A告知B MSS为1460时,表示B可以发给A的最大数据块长度就是1460 通常以太网将MSS设为MTU大小减去IP首部和TCP首部长度,即 1500-20-20=1460 TCP的半关闭 TCP提供了发送端在结束发送后,依然可以接收数据的能力,这就是半关闭 在应用程序调用shutdown,并且第二个参数为1时,会使用半关闭。普通的close不会有半关闭。所以很少应用程序会使用到半关闭 为什么要有半关闭? 场景:当发送远程命令到目的主机执行时,命令发送完后,client就能结束数据发送,但仍然接收目的主机发回的执行结果,这就是半关闭状态,当目的主机发完数据时,结束数据发送,完成连接关闭。没有半关闭,目的主机无法知道client数据什么时候发完,也就无法执行命令并响应结果 TCP状态变迁图 其中SYN收到就是SYN_RCVD 通过上面两个图可以观察到 client从CLOSED到ESTABLISHED所需要发送和接收的报文 server从LISTEN到ESTABLISHED所需要发送和接收的报文 ESTABLISHED状态才能进行数据传输 client从ESTABLISHED到CLOSED所需要发送和接收的报文 server从ESTABLISHED到CLOSED再到LISTEN所需要发送和接收的报文 并不存在CLOSED这个状态,它是一个假象的状态起点和终点,所以server从CLOSED过度到LISTEN不需要特殊处理 TIME_WAIT状态 又称2MSL等待状态,即2倍的报文段最大生存周期 当TCP主动关闭一方发送最后一个ACK时,会进入TIME_WAIT状态,等待2MSL时间才能彻底关闭连接 为什么需要等待2MSL呢? 防止最后一个ACK丢失。如果真丢失,被动关闭一方会重发FIN( 2MSL=MSL(丢失的ACK)+MSL(重发的FIN) ) 在2MSL期间不能复用连接(源IP、目的IP、源端口、目的端口的四元祖),避免原始连接中迷途的数据跑到新连接中 大部分TCP实现较为严格,在TIME_WAIT期间,无法复用端口 如果客户端主动关闭连接,进入TIME_WAIT,由于客户端是随机端口,无法复用原来端口可以很容易做到 如果服务端主动关闭连接,进入TIME_WAIT,由于服务端是知名端口,无法复用原来端口会导致重启服务耗时至少为2MSL。很多实现提供SO_REUSEADDR来绕过这个限制,保证服务端可以复用TIME_WAIT期间的端口 FIN_WAIT_2状态 当主动关闭一方发送FIN,并收到ACK后,会进入FIN_WAIT_2状态,直到被动关闭一方发送FIN,主动方才会响应ACK并进入TIME_WAIT状态 所以,如果被动关闭一方不关闭连接,会导致主动关闭一方永远处于FIN_WAIT_2状态,而被动关闭一方永远处于CLOSE_WAIT状态 复位报文段 当报文段发往一个socket时出现错误,TCP就会发出一个复位报文段。通常有以下三种场景: 到不存在的端口发起连接请求。当发送到目的端,发现端口不存在,UDP会响应一个ICMP端口不可达差错,TCP会响应复位报文段 异常终止一个连接。通过FIN正常关闭,但是需要处理排队的数据;复位报文段异常关闭,可以立即丢弃排队的数据 检测半打开连接。当一边异常关闭连接而另一边不知道,这种是半打开连接。如server异常断电重启,client不知server的状况,继续发送报文,server收到后立马响应一个复位报文段 TCP选项 如图显示了三个选项: 最大报文段长度 窗口扩大因子 时间戳 实际为了保证选项总长度是4字节的倍数,需要在其中填充无操作NOP选项 TCP服务器的设计 当服务端监听连接时,会处于LISTEN状态 当客户端请求到来时,会启动一个线程/进程去接收客户端连接请求 当客户端服务端连接建立时,处于ESTABLISHED状态 服务器可以限定本地监听的IP地址和远端请求的IP地址 连接队列 当服务器忙于处理客户端请求时,多的请求在连接建立后会放入连接队列。连接队列有以下规则: 监听连接请求的一端会有固定长度的连接队列,该队列存储已建立连接(完成了三次握手)的请求,稍后应用程序会从该队列中移除请求并处理 积压值(backlog)是这个队列的最大长度 当该队列已满,TCP不会将理会后续的连接请求(SYN),并且不会回复RST。RST代表这个请求是硬错误,不能重试。而不理会会让客户端请求超时,发现是一个软错误,会进行重试 项目管理 2018-07-28 15:18:00 「深度学习福利」大神带你进阶工程师,立即查看>>> def ShieldAlert(IsRet):#屏蔽这两种提示框 参数为你想让他自动返回的 self.Eval("window.alert = function(s) {return [0]};".replace('[0]','false' if IsRet==0 else 'true')) self.Eval("window.confirm = function(s) {return [0]};".replace('[0]','false' if IsRet==0 else 'true')) return 1 其中原理就是 js的简单hook 相当于临时重写此函数 在自动化操作的时候会弹出提示框,如果是代码触发的 就在操作前一句ShieldAlert调用此函数 以保证此函数不失效并且保证测试js正常运行。 注意,此情况分为两种,一种是网页自己触发的jsalert 无论什么弹窗 只要是网页自己触发的,比如加载网页触发,就不需要此函数,要使用 chrome_IsDialog(self):#获取是否有对话框 chrome_JsDialog(self,IsBool,EoText):#操作对话框,IsBool确定|关闭 EoText文本 这两个处理网页自己触发的阻塞弹窗 如果是代码触发,他就会阻塞代码 就达不到自动化的情况,就在触发弹窗之前调用 ShieldAlert hook弹窗保证代码正常运行并且功能正常实现 项目管理 2018-07-27 22:30:00 「深度学习福利」大神带你进阶工程师,立即查看>>> DevOps (Development和Operations的组合词)是一组过程、方法与系统的统称,用于促进开发(应用程序/软件工程)、技术运营和质量保障(QA)部门之间的沟通、协作与整合。 它是一种重视“软件开发人员(Dev)”和“IT运维技术人员(Ops)”之间沟通合作的文化、运动或惯例。透过自动化“软件交付”和“架构变更”的流程,来使得构建、测试、发布软件能够更加地快捷、频繁和可靠。 技术革新 在以前的系统中业务单一、逻辑简单、用户量少,项目团队的规模一般在 10~30人。而现在的系统要面对不同用户的定制化推荐等,互联网连接着人与人、人与物、以及物与物,业务也变得越来越复杂,功能越来越多,如果整个系统耦合在一起,则必定会牵一发而动全身,导致系统维护起来相当困难。 因此IT技术架构也随着系统的复杂化而不断地变化革新,从早期所有服务的All In One发展到现在的微服务架构、从纯手动操作到全自动化流程、从单台物理机到云平台,下图展示了IT技术革新的变化: 现在DevOps已经成为发展的趋势了,那它又是怎么实现落地的呢? 如何实现DevOps的落地 知之真切笃实处即是行,行之明觉精察处即是知 —— 明•王守仁《传习录》 在些我引用了圣贤王阳明的一句名言,他提倡“知行合一”,通俗的讲就是做事情要理论与实践相结合。我们在实现DevOps落地时也一定要遵循“理论与实践相结合”的方式进行,理论就是我们做事的指导思想,而实践就是具体做事的方法,接下来我就从我在公司中是如何按照理论与实践相结合来推动DevOps落实地。 落实DevOps的指导思想 首先我们还是要回到什么是DevOps,如果大家忘记了可以回到之前再温故一下,包括我总结的DevOps公式。 其实DevOps核心思想就是:“快速交付价值,灵活响应变化”。其基本原则如下: 高效的协作和沟通; 自动化流程和工具; 快速敏捷的开发; 持续交付和部署; 不断学习和创新。 然而这些基本原则又是如何与项目研发息息相关的呢,也就是它们在我们的开发过程中的各个环节是如何体现的?请看下面一张来自《success with enterprise dev-ops - whitepaper》的介绍图: 敏捷管理:一支训练有素的敏捷开发团队是成功实施DevOps的关键。 根据 康威定律:软件团队开发的产品是对公司组织架构的反映 。 所以根据公司情况调整组织结构是首要条件,它将直接影响到需求、设计和开发阶段的效率、以及沟通的成本。 关于团队的沟通成本在《人月神话》中有个很好的计算公式:沟通成本 = n(n-1)/2,其中n为人数,所以沟通成本将随着组织人员的增加而呈指数级增长。而小而快的敏捷团队如何划分,我将在后面“DevOps的具体实施方法”一节中详细介绍。 持续交付部署:实现应用程序的自动化构建、部署、测试和发布。 通过技术工具,把传统的手工操作转变为自动化流程,这不仅有利于提高产品开发、运维部署的效率,还将减少人为因素引起的失误和事故,提早发现问题并及时地解决问题,这样也保证了产品的质量。下图展示了DevOps自动化的流程: 此图来自我的新书《分布式服务架构:原理、设计与实战》,书中也有具体介绍持续交付部署的细节内容。 IT服务管理:可持续的、高可用的IT服务是保障业务正常的关键要素,它与业务是一个整体。 IT服务管理(ITSM)直接影响产品运营的整个生命周期,传统的IT服务管理(像ITIL)在生产中做的非常好了,但是它对于DevOps来说又显得过于繁琐,所以有必要为DevOps创建一个只关注业务持续性的ITMS,它只需要很少的必要资源来为相应的业务提供服务,ITMS更多地从业务角度考虑了。 注:白话解释下什么是IT服务管理(ITSM),它是传统的“IT管理”转向为“IT服务”为主的一种模式,前者可能更关注具体服务器管理、网络管理和系统软件安装部署等工作;而后者更关注流程的规范化、标准化,明确定义各个流程的目标和范围、成本和效益、运营步骤、关键成功因素和绩效指标、有关人员的责权利,以及各个流程之间的关系等,比如建立线上事故解决流程、服务配置管理流程等; 而光有流程还不够,因为流程主要是IT服务提供方内部使用的,客户对他们并不感兴趣,所以还需将这些流程按需打包成特定的IT服务,然后提供给客户使用,比如在云平台上购买一台虚拟云主机一样。 精益管理:建立一个流水线式的IT服务链,打通开发与运维的鸿沟,实现开发运维一体化的敏捷模式。 精益生产主要来源于丰田生产方式 (TPS)的生产哲学,它以降低浪费、提升整体客户价值而闻名,它主要利用优化自动化流程来提高生产率、降低浪费。所以精益生产的精髓是即时制(JIT)和自动化(Jidoka)。 JIT(Just In time):JIT用一句话描述就是消耗最少的必要资源,以正确的数量,生产和运送正确的零件。在这种模式下工作,可以最大程度上降低库存,防止过早或者过度生产。大多数公司更倾向用库存来避免潜在的停线风险,而丰田却反其道而行之。通过减少库存“逼迫”对生产中产生的问题做及时且有效的反应。当然JIT这一模式对解决问题的能力是相当大的考验,在能力不足的情况下,会有相当大的断线风险。 Jidoka(Build in quality):自动化,日语表示为“自働化”,字面含义是自动化,日语里表示为“自動化”,而在丰田TPS系统里,特意给“動”字加上了“人”字旁变成了“働”,换句话说,TPS/精益生产渴望生产的过程控制能像“人”一样智能,在第一时间就异常情况下自动关闭。这种自动停机功能可以防止坏件流入下游,防止机器在错误的生产状态下造成损坏,也可以让人更好的在当前错误状态下进行故障分析。当设备能够做到自动分析故障时,就可以将监管机器的“人”真正解放出来,做到对人力成本的节省。 ——来自知乎 下图展示了丰田TPS(Toyota Production System)手册中的精益小屋: 而精益软件开发是精益生产和实践在软件开发领域的应用,总结为如下七条原则: 消除浪费 增强学习 尽量延迟决定 尽快发布 下放权力 嵌入质量 全局优化 精益管理贯穿于整个DevOps阶段,它鼓励主动发现问题,不断的优化流程,从而达到持续交付、快速反馈、降低风险和保障质量的目的。接下来让我们看看DevOps具体的实现方法。 实施DevOps的具体方法 建立快速敏捷团队 根据之前介绍的康威定律,我们可以看下目前公司中的项目团队结构是怎么的,如下图所示: 我相信这不仅仅是我们公司这样的结构,而是目前大多数IT互联网公司普遍的分层结构吧,它们一般分为七大部门:产品策划、设计美术、前端工程师、后端工程师、测试工程师、运维&DBA和市场运营等。各部门之间天然的形成了沟通障碍墙,相互之间主要以邮件和会议的形式沟通,效率低下、需求变更困难、很难快速响应市场变化和持续交付高品质的产品。 那么如何调整组织结构,建立一个Scrum团队呢?(什么是Scrum请参考维基百科) 我们会按照业务功能划分团队,建立沟通群组,设置产品负责人(一个策划人员)、Scrum Master(我们一般选择测试人员担任,测试驱动开发模式)和开发者团队(前端工程师、后端工程师、测试各一名),最后的组织结构和系统架构如下图所示: 一个高效的敏捷团队是DevOps能落地的保障,那么自动化流程就是保证产品快速交付和持续部署的有效机制,接下来为大家介绍我们是如何实现自动化流程的? 实现自动化的流程 直接看图说话吧,以下为一个完整DevOps的Pipeline: 提交:工程师将代码在本地测试后,提交到版本控制系统,如 Git代码仓库中。 构建:持续整合系统(如Jenkins CI),在检测到版本控制系统更新时,便自动从Git代码仓库里拉取最新的代码,进行编译、构建。 单元测试:Jenkins完成编译构建后,会自动执行指定的单元测试代码。 部署到测试环境:在完成单元测试后,Jenkins可以将应用程序部署到与生产环境相近的测试环境中进行测试。 预生产环境测试:在预生产测试环境里,可以进行一些最后的自动化测试,例如使用Appium自动化测试工具进行测试,以及与实际情况类似的一些测试可由开发人员或客户人员手动进行测试。 部署到生产环境:通过所有测试后,便可以使用灰度更新将最新的版本部署到实际生产环境里。 而实现DevOps自动化流水线所需要哪些技术,它们又是如何配合使用的?带着这些问题,我将在DevOps的技术栈一节中详细为大家介绍。接下来让我们看看DevOps在游戏项目中实施所遇到的问题吧。 技术栈 本节内容如果展开的话涉及太多,我将概略地为大家介绍下目前常见的一些开源DevOps技术工具,大家可以根据自己的需求选择使用,当然也可以使用像VSTS(Visual Studio Team Services)这样的集成团队环境。 其中有些内容在我的新书中有详细介绍,如代码仓库管理、虚拟机与容器化、持续集成&持续部署工具Jenkins、配置管理工具SaltStack。 敏捷管理工具 Trello Teambition Worktile Tower 以上工具使用大同小异,选择一款适合自己团队的就好。我们公司主要使用的是Teambition,截张效果图如下: 产品&质量管理 confluence 禅道 Jira Bugzila 其中confluence和禅道主要是产品的需求、定义、依赖和推广等的全面管理工具;而Jira和Bugzilla是产品的质量管理和监控能力,包括测试用例、缺陷跟踪和质量监控等。目前我们使用Jira较多。 代码仓库管理 Git Gitlab Github Git是一个开源的分布式版本控制系统;Gitlab和Github是用于仓库管理系统的开源项目,它们使用Git作为代码管理工具,并在此基础上搭建起来的web服务。我们主要使用的是Git和Gitlab。 开发流程规范 Git Flow Git Flow是构建在Git之上的一个组织软件开发活动的模型,是在Git之上构建的一项软件开发最佳实践。Git Flow是一套使用Git进行源代码管理时的一套行为规范和简化部分Git操作的工具。Git Flow模型如下图: Github Flow Github Flow是Git Flow的一个更简单的替换方案,它只有一个feature分支和一个master分支,简单而干净。Github Flow模型如下图: Gitlab Flow GitHub Flow认为你可以通过合并feature分支直接把代码部署到线上。Gitlab Flow模型如下图: 自动化构建脚本 Gradle Maven SBT ANT 我目前主要使用Gradle和Maven,而Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化构建工具。它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,抛弃了基于XML的各种繁琐配置。面向Java应用为主。当前其支持的语言限于Java、Groovy、Kotlin和Scala。 虚拟机与容器化 VMware VirtualBox Vagrant Docker VMware和VirtualBox是最常用的虚拟机,支持非常多的平台,而Vagrant是构建在虚拟化技术之上的虚拟机运行环境管理工具。通过Vagrant可以方便实现的对虚拟机的管理,包括建立和删除虚拟机、配置虚拟机运行参数、管理虚拟机运行状态、自动化配置和安装开发环境必须的各类软件、打包和分发虚拟机运行环境等。 Docker是一个开源的应用容器引擎,它让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。 持续集成(CI)&持续部署(CD) Jenkins Hudson Travis CI CircleCI Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能,它的前身为Hudson。 Travis CI 是目前新兴的开源持续集成构建项目,它与jenkins很明显的区别在于采用yaml格式,简洁清新独树一帜。 CircleCI是一个为web应用开发者提供服务的持续集成平台,主要为开发团队提供测试,持续集成,以及代码部署等服务。 自动化测试 Appium Appium是一个移动端的自动化框架,可用于测试原生应用,移动网页应用和混合型应用,且是跨平台的。可用于IOS和Android以及firefox的操作系统。 Selenium Selenium 测试直接在浏览器中运行,就像真实用户所做的一样。Selenium 测试可以在 Windows、Linux 和 Macintosh上的 Internet Explorer、Mozilla 和 Firefox 中运行。 Mock测试 Mock测试就是在测试过程中,对于某些不容易构造或者不容易获取的对象,用一个虚拟的对象来创建以便测试的测试方法。这个虚拟的对象就是Mock对象,Mock对象就是真实对象在调试期间的代替品。Java中的Mock框架常用的有EasyMock和Mockito等。 消费者驱动契约测试 契约测试是一种针对外部服务的接口进行的测试,它能够验证服务是否满足消费方期待的契约。当一些消费方通过接口使用某个组件的提供的行为时,它们之间就产生了契约。这个契约包含了对输入和输出的数据结构的期望,性能以及并发性。而PACT是目前比较流的消费者驱动契约测试框架。 自动化运维工具 Ansible Puppet Chef IT运维自动化是指将IT运维中日常的、大量的重复性工作自动化,把过去的手工执行转为自动化操作。自动化是IT运维工作的升华,IT运维自动化不单纯是一个维护过程,更是一个管理的提升过程,是IT运维的最高层次,也是未来的发展趋势。下图为常用自动化运维工具对比: 监控管理工具 Zabbix Zabbix是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级开源解决方案。 ELK Stack日志分析系统 ELK Stack是开源日志处理平台解决方案,背后的商业公司是Elastic。它由日志采集解析工具 Logstash、基于 Lucene 的全文搜索引擎 Elasticsearch、分析可视化平台 Kibana三部分组成。 云监控(如Amazon CloudWatch) Amazon CloudWatch 是一项针对 AWS 云资源和在 AWS 上运行的应用程序进行监控的服务。您可以使用 Amazon CloudWatch 收集和跟踪各项指标、收集和监控日志文件、设置警报以及自动应对 AWS 资源的更改 备注: 根据自身系统实地的情况,文章做了相关调整. Ref: https://www.cnblogs.com/beef/p/7743594.html 项目管理 2018-07-27 16:54:00 「深度学习福利」大神带你进阶工程师,立即查看>>> 报错信息: An internal error occurred during: "reload maven project". java.lang.NullPointerExceptio 解决方法: 找到workspace文件夹下的/.metadata文件夹,将其删除掉,然后再将项目重新导入进去eclipse中。但是这个有一点不好的地方,之前对eclipse所做的配置也会恢复为默认配置。 在.metadata下搜索workbench.xmi文件,用记事本打开,ctrl+F搜索找到包含 项目管理 2018-07-27 10:50:00 「深度学习福利」大神带你进阶工程师,立即查看>>> 找到workspace文件夹下的/.metadata文件夹,将其删除掉,然后再将项目重新导入进去eclipse中。但是这个有一点不好的地方,之前对eclipse所做的配置也会恢复为默认配置。 在.metadata下搜索workbench.xmi文件,用记事本打开,ctrl+F搜索找到包含 项目管理 2018-07-27 10:49:00 「深度学习福利」大神带你进阶工程师,立即查看>>> 编辑文件 $MAVEN_HOME/conf/settings.xml 。添加如下内容: 项目管理 2018-07-27 10:41:00 「深度学习福利」大神带你进阶工程师,立即查看>>> 优缺点 优点: 一些开发商开始采用并推广这个框架 作为开源项目,有很多先进的实现思想 对大型的应用支持的较好 有集中的网页导航定义 缺点: 不是业届标准 对开发工具的支持不够 复杂的taglib,需要比较长的时间来掌握 html form 和 actionform的搭配比较封闭,但这也是它的精华所在。 修改建议 把actionform属性的设置器和访问器修改成读取或生成xml文档的方法,然后 html form和actionform之间用xml文档进行数据交换,使之松散耦合,适应数据结构易变化的应用。 2.2. JATO JATO应用程序框架是iPlanet 应用程序框架的旧名。它是一个成熟的、强大的,基于J2EE标准的面向于开发WEB应用程序的应用框架。结合了显示字段、应用程序事件、组件层次和以页面为中心的开发方法、以及MVC和服务到工作者service-to-workers的设计模式等概念。JATO可适用于中、大、超大规模的WEB应用。但是它也不是一个企业层的应用框架,也就是说它不会直接提供创建EJB, WEB services等企业层组件的方法,但用它可以构造出访问企业层组件的客户应用。 这个框架功能主要有三部分组成: iPlanet应用框架核心; iPlanet应用框架组件; iPlanet应用框架扩展。 应用框架核心定义了基本接口、对象协议、简单组件,以及iPlanet应用框架程序的最小核心。包括视图简单组件、模型简单组件、请求分发组件和可重用命令对象。iPlanet应用框架组件利用框架核心定义的基本接口、协议和组件向开发者提供高层的重用组件,这些组件既有与特定视觉效果无关的水平组件,同时也有适应特定实用环境、提高可用性而特意提供的垂直型组件。框架扩展实现了用框架相容的方法访问非J2EE环境的方法。通常情况下,扩展被框架应用程序用来无缝访问J2EE容器特定功能。JATO平台栈图很清楚地表达了这个情况。 JATO最大的威力在:对于快速开发用户,你能利用框架组件和扩展提高生产率,对于要求更大灵活性的用户,你能实现框架核心提供的接口来保持应用的框架兼容性。 此图表示实现一个JATO应用程序,可以简单地实现控制组件module1Servlet,视图组件ListCustomersViewBean和模型组件CustomersModuleImpl,以及一个给客户代理显示界面的ListCustomers.jsp文件。并清楚地表明这些组件与JATO框架组件的继承关系。 JATO标签库提供了VIEW对象与JSP文件的接口。库中标签处理程序负责实现VIEW对象和JSP产生地客户端文档的信息同步和交换。这个图清楚地表达了这种对应关系 前端控制组件接收用户发来的任何请求,这个可在WEB.xml中指定 请求分发组件负责视图管理和导航,和前端控制组件封装在ApplicationSERVLETBase一起实现。应用程序开发者需要为每一个子系统(人力资源,财务,CRM等)实现一个此类的继承。 请求分发组件分发请求给工作者,工作者实现了command接口。应用开发者可以实现这个接口。JATO提供了一个缺省实现:DefaultRequestHandingCommand,这个实现会把请求传给视图组件的特定事件。 组合视图是指视图组件在显示给用户时的层次关系:根视图是一个ViewBean类的对象 字段是一个DisplayField类的对象,容器视图是一个ContainerView类的对象。视图组件类的层次关系如下图: 项目管理 2018-07-27 09:18:00 「深度学习福利」大神带你进阶工程师,立即查看>>> 声明: 网上关于分布式缓存Redis的学习资料很多,大家可以去网上找些资料去学习。 另外 JEESZ 框架面向企业的大型互联网分布式企业架构,分布式缓存是必不可少的,故这边总结了一些关于分布式缓存Redis的实战文章作为后期JEESZ分布式框架的教程,希望也可以帮助到大家,请勿吐槽。 Redis官网: http://redis.io 独立缓存服务器:IP:xxx.xxx.xxx.xxx 安装环境:CentOS 6.6 Redis 版本:redis-3.0(因为 Redis3.0 在集群和性能提升方面的特性,rc 版为正式版的候选版,请在安装时去官网选用最新版) 用户:root 安装目录:/usr/local/redis 下面我们针对于Redis安装做下详细的记录: 编译和安装所需的包: #yum install gcc tcl 提醒:下载 3.0 版 Redis(当前最新版 redis-3.0.0-rc5.tar.gz,请在安装时去官网选用最新版) #cd /usr/local/src #wget https://github.com/antirez/redis/archive/3.0.0-rc5.tar.gz 提醒:此路径可以通过官网去下载目录copy 创建安装目录: #mkdir /usr/local/redis 解压: #tar -zxvf 3.0.0-rc5.tar.gz #mv redis-3.0.0-rc5 redis3.0 #cd redis3.0 安装(使用 PREFIX 指定安装目录): #make PREFIX=/usr/local/redis install 安装完成后,可以看到/usr/local/redis 目录下有一个 bin 目录,bin 目录里就是 redis 的命令脚本: redis-benchmark redis-check-aof redis-check-dump redis-cli redis-server 将 Redis 配置成服务: 按上面的操作步骤,Redis 的启动脚本为:/usr/local/src/redis3.0/utils/redis_init_script 将启动脚本复制到/etc/rc.d/init.d/目录下,并命名为redis #cp /usr/local/src/redis3.0/utils/redis_init_script /etc/rc.d/init.d/redis 编辑/etc/rc.d/init.d/redis,修改相应配置,使之能注册成为服务: #vi /etc/rc.d/init.d/redis #!/bin/sh # # Simple Redis init.d script conceived to work on Linux systems # as it does use of the /proc filesystem. REDISPORT=6379 EXEC=/usr/local/bin/redis-server CLIEXEC=/usr/local/bin/redis-cli PIDFILE=/var/run/redis_${REDISPORT}.pid CONF="/etc/redis/${REDISPORT}.conf" case "$1" in start) if [ -f $PIDFILE ] then echo "$PIDFILE exists, process is already running or crashed" else echo "Starting Redis server..." $EXEC $CONF fi ;; stop) if [ ! -f $PIDFILE ] then echo "$PIDFILE does not exist, process is not running" else PID=$(cat $PIDFILE) echo "Stopping ..." $CLIEXEC -p $REDISPORT shutdown while [ -x /proc/${PID} ] do echo "Waiting for Redis to shutdown ..." sleep 1 done echo "Redis stopped" fi ;; *) echo "Please use start or stop as first argument" ;; esac 查看以上 redis 服务脚本,关注标为橙色的几个属性,做如下几个修改的准备: (1) 在脚本的第一行后面添加一行内容如下: #chkconfig: 2345 80 90 提醒:如果不添加上面的内容,在注册服务时会提示:service redis does not support chkconfig (2)REDISPORT端口保持6379不变;( 特别注意:端口名将与下面的配置文件名有 关 ) (3)EXEC=/usr/local/bin/redis-server 改为EXEC=/usr/local/redis/bin/redis-server (4)CLIEXEC=/usr/local/bin/redis-cli 改为CLIEXEC=/usr/local/redis/bin/redis-cli (5) 配置文件设置: 创建 redis 配置文件目录 #mkdir /usr/local/redis/conf 复制 redis 配置文件/usr/local/src/redis3.0/redis.conf到/usr/local/redis/conf目录并按端口号重命名为6379.conf #cp /usr/local/src/redis3.0/redis.conf /usr/local/redis/conf/6379.conf 做了以上准备后,再对 CONF 属性作如下调整: CONF="/etc/redis/${REDISPORT}.conf" 改为 CONF="/usr/local/redis/conf/${REDISPORT}.conf" (6) 更改 redis 开启的命令,以后台运行的方式执行: $EXEC $CONF“&”作用是将服务转到后面运行 修改后的/etc/rc.d/init.d/redis 服务脚本内容为: #!/bin/sh #chkconfig: 2345 80 90 # # Simple Redis init.d script conceived to work on Linux systems # as it does use of the /proc filesystem. REDISPORT=6379 EXEC=/usr/local/redis/bin/redis-server CLIEXEC=/usr/local/redis/bin/redis-cli PIDFILE=/var/run/redis_${REDISPORT}.pid CONF="/usr/local/redis/conf/${REDISPORT}.conf" case "$1" in start) if [ -f $PIDFILE ] then echo "$PIDFILE exists, process is already running or crashed" else echo "Starting Redis server..." $EXEC $CONF& fi ;; stop) if [ ! -f $PIDFILE ] then echo "$PIDFILE does not exist, process is not running" else PID=$(cat $PIDFILE) echo "Stopping ..." $CLIEXEC -p $REDISPORT shutdown while [ -x /proc/${PID} ] do echo "Waiting for Redis to shutdown ..." sleep 1 done echo "Redis stopped" fi ;; *) echo "Please use start or stop as first argument" ;; esac 以上配置操作完成后,便可将 Redis 注册成为服务: #chkconfig --add redis 防火墙中打开对应的端口 #vi /etc/sysconfig/iptables 添加: -A INPUT -m state --state NEW -m tcp -p tcp --dport 6379 -j ACCEPT 重启防火墙: #service iptables restart 修改 redis 配置文件设置: #vi /usr/local/redis/conf/6379.conf 修改如下配置 daemonizeno改为 daemonizeyes 备注:如果不改为yes,pid文件是不会生成,start、stop命令是不会生效的(依赖pid文件) pidfile /var/run/redis.pid 改为 pidfile /var/run/redis_6379.pid 启动 Redis 服务 #service redis start 将 Redis 添加到环境变量中: #vi /etc/profile 在最后添加以下内容: ## Redis env export PATH=$PATH:/usr/local/redis/bin 使配置生效: #source /etc/profile 当前可以直接使用 redis-cli 等 redis 命令了: #redis-cli 关闭 Redis 服务 #service redis stop 更多详细源码参考1903832579 提醒:默认情况下,Redis 开启安全认证,可以通过/usr/local/redis/conf/6379.conf 的 requirepass 指定一个 验证密码 项目管理 2018-07-27 09:16:00 「深度学习福利」大神带你进阶工程师,立即查看>>> 1、链路层具有最大传输单元 MTU 这个特性,它限制了数据帧的最大长度,不同的网络类型都有一个上限值。以太网的 MTU 是1500,你可以用 netstat -i 命令查看这个值。如果 IP 层有数据包要传,而且数据包的长度超过了 MTU ,那么 IP 层就要对数据包进行分片(fragmentation)操作,使每一片的长度都小于或等于MTU。我们假设要传输一个 UDP 数据包,以太网的MTU为1500字节,一般 IP 首部为20字节, UDP 首部为8字节,数据的净荷(payload)部分预留是1500-20-8=1472字节。如果数据部分大于1472字节,就会出现分片现象。 2、至于为什么最大值设置成1500字节。 其实,这个最大传输单元MTU等于1500是国际规定的默认值而已,自己也可以将它设置的小一些,【最大值是1500】,就是规定而已,可能是大家评估考虑1500是比较合适的一个数值。 可能可以这样认为,MTU=1500是一个经过实验得到的可以最大效率传输数据的值。倘若大于1500,数据传输速度就会变慢;相反,若小于1500,链路又得不到充分利用,减小了效率。。。。所以,1500就是最好的值。 项目管理 2018-07-26 19:49:00 「深度学习福利」大神带你进阶工程师,立即查看>>> 摘要: 包括SQL Maps和Data Access Objects(DAO)MyBatis 消除了几乎所有的JDBC代码和参数的手工设置以及结果集的... 摘要: Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring MVC 分离了控制器、模型对ฉ... 1、基本概念 1.1、Spring Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的 Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可 测试 性和松耦合的角度而言,任何Java应用都可以从Spring中受益。 简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。 1.2、SpringMVC Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring MVC 分离了 控制器 、模型 对象 、分派器以及处理程序对象的角色,这种分离让它们更容易进行定制。 1.3、MyBatis MyBatis 本是 apache 的一个开源项目 iBatis , 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。MyBatis是一个基于Java的 持久层 框架。iBATIS提供的 持久层 框架包括SQL Maps和Data Access Objects(DAO)MyBatis 消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis 使用简单的 XML或注解用于配置和原始映射,将接口和 Java 的POJOs(Plain Old Java Objects,普通的 Java对象)映射成 数据库 中的记录。 2、开发环境搭建 技术选型(只列了一部分技术) 1、后端 服务框架:Dubbo、zookeeper、Rest服务 缓存:Redis、ehcache 消息中间件:ActiveMQ 负载均衡:Nginx 分布式文件:FastDFS 数据库连接池:Alibaba Druid 1.0 核心框架:Spring framework 安全框架:Apache Shiro 1.2 视图框架:Spring MVC 4.0 服务端验证:Hibernate Validator 5.1 布局框架:SiteMesh 2.4 工作流引擎:Activiti 5.15 任务调度:quartz 1.8.5 持久层框架:MyBatis 3.2 日志管理:SLF4J 1.7、Log4j 工具类:Apache Commons、Jackson 2.2、Xstream 1.4、Dozer 5.3、POI 2、前端 JS框架:JQuery 1.9。 CSS框架: Bootstrap 4 metronic 客户端验证:JQuery Validation Plugin。 富文本:CKEcitor 文件管理:CKFinder 动态页签:Jerichotab 数据表格:jqGrid 对话框:jQuery jBox 树结构控件:jQuery zTree 其他组件:Bootstrap 4 metronic 3、支持 服务器中间件:Tomcat 6、7、Jboss 7、WebLogic 10、WebSphere 8 数据库支持:目前仅提供mysql数据库的支持,但不限于数据库,下个版本升级多数据源切换和数据库读写分离: 如:Oracle、SqlServer、H2等 支持开发环境:Eclipse、MyEclipse、Ras、Idea等 4、SSM整合 下面主要介绍三大框架的整合,至于环境的搭建以及项目的创建,参看上面的博文。这次整合我分了2个配置文件,分别是spring-mybatis.xml,包含spring和mybatis的配置文件,还有个是spring-mvc的配置文件,此外有2个资源文件:jdbc.propertis和log4j.properties。完整目录结构如下(最后附上源码下载地址,不建议直接使用源码,因为此教程已经有了全部代码): 使用框架都是较新的版本: Spring 4.0.2 RELEASE Spring MVC 4.0.2 RELEASE MyBatis 3.2.6 3、Maven Web项目创建 4.1、Maven引入需要的JAR包 为了方便后面说的时候不需要引入JAR包,我这里直接给出所有需要的JAR包,这都是基本的JAR包,每个包的是干什么的都有注释,就不再多说了。 pom.xml 4.2、Spring与MyBatis的整合 所有需要的JAR包都引入以后,首先进行Spring与MyBatis的整合,然后再进行JUnit测试,先看一个项目结构图: 4.2.1、建立JDBC属性文件 jdbc.properties(文件编码修改为utf-8) driver=com.mysql.jdbc.Driver url=jdbc:mysql://10.221.10.111:8080/db_zsl username=demao password=demao #定义初始连接数 initialSize=0 #定义最大连接数 maxActive=20 #定义最大空闲 maxIdle=20 #定义最小空闲 minIdle=1 #定义最长等待时间 maxWait=60000 4.2.2、建立spring-mybatis.xml配置文件 这个文件就是用来完成spring和mybatis的整合的。这里面也没多少行配置,主要的就是自动扫描,自动注入,配置数据库。注释也很详细,大家看看就明白了。 spring-mybatis.xml 4.2.3、Log4j的配置 为了方便调试,一般都会使用日志来输出信息,Log4j是 Apache 的一个开放源代码项目,通过使用Log4j,我们可以控制 日志 信息输送的目的地是 控制台 、文件、 GUI 组件,甚至是套接口服务器、 NT 的事件记录器、 UNIX Syslog 守护进程 等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。 Log4j的配置很简单,而且也是通用的,下面给出一个基本的配置,换到其他项目中也无需做多大的调整,如果想做调整或者想了解Log4j的各种配置,参看我转载的一篇博文,很详细: 下面给出配置文件目录: #定义LOG输出级别 log4j.rootLogger=INFO,Console,File #定义日志输出目的地为控制台 log4j.appender.Console=org.apache.log4j.ConsoleAppender log4j.appender.Console.Target=System.out #可以灵活地指定日志输出格式,下面一行是指定具体的格式 log4j.appender.Console.layout = org.apache.log4j.PatternLayout log4j.appender.Console.layout.ConversionPattern=[%c] - %m%n #文件大小到达指定尺寸的时候产生一个新的文件 log4j.appender.File = org.apache.log4j.RollingFileAppender #指定输出目录 log4j.appender.File.File = logs/ssm.log #定义文件最大大小 log4j.appender.File.MaxFileSize = 10MB # 输出所以日志,如果换成DEBUG表示输出DEBUG以上级别日志 log4j.appender.File.Threshold = ALL log4j.appender.File.layout = org.apache.log4j.PatternLayout log4j.appender.File.layout.ConversionPattern =[%p] [%d{yyyy-MM-dd HH\:mm\:ss}][%c]%m%n 4.2.4、JUnit测试 经过以上步骤(到4.2.2,log4j不配也没影响),我们已经完成了Spring和mybatis的整合,这样我们就可以编写一段测试代码来试试是否成功了。 4.2.4.1、创建测试用表 既然我们需要测试,那么我们就需要建立在数据库中建立一个测试表,这个表建的很简单,SQL语句为: DROP TABLE IF EXISTS `user_t`; CREATE TABLE `user_t` ( `id` int(11) NOT NULL AUTO_INCREMENT, `user_name` varchar(40) NOT NULL, `password` varchar(255) NOT NULL, `age` int(4) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; /*Data for the table `user_t` */ insert into `user_t`(`id`,`user_name`,`password`,`age`) values (1,'测试','sfasgfaf',24); 4.2.4.2、利用MyBatis Generator自动创建代码 这个可根据表自动创建实体类、MyBatis映射文件以及DAO接口,当然,我习惯将生成的接口名改为IUserDao,而不是直接用它生成的UserMapper。如果不想麻烦就可以不改。完成后将文件复制到工程中。如图: 4.2.4.3、建立Service接口和实现类 目录结构: 下面给出具体的内容: IUserService.jave package com.cn.hnust.service; import com.cn.hnust.pojo.User; public interface IUserService { public User getUserById(int userId); } UserServiceImpl.java package com.cn.hnust.service.impl; import javax.annotation.Resource; import org.springframework.stereotype.Service; import com.cn.hnust.dao.IUserDao; import com.cn.hnust.pojo.User; import com.cn.hnust.service.IUserService; @Service("userService") public class UserServiceImpl implements IUserService { @Resource private IUserDao userDao; @Override public User getUserById(int userId) { // TODO Auto-generated method stub return this.userDao.selectByPrimaryKey(userId); } } 4.2.4.4、建立测试类 测试类在src/test/java中建立,下面测试类中注释掉的部分是不使用Spring时,一般情况下的一种测试方法;如果使用了Spring那么就可以使用注解的方式来引入配置文件和类,然后再将service接口对象注入,就可以进行测试了。 如果测试成功,表示Spring和Mybatis已经整合成功了。输出信息使用的是Log4j打印到控制台。 package org.zsl.testmybatis; import javax.annotation.Resource; import org.apache.log4j.Logger; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import com.alibaba.fastjson.JSON; import com.cn.hnust.pojo.User; import com.cn.hnust.service.IUserService; @RunWith(SpringJUnit4ClassRunner.class) //表示继承了SpringJUnit4ClassRunner类 @ContextConfiguration(locations = {"classpath:spring-mybatis.xml"}) public class TestMyBatis { private static Logger logger = Logger.getLogger(TestMyBatis.class); // private ApplicationContext ac = null; @Resource private IUserService userService = null; // @Before // public void before() { // ac = new ClassPathXmlApplicationContext("applicationContext.xml"); // userService = (IUserService) ac.getBean("userService"); // } @Test public void test1() { User user = userService.getUserById(1); // System.out.println(user.getUserName()); // logger.info("值:"+user.getUserName()); logger.info(JSON.toJSONString(user)); } } 测试结果: 至此,完成Spring和mybatis这两大框架的整合,下面在继续进行SpringMVC的整合。 4.3、整合SpringMVC 上面已经完成了2大框架的整合,SpringMVC的配置文件单独放,然后在web.xml中配置整合。 4.3.1、配置spring-mvc.xml 配置里面的注释也很详细,在此就不说了,主要是自动扫描控制器,视图模式,注解的启动这三个。 4.3.2、配置web.xml文件 这里面对spring-mybatis.xml的引入以及配置的spring-mvc的Servlet就是为了完成SSM整合,之前2框架整合不需要在此处进行任何配置。配置一样有详细注释,不多解释了。 web.xml 4.3.3、测试 至此已经完成了SSM三大框架的整合了,接下来测试一下,如果成功了,那么恭喜你,如果失败了,继续调试吧,作为程序员就是不停的与BUG做斗争! 4.3.3.1、新建jsp页面 showUser.jsp 此页面仅输出一下用户名,完成一个完整的简单流程。 <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> 4.3.3.2、建立UserController类 欢迎大家一起学习研究相关技术 愿意了解框架技术或者源码的朋友直接求求交流分享技术:1903832579 项目管理 2018-07-26 10:07:00 「深度学习福利」大神带你进阶工程师,立即查看>>> FastDFS是一个轻量级的开源分布式文件系统 •FastDFS主要解决了大容量的文件存储和高并发访问的问题,文件存取时实现了负载均衡 •FastDFS实现了软件方式的RAID,可以使用廉价的IDE硬盘进行存储 •支持存储服务器在线扩容 •支持相同内容的文件只保存一份,节约磁盘空间 •FastDFS只能通过ClientAPI访问,不支持POSIX访问方式 •FastDFS特别适合大中型网站使用,用来存储资源文件(如:图片、文档、音频、视频等等) 系统架构-架构图 系统架构-上传文件流程图 • 1. client询问tracker上传到的storage,不需要附加参数; • 2. tracker返回一台可用的storage; • 3. client直接和storage通讯完成文件上传。 系统架构-下载文件流程图 • 1. client询问tracker下载文件的storage,参数为文件标识(组名和文件名); • 2. tracker返回一台可用的storage; • 3. client直接和storage通讯完成文件下载。 相关术语 • Tracker Server:跟踪服务器,主要做调度工作,在访问上起负载均衡的作用。记录storage server的状态,是连接Client和Storageserver的枢纽。 • Storage Server:存储服务器,文件和meta data都保存到存储服务器上 • group:组,也可称为卷。同组内服务器上的文件是完全相同的 • 文件标识:包括两部分:组名和文件名(包含路径) • meta data:文件相关属性,键值对(Key Value Pair)方式,如:width=1024,heigth=768 同步机制 •同一组内的storageserver之间是对等的,文件上传、删除等操作可以在任意一台storage server上进行; •文件同步只在同组内的storage server之间进行,采用push方式,即源服务器同步给目标服务器; •源头数据才需要同步,备份数据不需要再次同步,否则就构成环路了; •上述第二条规则有个例外,就是新增加一台storage server时,由已有的一台storageserver将已有的所有数据(包括源头数据和备份数据)同步给该新增服务器。 通信协议 • 协议包由两部分组成:header和body • header共10字节,格式如下: – 8 bytes body length – 1 byte command – 1 byte status • body数据包格式由取决于具体的命令,body可以为空 运行时目录结构-tracker server • ${base_path} |__data | |__storage_groups.dat:存储分组信息 | |__storage_servers.dat:存储服务器列表 |__logs |__trackerd.log:trackerserver日志文件 运行时目录结构-storage server • ${base_path} |__data | |__.data_init_flag:当前storageserver初始化信息 | |__storage_stat.dat:当前storage server统计信息 | |__sync:存放数据同步相关文件 | | |__binlog.index:当前的binlog文件索引号 | | |__binlog.###:存放更新操作记录(日志) | | |__${ip_addr}_${port}.mark:存放同步的完成情况 | | | |__一级目录:256个存放数据文件的目录,如:00, 1F | |__二级目录:256个存放数据文件的目录 |__logs |__storaged.log:storageserver日志文件 安装和运行 •#step 1. download FastDFS source package and unpack it, •# if you use HTTP to download file, please downloadlibevent 1.4.x and install it •tar xzf FastDFS_v1.x.tar.gz •#for example: •tar xzf FastDFS_v1.20.tar.gz • •#step 2. enter the FastDFS dir •cd FastDFS • •#step 3. if HTTP supported, modify make.sh, uncommentthe line: •# WITH_HTTPD=1, then execute: •./make.sh • •#step 4. make install •./make.sh install • •#step 5. edit/modify the config file of tracker andstorage • •#step 6. run server programs •#start the tracker server: •/usr/local/bin/fdfs_trackerd • •#start the storage server: •/usr/local/bin/fdfs_storaged FastDFS和集中存储方式对比 FastDFS中文: http://www.csource.org/ • FastDFS英文: http://code.google.com/p/fastdfs/ 官网资料,分享给大家学习 项目管理 2018-07-26 09:47:00 「深度学习福利」大神带你进阶工程师,立即查看>>> 微服务架构的好处 微服务架构模式有很多好处。首先,通过分解巨大单体式应用为多个服务方法解决了复杂性问题。在功能不变的情况下,应用被分解为多个可管理的分支 或服务。每个服务都有一个用RPC-或者消息驱动API定义清楚的边界。微服务架构模式给采用单体式编码方式很难实现的功能提供了模块化的解决方案,由 此,单个服务很容易开发、理解和维护。 第二,这种架构使得每个服务都可以有专门开发团队来开发。开发者可以自由选择开发技术,提供API服务。当然,许多公司试图避免混乱,只提供某 些技术选择。然后,这种自由意味着开发者不需要被迫使用某项目开始时采用的过时技术,他们可以选择现在的技术。甚至于,因为服务都是相对简单,即使用现在 技术重写以前代码也不是很困难的事情。 第三,微服务架构模式是每个微服务独立的部署。开发者不再需要协调其它服务部署对本服务的影响。这种改变可以加快部署速度。UI团队可以采用AB测试,快速的部署变化。微服务架构模式使得持续化部署成为可能。 最后,微服务架构模式使得每个服务独立扩展。你可以根据每个服务的规模来部署满足需求的规模。甚至于,你可以使用更适合于服务资源需求的硬件。 比如,你可以在EC2 Compute Optimized instances上部署CPU敏感的服务,而在EC2 memory-optimized instances上部署内存数据库。 微服务架构的不足 Fred Brooks在30Year前写道,“there are no silver bullets”,像任何其它科技一样,微服务架构也有不足。其中一个跟他的名字类似,『微服务』强调了服务大小,实际上,有一些开发者鼓吹建立稍微大一 些的,10-100 LOC服务组。尽管小服务更乐于被采用,但是不要忘了这只是终端的选择而不是最终的目的。微服务的目的是有效的拆分应用,实现敏捷开发和部署。 另外一个主要的不足是,微服务应用是分布式系统,由此会带来固有的复杂性。开发者需要在RPC或者消息传递之间选择并完成进程间通讯机制。更甚 于,他们必须写代码来处理消息传递中速度过慢或者不可用等局部失效问题。当然这并不是什么难事,但相对于单体式应用中通过语言层级的方法或者进程调用,微 服务下这种技术显得更复杂一些。 另外一个关于微服务的挑战来自于分区的数据库架构。商业交易中同时给多个业务分主体更新消息很普遍。这种交易对于单体式应用来说很容易,因为只 有一个数据库。在微服务架构应用中,需要更新不同服务所使用的不同的数据库。使用分布式交易并不一定是好的选择,不仅仅是因为CAP理论,还因为今天高扩 展性的NoSQL数据库和消息传递中间件并不支持这一需求。最终你不得不使用一个最终一致性的方法,从而对开发者提出了更高的要求和挑战。 测试一个基于微服务架构的应用也是很复杂的任务。比如,采用流行的Spring Boot架构,对一个单体式web应用,测试它的REST API,是很容易的事情。反过来,同样的服务测试需要启动和它有关的所有服务(至少需要这些服务的stubs)。再重申一次,不能低估了采用微服务架构带 来的复杂性。 另外一个挑战在于,微服务架构模式应用的改变将会波及多个服务。比如,假设你在完成一个案例,需要修改服务A、B、C,而A依赖B,B依赖C。 在单体式应用中,你只需要改变相关模块,整合变化,部署就好了。对比之下,微服务架构模式就需要考虑相关改变对不同服务的影响。比如,你需要更新服务C, 然后是B,最后才是A,幸运的是,许多改变一般只影响一个服务,而需要协调多服务的改变很少。 部署一个微服务应用也很复杂,一个分布式应用只需要简单在复杂均衡器后面部署各自的服务器就好了。每个应用实例是需要配置诸如数据库和消息中间件等基础服务。相对比,一个微服务应用一般由大批服务构成。例如,根据Adrian Cockcroft,NetFlix 有大约600个服务。每个服务都有多个实例。这就造成许多需要配置、部署、扩展和监控的部分,除此之外,你还需要完成一个服务发现机制(后续文章中发 表),以用来发现与它通讯服务的地址(包括服务器地址和端口)。传统的解决问题办法不能用于解决这么复杂的问题。接续而来,成功部署一个微服务应用需要开 发者有足够的控制部署方法,并高度自动化。 一种自动化方法是使用PaaS服务,例如Cloud Foundry。 PaaS给开发者提供一个部署和管理微服务的简单方法,它把所有这些问题都打包内置解决了。同时,配置PaaS的系统和网络专家可以采用最佳实践和策略来 简化这些问题。另外一个自动部署微服务应用的方法是开发对于你来说最基础的PaaS系统。一个典型的开始点是使用一个集群化方案,比如配合Docker使 用Mesos或者Kubernetes。后面的系列我们会看看如何基于软件部署方法例如NGINX,可以方便的在微服务层面提供缓存、权限控制、API统 计和监控。 总结 构建复杂的应用真的是非常困难。单体式的架构更适合轻量级的简单应用。如果你用它来开发复杂应用,那真的会很糟糕。微服务架构模式可以用来构建复杂应用,当然,这种架构模型也有自己的缺点和挑战。 在后续的博客中,我会深入探索微服务架构模式,并讨论诸如服务发现、服务部署选择和如何分解一个分布式应用为多个服务的策略。 欢迎大家一起学习研究相关技术 项目管理 2018-07-26 09:45:00 「深度学习福利」大神带你进阶工程师,立即查看>>> 1. 效果 2. 下载需要的软件 3. 搭建rtx服务器 服务配置 (其实中间应该导入lincen文件 授权 要用企业的信息申请 ) 设置管理员密码 查看服务: 添加用户 3. 客户端 安装 配置 配置客户端的服务器地址:( 127.0.0.1 )(在其他的电脑 配置该服务器的IP 必须局域网内) 测试发送消息 4. 破解 服务端 效果图: 4.1 替换1 4.2 替换2 4.3 重启 rtx服务 这样员工再使用客户端登录的时候就是正式版了 项目管理 2018-07-25 14:02:00 「深度学习福利」大神带你进阶工程师,立即查看>>> Appium参考文档中文版: http://appium.io/docs/cn/about-appium/intro/ http://appium.io/docs/cn/writing-running-appium/caps/#appium-capability http://appium.io/docs/en/about-appium/api/ 项目管理 2018-07-25 11:43:00 「深度学习福利」大神带你进阶工程师,立即查看>>> 进入开发者模式 【设置】---》【我的设备】---》【全部参数】---》狂按【Android 版本】 打开USB调试 【设置】---》【更多设置】---》【开发者选项】---》【USB调试】 项目管理 2018-07-25 10:13:00 「深度学习福利」大神带你进阶工程师,立即查看>>> 简介 鸿鹄云Cloud 是基于SpringCloud来封装的, 是一系列框架的有序集合。利用Spring Boot的开发模式简化了分布式系统基础设施的开发,如 服务发现、注册、配置中心、消息总线、负载均衡、断路器、数据监控 等(这里只简单的列了一部分),都可以用Spring Boot的开发风格做到一键启动和部署。鸿鹄云Cloud将目前比较成熟、经得起实际考验的服务框架组合起来,通过Spring Boot风格进行再封装,屏蔽掉了复杂的配置和实现原理,最终整合出一套简单易懂、易部署和易维护的分布式系统架构平台。 鸿鹄Cloud组成 Spring Cloud的子项目,大致可分成两类: 一类是对现有成熟框架Spring Boot的封装和抽象,也是数量最多的项目; 第二类是开发了一部分分布式系统的基础设施的实现,如 Spring Cloud Stream就是kafka, ActiveMQ这样的角色。开发人员进行微服务的实践,第一类子项目就已经足够使用,如: Spring Cloud Netflix 是对Netflix开发的一套分布式服务框架的封装,包括服务的发现和注册,负载均衡、断路器、REST客户端、请求路由等。 Spring Cloud Config 将配置信息中央化保存, 配置 Spring Cloud Bus可以实现动态修改配置文件。 Spring Cloud Bus 分布式消息队列,是对Kafka, MQ的封装。 Spring Cloud Security 对Spring Security的封装,并能配合Netflix使用。 Spring Cloud Zookeeper 对Zookeeper的封装,使之能配置其它 Spring Cloud的子项目使用。 Spring Cloud Eureka Spring Cloud Eureka 是 Spring Cloud Netflix 微服务套件中的一部分,它基于Netflix Eureka 做了二次分装,主要负责完成微服务架构中的服务治理功能。 鸿鹄Cloud未来 Spring Cloud为未来互联网企业提供分布式基础设施解决方案。同时,随着近几年微服务架构和Docker容器概念的火爆,也会让 Spring Cloud在未来越来越“云”化的软件开发风格中立有一席之地,尤其是在目前五花八门的分布式解决方案中提供了标准化的、全站式的技术方案,有效推进服务端软件系统技术水平提升。 项目管理 2018-07-25 10:01:00 「深度学习福利」大神带你进阶工程师,立即查看>>> 这边结合了当前大部分企业的通用需求,包括技术的选型比较严格、苛刻,不仅要用业界最流行的技术,还要和国际接轨,在未来的5~10年内不能out。作为公司的架构师,也要有一种放眼世界的眼光,不仅要给公司做好的技术选型,而且还要快速响应企业的业务需求,能够为企业快速定制化业务。 以下是我为公司规划的大型互联网分布式企业微服务云架构: 从现在开始,我这边会将近期研发的spring cloud微服务云架构的搭建过程和精髓记录下来,帮助更多有兴趣研发spring cloud框架的朋友,大家来一起探讨spring cloud架构的搭建过程及如何运用于企业项目。 完整项目的源码来源 技术支持1791743380 项目管理 2018-07-25 09:59:00 「深度学习福利」大神带你进阶工程师,立即查看>>> pom.xml添加以下: 项目管理 2018-07-24 09:44:00 「深度学习福利」大神带你进阶工程师,立即查看>>> 在web.xml中添加以下过滤器 ajax处理: $.ajax({ type: "GET", url: "http://localhost:8888/crbcHQimis/specialplanmanage/d7194c5a32ca43fc94684579ab42d3d6?userAcct=fansp", dataType: "json", success: function(data) { //..... } }); 不过根据浏览器的保护规则,跨域的时候我们创建的sessionId是不会被浏览器保存下来的,这样,当我们在进行跨域访问的时候,我们的sessionId就不会被保存下来,也就是说,每一次的请求,服务器就会以为是一个新的人,而不是同一个人,为了解决这样的办法,需要在ajax请求时增加 xhrFields:{withCredentials:true},如下: $.ajax({ type: "GET", url: "http://localhost:8888/crbcHQimis/specialplanmanage/d7194c5a32ca43fc94684579ab42d3d6?userAcct=fansp", dataType: "json", xhrFields:{withCredentials:true}, success: function(data) { //..... } }); 项目管理 2018-07-24 09:28:00 「深度学习福利」大神带你进阶工程师,立即查看>>> 在使用PowerDesigner对数据库进行概念模型和物理模型设计时,一般在Name或Comment中写中文,在Code中写英文。Name用来显示,Code对应数据库中的列名,Comment中的文字会保存到数据库Table或Column的Comment中,当Name已经存在的时候,再写一次 Comment很麻烦,可以使用以下代码来解决这个问题。 另外在使用REVERSE ENGINEER从数据库反向生成PDM的时候,PDM中的表的Name和Code事实上都是Code,为了把Name替换为数据库中Table或Column的中文Comment,可以使用以下脚本。 1、将Name中的内容复制至Comment中 Option Explicit ValidationMode = True InteractiveMode = im_Batch Dim mdl ' the current model ' get the current active model Set mdl = ActiveModel If (mdl Is Nothing) Then MsgBox "There is no current Model " ElseIf Not mdl.IsKindOf(PdPDM.cls_Model) Then MsgBox "The current model is not an Physical Data model. " Else ProcessFolder mdl End If ' This routine copy name into comment for each table, each column and each view ' of the current folder Private sub ProcessFolder(folder) Dim Tab 'running table for each Tab in folder.tables if not tab.isShortcut then tab.comment = tab.name Dim col ' running column for each col in tab.columns col.comment= col.name next end if next Dim view 'running view for each view in folder.Views if not view.isShortcut then view.comment = view.name end if next ' go into the sub-packages Dim f ' running folder For Each f In folder.Packages if not f.IsShortcut then ProcessFolder f end if Next end sub 2、将Comment中的内容复制至Name中 Option Explicit ValidationMode = True InteractiveMode = im_Batch Dim mdl ' the current model ' get the current active model Set mdl = ActiveModel If (mdl Is Nothing) Then MsgBox "There is no current Model " ElseIf Not mdl.IsKindOf(PdPDM.cls_Model) Then MsgBox "The current model is not an Physical Data model. " Else ProcessFolder mdl End If Private sub ProcessFolder(folder) On Error Resume Next Dim Tab 'running table for each Tab in folder.tables if not tab.isShortcut then tab.name = tab.comment Dim col ' running column for each col in tab.columns if col.comment="" then else col.name= col.comment end if next end if next Dim view 'running view for each view in folder.Views if not view.isShortcut then view.name = view.comment end if next ' go into the sub-packages Dim f ' running folder For Each f In folder.Packages if not f.IsShortcut then ProcessFolder f end if Next end sub 以上两段代码都是VB脚本,在PowerDesigner中使用方法为: PowerDesigner->Tools->Execute Commands->Edit/Run Scripts 将代码Copy进去执行就可以了,是对整个CDM或PDM进行操作 项目管理 2018-07-23 16:36:00 「深度学习福利」大神带你进阶工程师,立即查看>>> 1.安装必要的扩展 # yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-de 2.下载python3.7源码 # wget https://www.python.org/ftp/python/3.7.0/Python-3.7.0.tar.xz 3.解压安装 # tar xf Python-3.7.0.tar.xz -C /usr/local/src/ # cd /usr/local/src/Python-3.7.0/ # ./configure --prefix=/usr/local/python3 # make && make install 报错:ModuleNotFoundError: No module named '_ctypes' #yum install libffi-devel -y 4.查看pip //从 Python 3.4 开始就已经自带了 pip 和 easy_install(setuptools 包带的命令) 包管理命令,你可以在 /usr/local/python3/bin/ 目录下看到,查看一下已经安装的扩展包: #/usr/local/python3/bin/pip3 list 5.修改yum配置文件 因为yum使用python2,因此替换为python3后可能无法正常工作,继续使用这个python2.7.5,因此需要修改yum相关配置文件。 (1)vi /usr/bin/yum 把文件头部的#!/usr/bin/python改成#!/usr/bin/python2.7保存退出即可。 因为yum使用python2,因此替换为python3后可能无法正常工作,继续使用这个python2.7.5因此修改yum配置文件(vi /usr/bin/yum)。把文件头部的#!/usr/bin/python改成#!/usr/bin/python2.7保存退出即可 (2) vi /usr/libexec/urlgrabber-ext-down 第一行改为#!/usr/bin/python2.7 注意:若只修改第一个,还是无法使用yum,需要这2个文件都修改。 只修改一个不修改第二个,报错如下: #yum repolist 已加载插件:fastestmirror Determining fastest mirrors * base: mirrors.yun-idc.com * extras: mirrors.yun-idc.com * updates: mirrors.yun-idc.com File "/usr/libexec/urlgrabber-ext-down", line 28 except OSError, e: ^ SyntaxError: invalid syntax File "/usr/libexec/urlgrabber-ext-down", line 28 except OSError, e: ^ SyntaxError: invalid syntax File "/usr/libexec/urlgrabber-ext-down", line 28 except OSError, e: ^ SyntaxError: invalid syntax 由于用户取消而退出 6.检测多版本 #python -V --- python 3.7 #python2.7 -V --- python 2.7 项目管理 2018-07-23 16:07:00 「深度学习福利」大神带你进阶工程师,立即查看>>> SVN 重新定位 1.方法一 首先:在Eclipse中选择Windows-> Show View->others 就会出现【SVN资源库/SVN Repositories】,选中后,点击确认; 然后:选中原有的地址,选择【重新定位/Relocate】 最后:在弹出的窗口中显示出Eclipse中原有的工程,选中一个项目,再点击“Next”,然后修改新的SVN地址即可; 2.方法二 选中项目名(ecstore)--->team--->断开连接--->并且从文件系统中删除SVN元信息 然后重新上传项目 eclipse 上传项目 右键项目--->Team--->Share Project 参考链接: https://blog.csdn.net/flying_vip_521/article/details/9352385 https://jingyan.baidu.com/article/67508eb40dfab09ccb1ce473.html https://blog.csdn.net/f429629227/article/details/51954048 项目管理 2018-07-23 12:11:00 「深度学习福利」大神带你进阶工程师,立即查看>>> 摘要: 主要核心部件: Remoting: 网络通信框架,实现了 sync-over-async 和 request-response 消息机制. RPC: 一个远程过程调用的抽象,支持负载均衡、容灾和集群功能 Registry: 服务目录框架用于服务的注册和服务事件发布和订阅 Dubbo 是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 Spring 框架无缝集成。 主要核心部件: Remoting: 网络通信框架,实现了 sync-over-async 和 request-response 消息机制. RPC: 一个远程过程调用的抽象,支持负载均衡、容灾和集群功能 Registry: 服务目录框架用于服务的注册和服务事件发布和订阅 Dubbo工作原理 Provider 暴露服务方称之为“服务提供者”。 Consumer 调用远程服务方称之为“服务消费者”。 Registry 服务注册与发现的中心目录服务称之为“服务注册中心”。 Monitor 统计服务的调用次调和调用时间的日志服务称之为“服务监控中心”。 (1) 连通性: 注册中心负责服务地址的注册与查找,相当于目录服务,服务提供者和消费者只在启动时与注册中心交互,注册中心不转发请求,压力较小 监控中心负责统计各服务调用次数,调用时间等,统计先在内存汇总后每分钟一次发送到监控中心服务器,并以报表展示 服务提供者向注册中心注册其提供的服务,并汇报调用时间到监控中心,此时间不包含网络开销 服务消费者向注册中心获取服务提供者地址列表,并根据负载 算法 直接调用提供者,同时汇报调用时间到监控中心,此时间包含网络开销 注册中心,服务提供者,服务消费者三者之间均为长连接,监控中心除外 注册中心通过长连接感知服务提供者的存在,服务提供者宕机,注册中心将立即推送事件通知消费者 注册中心和监控中心全部宕机,不影响已运行的提供者和消费者,消费者在本地缓存了提供者列表 注册中心和监控中心都是可选的,服务消费者可以直连服务提供者 (2) 健状性: 监控中心宕掉不影响使用,只是丢失部分采样数据 数据库 宕掉后,注册中心仍能通过缓存提供服务列表查询,但不能注册新服务 注册中心对等集群,任意一台宕掉后,将自动切换到另一台 注册中心全部宕掉后,服务提供者和服务消费者仍能通过本地缓存通讯 服务提供者无状态,任意一台宕掉后,不影响使用 服务提供者全部宕掉后,服务消费者应用将无法使用,并无限次重连等待服务提供者恢复 (3) 伸缩性: 注册中心为对等集群,可动态增加机器部署实例,所有客户端将自动发现新的注册中心 服务提供者无状态,可动态增加机器部署实例,注册中心将推送新的服务提供者信息给消费者 平台简介 Jeesz是一个分布式的框架,提供项目模块化、服务化、热插拔的思想,高度封装安全性的 Java EE快速开发平台。 Jeesz本身集成Dubbo服务管控、Zookeeper注册中心、 Redis 分布式缓存技术、FastDFS分布式文件系统、ActiveMQ异步消息中间件、Nginx负载均衡等分布式技术 使用Maven做项目管理,项目模块化,提高项目的易开发性、扩展性 以 spring Framework为核心容器,Spring MVC为模型视图控制器,MyBatis为数据访问层, Apache Shiro为权限授权层,Ehcahe对常用数据进行缓存,Activit为工作流引擎等。 前端集成Bootstrap4 metronic框架,UI响应式、扁平化布局,适应所有PC、Pad、Anroid、 iOS 移动设备等。 Jeesz主要定位于互联网企业 架构 ,已内置企业信息化系统的基础功能和高效的代码生成工具,包括:系统权限组件、数据权限组件、数据字典组件、核心工具 组件、视图操作组件、工作流组件、代码生成等。采用分层设计、双重验证、提交数据安全编码、密码加密、访问验证、数据权限验证。 Jeesz目前包括以下模块项目,后台系统管理系统,RestFul独立服务系统、Scheduler定时调度系统、内容管理(CMS)系统、在线办公(OA)系统、我的待办(Task服务)、我的收藏(Bookmark服务)。 后台管理系统包括企业组织架构(用户管理、机构管理、区域管理)、菜单管理、角色权限管理、字典管理等功能; RestFul独立提供标准Rest服务API,您可以快速实现自己的业务,提供需要的服务; Quartz定时调度系统可以动态配置您的任务规则等; 内容管理(CMS)系统,包括内容管理,栏目管理、站点管理、公共留言、文件管理、前端网站展示等功能; 在线办公(OA)系统,主要提供简单的流程实例。 Jeesz提供了常用工具进行封装,包括日志工具、缓存工具、服务器端验证、数据字典、当前组织机构数据(用户、机构、区域)以及其它常用小工具等。另外 还提供一个强大的在线 代码生成 工具,此工具提供简单的单表、一对多、树结构功能的生成,如果对外观要求不是很高,生成的功能就可以用了。使用了Jeesz基础框架,可以提高快速开发效 率。 内置功能(只列了一部分功能) 1.用户管理:用户是系统操作者,该功能主要完成系统用户配置。 2.机构管理:配置系统组织机构(公司、部门、小组),树结构展现,可随意调整上下级。 3.区域管理:系统城市区域模型,如:国家、省市、地市、区县的维护。 4.菜单管理:配置系统菜单,操作权限,按钮权限标识等。 5.角色管理:角色菜单权限分配、设置角色按机构进行数据范围权限划分。 6.字典管理:对系统中经常使用的一些较为固定的数据进行维护,如:是否、男女、类别、级别等。 7.操作日志:系统正常操作日志记录和查询;系统异常信息日志记录和查询。 8.连接池监视:监视当期系统数据库连接池状态,可进行分析SQL找出系统性能瓶颈。 9.工作流引擎:实现业务工单流转、在线流程设计器。 开发工具 1.Eclipse IDE:采用Maven项目管理,模块化。 2.代码生成:通过界面方式简单配置,自动生成相应代码,目前包括三种生成方式(增删改查):单表、一对多、树结构。生成后的代码如果不需要注意美观程度,生成后即可用。 技术选型(只列了一部分技术) 1、后端 服务框架:Dubbo、zookeeper、Rest服务 缓存: redis 、ehcache 消息中间件:ActiveMQ 负载均衡:Nginx 分布式文件:FastDFS 数据库连接池:Alibaba Druid 1.0 核心框架:Spring framework 安全框架:Apache Shiro 1.2 视图框架:Spring MVC 4.0 服务端验证: hibernate Validator 5.1 布局框架:SiteMesh 2.4 工作流引擎:Activiti 5.15 任务调度:quartz 1.8.5 持久层框架:MyBatis 3.2 日志管理:SLF4J 1.7、Log4j 工具类:Apache Commons、Jackson 2.2、Xstream 1.4、Dozer 5.3、POI 2、前端 js 框架: jQuery 1.9。 CSS框架: Bootstrap 4 metronic 客户端验证: jquery Validation Plugin。 富文本:CKEcitor 文件管理:CKFinder 动态页签:Jerichotab 数据表格:jqGrid 对话框:jQuery jBox 树结构控件:jQuery zTree 其他组件:Bootstrap 4 metronic 3、支持 服务器中间件:Tomcat 6、7、Jboss 7、WebLogic 10、WebSphere 8 数据库支持:目前仅提供 MySQL 数据库的支持,但不限于数据库,下个版本升级多数据源切换和数据库读写分离: 如: Oracle 、SqlServer、H2等 支持开发环境:Eclipse、MyEclipse、Ras、Idea等 项目管理 2018-07-23 10:07:00 「深度学习福利」大神带你进阶工程师,立即查看>>> 开发工具 1.Eclipse IDE:采用Maven项目管理,模块化。 2.代码生成:通过界面方式简单配置,自动生成相应代码,目前包括三种生成方式(增删改查):单表、一对多、树结构。生成后的代码如果不需要注意美观程度,生成后即可用。 技术选型(只列了一部分技术) 1、后端 服务框架:Dubbo、zookeeper、Rest服务 缓存:Redis、ehcache 消息中间件:ActiveMQ 负载均衡:Nginx 分布式文件:FastDFS 数据库连接池:Alibaba Druid 1.0 核心框架:Spring framework 安全框架:Apache Shiro 1.2 视图框架:Spring MVC 4.0 服务端验证:Hibernate Validator 5.1 布局框架:SiteMesh 2.4 工作流引擎:Activiti 5.15 任务调度:quartz 1.8.5 持久层框架:MyBatis 3.2 日志管理:SLF4J 1.7、Log4j 工具类:Apache Commons、Jackson 2.2、Xstream 1.4、Dozer 5.3、POI 2、前端 JS框架:JQuery 1.9。 CSS框架: Bootstrap 4 metronic 客户端验证:JQuery Validation Plugin。 富文本:CKEcitor 文件管理:CKFinder 动态页签:Jerichotab 数据表格:jqGrid 对话框:jQuery jBox 树结构控件:jQuery zTree 其他组件:Bootstrap 4 metronic 3、支持 服务器中间件:Tomcat 6、7、Jboss 7、WebLogic 10、WebSphere 8 数据库支持:目前仅提供mysql数据库的支持,但不限于数据库,下个版本升级多数据源切换和数据库读写分离: 如:Oracle、SqlServer、H2等 支持开发环境:Eclipse、MyEclipse、Ras、Idea等 经典介绍: 源码结构 jeesz-utils jeesz-config jeesz-framework jeesz-core-cms jeesz-core-gen jeesz-core-bookmark jeesz-core-act jeesz-core-oa jeesz-core-test jeesz-core-scheduler jeesz-core-task jeesz-web-admin jeesz-web-service jeesz-web-scheduler jeesz-web-task jeesz-web-bookmark jeesz-facade-bookmark jeesz-service-bookmark jeesz-facade-task jeesz-servicetask jeesz-web-mq-task 特别提醒:开发人员在开发的时候可以将自己的业务REST服务化或者Dubbo服务化 OPEN CI 开源规范化项目管理解决方案,实现软件流水线式生产,保证正确性、可靠性 向导式创建、导入项目,集成版本控制(GIT/SVN)、项目管理(Trac/Redmine)、代码质量(Sonar)、持续集成(Jenkins) 私有部署,统一管理,为开发者而生 分布式 分布式服务:Dubbo+Zookeeper+Proxy+Restful 分布式消息中间件:KafKa+Flume+Zookeeper 分布式缓存:Redis 分布式文件:FastDFS 负载均衡:Keepalived+Nginx+Proxy(三重负载) 愿意了解框架技术或者源码的朋友直接求求交流分享技术:1903832579 云服务 子系统:后台管理系统、Restfu服务系统、Dubbo服务/管控/监控中心 Zookeeper注册中心、报表分析系统、日志记录系统、定时调度系统 搜索引擎系统、分布式文件系统、消息系统、SSO单点登录系统 SOA管控平台、UI组件系统、OA办公系统、CMS新闻发布系统 支付系统、数据库配置系统、工作流系统、云服务平台 欢迎大家一起学习研究相关技术 项目管理 2018-07-23 10:06:00 「深度学习福利」大神带你进阶工程师,立即查看>>> 1.因为是本地模拟sso环境,而sso的环境测试需要域名,所以需要虚拟几个域名出来,步骤如下: 2.进入目录C:\Windows\System32\drivers\etc 3.修改hosts文件 127.0.0.1 jeesz.cn 127.0.0.1 sso1.jeesz.cn 127.0.0.1 sso2.jeesz.cn 4.生成认证证书 注意:我们可以根据sso单点登录的架构图可以看到,在客户端和服务端进行交互的时候,是需要认证的,在这里我们使用jdk中的keytool方案生成证书(一般正式环境,使用正规机构颁发的证书,可以去购买) (一)创建一个caskey目录,如:D:\sso-cas\caskey (二)打开cmd的命令窗口: (三)进入jdk bin的安装目录 (四)使用keytool -genkey -alias mycacerts -keyalg RSA -keystore D:/sso-cas/caskey/keycard 生成key 注意:输入相关信息用于生成证书. 其中名字与姓氏使用你的域名,保持和C:\Windows\System32\drivers\etc\hosts 文件中映射域名相同,注意不要写成IP。 在这里我使用的口令是minglisoft(这个要记住,后面还会使用到) 名字姓氏使用的是jeesz.cn(对应host中的域名配置) (五)使用命令keytool -export -file D:/sso-cas/caskey/keycard.crt -alias mycacerts -keystore D:/sso-cas/caskey/keycard导出证书: 注意:口令为minglisoft (六)将证书导入到 JDK 安装目录 Keytool -import -keystore C:/"Program Files"/Java/jdk1.8.0_131/jre/lib/security/cacerts -file D:/sso-cas/caskey/keycard.crt -alias mycacerts 备注:我已经帮忙生成了,最终要将cacerts拷贝到C:\Program Files\Java\jdk1.8.0_131\jre\lib\security目录即可 注意口令:minglisoft 5. 准备好服务端的tomcat容器,这里使用的是tomcat8进行测试(首先要保证tomcat启动后是可以运行的),如下: 到此cas的server测试成功!! 项目管理 2018-07-23 10:03:00 「深度学习福利」大神带你进阶工程师,立即查看>>> 今天我们对OAuth2.0的整合方式做一下笔记,首先我从网上找了一些关于OAuth2.0的一些基础知识点,帮助大家回顾一下知识点: 一、oauth中的角色 client:调用资源服务器API的应用 Oauth 2.0 Provider:包括Authorization Server和Resource Server (1)Authorization Server:认证服务器,进行认证和授权 (2)Resource Server:资源服务器,保护受保护的资源 user:资源的拥有者 二、下面详细介绍一下Oauth 2.0 Provider Authorization Server: (1) AuthorizationEndpoint :进行授权的服务,Default URL: /oauth/authorize (2) TokenEndpoint :获取token的服务,Default URL: /oauth/token Resource Server: OAuth2AuthenticationProcessingFilter :给带有访问令牌的请求加载认证 三、下面再来详细介绍一下Authorization Server: 一般情况下,创建两个配置类,一个继承AuthorizationServerConfigurerAdapter,一个继承WebSecurityConfigurerAdapter,再去复写里面的方法。 主要出现的两种注解: 1、@EnableAuthorizationServer:声明一个认证服务器,当用此注解后,应用启动后将自动生成几个 Endpoint :(注:其实实现一个认证服务器就是这么简单,加一个注解就搞定,当然真正用到生产环境还是要进行一些配置和复写工作的。) /oauth/authorize:验证 /oauth/token:获取token /oauth/confirm_access:用户授权 /oauth/error:认证失败 /oauth/check_token:资源服务器用来校验token /oauth/token_key:如果jwt模式则可以用此来从认证服务器获取公钥 以上这些endpoint都在源码里的endpoint包里面。 2、@Beans:需要实现AuthorizationServerConfigurer AuthorizationServerConfigurer包含三种配置: ClientDetailsServiceConfigurer:client客户端的信息配置,client信息包括:clientId、secret、scope、authorizedGrantTypes、authorities (1)scope:表示权限范围,可选项,用户授权页面时进行选择 (2)authorizedGrantTypes:有四种授权方式 Authorization Code:用验证获取code,再用code去获取token(用的最多的方式,也是最安全的方式) Implicit: 隐式授权模式 Client Credentials (用來取得 App Access Token) Resource Owner Password Credentials (3)authorities:授予client的权限 这里的具体实现有多种,in-memory、JdbcClientDetailsService、jwt等。 AuthorizationServerSecurityConfigurer:声明安全约束,哪些允许访问,哪些不允许访问 AuthorizationServerEndpointsConfigurer:声明授权和token的端点以及token的服务的一些配置信息,比如采用什么存储方式、token的有效期等 client的信息的读取:在ClientDetailsServiceConfigurer类里面进行配置,可以有in-memory、jdbc等多种读取方式。 jdbc需要调用JdbcClientDetailsService类,此类需要传入相应的DataSource. 下面再介绍一下如何管理token: AuthorizationServerTokenServices 接口:声明必要的关于token的操作 (1)当token创建后,保存起来,以便之后的接受访问令牌的资源可以引用它。 (2)访问令牌用来加载认证 接口的实现也有多种, DefaultTokenServices 是其默认实现,他使用了默认的InMemoryTokenStore,不会持久化token; token存储方式共有三种分别是: (1)InMemoryTokenStore:存放内存中,不会持久化 (2)JdbcTokenStore:存放数据库中 (3)Jwt: json web token 授权类型: 可以通过AuthorizationServerEndpointsConfigurer来进行配置,默认情况下,支持除了密码外的所有授权类型。相关授权类型的一些类: (1)authenticationManager:直接注入一个AuthenticationManager,自动开启密码授权类型 (2)userDetailsService:如果注入UserDetailsService,那么将会启动刷新token授权类型,会判断用户是否还是存活的 (3)authorizationCodeServices:AuthorizationCodeServices的实例,auth code 授权类型的服务 (4)implicitGrantService:imlpicit grant (5)tokenGranter: endpoint的URL的配置: (1)AuthorizationServerEndpointsConfigurer的pathMapping()方法,有两个参数,第一个是默认的URL路径,第二个是自定义的路径 (2)WebSecurityConfigurer的实例,可以配置哪些路径不需要保护,哪些需要保护。默认全都保护。 自定义UI: (1)有时候,我们可能需要自定义的登录页面和认证页面。登陆页面的话,只需要创建一个login为前缀名的网页即可,在代码里,设置为允许访问,这样,系统会自动执行你的登陆页。此登陆页的action要注意一下,必须是跳转到认证的地址。 (2)另外一个是授权页,让你勾选选项的页面。此页面可以参考源码里的实现,自己生成一个controller的类,再创建一个对应的web页面即可实现自定义的功能。 下面梳理一下授权获取token流程: (1)端口号换成你自己的认证服务器的端口号,client_id也换成你自己的,response_type类型为code。 localhost:8080/uaa/oauth/authorize?client_id=client&response_type=code&redirect_uri= http://www .baidu.com (2)这时候你将获得一个code值: http://www .baidu.com/?code=G0C20Z (3)使用此code值来获取最终的token: curl -X POST -H "Cant-Type: application/x-www-form-urlencoded" -d 'grant_type=authorization_code&code=G0C20Z&redirect_uri= http://www.baidu.com ' " http://client:secret @localhost :8080/uaa/oauth/token" 返回值: {"access_token":"b251b453-cc08-4520-9dd0-9aedf58e6ca3","token_type":"bearer","expires_in":2591324,"scope":"app"} (4)用此token值来调用资源服务器内容(如果资源服务器和认证服务器在同一个应用中,那么资源服务器会自己解析token值,如果不在,那么你要自己去做处理) curl -H "Authorization: Bearer b251b453-cc08-4520-9dd0-9aedf58e6ca3" "localhost:8081/service2(此处换上你自己的url)" 四、Resource Server:保护资源,需要令牌才能访问 在配置类上加上注解@EnableResourceServer即启动。使用ResourceServerConfigurer进行配置: (1)tokenServices:ResourceServerTokenServices的实例,声明了token的服务 (2)resourceId:资源Id,由auth Server验证。 (3)其它一些扩展点,比如可以从请求中提取token的tokenExtractor (4)一些自定义的资源保护配置,通过HttpSecurity来设置 使用token的方式也有两种: (1)Bearer Token(https传输方式保证传输过程的安全):主流 (2)Mac(http+sign) 如何访问资源服务器中的API? 如果资源服务器和授权服务器在同一个应用程序中,并且您使用DefaultTokenServices,那么您不必太考虑这一点,因为它实现所有必要的接口,因此它是自动一致的。如果您的资源服务器是一个单独的应用程序,那么您必须确保您匹配授权服务器的功能,并提供知道如何正确解码令牌的ResourceServerTokenServices。与授权服务器一样,您可以经常使用DefaultTokenServices,并且选项大多通过TokenStore(后端存储或本地编码)表示。 (1)在校验request中的token时,使用RemoteTokenServices去调用AuthServer中的/auth/check_token。 (2)共享数据库,使用Jdbc存储和校验token,避免再去访问AuthServer。 (3)使用JWT签名的方式,资源服务器自己直接进行校验,不借助任何中间媒介。 五、oauth client 在客户端获取到token之后,想去调用下游服务API时,为了能将token进行传递,可以使用RestTemplate.然后使用restTemplate进行调用Api。 注: scopes和authorities的区别: scopes是client权限,至少授予一个scope的权限,否则报错。 authorities是用户权限。 以上是我从网上找到的一篇写的不错的博客,希望可以帮助大家快速了解OAuth2.0,下一篇文章我们正式介绍OAuth2.0在当前框架中的使用。 从现在开始,我这边会将近期研发的spring cloud微服务云架构的搭建过程和精髓记录下来,帮助更多有兴趣研发spring cloud框架的朋友,大家来一起探讨spring cloud架构的搭建过程及如何运用于企业项目。完整项目的源码来源 技术支持1791743380 项目管理 2018-07-23 09:38:00 「深度学习福利」大神带你进阶工程师,立即查看>>> Ubuntu 安装AB apapt-get install apache2-utils 使用AB 压力测试 -c 并发数 -n请求总数 ab -c 3000 -n 10000 http://localhost/test/index.php AB只能测试localhost 返回结果 This is ApacheBench, Version 2.3 <$Revision: 1528965 $> Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ Licensed to The Apache Software Foundation, http://www.apache.org/ Benchmarking localhost (be patient) Completed 1000 requests Completed 2000 requests Completed 3000 requests Completed 4000 requests Completed 5000 requests Completed 6000 requests Completed 7000 requests Completed 8000 requests Completed 9000 requests Completed 10000 requests Finished 10000 requests Server Software: nginx Server Hostname: localhost Server Port: 80 Document Path: /test/index.php Document Length: 25 bytes Concurrency Level: 2900 当前并发数 Time taken for tests: 1.772 seconds 测试使用是回见 Complete requests: 10000 完成请求个数 Failed requests: 0 失败请求个数 Non-2xx responses: 10000 Total transferred: 1850000 bytes 数据总大小 HTML transferred: 250000 bytes html大小 Requests per second: 5643.61 [#/sec] (mean) 吞吐率,计算公式:Complete requests/Time taken for tests Time per request: 513.856 [ms] (mean)用户平均请求等待时间,计算公式:Time token for tests/(Complete requests/Concurrency Level)。 Time per request: 0.177 [ms] (mean, across all concurrent requests) 服务器平均请求等待时间,计算公式:Time taken for tests/Complete requests,正好是吞吐率的倒数。也可以这么统计:Time per request/Concurrency Level。 Transfer rate: 1019.60 [Kbytes/sec] received 表示这些请求在单位时间内从服务器获取的数据长度,计算公式:Total trnasferred/ Time taken for tests,这个统计很好的说明服务器的处理能力达到极限时,其出口宽带的需求量。 Connection Times (ms) min mean[+/-sd] median max Connect: 0 23 36.8 0 98 Processing: 58 433 121.4 477 598 Waiting: 55 433 121.5 477 598 Total: 154 456 103.6 494 661 Percentage of the requests served within a certain time (ms) 50% 494 66% 532 75% 539 80% 550 90% 555 95% 573 98% 608 99% 628 100% 661 (longest request) 使用AB 遇到问题 执行操作一定条数,或连续执行该命令会出现如下问题: apr_socket_recv: Connection timed out (110) 查看系统日志: dmesg 显示大量下面错误 nf_conntrack: table full, dropping packet. 原因: 服务器访问量大,内核netfilter模块conntrack相关参数配置不合理,导致新连接被drop掉。 详细 nf_conntrack模块在kernel 2.6.15(2006-01-03发布) 被引入,支持ipv4和ipv6,取代只支持ipv4的ip_connktrack,用于跟踪连接的状态,供其他模块使用。 最常见的使用场景是 iptables 的 nat 和 state 模块: 1.nat 根据转发规则修改IP包的源/目标地址,靠nf_conntrack的记录才能让返回的包能路由到发请求的机器。 2.state 直接用 nf_conntrack 记录的连接状态(NEW/ESTABLISHED/RELATED/INVALID)来匹配防火墙过滤规则。 3.nf_conntrack用1个哈希表记录已建立的连接,包括其他机器到本机、本机到其他机器、本机到本机(例如 ping 127.0.0.1 也会被跟踪)。 4.如果连接进来比释放的快,把哈希表塞满了,新连接的数据包会被丢掉,此时netfilter变成了一个黑洞,导致拒绝服务。 这发生在3层(网络层),应用程序毫无办法。 解决与调优 A. 调整内核参数 如果不能关掉防火墙,基本思路就是上面说的,调大nf_conntrack_buckets和nf_conntrack_max,调小超时时间。 # net.netfilter.nf_conntrack_buckets 不能直接改(报错) # 需要修改模块的设置: echo 262144 > /sys/module/nf_conntrack/parameters/hashsize # 如果不是root: echo 262144 | sudo tee /sys/module/nf_conntrack/parameters/hashsize # 再查看,bucket已经变成设置的大小 sudo sysctl net.netfilter.nf_conntrack_buckets # max设为桶的4倍 sudo sysctl -w net.netfilter.nf_conntrack_max=1048576 suod sysctl -w net.nf_conntrack_max=1048576 sudo sysctl -w net.netfilter.nf_conntrack_tcp_timeout_fin_wait=30 sudo sysctl -w net.netfilter.nf_conntrack_tcp_timeout_time_wait=30 sudo sysctl -w net.netfilter.nf_conntrack_tcp_timeout_close_wait=15 sudo sysctl -w net.netfilter.nf_conntrack_tcp_timeout_established=300 如果测试过没问题,可以编辑/etc/sysctl.d/下的配置文件(旧系统是/etc/sysctl.conf),系统启动时会加载里面的设置。 sudo vim /etc/sysctl.d/90-conntrack.conf # 格式:<参数>=<值>,等号两边可以空格,支持 # 注释 net.netfilter.nf_conntrack_max=1048576 net.nf_conntrack_max=1048576 net.netfilter.nf_conntrack_tcp_timeout_fin_wait=30 net.netfilter.nf_conntrack_tcp_timeout_time_wait=30 net.netfilter.nf_conntrack_tcp_timeout_close_wait=15 net.netfilter.nf_conntrack_tcp_timeout_established=300 # 如果要马上应用配置文件里的设置: sudo sysctl -p /etc/sysctl.d/90-conntrack.conf # 不传配置文件路径默认加载 /etc/sysctl.conf B. 关闭防火墙 C. 设置不跟踪连接的规则(不推荐) D. 禁用相关模块(不推荐) 外链nf_conntrack说明 项目管理 2018-07-23 00:45:00 「深度学习福利」大神带你进阶工程师,立即查看>>> 1.装饰器模式 概念 允许向一个现有的对象添加新的功能,同时又不改变其结构。装饰者可以在所委托被装饰者的行为之前或之后加上自己的行为,以达到特定的目的。(自由组合功能去实现,相对于继承实现,灵活许多) 实现 增加一个修饰类包裹原来的类,包裹的方式一般是通过在将原来的对象作为修饰类的构造函数的参数。装饰类实现新的功能,但是,在不需要用到新功能的地方,它可以直接调用原来的类中的方法。修饰类必须和原来的类有相同的接口。 项目管理 2018-07-22 20:28:00 |
---|