简单的需求开发记录

概述:本文记录了我开发第一个需求【挽留弹窗】的过程

明确需求

芥末端

配置界面

为游戏中心2.0的活动配置界面【新人引导奖励】下方增加一个挽留弹窗的part,拥有两个字段:

  • 【开关】,开关开启时展示面向用户选项,关闭时不展示
  • 【面向用户】只提供【全部】和【CRMID】选项

打开网页开发者工具,点开编辑,在【Network】中可以找到【detail】开头的name,在【Response】中可以复制Json代码到json.cn中进行解析,其中【bizConfig】字段中包含的也是一个Json实体,去掉转义字符可以同样进行解析发现对应的就是【订单返回奖励】到【新人引导奖励】这部分的内容。

在network中【detail】的【Headers】中可以找到【Request URL】从而定位API的名称,方便于在API分组中搜索【path】进行寻找 。

另外点击【保存】后会调用一个save方法,同样也可以在相应的Headers中定位API的位置和名称

在【Shepherd】通过【path】找到API接口后可以在【后端请求定义】中找到接口对应的名称,从而定位到了具体的代码(服务和方法)

例如如这里通过 /activity/generic/detail找到了MAPI下的 queryActivityDetail方法(.client.service.activity.ActivityManagerMTService

通过 /activity/generic/save找到了MAPI下的 saveActivity方法(.client.service.activity.ActivityManagerMTService

C端

需要调整主页加载接口

增加用户类型字段:retainPopDisplay, true表示满足挽留弹窗条件,false表示不满足

responseBody:

1
2
3
4
5
6
7
8
9
10
{
"code": 0,
"data":{
"code":0,
"message":"成功",
"retainPopDisplay":true,
......
......
}
}

如何定位对应的接口:

  • APPMOCK中绑定自己的设备,选择测试环境,扫码美团优选APP测试版,然后在手机中的mis号和泳道中进行相应的设置,完成后点开游戏中心。
  • 在APPMOCK中搜索【game】即可找到一些请求,其中后缀为loadMainView的为我们需要的这条请求,点入之后选择【Response】即可查看response的具体信息

写UT

要尽量覆盖到各种可能性,覆盖每一行代码

芥末端开发步骤

在interact.mapi包下

DTO到VO

找到要修改的位置:

  • ActivityManagerMTService类中的 queryActivityDetail方法出发,从接口找到实现类,

    • 进入 ActivityDetailResponse查看返回类型的具体信息,
    • 进入 ActivityDetailConfigVO,可以看到这里的对象与网络上detail的response中收到的Json格式的对象是对应起来的,包含baseInfo 基本信息, dispatchStrategy 分流信息, bizConfig 业务模型, ext 扩展信息,其中bizConfig是我们需要关注的东西,可以看到他是一个String。
  • 重新回到实现类 ActivityManagerMTServiceImpl,进入 ActivityManagerLocalService接口,可以看到 supportActivityType() save() detail()三个方法,进入detail()的实现,进入convertDTO2VO方法的实现,注意其中setBizConfig方法是我们需要设置bizConfig的关键代码

    1
    2
    ActivityDetailConfigVO vo = new ActivityDetailConfigVO();
    vo.setBizConfig(resolveExtraConfigWhenQuery(vo.getBaseInfo(),activityDTO.getExtraConfig()));
  • 进入 resolveExtraConfigWhenQuery接口再进入实现(GameCenter前缀的那一个)

  • 这里可以进入 GameCenterExtraConfigDTO加入DTO字段和对应方法(注意DTO的修改需要在另一个包下)和 GameCenterInfoConfigVO(需要在里面加入VO字段和对应方法)

  • 在同样的位置进入 buildExtraConfigVO方法,在其中new一个retainWindowVO对象,并将从DTO的对应数据set进去,完成DTO到VO对象的转换

VO到DTO

  • ActivityManagerMTService类中的 saveActivity方法出发,从接口找到实现类,

    • 入参是ActivityDetailConfigVO
    • 进入 PrimaryIdResponse查看返回类型的具体信息,可以看见其中是一个Long类型的data
    • 找到 saveActivity的实现,同样可以通过ActivityManagerLocalService找到其中的 save()方法,进入 AbstractActivityManagerService的实现
  • 可以看到save中需要更改的几处地方

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    public PrimaryIdResponse save(ActivityDetailConfigVO vo){
    //......

    //校验配置
    String bizCheckMsg = checkBizConfig(vo.getBaseInfo(), vo.getBizConfig());

    //...

    //0.init activity base info
    ActivityDTO activityDTO = init(vo);

    //......

    //convert and check
    activityDTO.setExtraConfig(resolveExtraConfigWhenSave(vo.getBaseInfo(), vo.getBizConfig()));
    }
  • 在【校验配置】部分,进入 checkBizConfig方法位于 GameCenterActivityManagerLocalServiceImpl实现中使用的 checkBaseAndBizParam方法(返回String),注意需要在这里设置校验

  • 【convert and check】部分,进入resolveExtraConfigWhenSave方法位于 GameCenterActivityManagerLocalServiceImpl实现中使用的 resolveExtraConfigWhenSave(返回String),可以进入 GameCenterConvert类中的 buildExtraDTO方法,在这里进行对应的VO对象到DTO对象的转换

设计RetainWindowDTO类

1
2
3
4
5
6
7
8
9
10
11
12
@ToString
@Getter
@Setter
public class RetainWindowDTO implements Serializable{
private static final long serialVersionUID = ;

//弹窗开关
privateBoolean popSwitch;

//任务人群配置
private CrowdConfigDTO crowd
}

注意还需要在GameCenterExtraConfigDTO中加入一条对应的配置

设计RetainWindowVO类

注意VO( View Object):显示层对象,通常是 Web 向模板渲染引擎层传输的对象。

注解使用:

@ToString:Lombok下自动生成toString()方法的注解

@ThriftStruct:Thrift组件用于定义结构体

生成serialVersionUID:注意要安装GenerateSerialVersionUID插件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
@ToString
@ThriftStruct
public class RetainWindowVO implements Serializable{
private static final long serialVersionUID = ;

//弹窗开关
private Boolean popSwitch;

//人群类型
private CrowdConfigVO crowdConfig;

@ThriftField(1)
public Boolean getPopSwitch(){
return popSwitch;
}

@ThriftField
public void setPopSwitch(Boolean popSwitch){
this.popSwitch = popSwitch;
}

@ThriftField(2)
public Boolean getCrowdConfig(){
return crowdConfig;
}

@ThriftField
public void setCrowdConfig(CrowdConfigVO crowdConfigVO){
this.crowdConfig = crowdConfig;
}
}

注意本地代码和远程代码的合并

1
2
//切换分支命令
git checkout 分支名

调试和测试

千万注意要在测试时要设置泳道 Tracer.setSwimlane("泳道名称"),否则默认是在默认渠道上进行的。并且要保证服务已经在泳道进行了部署,否则是在做无用功

userId = 5054538345L

poi=143339791618804

C端开发

game-center 包的core模块下的local包下找到 GameCenterLocalService类中的 loadMainSceneInfo方法:

  • 首先看返回类型 MainSceneResp,这里的字段其实是和网页上的Response中的内容对应的,我们要做的就是增加一个挽留窗口retainPopDisplay的字段,类型为Boolean

  • 查看 ActivityDTO可以发现其中有bizConfig字段

  • 在合并奖励结果部分写:

    1
    resp.setRetainPopDisplay(mainSceneService.getRetainPopDisplay(req, activityDto));

MainSceneService类下新增一个 getRetainPopDisplay(activityDto)的方法,用于通过DTO的状态获取得到RetainPopDisplay的结果。这里要写清楚业务需求的逻辑关系(最关键的部分!),目前的需求就是按照传入的dto和req中的id进行分析,看是否符合弹出挽留窗口的需求。

注意完成这部分的开发后要修改版本号,如从1.0.29到1.0.30-SNAPSHOT,然后在devtools网站上进行jar包的更新。

修改http服务

首先需要全局搜索grocerymkthd-game-center-clientjar包所在的pom.xml的位置并进行相应版本号的修改,才能导入我们开发完成后的字段和功能。

在web模块下,在controller包下找到 GameCenterController类中的 loadMainView方法,找到loadMainView的实现,在其中进入 convertToResp方法:

  • 查看返回类型 GameCenterMainSceneResp,在其中加入一个挽留弹窗状态 retailPopDisplay 的字段,返回类型为Boolean

  • 加入以下一行:

    1
    resp.setRetainPopDisplay(mainSceneResp.getRetainPopDisplay());

在泳道上部署服务

主要目的是进行自测和配合前端进行联调,写好UT保证行覆盖率

整体测试

在ones中完成一些case的测试

上线流程

  1. 上线文档补充填写,(有需求链接的)注意贴需求链接,ones上建立相应的分支(注意设置成release而不是feature的,买票上车)

  2. Code中提PR(Pull Request),注意要将代码中的版本号改为正式版本号

  3. Merge分支(注意需要有评论(QA要求)再Approve,另外确认版本号不能冲突)

  4. 另外在CTS创建PR(注意发布要考虑先后顺序)

  5. 点击生成中可以看到检测过程

  6. 检测通过后和第三步一样,评论、Approve、Merge

  7. 在集成泳道进行服务的部署:

    1. 去CTS可看到已生成
    2. 在Service中进行打包,注意要选择【tag】,分支注意查看日期是否对应不要选错
    3. 灰度发布,注意静默期间无法发布,并且发布过程中时刻在Raptor中注意异常数量和大盘趋势是否有异动,如果出现错误,单台机器可以直接禁用,多台机器则需要考虑回滚:
      1. 灰度任务创建,注意并发度
      2. 开始发布,注意周知流程
      3. copy机器ID,到Raptor中查看Error,涉及到大盘的服务(如game-center,gamecapi)要注意大盘信息
      4. 有问题需要禁用(Rhino)或回滚
  8. 在手机上进行测试,确认服务正常

线上监控

线上ERROR:

  • 线上ERROR率走势:errorRate = failCount/totalCount*100%
  • 接口错误率:errorRate = failCount/totalCount*100%

线上性能:

  • TP响应趋势:在开始时间和结束时间内,组织内所有服务(appkey)的平均响应时间走势

    TPavg = (TPavgA * totalCountA + TPavgB * totalCountB)/(totalCountA + totalCountB)

  • 慢响应(long-url):在开始时间和结束时间内,组织内所有服务(appkey)的long-url走势

  • 慢缓存(long-cache)

  • 慢消息(long-mq)

  • 慢RPC调用量(long-call)

  • 慢服务数(long-service)

线上故障:

  • 故障数(COE)
  • 热修复统计

遇到故障可以去日志中心进行问题定位(通过TraceId,UserId,注意要加双引号)

  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2022 ZHU
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信