很多用户选择将 Confluence 运行在反向代理的后面,同时还启用了 HTTPS。将你的的 Confluence 反向代理配置正确就显得非常必要了,并且能够避免后期在使用 Confluence 遇到的很多问题。
/conf/server.xml 文件中。
连接器示例 描述 DEFAULT - 直接连接,不使用代理,针对不使用代理的 HTTP 访问 Confluence | 这个是默认的选项。当你没有使用反向代理并且 没有 启用 HTTPS,启用这个选项。 HTTP - 代理访问 Confluence ,通过 Apache 或者 Nginx 通过 HTTP 访问 | 当你使用了反向代理,并且 没有 启用 HTTPS,选择这个选项。 HTTPS - 直接连接,不使用代理,针对不使用代理的 HTTPS 访问 Confluence | HTTPS - 代理访问 Confluence ,通过 Apache 或者 Nginx 通过 HTTPS 访问 如果你希望使用 HTTPS,但是不配置反向代理,选择这个选项。HTTPS 将会在 Tomcat 中进行配置。 | 如果你希望使用反向代理,并且还启用 HTTPS。请使用这个选项,同时这个也是最常用的配置。 |
---|
我们仅提供 HTTP/HTTPS 连接器的示例。如果你不能使用 AJP 连接器(例如,使用 Apache mod_jk)为 Synchrony。 Synchrony 在配置在协同编辑使用,不能接受 AJP 连接。 如果你计划使用协同编辑,这里有一系列的基于代理和 SSL 连接的考虑。请参考 proxy and SSL considerations 页面中的内容。当你决定何种配置最适合你配置反向代理,你需要考虑这些因素。 https://www.cwiki.us/display/CONF6ZH/Proxy+and+HTTPS+setup+for+Confluence 「深度学习福利」大神带你进阶工程师,立即查看>>> 策略模式: 定义了算法族(就是鸭子的飞和叫的行为组),分别封装起来,让它们之间可以互相替换, 此模式让算法的变化独立于使用算法的客户。 设计一个不同鸭子叫和飞的行为: 飞行为的抽象类: public interface FlyBehavior { public void fly(); } 叫行为的抽象类: public interface QuackBehavior { public void quack(); } 实现多个飞行为: // 会飞 public class FlyWithWings implements FlyBehavior { public void fly() { System.out.println(“I’m flying!!”); } } // 不会飞 public class FlyNoWay implements FlyBehavior { public void fly() { System.out.println(“I can’t fly”); } } 实现多个叫的行为实例: public class Quack implements QuackBehavior { public void quack() { System.out.println(“Quack”); } } public class MuteQuack implements QuackBehavior { public void quack() { System.out.println(“<< Silence >>”); } } public class Squeak implements QuackBehavior { public void quack() { System.out.println(“Squeak”); } } 鸭子的父类: public abstract class Duck { FlyBehavior flyBehavior; QuackBehavior quackBehavior; public Duck() {} public abstract void display(); public void performFly() { // 委托给行为类 flyBehavior.fly(); } public void performQuack() { // 委托给行为类 quackBehavior.quack(); } public void swim() { System.out.println(“All ducks float, even decoys!”); } } 开始创建一只鸭子: public class MallardDuck extends Duck { // 在构造函数中设定行为不易扩展,使用set方式动态创建/改变不同行为的鸭子 public MallardDuck() { quackBehavior = new Quack(); flyBehavior = new FlyWithWings(); } public void display() { System.out.println(“I’m a real Mallard duck”); } public void setFlyBehavior(FlyBehavior fb) { flyBehavior = fb; } public void setQuackBehavior(QuackBehavior qb) { quackBehavior = qb; } } 让鸭子飞起来、叫起来 public class MiniDuckSimulator { public static void main(String[] args) { Duck mallard = new MallardDuck(); mallard.performQuack(); // 进行委托 mallard.performFly(); // 随意改变鸭子行为 mallard.setFlyBehavior(new FlyNoWay()); mallard.setQuackBehavior(new MuteQuack()); mallard.performQuack(); // 进行委托 mallard.performFly(); } }
「深度学习福利」大神带你进阶工程师,立即查看>>> 在默认的情况下,所有的 Confluence 计划任务都是默认启用的。 使用 启用(Disable )/ 禁用(Enable ) 连接操作来启用和禁用每一个计划任务。 不是所有的加护任务都可以被禁用的。 https://www.cwiki.us/display/CONF6ZH/Scheduled+Jobs 「深度学习福利」大神带你进阶工程师,立即查看>>> 手动运行一个任务 希望手动运行一个计划任务,进入计划任务的列表中,找到你希望手动运行的计划任务,在这个计划任务的边上选择 运行(Run) 。这个计划任务将会马上执行。 不是所有的计划任务都可以手动运行的。 修改任务的计划 希望修改计划任务的计划时间: 找到你希望修改的计划任务边上的 编辑( Edit )。 使用 Cron 表达式输入你希望这个计划任务运行的新日期和时间——关 Cron 表达式的相关信息,请参考 下面 的内容。 保存(Save ) 你对计划任务的修改,或者 重置(Revert ) 为默认设置。 不是所有的计划任务都可以配置时间的。 屏幕截图:配置一个计划任务 https://www.cwiki.us/display/CONF6ZH/Scheduled+Jobs 「深度学习福利」大神带你进阶工程师,立即查看>>> 希望访问 Confluence 计划任务配置界面: 进入 > 基本配置( General Configuration) > 计划任务(Scheduled Jobs) 所有的计划任务将会按照下面的格式列出来: 状态(Status ) - 这个计划任务的状态。这个状态为 'Scheduled' (当前这个计划任务是启用的)或者 'Disabled'。 上次执行(Last Execution) - 这个计划任务上次执行的日期和时间。如果这个计划任务没有执行的话,这个字段为空。 下次执行(Next Execution) - 这个计划任务下次执行的日期和时间。如果任务被禁用的话,这个字段将会显示符号(-)。 平均执行时间(Avg. Duration) - 计划任务的执行时间(毫秒)这个时间表示的是这个计划任务执行完成所消耗的世界(上次任务完成所需要的时间)。 操作(Actions) - 对计划任务可以进行操作,包括编辑,手动运行,查看历史或者禁用这个任务。 屏幕截图:计划任务 https://www.cwiki.us/display/CONF6ZH/Scheduled+Jobs 「深度学习福利」大神带你进阶工程师,立即查看>>> 管理员控制台能够允许你对 Confluence 运行的计划任务进行计划的调整,这些计划任务将会按照你的调整按时执行。可以按照计划执行的任务如下: Confluence 站点备份 存储优化任务,清理 Confluence 的临时目录中的文件和缓存 索引优化任务,确定 Confluence 的索引能够保持与数据库同步是最新的索引 邮件队列优化任务,确保 Confluence 的邮件任务能够处理邮件队列并且所有的邮件都能发送出去。 你需要具有 系统管理员权限 才能对计划任务进行编辑和手动运行。 https://www.cwiki.us/display/CONF6ZH/Scheduled+Jobs 「深度学习福利」大神带你进阶工程师,立即查看>>> ZooKeeper典型应用场景一览 数据发布与订阅(配置中心) 发布与订阅模型,即所谓的配置中心,顾名思义就是发布者将数据发布到ZK节点上,供订阅者动态获取数据,实现配置信息的集中式管理和动态更新。例如全局的配置信息,服务式服务框架的服务地址列表等就非常适合使用。 应用中用到的一些配置信息放到ZK上进行集中管理。这类场景通常是这样:应用在启动的时候会主动来获取一次配置,同时,在节点上注册一个Watcher,这样一来,以后每次配置有更新的时候,都会实时通知到订阅的客户端,从来达到获取最新配置信息的目的。 分布式搜索服务中,索引的元信息和服务器集群机器的节点状态存放在ZK的一些指定节点,供各个客户端订阅使用。 分布式日志收集系统。这个系统的核心工作是收集分布在不同机器的日志。收集器通常是按照应用来分配收集任务单元,因此需要在ZK上创建一个以应用名作为path的节点P,并将这个应用的所有机器ip,以子节点的形式注册到节点P上,这样一来就能够实现机器变动的时候,能够实时通知到收集器调整任务分配。 系统中有些信息需要动态获取,并且还会存在人工手动去修改这个信息的发问。通常是暴露出接口,例如JMX接口,来获取一些运行时的信息。引入ZK之后,就不用自己实现一套方案了,只要将这些信息存放到指定的ZK节点上即可。 注意:在上面提到的应用场景中,有个默认前提是:数据量很小,但是数据更新可能会比较快的场景。 负载均衡 这里说的负载均衡是指软负载均衡。在分布式环境中,为了保证高可用性,通常同一个应用或同一个服务的提供方都会部署多份,达到对等服务。而消费者就须要在这些对等的服务器中选择一个来执行相关的业务逻辑,其中比较典型的是消息中间件中的生产者,消费者负载均衡。 消息中间件中发布者和订阅者的负载均衡,linkedin开源的KafkaMQ和阿里开源的 metaq 都是通过zookeeper来做到生产者、消费者的负载均衡。这里以metaq为例如讲下: 生产者负载均衡:metaq发送消息的时候,生产者在发送消息的时候必须选择一台broker上的一个分区来发送消息,因此metaq在运行过程中,会把所有broker和对应的分区信息全部注册到ZK指定节点上,默认的策略是一个依次轮询的过程,生产者在通过ZK获取分区列表之后,会按照brokerId和partition的顺序排列组织成一个有序的分区列表,发送的时候按照从头到尾循环往复的方式选择一个分区来发送消息。 消费负载均衡: 在消费过程中,一个消费者会消费一个或多个分区中的消息,但是一个分区只会由一个消费者来消费。MetaQ的消费策略是: 每个分区针对同一个group只挂载一个消费者。 如果同一个group的消费者数目大于分区数目,则多出来的消费者将不参与消费。 如果同一个group的消费者数目小于分区数目,则有部分消费者需要额外承担消费任务。 在某个消费者故障或者重启等情况下,其他消费者会感知到这一变化(通过 zookeeper watch消费者列表),然后重新进行负载均衡,保证所有的分区都有消费者进行消费。 命名服务(Naming Service) 命名服务也是分布式系统中比较常见的一类场景。在分布式系统中,通过使用命名服务,客户端应用能够根据指定名字来获取资源或服务的地址,提供者等信息。被命名的实体通常可以是集群中的机器,提供的服务地址,远程对象等等——这些我们都可以统称他们为名字(Name)。其中较为常见的就是一些分布式服务框架中的服务地址列表。通过调用ZK提供的创建节点的API,能够很容易创建一个全局唯一的path,这个path就可以作为一个名称。 阿里巴巴集团开源的分布式服务框架Dubbo中使用ZooKeeper来作为其命名服务,维护全局的服务地址列表, 点击这里 查看Dubbo开源项目。在Dubbo实现中: 服务提供者在启动的时候,向ZK上的指定节点/dubbo/${serviceName}/providers目录下写入自己的URL地址,这个操作就完成了服务的发布。 服务消费者启动的时候,订阅/dubbo/${serviceName}/providers目录下的提供者URL地址, 并向/dubbo/${serviceName} /consumers目录下写入自己的URL地址。 注意,所有向ZK上注册的地址都是临时节点,这样就能够保证服务提供者和消费者能够自动感应资源的变化。 另外,Dubbo还有针对服务粒度的监控,方法是订阅/dubbo/${serviceName}目录下所有提供者和消费者的信息。 分布式通知/协调 ZooKeeper中特有watcher注册与异步通知机制,能够很好的实现分布式环境下不同系统之间的通知与协调,实现对数据变更的实时处理。使用方法通常是不同系统都对ZK上同一个znode进行注册,监听znode的变化(包括znode本身内容及子节点的),其中一个系统update了znode,那么另一个系统能够收到通知,并作出相应处理 另一种心跳检测机制:检测系统和被检测系统之间并不直接关联起来,而是通过zk上某个节点关联,大大减少系统耦合。 另一种系统调度模式:某系统有控制台和推送系统两部分组成,控制台的职责是控制推送系统进行相应的推送工作。管理人员在控制台作的一些操作,实际上是修改了ZK上某些节点的状态,而ZK就把这些变化通知给他们注册Watcher的客户端,即推送系统,于是,作出相应的推送任务。 另一种工作汇报模式:一些类似于任务分发系统,子任务启动后,到zk来注册一个临时节点,并且定时将自己的进度进行汇报(将进度写回这个临时节点),这样任务管理者就能够实时知道任务进度。 总之,使用zookeeper来进行分布式通知和协调能够大大降低系统之间的耦合 集群管理与Master选举 集群机器监控:这通常用于那种对集群中机器状态,机器在线率有较高要求的场景,能够快速对集群中机器变化作出响应。这样的场景中,往往有一个监控系统,实时检测集群机器是否存活。过去的做法通常是:监控系统通过某种手段(比如ping)定时检测每个机器,或者每个机器自己定时向监控系统汇报“我还活着”。 这种做法可行,但是存在两个比较明显的问题: 集群中机器有变动的时候,牵连修改的东西比较多。 有一定的延时。 利用ZooKeeper有两个特性,就可以实时另一种集群机器存活性监控系统: 客户端在节点 x 上注册一个Watcher,那么如果 x?的子节点变化了,会通知该客户端。 创建EPHEMERAL类型的节点,一旦客户端和服务器的会话结束或过期,那么该节点就会消失。 例如,监控系统在 /clusterServers 节点上注册一个Watcher,以后每动态加机器,那么就往 /clusterServers 下创建一个 EPHEMERAL类型的节点:/clusterServers/{hostname}. 这样,监控系统就能够实时知道机器的增减情况,至于后续处理就是监控系统的业务了。 Master选举则是zookeeper中最为经典的应用场景了。 在分布式环境中,相同的业务应用分布在不同的机器上,有些业务逻辑(例如一些耗时的计算,网络I/O处理),往往只需要让整个集群中的某一台机器进行执行,其余机器可以共享这个结果,这样可以大大减少重复劳动,提高性能,于是这个master选举便是这种场景下的碰到的主要问题。 利用ZooKeeper的强一致性,能够保证在分布式高并发情况下节点创建的全局唯一性,即:同时有多个客户端请求创建 /currentMaster 节点,最终一定只有一个客户端请求能够创建成功。利用这个特性,就能很轻易的在分布式环境中进行集群选取了。 另外,这种场景演化一下,就是动态Master选举。这就要用到?EPHEMERAL_SEQUENTIAL类型节点的特性了。 上文中提到,所有客户端创建请求,最终只有一个能够创建成功。在这里稍微变化下,就是允许所有请求都能够创建成功,但是得有个创建顺序,于是所有的请求最终在ZK上创建结果的一种可能情况是这样: /currentMaster/{sessionId}-1 ,?/currentMaster/{sessionId}-2 ,?/currentMaster/{sessionId}-3 ….. 每次选取序列号最小的那个机器作为Master,如果这个机器挂了,由于他创建的节点会马上小时,那么之后最小的那个机器就是Master了。 在搜索系统中,如果集群中每个机器都生成一份全量索引,不仅耗时,而且不能保证彼此之间索引数据一致。因此让集群中的Master来进行全量索引的生成,然后同步到集群中其它机器。另外,Master选举的容灾措施是,可以随时进行手动指定master,就是说应用在zk在无法获取master信息时,可以通过比如http方式,向一个地方获取master。 在Hbase中,也是使用ZooKeeper来实现动态HMaster的选举。在Hbase实现中,会在ZK上存储一些ROOT表的地址和HMaster的地址,HRegionServer也会把自己以临时节点(Ephemeral)的方式注册到Zookeeper中,使得HMaster可以随时感知到各个HRegionServer的存活状态,同时,一旦HMaster出现问题,会重新选举出一个HMaster来运行,从而避免了HMaster的单点问题 分布式锁 分布式锁,这个主要得益于ZooKeeper为我们保证了数据的强一致性。锁服务可以分为两类,一个是保持独占,另一个是控制时序。 所谓保持独占,就是所有试图来获取这个锁的客户端,最终只有一个可以成功获得这把锁。通常的做法是把zk上的一个znode看作是一把锁,通过create znode的方式来实现。所有客户端都去创建 /distribute_lock 节点,最终成功创建的那个客户端也即拥有了这把锁。 控制时序,就是所有视图来获取这个锁的客户端,最终都是会被安排执行,只是有个全局时序了。做法和上面基本类似,只是这里 /distribute_lock 已经预先存在,客户端在它下面创建临时有序节点(这个可以通过节点的属性控制:CreateMode.EPHEMERAL_SEQUENTIAL来指定)。Zk的父节点(/distribute_lock)维持一份sequence,保证子节点创建的时序性,从而也形成了每个客户端的全局时序。 分布式队列 队列方面,简单地讲有两种,一种是常规的先进先出队列,另一种是要等到队列成员聚齐之后的才统一按序执行。对于第一种先进先出队列,和分布式锁服务中的控制时序场景基本原理一致,这里不再赘述。 第二种队列其实是在FIFO队列的基础上作了一个增强。通常可以在 /queue 这个znode下预先建立一个/queue/num 节点,并且赋值为n(或者直接给/queue赋值n),表示队列大小,之后每次有队列成员加入后,就判断下是否已经到达队列大小,决定是否可以开始执行了。这种用法的典型场景是,分布式环境中,一个大任务Task A,需要在很多子任务完成(或条件就绪)情况下才能进行。这个时候,凡是其中一个子任务完成(就绪),那么就去 /taskList 下建立自己的临时时序节点(CreateMode.EPHEMERAL_SEQUENTIAL),当 /taskList 发现自己下面的子节点满足指定个数,就可以进行下一步按序进行处理了。最后一句,分享点我 Redis缓存技术交流组: 1903832579 「深度学习福利」大神带你进阶工程师,立即查看>>> 1.修改server.xml文件,如下:
注意: 这里使用的是https的认证方式,需要将这个配置放开,并做如下修改: port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol" maxThreads="150" SSLEnabled="true" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS" keystoreFile="D:/sso-cas/caskey/keycard" keystorePass="minglisoft" /> 注意: keystoreFile="D:/sso-cas/caskey/keycard" --证书了路径 keystorePass="minglisoft" --证书密码 2.测试https的8443端口是否可以访问:https://localhost:8443 配置没有问题 3.可以配置只通过域名访问,还是修改server.xml文件,将localhost的配置修改为jeesz.cn如下: unpackWARs="true" autoDeploy="true"> unpackWARs="true" autoDeploy="true"> 重启tomcat容器,访问如下:http://jeesz.cn:8080 4.将cas-server-webapp-4.2.7.war包拷贝到tomcat容器中,并命名为cas.war如下:
5.重启启动tomcat容器,访问cas, https://jeesz.cn:8443/cas 默认用户名为:casuser 默认密码为:Mellon
以下是所有的cas sso单点登录交付件和源码
「深度学习福利」大神带你进阶工程师,立即查看>>> 前面几篇我们已经介绍了Spring Cloud和oauth2的知识点,今天我们要利用Spring Cloud和oauth2进行commonservice-sso服务搭建,本节我们只是搭建commonservice-sso的基础平台,闲话少说,直接将步骤记录下来: 1. 创建maven项目commonservice-sso,其中pom.xml文件配置如下: 4.0.0 com.ml.honghu commonservice 0.0.1-SNAPSHOT commonservice-sso jar org.springframework.cloud spring-cloud-starter-eureka org.springframework.cloud spring-cloud-starter-config org.springframework.boot spring-boot-starter-actuator org.springframework.boot spring-boot-starter-data-rest org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-security org.springframework.security.oauth spring-security-oauth2 org.springframework.boot spring-boot-starter-test org.springframework.hateoas spring-hateoas org.springframework.boot spring-boot-starter-data-rest com.ml.honghu.common.framework common-framework-dao 1.0.0-SNAPSHOT org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-freemarker com.ml.honghu component-base org.springframework.boot spring-boot-maven-plugin 1 repackage 2 build-info 2. 配置bootstrap.yml文件 spring: application: name: commonservice-sso profiles: active: dev,discoveryClient cloud: config: discovery: enabled: true service-id: commonservice-config-server eureka: client: service-url: defaultZone: http://honghu:123456@localhost:8761/eureka instance: prefer-ip-address: true 3. 配置项目启动文件 package com.ml.honghu; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; @SpringBootApplication @EnableEurekaClient public class SSOApplication { public static void main(String[] args) { SpringApplication.run(SSOApplication.class, args); } } 4. 创建sso相关表: oauth_access_token、oauth_approvals、 oauth_client_details、oauth_client_token、 oauth_code、oauth_refresh_token /* Navicat MySQL Data Transfer Source Server : localhost Source Server Version : 50621 Source Host : localhost:3306 Source Database : honghu Target Server Type : MYSQL Target Server Version : 50621 File Encoding : 65001 Date: 2017-10-26 20:12:56 */ SET FOREIGN_KEY_CHECKS=0; -- ---------------------------- -- Table structure for `oauth_access_token` -- ---------------------------- DROP TABLE IF EXISTS `oauth_access_token`; CREATE TABLE `oauth_access_token` ( `token_id` varchar(256) DEFAULT NULL, `token` blob, `authentication_id` varchar(128) NOT NULL, `user_name` varchar(256) DEFAULT NULL, `client_id` varchar(256) DEFAULT NULL, `authentication` blob, `refresh_token` varchar(256) DEFAULT NULL, PRIMARY KEY (`authentication_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- ---------------------------- -- Table structure for `oauth_approvals` -- ---------------------------- DROP TABLE IF EXISTS `oauth_approvals`; CREATE TABLE `oauth_approvals` ( `userId` varchar(256) DEFAULT NULL, `clientId` varchar(256) DEFAULT NULL, `scope` varchar(256) DEFAULT NULL, `status` varchar(10) DEFAULT NULL, `expiresAt` datetime DEFAULT NULL, `lastModifiedAt` datetime DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of oauth_approvals -- ---------------------------- -- ---------------------------- -- Table structure for `oauth_client_details` -- ---------------------------- DROP TABLE IF EXISTS `oauth_client_details`; CREATE TABLE `oauth_client_details` ( `client_id` varchar(128) NOT NULL, `resource_ids` varchar(256) DEFAULT NULL, `client_secret` varchar(256) DEFAULT NULL, `scope` varchar(256) DEFAULT NULL, `authorized_grant_types` varchar(256) DEFAULT NULL, `web_server_redirect_uri` varchar(256) DEFAULT NULL, `authorities` varchar(256) DEFAULT NULL, `access_token_validity` int(11) DEFAULT NULL, `refresh_token_validity` int(11) DEFAULT NULL, `additional_information` varchar(4096) DEFAULT NULL, `autoapprove` varchar(256) DEFAULT NULL, PRIMARY KEY (`client_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- ---------------------------- -- Table structure for `oauth_client_token` -- ---------------------------- DROP TABLE IF EXISTS `oauth_client_token`; CREATE TABLE `oauth_client_token` ( `token_id` varchar(256) DEFAULT NULL, `token` blob, `authentication_id` varchar(128) NOT NULL, `user_name` varchar(256) DEFAULT NULL, `client_id` varchar(256) DEFAULT NULL, PRIMARY KEY (`authentication_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of oauth_client_token -- ---------------------------- -- ---------------------------- -- Table structure for `oauth_code` -- ---------------------------- DROP TABLE IF EXISTS `oauth_code`; CREATE TABLE `oauth_code` ( `code` varchar(256) DEFAULT NULL, `authentication` blob ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of oauth_code -- ---------------------------- -- ---------------------------- -- Table structure for `oauth_refresh_token` -- ---------------------------- DROP TABLE IF EXISTS `oauth_refresh_token`; CREATE TABLE `oauth_refresh_token` ( `token_id` varchar(256) DEFAULT NULL, `token` blob, `authentication` blob ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 备注: oauth的相关表是用来存储用户的token信息和认证信息的。 本节搭建先搭建那么多,后面的业务代码太多,我们会在后面的章节中放出来。 从现在开始,我这边会将近期研发的spring cloud微服务云架构的搭建过程和精髓记录下来,帮助更多有兴趣研发spring cloud框架的朋友,大家来一起探讨spring cloud架构的搭建过程及如何运用于企业项目。完整项目的源码来源 技术支持1791743380 「深度学习福利」大神带你进阶工程师,立即查看>>> cd /usr/local/tomcat/tomcat-pm bin/shutdown.sh ps -ef|grep tomcat kill -9 进程号 bin/startup.sh tail -f logs/catalina.out (bin同级目录) Ctrl+c 「深度学习福利」大神带你进阶工程师,立即查看>>> [root @bogon ~]# cd /usr/local/tomcat/apache-tomcat-8.5.8/bin/ [root @bogon bin]# vi startup.sh 在最后一行增加jpda,注意前后有空格 保存退出 [root @bogon bin]# vi catalina.sh /jpda 搜索 如果查找下一个,按“n”即可 保存退出 注意防火墙要开放5005端口 如果是jar,则: #!/bin/bash nohup java -jar -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005 /data/sharksucker/workspace/resource/sharksucker-admin.jar idea连接调试
打断点即可调试 「深度学习福利」大神带你进阶工程师,立即查看>>> 想来想去,这个文章的名字还是叫理性看待性能测试更为妥当。今天在微博上看到有人@到我提到一个关于性能测试的问题,我在回复了之后,感觉意犹未尽。由于微博上打字太费劲了,想说的话还没说完就不让输入了。只能回来自己写一个文章以平复一下想说未说完的憋闷。 我们总是会听到这样的话:性能测试工程师应该会操作系统、数据库、网络、应用、代码等等。这样的话,大部分是从有经验的性能测试所谓的前辈的嘴里说出来,让一些人觉得说这样的话的人牛B而且非常值得膜拜。可气的是没有说明白这个程度到底是什么样的,其实从我个人从业这么多年的角度来看,没有哪一个人可以把这些东西,全都精通到不可一世的程度的。要是说完全不知道,那也不太可能,哪个IT行业的人一生不得总是接触这些东西呢。接触并不代表可以掌握和控制它,这种完全不同的视角会在含糊其词之间被无视。所以,我觉得对性能测试工程师,没有必要这么苛刻。要求可以,但是要理智的要求。要求懂操作系统、数据库、网络、应用?没有关系,正常的操作是可以做的,和性能有关的常用的判断手段是可以做的,和性能有关的常用的参数配置是可以知道的。(其他亦如此)。我觉得这样的要求对中级性能测试工程师就可以了。至少可以做大部分的工作了。也许会有人接着问了,高级性能测试工程师又要求什么呢?我觉得:性能测试的思维是高级性能测试工程师必须修炼的内功心法。面对一个未做过的系统,如果出现性能问题,从自己的经验教训中去判断寻找一些蛛丝马迹,配合整体的团队寻找解决问题的方法,这才是要体现出来的价值。 同时,我们还会听到另一种声音:性能测试不就是拿着工具录个脚本,加些用户跑一下就行了吗?于是乎,经常会有一些人提出一些比较苛刻的性能测试需求:很短的时间内出一个性能测试的结果,并且要说出性能瓶颈在哪里。这种性能需求大部分来自于一些对性能测试并不十分了解的人群,但是这部分人群又有足够的能量影响着性能测试的方向。比如说,客户方的某个领导。在这样的情形之下,做为性能测试的行内人,就有引导客户需求、说服客户的职责了。当然,在现在这种利益驱动的市场模式之下,花个大价钱做个完整的性能测试,可能还没有给某些关键人物来点贿赂更为有效。毕竟系统上线就死的也不是很多嘛,哪有那么多的系统都像某订票网站那么悲摧呢。只有实际的损失才能有切肤之痛。 说到性能测试产生的实际的损失,我记得我在一次测试沙龙上说过一句话:在某些感受不到性能测试价值的企业里,性能测试是在谩骂和鄙视中被从踏得满是灰尘的地上捡起来的。在一些实际的利益损失之后,那些各相关部门才会捡起这个大海中救命的木头。可惜的是,这个时候各种动作都是亡羊补牢,损失的再也不会回来。那些被终端用户的嘲笑也被记录在企业的发展历史中。话说,前一阵子,一个金融行业巨头的某系统由于参数配置的问题一上线就死了,幸好产生的社会影响并不大;还有某证券公司的渠道总线因为性能不达标导致停了半个小时,损失了1个亿;还有某互联网公司的系统上线之后,因为数据库承受不了压力而出现了大量的用户失败的现象,等等。这样的情况举不胜举,我都不用众所周知的某订票网站做例子。 不管是在什么样的行业中,我觉得都要正视行业的处境,也需要明白自己的能力在行业中的位置。在自己的岗位上,就要明白自己的职责。我们不应该给性能测试相关的岗位太多的压力,也不应该报有过高的期望。同时,我们也要知道性能测试的岗位能做到什么样的事情。做为一个性能测试工程师,本身就要明白性能测试的工作职责。我看到很多个招聘性能测试职位的要求,有些要求招的不是人,而是神。由于神不多,所以只能抱怨现在这个行业真是整体能力太差了。性能测试的整个过程中确实应该包括完整的性能分析、优化工作,也需要给足够的时间、资源和支持。 一个性能项目,如果想做到完整的性能分析,必须要有其他团队的支持。我们可以定位到一个具体的函数,但是如果我们也把函数改了,是不是更能体现我们强大呢?显然这不符合逻辑。这不是我们该干的事情,除非把开发的工资也发给我们。所以,我的观点是:性能分析是性能测试过程中的一个必然的环节;性能分析需要各个相关团队的支持。当然有些团队可能因为时间比较紧,最后留给系统性能测试的只有一点点可怜的时间。在这样的情况之下,就不要再指望性能测试能带来多大的强心剂了,最多也就是安慰安慰领导或者客户罢了。 还是总结一下:认清楚性能测试职位能做到的事情,明确性能测试工作中需要的支持。不要有无谓的天马行空的论调和不切实际的需求。真正的理性的看待性能测试,才能让性能测试发挥它本应该发挥的也可以发挥的最大的价值。 后记:希望行内人和行外人都给一个合理的空间。 「深度学习福利」大神带你进阶工程师,立即查看>>> 如果你得到了与下面显示内容类似的信息话,那么你最好考虑修改 Confluence 的日志级别输出更多的信息。如果你考虑通过 Atlassian support 获得帮助,那么这些详细的错误信息能够更好的帮助我们找到问题的原因。 增加日志的级别将会让我们能够对下面的问题进行诊断: org.springframework.dao.DataIntegrityViolationException: (HibernateTemplate): data integrity violated by SQL '' ; nested exception is java.sql.BatchUpdateException: Duplicate entry '1234' for key 1 at org.springframework.jdbc.support.SQLStateSQLExceptionTranslator.translate(SQLStateSQLExceptionTranslator.java: 88 ) caused by: java.sql.BatchUpdateException: Duplicate entry '1234' for key 1 at com.mysql.jdbc.ServerPreparedStatement.executeBatch(ServerPreparedStatement.java: 647 ) |
---|
或者 (HibernateTemplate): data integrity violated by SQL '' ; nested exception is java.sql.BatchUpdateException: ORA- 00001 : unique constraint ( CONFLUENCE.SYS_C0012345) violated |
---|
这个文档对如果在你的系统中增加日志级别,并让日志输出更多详细信息进行了说明。 Changing the logging levels via the Administration Console 从 Confluence 2.7 开始,你可以在你的 Confluence 管理员控制台中调整日志的级别——请阅读 Working with Confluence Logs 页面中的相关内容。下面我们将会告诉你如何直接编辑 log4j 文件。 打开 confluence/WEB-INF/classes/log4j.properties 然后取消注释下面的行。 ## 行是注释,请保持这行的完整。 ## log hibernate prepared statements/SQL queries (equivalent to setting ' hibernate.show_sql' to 'true' ) # log4j.logger.net.sf.hibernate.SQL=DEBUG ## log hibernate prepared statement parameter values # log4j.logger.net.sf.hibernate.type=DEBUG |
---|
如果你不能在你的 log4j.properties 文件中找到上面的内容的话,请在文件的最后添加上这些内容。 重启 Confluence。 重新操作你出现错误的的步骤。 压缩你的日志目录然后添加到你的支持请求工单中。 如果你使用的是 Oracle 数据库同时你收到了一个 constraint error ,请询问你的数据库管理员是哪个一个数据库表和列有约束(例如: CONFLUENCE.SYS_C0012345 ),获得相关信息后将这些内容添加到你的工单中。 打开 confluence/WEB-INF/classes/log4j.properties 文件,删除在第一步中添加的上面 4 行(让 Confluence 输出更多的日志信息将会影响 Confluence 的性能,在生产环境中,你应该不输出这些信息)。 相关主题 Enabling Detailed SQL Logging Working with Confluence Logs Troubleshooting failed XML site backups https://www.cwiki.us/display/CONF6ZH/Troubleshooting+SQL+Exceptions 「深度学习福利」大神带你进阶工程师,立即查看>>> 日志级别 DEBUG - 被设计为用来获得最多的信息和事件,在对应用程序进行调试的时候,这个日志级别通常能够提供最多的有效信息(查看应用程序怎么了) INFO - 有关系统正常运行-计划任务运行,服务器开始和结束的世界,用户触发的进程和操作的一些有关声明和输出 WARN - 有关这方面的内容并不是表示系统本身出错了,而是表示系统本身有优化的空间 ERROR - 有关这个的输出表示的是系统在运行的时候遇到了一些错误 FATAL - 有关这个级别的输出表示系统进入了一个非常糟糕的状态并且已经不能从这个状态中恢复了。 TRACE - 没有在 Confluence 中输出 有 2 个方法能够对 Confluence 的日志输出进行调整,相关的方法描述在 log4j Logging Levels 中。 通过 管理员控制台(Administration Console) 修改运行日志的级别(这个修改将会在系统重启后失效,不是一个永久的修改)。 手动修改 \confluence\WEB-INF\classes\log4j.properties 文件。 默认日志级别 标准的 Confluence 日志级别 WARN 被保留在 Confluence 服务器中与 Confluence 管理员进行通信。 WARN 及其更高的日志级别应该在 Confluence 保留使用为某些特定的用途,这些能够提醒系统管理员关注这些错误的日志信息,然后对出现的问题进行纠正。 请参考 log4j manual 来获得更多的信息。 https://www.cwiki.us/display/CONF6ZH/log4j+Logging+Levels 「深度学习福利」大神带你进阶工程师,立即查看>>> 我们推荐你根据你的需求来配置你自己的 Confluence 日志。你可以有下面 2 种方法来修改你的日志: 通过 Confluence 管理员控制台进行配置 – 你的修改仅在本次修改有效,下次重启后将会把所有修改重置。 编辑属性文件 – 你的修改将会在下次重启后生效同时针对所有的会话。 这 2 种方式的修改的方法将在下面的章节中描述。在一些很不常见的情况下,你可能同时还需要修改 logging.properties 文件。 术语: 在 log4j 中,一个 'logger' 就是一个命名的实体。日志名是大小写敏感的,这些命名还遵循分段命名的结构。例如一个 logger 被命名为 com.foo ,那这个名是 com.foo.Bar 的上级名称。 在 Confluence 管理员控制台中配置日志 你可以通过 Confluence 管理员控制台(Administration Console) 来修改 Confluence 的一些日志的表现。任何按照这个方法修改的的内容只会在当前 Confluence 的运行实例阶段有效(重启 Confluence 后,你修改的配置将失效)。这里修改的配置内容将不会写入到 log4j.properties 文件中,同时当你在下一次停止 Confluence 的时候修改的内容将会被丢弃。 Confluence 的管理员控制台不能修改所有的日志表现。如果你不能在下面的描述的内容中找到修改的对象,那么你需要停止 Confluence 后 编辑日志属性文件 。 Confluence 管理员控制台中的 日志和属性( Logging and Profiling )界面显示了当前定义的所有日志列表。在这个界面中你可以: 打开或者关闭 page profiling 。 打开或者关闭 SQL 语句日志。 为一个类或者包添加一个新的日志。 为一个类或者包删除一个新的日志。 为一个类或者包设置日志的级别(INFO, WARN, FATAL, ERROR 或者 DEBUG)。 重置所有的日志级别到 predefined 属性。 修改日志配置 在屏幕的右上角单击 控制台按钮 ,然后选择 General Configuration 链接。 在左侧面板中 管理(Administration) 的界面下面选择 日志和配置(Logging and Profiling) 。 你需要具有 System Administrator 权限才可以进行这个操作。 日志和配置(Logging and Profiling) 界面将会显示,如下图显示,使用下面的的指南来记录 Confluence 的日志表现: 性能属性(Performance Profiling) — 请参考页面 Troubleshooting Slow Performance Using Page Request Profiling 中的内容 SQL 日志( SQL Logging )' — 单击 启用 SQL 日志( Enable SQL Logging )按钮来启用记录系统运行的 SQL 脚本。 如果你需要启用日志 SQL 参数变量,你需要修改 properties file 文件中的设置。这个配置的修改在管理员控制台界面中不可用。 Log4j 日志( Log4j Logging ) — 单击下面的的属性按钮来重置你的日志定义为默认的初始化定义: 'Production ' 属性定义了标准的属性,推荐你在生产环境中使用。 ' Diagnostic ' 属性定义了更多的属性配置,能够为你提供更多的日志信息。这个配置将会降低你系统的性能并且让你日志文件更快的填充满。 ' Add New Entry ' — 输入类或者包的名字到边上的文本输入框中,然后单击 添加实体( Add Entry )按钮。这个新的日志将会显示 已存在的级别(Existing Levels) 在下面的界面中。 ' Existing Levels ' - 这个是当前你 Confluence 实例中的操作。 你可以通过选择 New Level 的下拉列表来修改日志级别。请阅读 Apache documentation 页面中的内容来定义每一个级别。 单击 ' Remove ' 链接来停止日志记录你选择的类和包的名称。 单击 保存( Save )按钮来保存你在 ' Existing Levels ' 部分所做的任何修改。 屏幕截图:修改日志级别和参数 编辑属性文件 希望配置日志级别和其他基础参数的设置,你需要停止 Confluence 然后修改 log4j.properties 文件的设置,如果 上面 的描述。 这个属性文件包括了一系列的不同日志并且可以被你取消备注,如果你希望记录一些特定的组件。请参考 Apache log4j documentation 页面中的内容。 请参考 Working with Confluence Logs 页面中的的内容来获得一些配置的指南,你可能会发现这些指南对你对问题的诊断会比较有用。 针对 logging.properties 中的 java.util.logging 配置级别 一些库在 Confluence 中被用来使用 java.util.logging 而不是 log4j 或者 slf4j。这些库包括: com.sun.jersey org.apache.shindig net.sf.ehcache Confluence 的 logging.properties 文件设置将 java.util.logging 重定向为 log4j 的特定级别,这个重定向是通过 slf4j 操作的。 为了增加这些库的日志级别,你必须首先配置 logging.properties 文件中的 /confluence/WEB-INF/classes/ 。这些日志级别与 Logj 的级别不同,如 这里 列出来的。 例如,为了让 shindig 增加在日志中输出的内容信息,需要修改 in the logging.properties 文件: org.apache.shindig.level = INFO 为 org.apache.shindig.level = FINE 然后需要使用上面提供的 2 中方式中的一种来配置 log4j 级别。 https://www.cwiki.us/display/CONF6ZH/Configuring+Logging 「深度学习福利」大神带你进阶工程师,立即查看>>>
1.centos7版本对防火墙进行 加强,不再使用原来的iptables,启用firewall 1.查看已开放的端口(默认不开放任何端口) firewall-cmd --list-ports 2.开启80端口 firewall-cmd --zone=public(作用域) --add-port=80/tcp(端口和访问类型) --permanent(永久生效) 3.重启防火墙 firewall-cmd --reload 4.停止防火墙 systemctl stop firewalld.service 5.禁止防火墙开机启动 systemctl disable firewalld.service 6.删除 firewall-cmd --zone= public --remove-port=80/tcp --permanent 2.centos7以下版本 1.开放80,22,8080 端口 /sbin/iptables -I INPUT -p tcp --dport 80 -j ACCEPT /sbin/iptables -I INPUT -p tcp --dport 22 -j ACCEPT /sbin/iptables -I INPUT -p tcp --dport 8080 -j ACCEPT 2.保存 /etc/rc.d/init.d/iptables save 3.查看打开的端口 /etc/init.d/iptables status 4.关闭防火墙 1) 永久性生效,重启后不会复原 开启: chkconfig iptables on 关闭: chkconfig iptables off 2) 即时生效,重启后复原 开启: service iptables start 关闭: service iptables stop 「深度学习福利」大神带你进阶工程师,立即查看>>> 1. 项目核心代码结构截图
jeesz-utils jeesz-config jeesz-framework jeesz-core-cmsjeesz-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-service-task jeesz-web-mq-task 提醒: 开发人员在开发的时候可以将自己的业务 REST服务化或者 Dubbo服务化 2. 项目依赖介绍 2.1. 后台管理系统、Rest 服务系统、Scheculer 定时调度系统依赖如下图: 2.2. Dubbo 独立服务项目依赖如下图: 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 基础框架,可以提高快速开发效率。 4. 内置功能(只列了一部分功能) 1. 用户管理:用户是系统操作者,该功能主要完成系统用户配置。 2. 机构管理:配置系统组织机构(公司、部门、小组),树结构展现,可 随意调整上下级。 3. 区域管理:系统城市区域模型,如:国家、省市、地市、区县的维护。 4. 菜单管理:配置系统菜单,操作权限,按钮权限标识等。 5. 角色管理:角色菜单权限分配、设置角色按机构进行数据范围权限划分。 6. 字典管理:对系统中经常使用的一些较为固定的数据进行维护,如:是否、男女、类别、级别等。 7. 操作日志:系统正常操作日志记录和查询;系统异常信息日志记录和查询。 8. 连接池监视:监视当期系统数据库连接池状态,可进行分析 SQL 找出系统性能瓶颈。 9. 工作流引擎:实现业务工单流转、在线流程设计器。 5. 开发工具 1. Eclipse IDE:采用 Maven 项目管理,模块化。 2. 代码生成:通过界面方式简单配置,自动生成相应代码,目前包括三种生成方式(增删改改查):单表、一对多、树结构。生成后的代码如果不需要注意美观程度,生成后即可用。 6. 技术选型(只列了一部分技术) 1、后端 ➢ 服务框架:Dubbo、zookeeper、Rest 服务 ➢缓存:Redis、ehcache ➢ 消息中间件:ActiveMQ,KAFKA ➢ 负载均衡: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 模块项目 1、 创建表 1.1、 创建电子商务系统配置 jeesz_eb_global_config 表 SET FOREIGN_KEY_CHECKS=0; -- ---------------------------- -- Table structure for `jeesz_eb_global_config` -- ---------------------------- DROP TABLE IF EXISTS `jeesz_eb_global_config`; CREATE TABLE `jeesz_eb_global_config` ( `id` varchar(64) NOT NULL COMMENT '编号', `context_path` varchar(20) DEFAULT NULL COMMENT '部署路径', `port` int(11) DEFAULT NULL COMMENT '端口号', `treaty` longtext COMMENT '用户协议', `activescore` int(11) NOT NULL COMMENT '激活积分', `def_img` varchar(255) NOT NULL DEFAULT '/r/eb/u/no_picture.gif' COMMENT '图片不存 在时默认图片', `create_by` varchar(64) NOT NULL COMMENT '创建者', `create_date` datetime NOT NULL COMMENT '创建时间', `update_by` varchar(64) NOT NULL COMMENT '更新者', `update_date` datetime NOT NULL COMMENT '更新时间', `remarks` varchar(255) DEFAULT NULL COMMENT '备注信息', `del_flag` char(1) NOT NULL DEFAULT '0' COMMENT '删除标记', PRIMARY KEY (`id`), KEY `jeesz_eb_global_config` (`del_flag`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='jeesz 电子商务系统配置表'; -- ---------------------------- -- Records of jeesz_eb_global_config -- ---------------------------- 注意: 1. 表名的修改 2. `create_by`、`create_date`、`update_by`、`update_date`、`remarks`、`del_flag` 是不可缺少的,大家在创建表的时候请勿忽略这些字段。 1.2、 驱动式方案添加业务表配置 点击下一步进行业务表配置(主要针对于 sql 查询条件、页面元素进行设置) 最后进行保存 1.3、 生成方案添加 保存并生成代码(我代码生成在 D:/src 目录下) 2、 创建模块项目 2.1、 根据自己的业务创建模块项目(我以 EB 为实例) 2.2、 对 module 项目进行修改、配置 因为考虑到项目的完整和一致性,通过工具生成的 maven 项目缺少一些源文件,故需要手动创建如下: 点击 ok 后对新创建的文件目录进行顺序调整: 调整后的结果: 修改模块项目 jeesz-core-eb 的 pom.xml 文件: 具体内容如下: com.alibaba druid ${druid.version} mysql mysql-connector-java ${mysql.driver.version} runtime com.oracle ojdbc14 ${oracle.driver.version} runtime net.sourceforge.jtds jtds ${mssql.driver.version} runtime org.aspectj aspectjrt 1.7.4 org.aspectj aspectjweaver 1.7.4 cglib cglib 3.1 com.sml.sz jeesz-config com.sml.sz jeesz-framework 2.3、 将生的代码 copy 到指定目录 com.sml.sz.eb 修改 jeesz-project 的 pom.xml 文件,添加模块依赖 代码如下 com.sml.sz jeesz-core-eb ${project.version} 修改 jeesz-web-admin 的 pom.xml 文件,添加模块依赖 代码如下 com.sml.sz jeesz-core-eb 将生成的 controller 文件 copy 到 web 项目中 将生成的界面文件 copy 到 web 项目中: 3、 新建菜单并配置权限 具体配置请看我的收藏配置 功能截图: 「深度学习福利」大神带你进阶工程师,立即查看>>> 介绍 意图 :避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。 主要解决 :职责链上的处理者负责处理请求,客户只需要将请求发送到职责链上即可,无须关心请求的处理细节和请求的传递,所以职责链将请求的发送者和请求的处理者解耦了。 何时使用 :在处理消息的时候以过滤很多道。 如何解决 :拦截的类都实现统一接口。 实现 实现一 创建抽象类 AbstractLogger,带有详细的日志记录级别。然后我们创建三种类型的记录器,都扩展了 AbstractLogger。每个记录器消息的级别是否属于自己的级别,如果是则相应地打印出来,否则将不打印并把消息传给下一个记录器。 public abstract class AbstractLogger { public static int INFO = 1; public static int DEBUG = 2; public static int ERROR = 3; protected int level; // 责任链中的下一个元素 protected AbstractLogger nextLogger; public void setNextLogger(AbstractLogger nextLogger) { this.nextLogger = nextLogger; } public void logMessage(int level, String message) { if (this.level <= level) { write(message); } if (nextLogger != null) { nextLogger.logMessage(level, message); } } abstract protected void write(String message); } public class ConsoleLogger extends AbstractLogger { public ConsoleLogger(int level) { this.level = level; } [@Override](https://my.oschina.net/u/1162528) protected void write(String message) { System.out.println("Standard Console::Logger: " + message); } } public class ErrorLogger extends AbstractLogger { public ErrorLogger(int level) { this.level = level; } [@Override](https://my.oschina.net/u/1162528) protected void write(String message) { System.out.println("Error Console::Logger: " + message); } } public class FileLogger extends AbstractLogger { public FileLogger(int level) { this.level = level; } [@Override](https://my.oschina.net/u/1162528) protected void write(String message) { System.out.println("File::Logger: " + message); } } public class ChainPatternDemo { private static AbstractLogger getChainOfLoggers() { AbstractLogger errorLogger = new ErrorLogger(AbstractLogger.ERROR); AbstractLogger fileLogger = new FileLogger(AbstractLogger.DEBUG); AbstractLogger consoleLogger = new ConsoleLogger(AbstractLogger.INFO); errorLogger.setNextLogger(fileLogger); fileLogger.setNextLogger(consoleLogger); return errorLogger; } public static void main(String[] args) { AbstractLogger loggerChain = getChainOfLoggers(); loggerChain.logMessage(AbstractLogger.INFO, "This is an information."); System.out.println(); loggerChain.logMessage(AbstractLogger.DEBUG, "This is an debug level information."); System.out.println(); loggerChain.logMessage(AbstractLogger.ERROR, "This is an error information."); System.out.println(); } } 运行结果 Standard Console::Logger: This is an information. File::Logger: This is an debug level information. Standard Console::Logger: This is an debug level information. Error Console::Logger: This is an error information. File::Logger: This is an error information. Standard Console::Logger: This is an error information. 实现二 模拟Mail邮件处理 以及 Enum 的运用来演示责任链模式 public class Enums { private static Random rand = new Random(47); public static > T random(Class ec) { return random(ec.getEnumConstants()); } public static T random(T[] values) { return values[rand.nextInt(values.length)]; } } class Mail { // The NO's lower the probability of random selection: enum GeneralDelivery { YES, NO1, NO2, NO3, NO4, NO5 } enum Scannability { UNSCANNABLE, YES1, YES2, YES3, YES4 } enum Readability { ILLEGIBLE, YES1, YES2, YES3, YES4 } enum Address { INCORRECT, OK1, OK2, OK3, OK4, OK5, OK6 } enum ReturnAddress { MISSING, OK1, OK2, OK3, OK4, OK5 } GeneralDelivery generalDelivery; Scannability scannability; Readability readability; Address address; ReturnAddress returnAddress; static long counter = 0; long id = counter++; public String toString() { return "Mail " + id; } public String details() { return toString() + ", General Delivery: " + generalDelivery + ", Address Scanability: " + scannability + ", Address Readability: " + readability + ", Address Address: " + address + ", Return address: " + returnAddress; } // Generate test Mail: public static Mail randomMail() { Mail m = new Mail(); m.generalDelivery = Enums.random(GeneralDelivery.class); m.scannability = Enums.random(Scannability.class); m.readability = Enums.random(Readability.class); m.address = Enums.random(Address.class); m.returnAddress = Enums.random(ReturnAddress.class); return m; } public static Iterable generator(final int count) { return new Iterable() { int n = count; public Iterator iterator() { return new Iterator() { public boolean hasNext() { return n-- > 0; } public Mail next() { return randomMail(); } public void remove() { // Not implemented throw new UnsupportedOperationException(); } }; } }; } } public class PostOffice { enum MailHandler { GENERAL_DELIVERY { boolean handle(Mail m) { switch (m.generalDelivery) { case YES: System.out.println("Using general delivery for " + m); return true; default: return false; } } }, MACHINE_SCAN { boolean handle(Mail m) { switch (m.scannability) { case UNSCANNABLE: return false; default: switch (m.address) { case INCORRECT: return false; default: System.out.println("Delivering " + m + " automatically"); return true; } } } }, VISUAL_INSPECTION { boolean handle(Mail m) { switch (m.readability) { case ILLEGIBLE: return false; default: switch (m.address) { case INCORRECT: return false; default: System.out.println("Delivering " + m + " normally"); return true; } } } }, RETURN_TO_SENDER { boolean handle(Mail m) { switch (m.returnAddress) { case MISSING: return false; default: System.out.println("Returning " + m + " to sender"); return true; } } }; abstract boolean handle(Mail m); } static void handle(Mail m) { for (MailHandler handler : MailHandler.values()) if (handler.handle(m)) return; System.out.println(m + " is a dead letter"); } public static void main(String[] args) { for (Mail mail : Mail.generator(10)) { System.out.println(mail.details()); handle(mail); System.out.println("*****"); } } } 运行结果: Mail 0, General Delivery: NO2, Address Scanability: UNSCANNABLE, Address Readability: YES3, Address Address: OK1, Return address: OK1 Delivering Mail 0 normally ***** Mail 1, General Delivery: NO5, Address Scanability: YES3, Address Readability: ILLEGIBLE, Address Address: OK5, Return address: OK1 Delivering Mail 1 automatically ***** Mail 2, General Delivery: YES, Address Scanability: YES3, Address Readability: YES1, Address Address: OK1, Return address: OK5 Using general delivery for Mail 2 ***** Mail 3, General Delivery: NO4, Address Scanability: YES3, Address Readability: YES1, Address Address: INCORRECT, Return address: OK4 Returning Mail 3 to sender ***** Mail 4, General Delivery: NO4, Address Scanability: UNSCANNABLE, Address Readability: YES1, Address Address: INCORRECT, Return address: OK2 Returning Mail 4 to sender ***** Mail 5, General Delivery: NO3, Address Scanability: YES1, Address Readability: ILLEGIBLE, Address Address: OK4, Return address: OK2 Delivering Mail 5 automatically ***** Mail 6, General Delivery: YES, Address Scanability: YES4, Address Readability: ILLEGIBLE, Address Address: OK4, Return address: OK4 Using general delivery for Mail 6 ***** Mail 7, General Delivery: YES, Address Scanability: YES3, Address Readability: YES4, Address Address: OK2, Return address: MISSING Using general delivery for Mail 7 ***** Mail 8, General Delivery: NO3, Address Scanability: YES1, Address Readability: YES3, Address Address: INCORRECT, Return address: MISSING Mail 8 is a dead letter ***** Mail 9, General Delivery: NO1, Address Scanability: UNSCANNABLE, Address Readability: YES2, Address Address: OK1, Return address: OK4 Delivering Mail 9 normally ***** 参考及引用 1.《Java编程思想(第四版)》 2.责任链模式 「深度学习福利」大神带你进阶工程师,立即查看>>> 一个 cron 表达式是以 6-7 时间字段来定义一个计划任务是如何按照时间被执行的。每一个字段中的数据库而已为数字或者是一些特定的字符串来进行表达。每一个字段是使用空格或者 tab 进行分隔的。 下面的表格中显示了每一字段中可以被使用的字符和被允许的值。 你可以为这些字段指定一些特殊的值在 cron 表达式中,能够为你提供更多的世界控制和计划任务的频率控制。最常用的字符包括有: '*' — 一个通配符,表示的是所有允许的值。 '?' — 表达的是忽略这个字段的意思。当这个字段被设置后,这个字段表示的是计划任务在这个时间点没边际(例如: 'Month', 'Day of week' 或者'Year')。 有关更多 Confluence 的表达式,请参考 Cron Trigger tutorial on the Quartz website 页面中的内容。 一个 cron 表达式是以 6-7 时间字段来定义一个计划任务是如何按照时间被执行的。每一个字段中的数据库而已为数字或者是一些特定的字符串来进行表达。每一个字段是使用空格或者 tab 进行分隔的。 下面的表格中显示了每一字段中可以被使用的字符和被允许的值。 你可以为这些字段指定一些特殊的值在 cron 表达式中,能够为你提供更多的世界控制和计划任务的频率控制。最常用的字符包括有: '*' — 一个通配符,表示的是所有允许的值。 '?' — 表达的是忽略这个字段的意思。当这个字段被设置后,这个字段表示的是计划任务在这个时间点没边际(例如: 'Month', 'Day of week' 或者'Year')。 有关更多 Confluence 的表达式,请参考 Cron Trigger tutorial on the Quartz website 页面中的内容。 |
---|
1 | 秒(Seconds) | 0-59 | 是(Yes) |
---|
2 | 分钟(Minutes) | 0-59 | 是(Yes) | 3 | 小时(Hours) | 0-23 | 是(Yes) | 4 | 每月中的天(Day of month) | 1-31 | 是(Yes) 5 | 6 | 7 月(Month) | 每周中的天(Day of week) | 年(Year) 1-12 or JAN-DEC | 1-7 or SUN-SAT | 1970-2099 是(Yes) | 是(Yes) | 否(No) |
* 包括有特殊字符 https://www.cwiki.us/display/CONF6ZH/Scheduled+Jobs | 秒(Seconds) | 0-59 | 是(Yes) 2 | 分钟(Minutes) | 0-59 | 是(Yes) |
---|
3 | 小时(Hours) | 0-23 | 是(Yes) | 4 | 每月中的天(Day of month) | 1-31 | 是(Yes) 5 | 6 | 7 月(Month) | 每周中的天(Day of week) | 年(Year) 1-12 or JAN-DEC | 1-7 or SUN-SAT | 1970-2099 是(Yes) | 是(Yes) | 否(No) | * 包括有特殊字符 https://www.cwiki.us/display/CONF6ZH/Scheduled+Jobs 「深度学习福利」大神带你进阶工程师,立即查看>>> 下面是有关你可以调整的计划任务列表。 Confluence 备份(Back Up Confluence) | 对 Confluence 站点执行 备份 操作。 | 每集群(Per cluster) | At 2am every day |
---|
检查集群安全(Check Cluster Safety) | 针对集群方式的 Confluence 安装,这个计划任务将会保证在集群中只有一个 Confluence 节点向数据库中写入信息。 针对标准方式(非集群方式)版本的 Confluence,这个任务被用来警告用户,谁错误的连接到第二个 Confluence 数据库实例,这个数据库已经被一个 Confluence 使用了。in use. | 每集群(Per cluster) | Every 30 seconds | 清理 Journal 实体(Clean Journal Entries) | 周期化的清理 journal 实体,这个能够保证数据的大小能够保持正常的增长速度而避免过度膨胀。 | 每节点(Per node) | 每天的 2 AM | 清理临时目录(Clean Temporary Directory) | 清理 /temp 目录中的临时文件。这个目录被导出任务或其他一些任务创建。 这个清理不包括 Confluence 安装目录中文件的清理。 | 每节点(Per node) | 每天的 4 AM | 清理过期的邮件错误(Clear Expired Mail Errors) | 清理 The Mail Queue 队列中的通知错误。当一个邮件因为某个原因而发送失败没有发送成功的话,一个通知错误将会被发送到邮件错误队列中。 | 每集群(Per cluster) | 每天的 3 AM | 清理过期的记住我令牌(Clear Expired Remember Me Tokens) | 清理所有过期的记住我(Remember Me)令牌。记住我这个令牌超过两周后就会过期。 | 每集群(Per cluster) | 每个月的 20 号 | 邮件每日报表(Email Daily Reports) | 针对 Confluence 的内容的修改,为 所有订阅者 发送每天的更新通知。 所有有关 Confluence 的内容修改记录将会只记录最后 24 小时的修改。这个推荐你只能修改任务发送邮件的时间为每 24 个小时中的某一个时间、 | 每集群(Per cluster) | 每天的 12 AM | 刷新边际索引队列(Flush Edge Index Queue) | 刷新边际索引队列,能够保证 Confluence 的索引是最新的索引。 | 每节点(Per node) | 每 30 秒 | 刷新本地任务队列(Flush Local Task Queue) | 刷新本地任务队列。(Confluence 的内部任务通常具有很高的刷新频率)。 | 每节点(Per node) | 每分钟 | 刷新邮件队列(Flush Mail Queue) | 发送 mail queue 队列中已经队列的邮件通知。这并不包括批量的通知。编辑 发送批量的通知( Send batched notifications )任务,如果你同时希望修改通知的发送频率包括页面或者博客的更新。 | 每集群(Per cluster) | 每分钟 | 发送批量通知(Send batched notifications) | 从有关上次任务运行后,发送有关页面或者博客更新的邮件通知。如果邮件并不是很多的话,可以增加这个发送的频率,如果你有很多邮件通知的话,你可以减少发送邮件的频率。这个设置对 Confluence 的性能提升会有很大的影响。 | 每集群(Per cluster) | 每 10 分钟 刷新任务队列(Flush Task Queue) | 发送推荐更新邮件(Send Recommended Updates Email) | 清理老的计划任务运行信息(Purge Old Job Run Details) 刷新任务队列(Confluence 的内部任务通常具有很高的刷新频率)。 | 触发发送推荐更新邮件给用户。这个任务是每个小时运行一次的,但是用户可以收到每周更新或者每日更新,这个是根据用户自己属性的设置不同而不同的。这个时间与时区是对应的。 | Confluence 存储每一个计划任务的运行情况在数据库表 scheduler_run_details 中。为了保持数据库中保存有足够的信息,但是又不至于扩大数据库的存储,清理老的计划任务细节( Purge Old Job Run Details )任务将会日常运行删除细节: 超过 90 的天成功任务。 超过 7 天的未成功的任务。 有可以重置 system properties 中的一些设置; jobs.limit.per.purge , all.jobs.ttl.hours and unsuccessful.jobs.ttl.hours 。 每节点(Per node) | 每集群(Per cluster) | 每集群(Per cluster) 每分钟 | 每小时 | 每天的 11 PM |
https://www.cwiki.us/display/CONF6ZH/Scheduled+Jobs 「深度学习福利」大神带你进阶工程师,立即查看>>> 希望查看一个计划任务最后运行的时间和这个计划任务最后一次运行花费了多长时间。单击计划任务边上的 历史(History ) 连接。 如果一个计划任务从来没有运行的胡啊,那么这个历史的链接是不会显示的。 屏幕截图:任务执行历史 https://www.cwiki.us/display/CONF6ZH/Scheduled+Jobs 「深度学习福利」大神带你进阶工程师,立即查看>>> 结合Dubbo官方文档,我们分别理解一下各个层次的设计要点: 服务接口层(Service):该层是与实际业务逻辑相关的,根据服务提供方和服务消费方的业务设计对应的接口和实现。 配置层(Config):对外配置接口,以ServiceConfig和ReferenceConfig为中心,可以直接new配置类,也可以通过spring解析配置生成配置类。 服务代理层(Proxy):服务接口透明代理,生成服务的客户端Stub和服务器端Skeleton,以ServiceProxy为中心,扩展接口为ProxyFactory。 服务注册层(Registry):封装服务地址的注册与发现,以服务URL为中心,扩展接口为RegistryFactory、Registry和RegistryService。可能没有服务注册中心,此时服务提供方直接暴露服务。 集群层(Cluster):封装多个提供者的路由及负载均衡,并桥接注册中心,以Invoker为中心,扩展接口为Cluster、Directory、Router和LoadBalance。将多个服务提供方组合为一个服务提供方,实现对服务消费方来透明,只需要与一个服务提供方进行交互。 监控层(Monitor):RPC调用次数和调用时间监控,以Statistics为中心,扩展接口为MonitorFactory、Monitor和MonitorService。 远程调用层(Protocol):封将RPC调用,以Invocation和Result为中心,扩展接口为Protocol、Invoker和Exporter。Protocol是服务域,它是Invoker暴露和引用的主功能入口,它负责Invoker的生命周期管理。Invoker是实体域,它是Dubbo的核心模型,其它模型都向它靠扰,或转换成它,它代表一个可执行体,可向它发起invoke调用,它有可能是一个本地的实现,也可能是一个远程的实现,也可能一个集群实现。 信息交换层(Exchange):封装请求响应模式,同步转异步,以Request和Response为中心,扩展接口为Exchanger、ExchangeChannel、ExchangeClient和ExchangeServer。 网络传输层(Transport):抽象mina和netty为统一接口,以Message为中心,扩展接口为Channel、Transporter、Client、Server和Codec。 数据序列化层(Serialize):可复用的一些工具,扩展接口为Serialization、 ObjectInput、ObjectOutput和ThreadPool。 根据官方提供的,对于上述各层之间关系的描述,如下所示: 在RPC中,Protocol是核心层,也就是只要有Protocol + Invoker + Exporter就可以完成非透明的RPC调用,然后在Invoker的主过程上Filter拦截点。 图中的Consumer和Provider是抽象概念,只是想让看图者更直观的了解哪些类分属于客户端与服务器端,不用Client和Server的原因是Dubbo在很多场景下都使用Provider、Consumer、Registry、Monitor划分逻辑拓普节点,保持统一概念。 而Cluster是外围概念,所以Cluster的目的是将多个Invoker伪装成一个Invoker,这样其它人只要关注Protocol层Invoker即可,加上Cluster或者去掉Cluster对其它层都不会造成影响,因为只有一个提供者时,是不需要Cluster的。 Proxy层封装了所有接口的透明化代理,而在其它层都以Invoker为中心,只有到了暴露给用户使用时,才用Proxy将Invoker转成接口,或将接口实现转成Invoker,也就是去掉Proxy层RPC是可以Run的,只是不那么透明,不那么看起来像调本地服务一样调远程服务。 而Remoting实现是Dubbo协议的实现,如果你选择RMI协议,整个Remoting都不会用上,Remoting内部再划为Transport传输层和Exchange信息交换层,Transport层只负责单向消息传输,是对Mina、Netty、Grizzly的抽象,它也可以扩展UDP传输,而Exchange层是在传输层之上封装了Request-Response语义。 Registry和Monitor实际上不算一层,而是一个独立的节点,只是为了全局概览,用层的方式画在一起。 服务定义 服务是围绕服务提供方和服务消费方的,服务提供方实现服务,而服务消费方调用服务。 服务注册 对于服务提供方,它需要发布服务,而且由于应用系统的复杂性,服务的数量、类型也不断膨胀;对于服务消费方,它最关心如何获取到它所需要的服务,而面对复杂的应用系统,需要管理大量的服务调用。而且,对于服务提供方和服务消费方来说,他们还有可能兼具这两种角色,即既需要提供服务,有需要消费服务。 通过将服务统一管理起来,可以有效地优化内部应用对服务发布/使用的流程和管理。服务注册中心可以通过特定协议来完成服务对外的统一。Dubbo提供的注册中心有如下几种类型可供选择: Multicast注册中心 Zookeeper注册中心 Redis注册中心 Simple注册中心 服务监控 无论是服务提供方,还是服务消费方,他们都需要对服务调用的实际状态进行有效的监控,从而改进服务质量。 远程通信与信息交换 远程通信需要指定通信双方所约定的协议,在保证通信双方理解协议语义的基础上,还要保证高效、稳定的消息传输。Dubbo继承了当前主流的网络通信框架,主要包括如下几个: Mina Netty Grizzly 「深度学习福利」大神带你进阶工程师,立即查看>>> spring 是一个开源框架,是为了解决企业应用程序开发,功能如下 ◆目的:解决企业应用开发的复杂性 ◆功能:使用基本的JavaBean代替EJB,并提供了更多的企业应用功能 ◆范围:任何Java应用 简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。 ◆轻量——从大小与开销两方面而言Spring都是轻量的。完整的Spring框架可以在一个大小只有1MB多的JAR文件里发布。并且Spring所需的处理开销也是微不足道的。此外,Spring是非侵入式的:典型地,Spring应用中的对象不依赖于Spring的特定类。 ◆控制反转——Spring通过一种称作控制反转(IoC)的技术促进了松耦合。当应用了IoC,一个对象依赖的其它对象会通过被动的方式传递进来,而不是这个对象自己创建或者查找依赖对象。你可以认为IoC与JNDI相反——不是对象从容器中查找依赖,而是容器在对象初始化时不等对象请求就主动将依赖传递给它。 ◆面向切面——Spring提供了面向切面编程的丰富支持,允许通过分离应用的业务逻辑与系统级服务(例如审计(auditing)和事务(transaction)管理)进行内聚性的开发。应用对象只实现它们应该做的——完成业务逻辑——仅此而已。它们并不负责(甚至是意识)其它的系统级关注点,例如日志或事务支持。 ◆容器——Spring包含并管理应用对象的配置和生命周期,在这个意义上它是一种容器,你可以配置你的每个bean如何被创建——基于一个可配置原型(prototype),你的bean可以创建一个单独的实例或者每次需要时都生成一个新的实例——以及它们是如何相互关联的。然而,Spring不应该被混同于传统的重量级的EJB容器,它们经常是庞大与笨重的,难以使用。 ◆框架——Spring可以将简单的组件配置、组合成为复杂的应用。在Spring中,应用对象被声明式地组合,典型地是在一个XML文件里。Spring也提供了很多基础功能(事务管理、持久化框架集成等等),将应用逻辑的开发留给了你。 所有Spring的这些特征使你能够编写更干净、更可管理、并且更易于测试的代码。它们也为Spring中的各种模块提供了基础支持。 Spring的两大核心AOP与IOC,可以单独用于任何应用,包括与Struts等MVC框架与Hibernate等ORM框架的集成,目前很多公司所谓的轻量级开发就是用 Spring + Struts(2)+Hibernate。 Spring MVC就是一个MVC框架,个人觉得Spring MVC annotation式的开发比Struts2方便,可以直接代替上面的Struts(当然Struts的做为一个非常成熟的MVC,功能上感觉还是比Spring强一点,不过Spring MVC已经足够用了)。当然spring mvc的执行效率比struts高,是因为struts的值栈影响效率 spring mvc类似于struts的一个MVC开框架,其实都是属于spring,spring mvc需要有spring的架包作为支撑才能跑起来。 「深度学习福利」大神带你进阶工程师,立即查看>>> Spring Cloud是一系列框架的有序集合。利用Spring Boot的开发模式简化了分布式系统基础设施的开发,如服务发现、注册、配置中心、消息总线、负载均衡、断路器、数据监控等(这里只简单的列了一部分),都可以用Spring Boot的开发风格做到一键启动和部署。Spring Cloud将目前比较成熟、经得起实际考验的服务框架组合起来,通过Spring Boot风格进行再封装,屏蔽掉了复杂的配置和实现原理,最终整合出一套简单易懂、易部署和易维护的分布式系统架构平台。 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 做了二次分装,主要负责完成微服务架构中的服务治理功能。 Spring Cloud为未来互联网企业提供分布式基础设施解决方案。同时,随着近几年微服务架构和Docker容器概念的火爆,也会让Spring Cloud在未来越来越“云”化的软件开发风格中立有一席之地,尤其是在目前五花八门的分布式解决方案中提供了标准化的、全站式的技术方案,有效推进服务端软件系统技术水平提升。 从现在开始,我这边会将近期研发的spring cloud微服务云架构的搭建过程和精髓记录下来,帮助更多有兴趣研发spring cloud框架的朋友,大家来一起探讨spring cloud架构的搭建过程及如何运用于企业项目.完整项目的源码来源 技术支持1791743380 「深度学习福利」大神带你进阶工程师,立即查看>>> Confluence 支持一些可以从 Java 系统属性中配置的配置参数和调试(debugging )设置。系统属性通常是使用 -D 为参数选项,这个选项是 Confluence 在运行后设置到 JVM 虚拟机中的。请参考: Configuring System Properties 页面中的内容来获得更多的信息。 开始版本 默认值 模块... 作用和影响 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 服务器进行处理的。 | https://www.cwiki.us/display/CONF6ZH/Recognized+System+Properties 「深度学习福利」大神带你进阶工程师,立即查看>>> 在 log4j 中,一个输出被定义为 'appender'。希望修改 log 文件的目标,你需要停止 Confluence 然后修改设置 log4j.properties 日志配置文件的 ' Logging Location and Appender ' 设置。有关这个文件的路径,请参考 上面 的说明。 在一个标准的配置文件中,你可以找到下面 2 个 appenders。 com.atlassian.confluence.logging.ConfluenceHomeLogAppender – 这个是默认的日志输出器(appender )在 上面 描述得文件中。这个日志输出器有允许下面的设置: MaxFileSize MaxBackupIndex org.apache.log4j.RollingFileAppender – 如果你希望记录日志到不同的位置,取消 RollingFileAppender 行前面的备注,同时修改下面的日志文件路径。注释掉 ConfluenceHomeLogAppender 行的内容。 Synchrony 日志路径也可以通过同样的方式进行修改。 Confluence 绑定了 log4j 提供的所有功能。有关 log4j 日志输出容器的的定义,请参考 log4j documentation 页面中的内容。 https://www.cwiki.us/display/CONF6ZH/Working+with+Confluence+Logs 「深度学习福利」大神带你进阶工程师,立即查看>>> 修改日志文件的大小和数量 在默认的情况下,Confluence 将会保持 5 个日志文件,每一个日志文件的大小超过 20 MB 的时候将会被重写。 你可以修改默认日志文件的大小和数量,通过编辑 /confluence/WEB-INF/classes/log4j.properties 文件中的内容。 log4j.appender.confluencelog.MaxFileSize=20480KB log4j.appender.confluencelog.MaxBackupIndex= 5 |
---|
修改日志级别 请参考 Configuring Logging 页面中的内容来修改 Confluence 中的日志配置文件。 https://www.cwiki.us/display/CONF6ZH/Working+with+Confluence+Logs 「深度学习福利」大神带你进阶工程师,立即查看>>> 指定 Confluence 日志选项 这里是一些特定的日志配置,你可能在对问题进行调试的时候需要。 在日志中记录数据库使用的 SQL 查询请求 你可能希望增加日志的中的内容,记录 Confluence 系统向数据库中插入数据的时候使用的 SQL 语句。针对一些特定的问题的诊断,这个配置能够帮你找到你肯能需要的一些信息。 你可以通过下面的 2 种方法启用在你的日志中记录 SQL 的内容: 在系统运行的时候记录 – 请参考 上面的指南 。 通过日志配置文件 – 请参考这里的 Enabling Detailed SQL Logging 。 日志用户查看/访问 Confluence 每一个页面的详细信息 你可以配置那些用户访问了你 Confluence 站点的那些页面。只仅仅只能通过修改日志配置文件才能进行配置,请参考下面 Enabling Detailed SQL Logging 页面中的内容。 搜索日志文件获得已知问题 Atlassian 问题解决和支持工具包括有一个日志分析器。这个日志分析器能够检查你 Confluence 的日志来找到日志中的错误,同时根据日志中的错误来对我们已知知识库和问题跟踪系统中的内容进行对比。 请参考 Troubleshooting Problems and Requesting Technical Support 页面中的内容来找到如何设置按照时间来执行扫描你的日志文件。 .https://www.cwiki.us/display/CONF6ZH/Working+with+Confluence+Logs 「深度学习福利」大神带你进阶工程师,立即查看>>> 修改日志文件的大小和数量 在默认的情况下,Confluence 将会保持 5 个日志文件,每一个日志文件的大小超过 20 MB 的时候将会被重写。 你可以修改默认日志文件的大小和数量,通过编辑 /confluence/WEB-INF/classes/log4j.properties 文件中的内容。 log4j.appender.confluencelog.MaxFileSize=20480KB log4j.appender.confluencelog.MaxBackupIndex= 5 |
---|
修改日志级别 请参考 Configuring Logging 页面中的内容来修改 Confluence 中的日志配置文件。 https://www.cwiki.us/display/CONF6ZH/Working+with+Confluence+Logs |