# 后端规范
# 一、 系统说明
生产环境下,网关必须需要配置https(微信小程序和IOS强制要求)
只允许**服务网关(gateway微服务)**可外网访问,其他微服务禁止外网访问。
接口文档请看网关接口汇总:http://localhost:9900/doc.html
# 二、命名空间约定
命名空间是根据nacos的命名空间来定义的,所有的值都是指命名空间ID(并不是命名空间名称),所有的服务必须在同一个命名空间才能相互调用。
# 1).应用配置
bootstrap.properties的参数说明
spring.profiles.active=dev
## 这个参数,是应用启动最重要的参数之一。spring.profiles.active和多个配置有关
# 2).配置中心
spring.cloud.nacos.namespace=${spring.profiles.active}
## 这里的namespace指的是nacos的命名空间ID,注意并不是命名空间的名称,为了方便使用,我们设置nacos的命名空间的时候,把名称和ID设置为相同值。特别注意:除了配置nacos的账号密码,命名空间ID配置正确才能读取到配置,应用启动才能成功。否则一般出现读取配置失败,数据库无法连接成功。
# 3).日志配置
roncoo-education\roncoo-education-common\roncoo-education-common-log\src\main\resources\logback-spring.xml
<springProfile name="dev">
## 这里的name和spring.profiles.active的值相对应,按需配置日志即可
## 特别注意:控制台的日志不显示,一般是这里设置不对导致的。
</springProfile>
# 三、 规则约定
# 1. 环境参数的约定
所谓的环境参数是指区分本地、开发、测试、生产的环境参数,对应如下:
环境参数 | 说明 |
---|---|
local | 本地环境,调试使用 |
dev | 开发环境,开发使用 |
test | 测试环境,测试使用 |
prod | 生产环境,生产使用 |
环境参数可以按需增减
# 2. 接口工程的约定
roncoo-education-feign下面的所有子工程,都定义为接口工程(提供接口给其他工程调用),包结构如下:
- interfaces 接口类,命名规范:IFeign开头
- req 入参实体,命名规范:Req结尾
- resp 出参实体,命名规范:Resp结尾
# 3. 服务工程的约定
roncoo-education-service 下面所有的子工程,都定义为服务工程(提供接口给前端调用),包结构如下:
- dao 数据层
- feign 工程接口
- job 定时任务,分布式调用
- service
- api 前端接口,不需要登录的接口
- auth 前端接口,需要登录的接口,路径包含关键词:/auth
- admim 后台接口,需要登录的接口,路径包含关键词:/admim
# 4. 服务网关的约定
服务网关的主要功能:转发和鉴权。
转发功能:通过配置中心获取转发规则。
鉴权功能:通过判断请求路径是否包含某个约定的字符串来实现鉴权。
目前鉴权路径为:/admin、/auth、 /boss
# 5. 建表的约定
数据库必备字段:
`status` tinyint unsigned NOT NULL DEFAULT '1' COMMENT '状态(0:禁用,1:可用)',
`sort` int NOT NULL DEFAULT '100' COMMENT '排序,默认值:100',
`creator_id` bigint NOT NULL DEFAULT '0' COMMENT '创建人ID',
`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
只有2种状态的字段,字段类型:tinyint,值使用:0和1;
3种或以上状态的字段,字段类型:tinyint,值使用:1、2、3;
mysql8.0使用CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
# 四、注意事项
# 1. Feign接口规范
- Get,使用注解@PathVariable接收参数,应该保证幂等。
- Post,使用注解@RequestBody接收参数,不允许出现多个@RequestBody。
- 每个方法建议最多
1
个参数,如果超出 1 个参数的话,要封装成javabean
对象。
# 2. Seata分布式事务
- 不允许更新主键操作
# 3. 异常处理
- 在开发过程中,如果要抛远程异常,应该抛系统里面已经定义好的BaseException。
# 4. 循环调用
- 不允许在方法里面循环调用远程接口或者查询数据库,应该使用批量操作,主要是考虑性能问题