项目结构
大约 6 分钟约 1686 字
项目结构参考
项目结构
Maven
demo
├── README.md
├── demo-sdk #feign 调用接口
│ ├── pom.xml
│ └── src
├── demo-common # 主要存放 实体 (这个模块可选)
│ ├── pom.xml
│ └── src
├── demo-service # 主要存放 controller、业务service、mapper
│ ├── pom.xml
│ └── src
│ └── application.yml
└── pom.xmlGradle
drawer
├── README.md // 项目的说明文档,通常描述项目的概述和使用方式
├── build.gradle.kts // 项目的顶级构建脚本,使用 Kotlin DSL 编写
├── drawer-common // 公共模块,用于储存可被其他模块复用的代码
│ └── build.gradle.kts // drawer-common模块的构建脚本,定义模块级别的构建配置
├── drawer-sdk // SDK模块,feign 调用接口 这里的结构通常是 部门内部的服务之间的调用 不属于外部(跨部门)SDK
│ ├── build.gradle.kts // drawer-sdk模块的构建脚本,定义模块级别的构建配置
│ └── src // SDK模块的源代码目录
├── drawer-service // 服务模块,包含服务端应用的相关代码
│ ├── build.gradle.kts // drawer-service模块的构建脚本,定义模块级别的构建配置
│ └── src // 服务模块的源代码目录
│ └── application.yml // 服务模块的配置文件
├── gradle // Gradle相关的附加配置和脚本目录
│ ├── gradle.properties // 额外的全局属性配置
│ └── wrapper // Gradle Wrapper相关文件,确保使用指定版本的Gradle
├── gradle.properties // 项目的全局属性配置文件
├── gradlew // Unix可执行的Gradle Wrapper脚本,用于确保使用正确的Gradle版本
├── gradlew.bat // Windows可执行的Gradle Wrapper脚本
└── settings.gradle.kts // 使用Kotlin DSL编写的项目设置文件,定义项目模块等信息示例项目见:https://gitlab.tiangong.site/fashion/backend/drawer
重要说明
application.yml
spring:
application:
name: demo-service # 应用程序的名称,用于标识该服务,通常与微服务名称一致
cloud:
nacos:
config:
username: ${NACOS_USERNAME} # 从环境变量或其他配置源读取 Nacos 用户名,用于身份验证
password: ${NACOS_PASSWORD} # 从环境变量或其他配置源读取 Nacos 密码,用于身份验证
server-addr: ${NACOS_SERVER_ADDR} # Nacos 服务器地址,配置中心的连接地址
namespace: ${NACOS_NAMESPACE} # Nacos 中的命名空间,便于逻辑隔离不同的配置和服务
group: ${NACOS_GROUP} # 配置所在的组,用于进一步组织和隔离配置
file-extension: ${NACOS_FILE_EXTENSION} # 配置文件的扩展名,如 yml 或 properties,定义配置格式
config:
import: # 依据项目需要自行导入需要的配置项 具体查看nacos
- optional:file:./bootstrap.yml # 可选地从本地文件系统导入配置文件 `bootstrap.yml`
- optional:nacos:yunwei-db.yml # 可选地从 Nacos 导入 `yunwei-db.yml` 配置文件
- optional:nacos:yunwei-resources-config.yml # 可选地从 Nacos 导入 `yunwei-resources-config.yml` 配置文件
- optional:nacos:nacos-register.yml # 可选地从 Nacos 导入 `nacos-register.yml` 配置文件
- optional:nacos:common-configuration.yml # 一些公共的配置 一般需要配置
- optional:nacos:${spring.application.name}.yml # 可选地从 Nacos 导入 `${spring.application.name}.yml` 配置文件,动态应用名称
- optional:nacos:${spring.application.name} # 可选地从 Nacos 导入不带扩展名的配置,动态应用名称2. nacos配置
2.1 common-configuration.yml (修改) (公共配置,不需要重复配置)
server:
# 容器线程配置
undertow:
threads:
io: 24
worker: 2000
feign:
client:
config:
default:
connectTimeout: 10000
readTimeout: 60000
loggerLevel: basic
booster:
# oss配置
oss:
domain: ${yibuyun.domain.oss}
pattern: ${framework.oss.pattern}
# cosid配置
cosid:
namespace: ${spring.application.name}
snowflake:
enabled: true
epoch: 1654016400
machine:
enabled: true
distributor:
type: redis
guarder:
enabled: true2.2 yunwei-resources-config.yml(修改)
mvc:
port:
#demo服务
demo-service: 4233
yibuyun:
dbs:
# demo服务
demo:
username: dev_cloud
passwd: Oc0Nqir76yBWxoKC&=3aapi-gateway (修改)
spring:
cloud:
gateway:
routes:
# demo服务
- id: demoService
uri: lb://demo-service
predicates:
- Path=/demo/**2.5 项目动态更新
如果项目需要动态更新配置,需要在nacos配置中心配置对应的配置文件,文件名称要与spring.application.name一致,如 demo-service.yml
server:
port: ${mvc.port.demo-service}
servlet:
context-path: /demo
spring:
redis:
host: ${yibuyun.redis[0].host}
port: ${yibuyun.redis[0].port}
password: ${yibuyun.redis[0].passwd}
datasource:
url: jdbc:mysql://${yibuyun.dbs.mysql8-master}/demo?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=false&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&allowMultiQueries=true
username: ${yibuyun.dbs.demo.username}
password: ${yibuyun.dbs.demo.passwd}
rabbitmq:
addresses: ${yibuyun.rabbit.addresses}
username: ${yibuyun.rabbit.username}
password: ${yibuyun.rabbit.passwd}
virtual-host: ${spring.profiles.active}
mybatis-plus:
mapper-locations: classpath*:mapper/**/*Mapper.xml
configuration:
map-underscore-to-camel-case: true
global-config:
db-config:
logic-delete-field: isDeleted # 全局逻辑删除的实体字段名(since 3.3.0,配置后可以忽略不配置步骤2)
logic-delete-value: 1 # 逻辑已删除值(默认为 1)
logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)
select-strategy: not_empty3. 代码生成
4. 代码开发
4.2 controller 开发
4.2.1 统一响应体
- DataResponse 统一的响应对象
- PageRespVo 统一的分页结果响应对象
@GetMapping("/page")
public DataResponse<PageRespVo<OrderInfoVo>> page(OrderInfoQuery queryDTO) {
return DataResponse.ok(orderInfoService.page(queryDTO));
}
@GetMapping("/{orderId}")
public DataResponse<OrderInfoVo> getById(@PathVariable(value = "orderId") Long orderId) {
return DataResponse.ok(orderInfoService.getById(orderId));
}
@PostMapping("/save")
public DataResponse<Void> create(@RequestBody @Validated OrderInfoReq req) {
orderInfoService.create(req);
return DataResponse.ok();
}4.2.2 添加url白名单
@Configuration
public class MvcConfig {
@Bean
public BoosterWebCustomizer boosterWebCustomizer() {
return properties -> {
properties.getUserAuth()
.addExcludePatterns(
"/xx/**"
);
};
}
}4.2.3 禁用认证拦截器
有些服务是完全不需要用户认证的,可以直接关闭用户认证拦截器开关
@Configuration
public class MvcConfig {
@Bean
public BoosterWebCustomizer boosterWebCustomizer() {
return properties -> {
properties.getUserAuth()
.setEnable(false);
};
}
}4.3 分布式锁
- booster框架介绍文档
4.4 redis操作
- CacheCommands 为了简化开发,booster封装了常用的redis命令
- StringRedisTemplate booster默认集成了spring-data-redis,可以使用StringRedisTemplate 操作redis
4.5 dao 开发
4.5.1 继承基类
BaseEntity包含了创建人id、创建时间、逻辑删除字段BaseWithReviserEntity继承BaseEntity,添加修改人id、最后修改时间字段BaseRepositoryRepository基类,提供增删改查、批量处理、逻辑删除相关方法
4.5.2 id生成
- 手动生成:IdHelper.getId()
- 自动生成
@TableId(value = "order_id", type = IdType.ASSIGN_ID)
private Long id;4.5.3 分页查询
推荐使用mybatis-plus自带分页查询方法。如果想要使用pagehelper插件,请自行添加pagehelper依赖pagehelper-spring-boot-starter。
// 自定义分页查询方法
IPage<Entity> selectPage(IPage<Entity> page , @Param("params") QueryReq params);
// BaseMapper自带的分页方法
IPage<Entity> selectPage(IPage<Entity> page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper)4.5.4 逻辑删除
按照我们的开发规范,所有表都需要包含is_deleted 逻辑删除字段。mybatis-plus支持逻辑删除,当你的表包含逻辑删除字段,BaseMapper.deleteById(Serializable id) 方法发出的是update 语句而不是delete语句。要注意的是,BaseMapper.deleteById(Serializable id) 删除方法是不记录最后修改人id和最后修改时间的。推荐使用下面的方法:
BaseRepository.logicDelete(Serializable id);
BaseRepository.removeById(Serializable id,true);
BaseMapper.deleteById(T entity);4.5.5 审计字段填充
4.6 sdk 开发
4.6.1 FeignClient 接口
booster默认配置了拦截器、编写Feign接口时不需要再手动配置 configuration属性。
@FeignClient(contextId = "OrderClient",value = OrderPathConstant.APPLICATION_NAME)
public interface OrderClient {
@GetMapping("/order/get")
DataResponse<OrderVo> get();
}4.6.2 Feign请求拦截器
- booster默认配置的请求拦截器如下:
- BoosterInnerFeignInterceptor
- BoosterTenantFeignInterceptor
- BoosterUserFeignInterceptor
