一、前言
次说明参照新的项目体系结构编写,具体哪些是新的项目体系,请参照:项目统计
随着我们对技术的不断深入,项目结构配置也会趋于更加透明简洁,所以项目体系会不断的更新,如有问题请咨询架构组
截至目前,本文采用的Nove版本为1.2.9.RELEASE
注意:API包除了依赖ecej-model 尽量不要依赖其他任何自定义包,否则以后发布公共接口可能导致各种奇葩问题
模板工程:http://10.4.96.22/luqiang/ecej-xxx/
二、应用技术说明
新的项目体系主要采用spring boot 、mybatis 、druid 、dubbo
三、项目结构说明
下面说下基本项目结构,先看下新结构包含什么,以用户中心为例
新的项目结构摒弃了老结构中的dao 、po 等jar依赖
dao的东西经过配置化管理,只剩下了UcBaseDao 和 DBConfiguration(包括了数据源等配置,大家可以依葫芦画瓢自己试试)
po的东西以后放到自己的api中,记住api包不允许依赖任何jar包,以免出现恶心自己的问题
父POM中删除了无用的依赖,继承了底层平台POM
下面说下核心的数据源配置DBConfiguration
这个继承了AbstractDruidDBConfig 其实内部就是帮助大家加载了下数据源,方便配置而已
这是我们需要配置的属性,配置在remote-db.properties中
这就是我们的数据源声明
事物的声明,其实大家会发现只是换了个形式写而已,省去了xml配置
四、Redis的使用
说下redis使用,如果想在自己的项目中使用redis,如下先加入依赖
<dependency>
<groupId>com.nove</groupId>
<artifactId>ecej-redis</artifactId>
</dependency>
就可以了,然后我们只要配置我们的配置文件,不需要其他多余的工作
redis集群分为两种,sentinel 还有3.x的cluster,根据你自己的需要选择集群配置,配置文件都放在resources下面的,没有特殊要求的话请都使用3.x配置
1、先说sentinel配置
用法:使用com.ecej.nove.redis.utils.JedisClusterUtils这个静态类
这个大家可以直接下载用
ecej.redis.hostName=@ecej.redis.hostName@
ecej.redis.password=@ecej.redis.password@
ecej.redis.mastername=@ecej.redis.mastername@
以下配置可选择增加
ecej.redis.maxIdle=@ecej.redis.maxIdle@
ecej.redis.maxTotal=@ecej.redis.maxTotal@
ecej.redis.maxWaitMillis=@ecej.redis.maxWaitMillis@
这是properties的配置
下面说下POM里面profile的配置
<ecej.redis.hostName>10.32.32.58:26379,10.32.32.58:26380,10.32.32.58:26381</ecej.redis.hostName>
<ecej.redis.mastername>redismaster</ecej.redis.mastername>
<ecej.redis.password><![CDATA[4BZcIv&9]]></ecej.redis.password>
<ecej.redis.maxIdle>10</ecej.redis.maxIdle>
<ecej.redis.maxTotal>1000</ecej.redis.maxTotal>
<ecej.redis.maxWaitMillis>3000</ecej.redis.maxWaitMillis>
2、下面再说下3.x的配置
ecej.redis.password=@ecej.redis.password@
ecej.redis.hostName=@ecej.redis.hostName@
以下配置可选择增加
ecej.redis.maxIdle=@ecej.redis.maxIdle@
ecej.redis.maxTotal=@ecej.redis.maxTotal@
ecej.redis.maxWaitMillis=@ecej.redis.maxWaitMillis@
ecej.redis.maxRedirects=@ecej.redis.maxRedirects@
下面贴出profile的配置
<ecej.redis.hostName>10.4.89.161:6379</ecej.redis.hostName>
<ecej.redis.maxRedirects>10</ecej.redis.maxRedirects>
<ecej.redis.password></ecej.redis.password>
<ecej.redis.maxIdle>10</ecej.redis.maxIdle>
<ecej.redis.maxTotal>1000</ecej.redis.maxTotal>
<ecej.redis.maxWaitMillis>3000</ecej.redis.maxWaitMillis>
两种配置都有了,那下面说下怎么选择用哪种集群模式
ecej.redis.cluster=true 使用3.x模式
ecej.redis.sentinel=true 使用sentinel模式
注意:这俩配置选一个,放在application.properties中,不要乱放。
最后一步,配置文件读取
在PropertiesConfig中
3.Key的命名规范
应用名称
|
key定义
|
说明
|
---|---|---|
公共 | COMM_XXX | |
运营 | ADMIN_XXX | |
用户 | CUST_XXX | |
员工 | EMP_XXX | |
五、RabbitMQ 使用
RabbitMQ 使用说明
首先加入依赖
<dependency>
<groupId>com.nove</groupId>
<artifactId>ecej-rabbitmq</artifactId>
</dependency>
编写配置文件到application.properties
spring.rabbitmq.addresses=@ecej.rabbitmq.addresses@
注意:有密码就加下面的配置,没有千万不要加(正常都应该有密码,没密码找运维)
spring.rabbitmq.username=@ecej.rabbitmq.username@
spring.rabbitmq.password=@ecej.rabbitmq.password@
下面贴出profile
<!-- Rabbit MQ -->
<ecej.rabbitmq.addresses>10.32.32.35:5672,10.32.32.37:5672,10.32.32.40:5672</ecej.rabbitmq.addresses>
<ecej.rabbitmq.username>ecej</ecej.rabbitmq.username>
<ecej.rabbitmq.password>ecej</ecej.rabbitmq.password>
配置队列
发送消息
接收消息
六、druid的监控
因为我们现在都有druid,所以有配套的数据源监控
监控地址
http://localhost:8080/druid/index.html
用户名密码 默认 admin
七、spring sts插件
这个就大家按喜好安装吧,主要为了方便我们开发,IDEA直接支持了boot,eclipse得我们自己弄个插件,所以这玩意就是了。
有什么好处呢?
可以在properties中提示,当然,只有在application.properties中可以提示,还有各种别的用法我就不一一说了
安装方法
Help -》 install new software
然后下一步下一步就行了,这个安装包地址https://spring.io/tools/sts/all
八、应用监控
spring boot给我们提供了很多监控,什么bean的啊,状态啊等等,回头我有空写几个介绍在这
1.应用异常信息推送.
通用服务AOP切面会统一处理系统异常,异常捕获后会直接发起一个独立的线程像收集服务器发送数据.
项目配置.properties中增加如下配置
ecej-core 1.2.0+版本配置
九、部署
部署命令
nohup java -jar -Xms2048m -Xmx2048m -Xmn512m -Xss256k -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=heapdump.hprof xxx.jar --server.port=8080 --log.home=/xxx/ --log.level=INFO --log.stdout=0 –ecej.ops.iswitch=1 --ecej.ops.port=80 --jmx.rmi.port=9999 &
server.port:内置tomcat端口,默认8999
jmx.rmi.port:JMX监控端口,默认9999
log.home:日志存放目录地址,默认为/data/dubbo/logs/应用名称
log.level:日志级别,默认DEBUG
log.stdout:是否输出日志到控制台,默认输出, "0"为不输出
ecej.ops.iswitch:是否开启异常推送
ecej.ops.port:异常推送服务端口
dubbo.port=默认分配,(如同一台部署多份请在默认端口值上加100以免重复)
server.context-path 项目访问路径(默认是/ ,这样直接通过http://ip:port/就可以访问到index页面,如果要修改为http://ip:port/path/ 访问的话,那么需要在Application.properties文件中加入server.context-path = /你的path)
十、单元测试
继承上边的类即可
十一、异常处理
1.基本异常处理流程
异常处理
总体原则说明,controller层服务调用必须有try{}catch处理,不能在向上抛.已经是顶层了.可以通过AOP切面统一处理.如果当前web服务返回包含数据返回(JSON)和页面返回,可以分为两个package,设置两个切面分别处理
案例1:controller处理异常方法. 使用AOP拦截器对异常统一处理,保证有一个合适的返回值
controller 不建议有业务处理流程,包括返回值的额外处理流程,所以只处理返回信息即可.
AOP simple