Showing
1 changed file
with
149 additions
and
198 deletions
@@ -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 | + |
-
Please register or login to post a comment