Java开发手册¶
本手册旨在于帮助Java开发人员快速熟悉系统技术架构与设计思想,以快速启动与运行后端服务。
软件安装¶
- JDK1.8:参考官方文档安装并配置环境变量即可
- maven:参考官方文档安装并配置环境变量即可
- IDEA、Eclipse:参考官方文档安装即可
- Zookeeper:参考官方文档安装即可
可选
- Mysql、Redis、FastDFS、MongoDB、Nginx
开发环境提供中间件配置使用,详见环境与配置管理
系统架构¶
系统分层¶
- client:终端层,目前主要是PC、APP、H5等
- web-server:
controller
层,提供rest
接口,主要是对各类基本参数校验,或者不复用的业务简单处理等 - service:
- 接口实现层,
RPC
服务提供者,具体的业务逻辑服务实现 DAO
层,使用JOOQ
框架与数据库产生数据交互- MQ消息生产者
- api:接口层,所有的接口、实体类、公共常量在这里定义,也是其他模块服务依赖包
- async-service:
- MQ消息消费层
- 可以作为MQ消息生产者
- 可以使用
JOOQ
框架与数据库产生数据交互
中间件¶
- Zookeeper:
RPC
服务注册中心 - MQ:使用RabbitMQ作为消息中间件
- Redis:系统缓存
- FastDFS:系统文件存储
- MongoDB:系统首页配置等场景使用的数据临时存储
配置与说明¶
Maven¶
Web-server¶
- FastDFSConfig:文件上传服务器
spring.fastdfs.* = xxx
-
MemberSecurityManager:单点安全认证实现类
-
RestfulConfig:校验器、参数解析器、异常处理器等配置
-
WebConfig:拦截器、过滤器、频次等校验配置
-
XxxPermissionQueryResolver:越权拦截处理器,详见越权解决方案
-
RPCClientConfig:RPC Consumer相关配置,在
common-rpc
包提供
dubbo.* = xxx
Service¶
-
RpcConfig:指定
RPC
服务注册扫描包 -
RPCServerConfig:注册
RPC
服务相关配置,在common-rpc
包提供
dubbo.* = xxx
- MessageConfig、RabbitAutoConfiguration:
RabbitMQ
相关配置
spring.rabbitmq.* = xxx
JDBC
事务管理器配置
spring.datasource.* = xxx
dao
与数据库schema
配置
Async-service¶
- MessageConfig:
RabbitMQ
相关配置,消费者队列绑定配置
spring.rabbitmq.* = xxx
-
数据库相关配置:同
service
-
RPCClientConfig:
RPC Consumer
相关配置,在common-rpc
包提供,同Web-server
通用¶
- CacheConfig:缓存配置
spring.redis.* = xxx
spring.jedis.* = xxx
spring.data.mongodb.* = xxx
上述相关中间件服务配置开发环境提供给开发人员使用,详见环境与配置管理
启动工程¶
- 启动Zookeeper
-
启动服务
-
用开发工具选择Maven方式导入工程
-
运行
CourseServiceMain.java
启动xx-service服务,控制台看到如下信息表示启动成功
Started XxxServiceMain in 18.411 seconds (JVM running for 22.131)
- 运行
CourseWebServerMain.java
启动xx-web-server服务,控制台看到如下信息表示启动成功Started XxxWebServerMain in 19.027 seconds (JVM running for 20.428)
-
至此,后端工程已启动完成,可以使用YApi接口管理平台或者PostMan等工具进行接口测试。
MQ消息定义¶
-
所有的消息都使用
com.zxy.common.base.message.Message
类发送与接收 -
消息分类(type属性)
-
所有的类型都是5位数, 从左到右定义如下,完整示例: 10101 为添加人员消息:
- 第1位表示模块类别, 如: 人资模块为 1, 考试模块为2
- 第2-3位表示业务类别, 如: 人员操作为 01, 部门操作为02
- 第4-5位表示操作类别, 如: 添加人员为01, 修改人员为02
-
消息头(headers属性)
headers
属性是一些键值对, 键和值都是String类型-
一般用来存放消息相关的一些ID值
-
消息体(payload属性)
-
payload
属性可以用来传一些实体对象 -
一般来说,这个属性是不设值的,若需要设值请在组内发起讨论,再确定是否需要设值
-
消息定义方式
-
每个模块的API项目中都应该有一个消息定义常量类
-
把每个消息类型、 消息头的Key值都定义在里面,并在消息类型定义的注释里注明
headers
和payload
开发demo¶
详细开发指南请参考知学云Java开发demo