实战篇-接口实现,配置和部署

# 接口配置

- 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)



SpringBoot入门系列

实战篇-项目架构,原则和分层
实战篇-基础设施,基类与配置
实战篇-接口实现,配置和部署
实战篇-仓储技术选型

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,393评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,790评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,391评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,703评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,613评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,003评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,507评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,158评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,300评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,256评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,274评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,984评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,569评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,662评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,899评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,268评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,840评论 2 339

推荐阅读更多精彩内容