Authored by xjipeng

update

@@ -4,201 +4,152 @@ @@ -4,201 +4,152 @@
4 4
5 接口编号用于接口降级使用 5 接口编号用于接口降级使用
6 6
7 -## api.yoho.cn  
8 -  
9 -|接口名称| 编号|  
10 -|---|:---|  
11 -|app.product.intro|1|  
12 -|app.product.data|2|  
13 -|app.sort.get|3|  
14 -|app.search.category|4|  
15 -|app.search.sales|5|  
16 -|app.search.newProduct|6|  
17 -|app.search.fuzzy|7|  
18 -|app.search.li|8|  
19 -|app.brand.brandlist|9|  
20 -|app.search.brand|10|  
21 -|app.favorite.add|11|  
22 -|app.favorite.cancel|12|  
23 -|app.home.preference|13|  
24 -|app.search.top|14|  
25 -|app.search.last7day|15|  
26 -|h5.consult.li|16|  
27 -|h5.consult.add|17|  
28 -|h5.preference.Search|18|  
29 -|h5.sortPreference.Search|19|  
30 -|h5.product.data|20|  
31 -|h5.product.intro|21|  
32 -|app.config.fashioncodeTemplate|22|  
33 -|app.promotion.sendCheckCode|23|  
34 -|app.promotion.getCoupon|24|  
35 -|app.promotion.validCode|25|  
36 -|app.promotion.queryCoupon|26|  
37 -|app.address.get|27|  
38 -|app.address.getlist|28|  
39 -|app.address.add|29|  
40 -|app.address.del|30|  
41 -|app.address.setDefault|31|  
42 -|app.address.provinces|32|  
43 -|app.address.update|33|  
44 -|inbox.updateInbox|34|  
45 -|inbox.queryListById|35|  
46 -|app.inbox.getlist|36|  
47 -|app.inbox.getlistnew|37|  
48 -|app.register.sendRegCodeToMobile|38|  
49 -|app.register.validRegCode|39|  
50 -|app.coupons.total|40|  
51 -|app.coupons.li|41|  
52 -|app.home.getInfoNum|42|  
53 -|app.passport.register|43|  
54 -|app.passport.profile|44|  
55 -|app.passport.signin|45|  
56 -|app.passport.signinByOpenID|46|  
57 -|app.passport.bind|47|  
58 -|app.passport.changeCheck|48|  
59 -|app.passport.modifyBase|49|  
60 -|app.passport.check|50|  
61 -|app.passport.getPrivilege|51|  
62 -|app.passport.smsbind|52|  
63 -|app.passport.vip|53|  
64 -|app.passport.changeMobile|54|  
65 -|app.brand.getBrandIntro|55|  
66 -|app.yohocoin.lists|56|  
67 -|app.yohocoin.total|57|  
68 -|show.toShareOrderList|58|  
69 -|show.productShareOrderList|59|  
70 -|show.allToShareOrderList|60|  
71 -|show.ownerShareList|61|  
72 -|show.otherToShareOrderList|62|  
73 -|show.showChannel|63|  
74 -|show.saveShareOrder|64|  
75 -|app.SpaceOrders.getShareOrder|65|  
76 -|app.SpaceOrders.info|66|  
77 -|app.SpaceOrders.get|67|  
78 -|app.SpaceOrders.detail|68|  
79 -|app.SpaceOrders.confirm|69|  
80 -|app.favorite.brand|70|  
81 -|app.favorite.product|71|  
82 -|app.consult.add|72|  
83 -|app.consult.li|73|  
84 -|app.consult.common|74|  
85 -|app.product.preference|75|  
86 -|app.consult.useful|76|  
87 -|app.consult.like|77|  
88 -|app.resources.config.clientInitConfig|78|  
89 -|app.Shopping.add|79|  
90 -|app.Shopping.cart|80|  
91 -|app.Shopping.increase|81|  
92 -|app.Shopping.decrease|82|  
93 -|app.Shopping.swap|83|  
94 -|app.Shopping.remove|84|  
95 -|app.Shopping.payment|85|  
96 -|app.Shopping.count|86|  
97 -|app.Shopping.selected|87|  
98 -|app.Shopping.compute|88|  
99 -|app.Shopping.useCoupon|89|  
100 -|app.Shopping.submit|90|  
101 -|app.yoho.yohocoin|91|  
102 -|app.browse.product|92|  
103 -|app.browse.delete|93|  
104 -|app.yoho.redpacket|94|  
105 -|app.yoho.redpacketInfo|95|  
106 -|app.promotion.queryBirthCoupon|96|  
107 -|app.resources.getNotices|97|  
108 -|app.promotion.queryUserShowYohoCoin|98|  
109 -|app.Shopping.usePromotionCode|99|  
110 -|show.addPraise|100|  
111 -|show.cancelPraise|101|  
112 -|app.promotion_code.get|102|  
113 -|app.express.get|103|  
114 -|app.express.li|104|  
115 -|app.express.getExpressInfo|105|  
116 -|app.express.getExpressCompany|106|  
117 -|app.express.getNewExpress|107|  
118 -|app.express.getRefundExpress|108|  
119 -|app.refund.goodsList|109|  
120 -|app.refund.getList|110|  
121 -|app.refund.detail|111|  
122 -|app.refund.setexpress|112|  
123 -|app.refund.submit|113|  
124 -|app.SpaceOrders.close|114|  
125 -|app.SpaceOrders.delOrderByCode|115|  
126 -|app.register.sendBackpwdCodeToMobile|116|  
127 -|app.register.validBackpwdCode|117|  
128 -|app.register.changepwdByMobileCode|118|  
129 -|app.register.backpwdByEmail|119|  
130 -|app.inbox.getTotal|120|  
131 -|app.product.gift|121|  
132 -|app.consult.lastTwo|122|  
133 -|show.recentShareOrderByProductId|123|  
134 -|app.SpaceOrders.payConfirm|124|  
135 -|app.SpaceOrders.updateOrdersPaymentByCode|125|  
136 -|app.Shopping.erpSubmitStat|126|  
137 -|app.search.getTerms|127|  
138 -|app.search.compareRecord|128|  
139 -|app.search.getTerms|129|  
140 -|app.brand.banner|130|  
141 -|app.SpaceOrders.close|131|  
142 -|app.change.submit|132|  
143 -|app.change.detail|133|  
144 -|app.change.setexpress|134|  
145 -|app.change.getDelivery|135|  
146 -|app.change.goodsList|136|  
147 -|app.cover.getCoverStart|137|  
148 -|app.msgsys.getIosUser|138|  
149 -|app.Msgsys.getAndroidUser|139|  
150 -|app.msgsys.pushIosUser|140|  
151 -|app.Msgsys.pushAndroidUser|141|  
152 -|app.activity.getlist|142|  
153 -|app.activity.bindaccount|143|  
154 -|app.activity.getshare|144|  
155 -|app.activity.addshare|145|  
156 -|app.search.lifeStyle|146|  
157 -|app.search.kids|147|  
158 -|app.brand.banner|148|  
159 -|app.help.li|149|  
160 -|app.help.detail|150|  
161 -|app.drawline.getQueueList|151|  
162 -|app.drawline.addQueue|152|  
163 -|app.drawline.getUserActivityInfo|153|  
164 -|app.drawline.getActivityInfo|154|  
165 -|app.drawline.getLuckyUserList|155|  
166 -|app.drawline.changeTaskValue|156|  
167 -|app.limitcode.add|157|  
168 -|app.limitcode.query|158|  
169 -|app.limitcode.showredpoint|159|  
170 -|app.limitcode.deleteinvalid|160|  
171 -|app.limitProduct.alreadySaleLimitProduct|161|  
172 -|app.limitProduct.hotLimitProduct|162|  
173 -|app.limitProduct.soonToSaleLimitProduct|163|  
174 -|app.limitProduct.limitProductDetail|164|  
175 -|app.limitProduct.limitProductHtml|165|  
176 -|app.reminder.addUserReminder|166|  
177 -|app.reminder.getUserReminder|167|  
178 -|show.notCommentRecordCount|168|  
179 -|app.help.li|169|  
180 -|app.help.detail|170|  
181 -  
182 -## service.yoho.cn  
183 -|接口名称| 编号|  
184 -|---|:---|  
185 -|/operations/api/v5/webshare/getShare|1000|  
186 -|/operations/api/v4/icon/getIcon|1001|  
187 -|/operations/api/v5/resource/home |1002|  
188 -|/operations/api/v5/resource/get |1003|  
189 -|/union/UnionRest/activeUnion |1004|  
190 -|/payment/wechat_data |1005|  
191 -|/payment/wechat_notify|1006|  
192 -|/payment/alipaywap_notify |1007|  
193 -|/payment/wechatwap_notify |1008|  
194 -|/payment/alipay_notify |1009|  
195 -|/payment/alipay_newnotify |1010|  
196 -|/payment/unionpay_notify|1011|  
197 -|/payment/unionpay_newnotify|1012|  
198 -|/payment/unionpay_data|1013|  
199 -|/operations/api/v5/help/getCategory|1014|  
200 -|/operations/api/v5/help/getHelp|1015|  
201 -|/operations/api/v5/help/getHelpContent|1016|  
202 -|/operations/api/v6/category/getCategory|1017|  
203 -|/operations/api/v5/entrance/getEntrance|1018|  
204 -|/operations/api/v5/version/getVersion|1019|  
  7 +## Java Bean规范
  8 +
  9 +- 模型要严格分离,DO是数据库模型,BO是服务层模型,VO是Gateway对外暴露的模型,服务之间、gateway和服务之间,传输的对象是BO,Gateway对外暴露的是VO,访问数据库的事DO
  10 +- bean需要实现tostring方法。 如果加入到hashmap、hashtable、set之类容器的bean,需要实现hashcode和equals方法
  11 +- 如非必要,使用int,long,double、float代替包装类Integer、Long、Double、Float (自动生成的DO除外)
  12 +- 所有的BO、VO、DO,必须向前兼容,只能添加属性,不能废弃原字段,原字段必须支持并正确赋值。通过@Deprated注解标注,并明确规划在未来的某个版本删除
  13 +- 所有的VO类型必须为全字符串类型(新增接口和字段)
  14 +
  15 +## 数据库操作
  16 +
  17 +- Dao方法命名规范,必须以select、delete、insert、update开始
  18 +- Dao层接口的命名由I + 表名 + Dao构成,例如:IUserBaseDao.java, 对应表user_base;
  19 +- 除非必要,禁止在sql中做运算功能
  20 +- 禁止任何跨库关联查询
  21 +- 尽可能把数据库当KV存储使用
  22 +- 除非必要,禁止使用 join 查询
  23 +- 禁止出现一个数据库表创建多个DAO,一个表只允许在一个工程中使用
  24 +- 从数据库中获取非关键信息失败时,使用默认值
  25 +- 禁止每次查询静态配置表,应在进程内缓存
  26 +- 禁止for、while循环中存在数据库操作,以批量替代
  27 +- Mybatis返回一个对象时,sql语句中默认添加limit 1
  28 +
  29 +
  30 +## 缓存Redis使用
  31 +
  32 +- 数据持久化使用mysql,不依赖redis持久化
  33 +- redis的操作归集到一个类中,禁止修改缓存,需要修改的时候,直接delete key(单个key存在高并发场景的计数器除外)
  34 +- 对缓存更新不用采取数据库和缓存同步更新,首先更新数据库,再删除缓存;后续在使用时,再次触发缓存;禁止修改redis中数据
  35 +- 进程内的缓存,使用yoho-core框架中的LocalCache,禁止自行创建全局变量和更新线程
  36 +- 浏览类业务,比如资源位、商品等,必须支持二级缓存(服务灾备)
  37 +- 向Redis写数据时,必需设置有效期
  38 +- 使用前台的Redis时,必需使用yoho-core框架中的YHRedisTemplate、YHValueOperation等,禁止使用其他方式操作redis。使用外部redis,参考core中,自己定义template
  39 +- 所有缓存必需提供清理接口,由写入的服务提供
  40 +- 禁止for、while循环中操作缓存,以批量替代
  41 +- 尽可能使用一个key完成多个维度数据的缓存,比如使用ZSet、Hashes
  42 +- 缓存中默认保存字符串,对象转换为json后再存储到redis中,禁止采用其他方式序列化对象
  43 +- 有效期超过90天,必需使用longexpire
  44 +- 所有redis操作失败,必须支持回源数据库
  45 +- 禁止使用集合的并、交,模糊key,例如keys *
  46 +
  47 +
  48 +## 消息队列
  49 +
  50 +- 消费者处理时保证幂等性,支持重复处理同样的消息
  51 +- 消费者对于处理失败的消息,并且不能丢弃时,需抛出异常; 如果消息可以丢弃,则吃掉所有异常;
  52 +- 对于非实时感知结果的操作,尽量使用MQ,由后台进程处理;
  53 +- 对于MQ的使用,必须经过开发经理确认,才可以使用; 禁止私自使用MQ;
  54 +- 如果无性能瓶颈的场景,禁止使用MQ;如果必要使用,需向团队报备;
  55 +
  56 +## 线程使用
  57 +
  58 +- 禁止在Gateway和服务中自行创建线程,需要异步线程处理的任务,由后台进程完成
  59 +- 除非必要,禁止使用ThreadLocal;每个线程使用时,必须首先remove
  60 +- 创建线程、线程池必须要添加名称;
  61 +- 创建大量线程(线程数量>5)、循环中创建线程,需要和模块负责人确认
  62 +
  63 +## 服务调用
  64 +
  65 +- 请求外部系统时,统一使用service.call,比如erp、search、短信sp等
  66 +- 多次服务调用时,如果没有必然联系,使用异步并发调用
  67 +- 非关键请求时,传入默认值,比如获取用户vip信息、获取促销信息失败,用户仍然可以下单、查看购物车
  68 +- 服务调用选择最小化信息的接口,提高响应速度和降低负载
  69 +- 禁止在for、while循环中调用服务,均以批量接口替代
  70 +- 一次接口调用处理过程,对同一个服务,只能消费一次,需要聚合请求
  71 +
  72 +## 服务提供者
  73 +
  74 +- 服务处理异常流程,返回ServiceException,并定义服务错误码和接口错误码
  75 +- 禁止使用true、false做为返回值代替各种含义,比如成功、失败等,必须定义明确的返回值(失败可用ServiceException代替)
  76 +- 避免提供大而全的服务接口,为不同场景提供不同粒度的服务
  77 +
  78 +## 日志打印
  79 +
  80 +- Gateway 和 服务的所有 restapi的入口和返回、关键路径,都要打印info级别日志。日志内容包括请求参数,关键响应结果(对于过长的响应结果,只打印关键信息)
  81 +- 处理非自定义业务Exception(例如网络异常、数据库异常)的时候,需要打印WARN异常堆栈
  82 +- 关键业务,例如注册、支付、订单等需要打印专门的日志文件
  83 +- 如非必要,禁止在循环中打印日志
  84 +- Gateway所有接口增加trace注解,记录关键请求参数
  85 +- 日志使用英文清晰描述场景,禁止打印中文
  86 +- 用户关键信息打印时,比如(密码、电话号码)在日志中打印时需要模糊化处理
  87 +- 非关键路径的日志,打印debug级别日志
  88 +
  89 +## 性能指标
  90 +
  91 +- 一般情况下,服务接口延时不超过50ms
  92 +- Gateway对外提供接口,延时不能超过200ms
  93 +
  94 +## 工程依赖
  95 +
  96 +- 任何业务工程、子工程,不能存在互相依赖;
  97 +- 业务工程之间公用部分,提取工程发布到maven私服;比如搜索各工程间共用dal
  98 +- 所有工程、子工程的POM文件中,禁止出现依赖版本号,统一在yoho-parent中管理
  99 +- 外部依赖的配置(例如外部redis地址、外部restful接口地址)添加到global配置中,自己工程的配置加入auto-conf中。
  100 +
  101 +
  102 +## 基础编程
  103 +
  104 +- 数字和字符串常量,统一定义final变量,命名规则全大写
  105 +- 禁止if、else、try、catch多层嵌套,在核心业务逻辑处理前,优先处理异常逻辑
  106 +- 禁止在Gateway、服务中定义全局变量
  107 +- 如果获取非核心配置、信息失败,采用默认配置;比如,获取vip信息失败,导致无法下单
  108 +- 类、public方法必须注释用途、参数含义、返回值含义,特别是restapi、service所有public必须明确注释
  109 +- 关键业务的每个路径、普通业务的关键路径必须详细注释
  110 +- 每个方法的实际代码不超过30行(排除注释、换行等)
  111 +
  112 +## 金额计算
  113 +
  114 +- 如果首先计算商品本身价格,则丢弃精度,比如原价 81.1元,85折后68.935元,则商品价格取68.93元,让利用户
  115 +- 如果首先计算优惠价格,则向上取, 比如原价 81.1元,满减计算时优惠 12.344元,则优惠金额取值为 12.35元,让利用户
  116 +- 每次加减运算使用yoho-core中的YHMath
  117 +
  118 +
  119 +## Git
  120 +- 只能使用 SourceTree 作为客户端工具。 禁止使用任何其他工具。
  121 +
  122 +## 命名规范
  123 +
  124 + Controller类是以英文单词组成;由模块名 + Controller构成,例如:UserController.java;
  125 + Controller层方法的命名:同Service层方法的命名(绝大多数情况我们的Controller作为Service的访问跳板)
  126 +
  127 + Service层接口的命名由I + 模块名 + Service构成,例如:IUserService.java;
  128 + Service层实现的命名由 模块名 + ServiceImpl构 成,例如:UserServiceImpl.java
  129 + Service层方法的命名:以 操作动词 + ValueObject名
  130 + 创建前缀:create,比如:createUser(User user);
  131 + 修改前缀:update,比如:updateUser(User user);
  132 + 删除前缀:delete,比如:deleteUser(User user);
  133 + 查询前缀:find,比如:findUserByGroupId(Long groupId);
  134 + 统计前缀:stat,比如:statUser();
  135 +
  136 + Dao层接口的命名由I + 表名 + Dao构成,例如:IUserDao.java;
  137 + Dao层方法的命名:以 操作动词 + ValueObject名
  138 + 创建前缀:insert
  139 + 修改前缀:update
  140 + 查询前缀:select
  141 +
  142 +
  143 +
  144 +
  145 +
  146 +
  147 +
  148 +
  149 +
  150 +
  151 +
  152 +
  153 +
  154 +
  155 +