实战篇-接口实现,配置和部署
# 接口配置
- api配置
通过@ControllerAdvice,截获已知异常,并返回相应的错误信息,具体见
flower-webapi/src/main/java/plus/cove/flower/webapi/config/WebResponseException.java · Jimmy.Zhang/flower - 码云 - 开源中国 (gitee.com)
@ControllerAdvice@ResponseBodypublic class WebResponseException {
private final Logger log = LoggerFactory.getLogger(WebResponseException.class);
@ExceptionHandler(ConstraintViolationException.class)
public ActionResult handleConstraintViolationException(ConstraintViolationException ex) { ... }
@ExceptionHandler(BusinessException.class)
public ActionResult handleBusinessException(BusinessException ex) { ... }
@ExceptionHandler(Exception.class)
public ActionResult handleServerException(Exception ex) { ... }
}
通过@RestControllerAdvice配置统一返回ActionResult,同时支持接口直接返回ActionResult,具体见
flower-webapi/src/main/java/plus/cove/flower/webapi/config/WebResponseAdvice.java · Jimmy.Zhang/flower - 码云 - 开源中国 (gitee.com)
@RestControllerAdvice(basePackages = "plus.cove.flower.webapi.controller")
public class WebResponseAdvice implements ResponseBodyAdvice<Object> {
...
}
通过ErrorController,截获一些404及未知错误来统一返回,具体见
flower-webapi/src/main/java/plus/cove/flower/webapi/component/ErrorController.java · Jimmy.Zhang/flower - 码云 - 开源中国 (gitee.com)
- mvc配置
配置验证器,拦截器,格式化,转换器,具体见flower-webapi/src/main/java/plus/cove/flower/webapi/config/WebMvcConfig.java · Jimmy.Zhang/flower - 码云 - 开源中国 (gitee.com)
@Configuration(proxyBeanMethods =false)
@EnableWebMvc
// 导入应用层及仓储实现层,为了保持应用层和仓储实现层不依赖其他框架,在此引入
@ImportResource({"classpath:beans/application.xml", "classpath:beans/repository.xml"})
// 扫描需要注入的包
@ComponentScan({"plus.cove.flower.*", "plus.cove.infrastructure.*"})
// 扫描过滤器等
@ServletComponentScan({"plus.cove.flower.*"})
public class WebMvcConfigimplements WebMvcConfigurer {
// 配置集合验证器,可以对集合内对象进行验证
@Override
public Validator getValidator() { return new SpringValidatorAdapter(new CollectionValidator());}// 配置格式化器,对http request query数据进行转换
@Override
public void addFormatters(FormatterRegistry registry) { }// 配置转换器,对http body数据进行格式化
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {}
}
- redis配置
通过RedisTemplate设置redis的key及value的序列化器,通过CacheManager设置支持过期时间及其他特性,具体见flower-webapi/src/main/java/plus/cove/flower/webapi/config/RedisConfig.java · Jimmy.Zhang/flower - 码云 - 开源中国 (gitee.com)
- filter
通过WebWrapperFilter对请求进行包装,然后日志拦截器LogTracingInterceptor即可以打印body,具体见flower-webapi/src/main/java/plus/cove/flower/webapi/config/WebWrapperFilter.java · Jimmy.Zhang/flower - 码云 - 开源中国 (gitee.com)
- metrics
自定义监控指标Counter类型,需要增加某个指标,通过调用MetricsConfig.getCounter("indicator_name").increment(); 具体使用详见监控篇。
- mybatis
通过MyBatisConfig配置MyBatis相关参数
@Configuration
@EnableTransactionManagement
// 配置扫面包
@MapperScan(basePackages ="plus.cove.flower.repository.mybatis")
public class MyBatisConfig {
@Bean
public SqlStatementInterceptor likeInterceptor() {
// 配置自定义MyBatis拦截器
SqlStatementInterceptor statement = new SqlStatementInterceptor();
return statement;
}}*SqlStatementInterceptor 主要实现过滤like的特殊符号_%[
副作用就是会修改传入参数,慎用,希望大神有更好的解决方法!!
- security
设置安全相关,可以配合WebSecurityFilter获取当前Token
# 接口部署
- profile
一般项目都会有开发环境,测试环境,生产环境,每个环境的参数是不一样的,SpringBoot的application.yml支持profile,每个profile可以设置不同的参数,通过application-{profile}.yml可以切换不同的环境。但这个需要在application.yml中指定spring.profiles.active=profile_name,手动切换还是比较繁琐且有出错的风险,所以我们需要自动化。
第一步:在application.yml中设置spring.profiles.active="@profile.active@",为什么必须用引号,没搞明白
第二步:在pom.xml中设置<profiles>,可以通过设置activation设置默认值
第三步:在pom.xml中build-resources中设置资源,filtering=true,includes中设置包含的资源,如果出现打包后资源不存在,则可能是此处设置错误
第四步:运行
运行方式1:通过在Maven中指定Profiles,直接在IDEA中运行即可
运行方式2:在命令中指定profile,-Pdevelop 比如:mvn spring-boot:run -Pdevelop 或者 mvn clean package -P develop
我们平时运行可以通过上述方式执行,但是发布呢,请看下一节
- deploy
为了减少发布出错的机率,我们可以通过shell脚本进行发布,包括tomcat部署和docker部署
- tomcat部署:需要在目标机器安装tomcat,具体代码见project/build/deploy.sh · Jimmy.Zhang/flower - 码云 - 开源中国 (gitee.com)
主要流程:编译-复制-部署
使用方式:./deploy.sh develop flower-api flower-api
* 具体可以根据项目需要进行修改
- docker部署:需要在本机及目标机器安装docker,具体代码见project/build/docker.sh · Jimmy.Zhang/flower - 码云 - 开源中国 (gitee.com)
主要流程:编译-镜像-保存-获取
* 具体可以根据项目需要进行修改
- nginx
Nginx官方推荐的nginx.conf标准配置 (jdon.com)
实战篇-项目架构,原则和分层
实战篇-基础设施,基类与配置
实战篇-接口实现,配置和部署
实战篇-仓储技术选型