Netsharp配置文件
一、总体说明
netsharp下需要配置的项目一般是需要独立启动的项目,主要有四个
- netsharp-web
- netsharp-test
- netsharp-elephant
- netsharp-donkey
其实每个项目都可能独立启动,一般的项目都会有自己的测试项目,所以这个时候也需要配置文件
配置文件同源代码一起管理,开始的时候配置文件直接放在上面四个项目里,会有以下几个问题
- 多个项目配置文件经常不一致,混乱
- 每个开发人员本地的配置不一样提交代码的时候经常有人把自己的配置提交到服务器,引起代码冲突
- 每个人经常修改配置文件提交之后配置文件被改的乱七八糟
针对上面几个问题,netsharp的配置文件是放在netsharp的顶级文件夹下的conf目录,代码下载之后开发人员把配置文件复制到项目下使用,同时在git的项目设置配置文件目录为ignore即可
对于生产环境、测试环境、部署运维的时候专门把配置文件放在服务器上,部署复制一下即可,这样也保证了配置账号的安全性
二、netsharp的配置文件
netsharp目前一共用到5个配置文件,他们的目录结构如下,一下以netsharp-web项目为例
|--netsharp-web
|--src/main/java
|--src/main/resources
|--log4j.properties
|--conf
|--communication.properties
|--configuration.properties
|--database.properties
|--redis.properties
三、netsharp配置文件读取
配置文件读取比较简单,首先有一个配置文件读取的基类,主要的方法是deserialize,用于读取配置文件
package org.netsharp.application; import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List; import org.netsharp.core.NetsharpException;
import org.netsharp.core.convertor.ITypeConvertor;
import org.netsharp.core.convertor.TypeConvertorFactory;
import org.netsharp.util.PropertyConfigurer;
import org.netsharp.util.ReflectManager;
import org.netsharp.util.StringManager; public class ApplicationConfiguration { public void deserialize() { Class<?> type = this.getClass(); Configuration confile = type.getAnnotation(Configuration.class);
if (confile == null) {
throw new NetsharpException("类上必须标注@Configuration:" + type.getName());
} PropertyConfigurer conf = PropertyConfigurer.newInstance(confile.file()); Field[] fields = ReflectManager.getDeclaredFields(type);
for (Field field : fields) {
this.parseField(conf, field);
}
} private void parseField(PropertyConfigurer conf, Field field) { ConfigurationItem item = field.getAnnotation(ConfigurationItem.class);
if (item == null) {
return;
} String value = conf.get(item.key());
if (StringManager.isNullOrEmpty(value)) {
value = item.defaultValue();
} ITypeConvertor convertor = TypeConvertorFactory.create(field.getType());
if (convertor == null) {
throw new NetsharpException("can't read " + item.key());
}
Object propertyValue = convertor.fromString(value); try {
field.setAccessible(true);
field.set(this, propertyValue);
} catch (IllegalArgumentException | IllegalAccessException e) {
throw new NetsharpException("can't read " + item.key(), e);
} if (field.getType().isEnum() && propertyValue == null) {
throw new NetsharpException(item.key() + "配置不正确,配置的值为:" + value);
}
} @Override
public String toString() { Class<?> type = this.getClass();
List<String> ss = new ArrayList<String>(); Field[] fields = ReflectManager.getDeclaredFields(type);
for (Field field : fields) {
ConfigurationItem item = field.getAnnotation(ConfigurationItem.class);
if (item == null) {
continue;
} try {
ss.add(field.getName() + " : " + field.get(this).toString());
} catch (IllegalArgumentException | IllegalAccessException e) {
e.printStackTrace();
}
} return StringManager.join(StringManager.NewLine, ss);
}
}
以configuration.properties为例子,看缓存类型(org.netsharp.panda.session.cache)的读取方式,他在PandaConfiguration类中
package org.netsharp.panda.core; import org.netsharp.application.ApplicationConfiguration;
import org.netsharp.application.Configuration;
import org.netsharp.application.ConfigurationItem;
import org.netsharp.cache.base.dict.CacheType; @Configuration(file = "conf/configuration.properties")
public class PandaConfiguration extends ApplicationConfiguration { private static PandaConfiguration instance; /*panda是否启用权限控制*/
@ConfigurationItem(key="org.netsharp.panda.ispermission",defaultValue="true")
private Boolean isPermission; /*panda的session缓存类型*/
@ConfigurationItem(key="org.netsharp.panda.session.cache",defaultValue="none")
private CacheType sessionCacheType; //panda的session时间(分钟)
@ConfigurationItem(key="org.netsharp.panda.session.timeout",defaultValue="30")
private Integer sessionTimtout; public static PandaConfiguration getInstance() { if(instance==null) {
instance = new PandaConfiguration();
instance.deserialize();
} return instance; } public Boolean getIsPermission() {
return isPermission;
} public CacheType getSessionCacheType() {
return sessionCacheType;
} public Integer getSessionTimtout() {
return sessionTimtout;
}
}
一般配置文件读取使用一个Singleton,不同类型的配置对应不同的Singleton,上文中的PandaConfiguration主要是读取关于Panda相关的配置
另外,多个配置类可以读取一个配置文件的内容,这样为了减少配置文件的数量,同时有可以达到配置文件进行分类管理的目的
在netsharp的配置文件中都标注了具体的配置文件的读取类
四、日志配置
日志文件是log4j自己读取的,不是netsharp读取的内容
文件:log4j.properties
netsharp.log.dir=/home/netsharp/logs
#=======================================================================
log4j.rootLogger=DEBUG,stdout,D,E # appender stdout
log4j.appender.stdout.Threshold=DEBUG
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH\:mm\:ss,SSS} %-5p [%t] %l - %m%n
log4j.appender.stdout.Encoding=UTF-8 # appender D
log4j.appender.D.Threshold=DEBUG
log4j.appender.D.File=${netsharp.log.dir}/log.txt
log4j.appender.D=org.apache.log4j.RollingFileAppender
log4j.appender.D.MaxFileSize=10MB
log4j.appender.D.ImmediateFlush=true
log4j.appender.D.Append=true
log4j.appender.D.MaxBackupIndex=10
log4j.appender.D.layout=org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern=%d{yyyy-MM-dd HH\:mm\:ss,SSS} %-5p %l - %m%n
log4j.appender.D.Encoding=UTF-8 # appender E
log4j.appender.E.Threshold=ERROR
log4j.appender.E.File=${netsharp.log.dir}/error.txt
log4j.appender.E=org.apache.log4j.RollingFileAppender
log4j.appender.E.MaxFileSize=10MB
log4j.appender.E.ImmediateFlush=true
log4j.appender.E.Append=true
log4j.appender.E.MaxBackupIndex=10
log4j.appender.E.layout=org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern=%d{yyyy-MM-dd HH\:mm\:ss,SSS} %-5p %l - %m%n
log4j.appender.E.Encoding=UTF-8
五、应用程序配置
文件:configuration.properties
#-----------------------------------------------------------------
#see : org.netsharp.application.Application
org.netsharp.name=Netsharp
org.netsharp.packages.scan= #-----------------------------------------------------------------
#see : org.netsharp.organization.entity.AuthorizationConfiguration
#员工重置密码
org.netsharp.authorization.defaultpassword=123456
#用户密码加密盐
org.netsharp.authorization.salt=xxxxxx #-----------------------------------------------------------------
#see : org.netsharp.panda.core.PandaConfiguration
#netsharp是否启用权限控制
org.netsharp.panda.ispermission=true
#panda的session缓存类型
org.netsharp.panda.session.cache=redis
#panda的session时间(分钟)
org.netsharp.panda.session.timeout=30 #-----------------------------------------------------------------
#see : org.netsharp.application.Application
#分布式id配置
org.netsharp.id.datacenterid=1
org.netsharp.id.workid=1
六、数据库配置
文件:database.properties
#see : org.netsharp.cache.service.redis.RedisConnection
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.jdbcUrl=jdbc:mysql://127.0.0.1:3306/netsharp?autoReconnect=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&noAccessToProcedureBodies=true
jdbc.username=root
jdbc.database=netsharp
jdbc.password=123456
jdbc.idleConnectionTestPeriod=60
jdbc.connectionTestStatement=select 1
jdbc.idleMaxAge=240
jdbc.maxConnectionsPerPartition=30
jdbc.minConnectionsPerPartition=10
jdbc.partitionCount=2
jdbc.acquireIncrement=5
jdbc.statementsCacheSize=100
jdbc.releaseHelperThreads=3
jdbc.lazyInit =false
七、RPC配置
文件:communication.properties
#base
#see : org.netsharp.communication.core.ConfigurationBase
org.netsharp.communication.host=127.0.0.1
org.netsharp.communication.port=8888
#consumer
#see : org.netsharp.communication.core.CommunicationConfiguration
org.netsharp.communication.protocol=local
#server
#see : org.netsharp.communication.protocol.tcp.container.server.TcpServerConfiguration
org.netsharp.communication.pool.coreSize=200
org.netsharp.communication.pool.maxinumSize=1000
org.netsharp.communication.pool.keepAliveTime=100
八、redis配置
文件:redis.properties
#see : org.netsharp.cache.service.redis.RedisConnection
redis.pool.maxActive=200
redis.pool.maxIdle=100
redis.pool.maxWait=3000
redis.ip=127.0.0.1
redis.port=6379
redis.password=123456
redis.timeout=5000
redis.database=1
redis.disabled=false
redis.cache.first.key=netsharp
Netsharp配置文件的更多相关文章
- Netsharp总体设计
阅读本文请先阅读如下两篇文章 什么是企业软件 Netsharp什么 Netsharp总体设计 1.1 Netsharp终端形式 Netsharp基于.NET平台,支持的产品形态有三种: 北极熊 ...
- NETSHARP的JAVA开发环境配置
一:JAVA配置 1. netsharp使用java1.8/1.7版本,本文使用1.8版本 2.jdk下载地址:http://www.oracle.com/technetwork/java/javas ...
- .Net Core MVC 网站开发(Ninesky) 2.3、项目架构调整(续)-使用配置文件动态注入
上次实现了依赖注入,但是web项目必须要引用业务逻辑层和数据存储层的实现,项目解耦并不完全:另一方面,要同时注入业务逻辑层和数据访问层,注入的服务直接写在Startup中显得非常臃肿.理想的方式是,w ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(64)-补充WebApi与Unity注入-配置文件
系列目录 上一篇演示了WebApi利用Unity注入 很多人问我如何用配置文件来配置注入,本节演示如何利用配置文件来注入,道理是一样的,跳转到上一节下载源码一起来动手! 1.打开源码定位到文件Depe ...
- Spring配置文件标签报错:The prefix "XXX" for element "XXX:XXX" is not bound. .
例如:The prefix "context" for element "context:annotation-config" is not bound. 这种 ...
- nginx服务器安装及配置文件详解
nginx在工作中已经有好几个环境在使用了,每次都是重新去网上扒博客,各种编译配置,今天自己也整理一份安装文档和nginx.conf配置选项的说明,留作以后参考.像负载均衡配置(包括健康检查).缓存( ...
- C#开发中使用配置文件对象简化配置的本地保存
C#开发中使用配置文件对象简化配置的本地保存 0x00 起因 程序的核心是数据和逻辑,开发过程中免不了要对操作的数据进行设置,而有些数据在程序执行过程中被用户或程序做出的修改是应该保存下来的,这样程序 ...
- 使用T4模板生成不同部署环境下的配置文件
在开发企业级应用的时候,通常会有不同的开发环境,比如有开发环境,测试环境,正式环境,生产环境等.在一份代码部署到不同环境的时候,不同环境的配置文件可能需要根据目标环境不同而不同.比如在开发环境中,数据 ...
- 配置文件Java读写
今天把配置文件的Bug修复了,总结一下Java配置文件如何读写 配置文件的格式 以.properties后缀结尾,内容不出现空格和双引号 //config.properties Driver=com. ...
随机推荐
- 阿里巴巴数据源Druid在tomcat中的配置
这里只说需要的配置文件,不讲具体的项目,仅作为备忘. pom.xml文件添加 <!-- druid --> <dependency> <groupId>com.al ...
- bzoj5049: 导航系统
Description 小Q来到了一个随机的国度.这个国度由n座城市和m条双向道路构成.因为这个国度崇尚随机,因此m条边是用随机 选择两端点的方式生成的.充满好奇的小Q想在这里进行k次随机的旅行,每次 ...
- 小程序客服下发消息禁止后 session from 还有用吗?
文章概要 1. 小程序下发政策调整分析 2. session from 数据还传到底三方了没? 1. 小程序下发政策调整分析 小程序客服功能下发策略调整 ...
- [UE4]记录瞬移目标点
1.判定射线是否击中一个物体:LineTraceByChannel的Return Value返回值 2.击中的目标点:LineTraceByChannel.Out Hit.Location,如图提示文 ...
- vue route
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 记一次KUBERNETES/DOCKER网络排障
https://coolshell.cn/articles/18654.html 总结在前面: 1.kill -9杀死docker进程,系统一定是要遍历所有的docker子进程来一个一个发退出信号的, ...
- Vue 折叠面板Collapse在标题上添加组件后,阻止面板冒泡的用法
iView组件中,折叠面板Collapse点击面板标题部分,会出现面板收起或展开的效果.那么在面板标题后面再添加下拉框之类的组件时,会出现跟面板点击一样的效果,这时候就需要阻止冒泡的用法了.具体代码: ...
- Codeforces Round #551 (Div. 2) A-E
A. Serval and Bus 算出每辆车会在什么时候上车, 取min即可 #include<cstdio> #include<algorithm> #include< ...
- 富文本编辑器summerNote
载入富文本: $('.summernote').summernote({ height: 220, tabsize: 2, lang: 'zh-CN' }); 富文本获取内容: $('.summern ...
- Java6及以上版本对synchronized的优化
目录 1.概述 2.实现同步的基础 3.实现方式 4.Java对象头(存储锁类型) 5.优化后synchronized锁的分类 6.锁的升级(进化) 6-1.偏向锁 6-2.轻量级锁 6-3.锁的比较 ...