我在公司的工作内容是,对于一个BS应用,负责服务器端开发工作,Java语言。与前端开发人员合作,最终提供给前端RESTFUL接口,保证页面正常响应。

经验之谈

一个接口可以理解为一个业务逻辑,一个业务逻辑可以由1~n个SQL组成。一个优质的接口,应该是通用的接口,一旦需求变了,给过来的参数有变化,那我尽量做到接口不变,你多给我一个参数或者某个参数变化一下,我就可以给出你要的结果。

后端提供给前端的接口,要尽量少。最好我给你一个接口,你可以用这一个接口做很多事,拿很多数据。这样对前端开发人员比较友好。后端开发人员对自己也要好一点,自己的mapper也要尽量通用,service层封装方法,几个service给出的方法,最好都是一个mapper或者几个mapper的组合。

写接口的时候,要考虑到接口的服役期,不要写一个简单的接口,临时使用。

举个例子,企业账户充值的页面,除了充值的功能外,原型上还有一个简单的充值记录查询功能,只是查找当前企业的充值记录。如果你的接口里面,没有将企业ID作为搜索条件传入,那么恭喜你,你可以准备好修改了。因为虽然短时期内,前端可以调你这个接口取得数据,但是今后原型上增加了【充值记录查询】这个功能,用户可以输入企业ID作为搜索条件,你就要改接口了。你要改成一个复杂一些的接口,在充值页面中使用,也在充值记录查询这个页面中使用,前端人员还得修改充值页面中调用的接口。这是典型的先甜后苦的情况。

为了前端和后端可以并行开发,后端开发人员应该先在RAP中定义接口并告知前端,前端开发人员就可以根据接口URL和参数,绑定到页面的触发函数中。

并行开发带来效率的提升的,但是难点是要预先筹划好接口,并且在后来的开发过程中尽量保证不变,特别是数组之类的数据结构不要修改,否则前端遍历处理的修改将会很麻烦。

要做到这样,就需要一些后端接口开发的经验,而且提前计划总是比较困难的,就像敏捷开发中的 Sprint Planning 总是比较难完成。但是坚持这么做,对自己的能力也是一种激励和提升,因此推荐这么做。

返回类和分页

返回给前端的数据,需要有Response类/ResponsePages类封装,也就是要带有返回码,返回消息和返回体。如果要求给出分页信息,那么ResponsePages类中,还需要有Page类,其中至少包括当前页数,每页显示条数和总条数信息。分页使用github的pagehelper工具类来完成。

返回码

返回码不可以使用http状态码,因为http状态码是有限的,而且提示信息很模糊,不足以定义丰富的业务错误,因此要定义自己的业务返回码。同样,也要成对定义业务返回消息,用于描述业务错误。业务分配的错误编码表,需要由研发部门统筹给出。如果是服务之间调用的,应当透传返回码和返回消息。

http返回对象:
{
code: code,
msg: msg,
pageInfo: { // 分页信息
curPage: 1,
pageLimit: 10,
page: 1,
total: 10
}
data: {data}
}

服务之间通信

服务和服务之间调用,通过RPC接口,一般分为【api模块】和【provider模块】。服务的治理采用微服务框架。服务有服务名称,服务组别和服务的版本号。 RPC的框架,2017年使用的是阿里的HSF框架,也就是Pandora容器。2018年10月开始,逐步转成帜讯RPC框架这是一种封装了Dubbo的RPC框架。目前正在进行架构改造。 微服务的架构下,服务部署在不同的服务器中,它们所对应的数据库也是不同的。有的时候,数据需要联查才可以组装,这就要考虑网络通信的代价。一般的做法,一次性从他处拿到数据,组装成map或者mapList,然后再与本地的数据做匹配。注意map或者mapList要尽量小。

HSF框架

HSF框架,服务的提供者具有@HSFProvider注解,服务的消费者具有@HSFConsumer注解,两者都会注册到【EDAS Config Center】注册中心,该注册中心负责服务的注册与发现,以及配置中心。每个服务都有Group,DataId和Version。如果在同一网段有两个Group、DataId和Version都相同的服务同时启动,那么注册中心就会进行随机调度。

帜讯RPC框架

帜讯RPC框架是封装了Dubbo的RPC框架,支持服务治理的框架参数化传入,可以是dubbo,也可以是市场上的任何一种RPC框架。目前默认是Dubbo。 具体来说,服务的提供者使用【@FlaginfoProvider】注解,服务的消费者使用【@FlaginfoConsumer】注解,服务组,服务名和版本号暂时不需要传入。注意,如果要标记提供者,不可以同时使用【@FlaginfoProvider】和【@Service】标签,否则会出现寻找实例化bean超过一个的错误。

我们来看一下RPC服务的代码结构,分为【api】和【provider】,简单来说,【api】中定义了暴露给其他服务的接口,【provider】中的内容是接口的实现。团队协作开发的时候,当你提交新的接口,而接口jar包版本又不升级的时候,需要记得把接口实现的代码一并提交。如果接口实现负责,一时间无法完成,那么可以先提交一个空的实现。如果你不这么做,那么当团队其他成员尝试发布RPC服务的时候,就会报【接口没有实现】的编译错误,影响发布。

开发杂谈

RAP一定要好好使用。在写接口之前,最好先定义好RAP,包括URL,入参和返回,这样前端开发人员就可以根据RAP去写前端页面,而同时后端人员可以实现这个接口。后端开发过程中,注意RAP上定义好的内容尽量不要变更。

关于枚举类,推荐使用Enum类来处理,好处是一次定义,多处使用,缺点是代码量增加,而且前端后端转换过程中要注意处理空值的情况。

一般,前端发起一个POST请求,传过来的参数是JSON格式的,后端使用Spring的【@RequestBody】注解将其转换成Java类,一般是一个VO。后端使用service处理以后,返回的是【@ResponseBody】类型的数据,这样前端拿到后自动会解析成JSON格式的数据。 以上是最基本的数据类型和标签使用,还有例如【@RestController】【@PostMapping】等,可以参看【Spring RESTful接口常用注解】。

持久层框架

后端和前端的交互,一般都是要从数据库中取出数据,然后在前端页面渲染。因此,后端写接口,很重要的一点,就是去数据库中取数据。帜讯使用的ORM框架是轻量级的MyBatis,DTO,mapper interface和xml文件,通过 MyBatis Generator自动生成。

下面来说说 MyBatis 的 xml文件。该文件可以接收VO,这样就可以直接接收前端传过来的参数。xml文件返回的一般是DTO,一般是DTO的List,注意调interface后要用一个List来组装。xml文件的核心是SQL语句,用于从数据库中取出数据。如果没有把握,可以将SQL语句在Navicat中执行一遍,看看输出的结果。

知识总结

我的认知中,简单地把【RESTFul接口/调用方式】理解为前端可以调用的,后端也可以通过httpClient的方式向其他服务的URL发送请求,获取数据;【RPC接口/调用方式】是服务之间的相互调用,前端无法直接使用。 前者通过Controller暴露出接口,前端访问URL,同时带上参数,如此来使用后端的服务;后者分api和provider,api暴露出接口,消费者引用提供者的api来调用。

创作日期:03/10/2018 21:32

Java后端开发工作 - 写接口的更多相关文章

  1. 零基础,三个月内,找到??? java后端开发工作

    一.分析你的问题 出于尊重,先分析一下你的原问题吧,从您的问题,我提取到关键信息:"零基础"."三个月内"."找到工作",最后一个关键词&q ...

  2. Java后端开发工程师是否该转大数据开发?

    撰写我对java后端开发工程师选择方向的想法,写给在java后端选择转方向的人 背景 看到一些java开发工程师,对java后端薪酬太悲观了.认为换去大数据领域就会高工资.觉得java后端没有前途.我 ...

  3. Java 后端开发常用的 10 种第三方服务

    请肆无忌惮地点赞吧,微信搜索[沉默王二]关注这个在九朝古都洛阳苟且偷生的程序员.本文 GitHub github.com/itwanger 已收录,里面还有我精心为你准备的一线大厂面试题. 严格意义上 ...

  4. 规范——Java后端开发规范

    Java后端开发规范 一.技术栈规约 二.命名规范 三.Java代码规范(注释规范.异常与日志.代码逻辑规范) 四.Mybatis与SQL规范 五.结果检查(单元测试及代码扫描) 六.安全规范 一.技 ...

  5. Java后端开发——美团(牛客)

    Java后端开发--美团(牛客) Java的基本数据类型,各自的字节数 ​ 老生常谈,不多说了. 类型 字节数 byte 1字节 short 2字节 int 4字节 long 8字节 float 4字 ...

  6. 2022美团Java后端开发春招实习面经

    2022美团Java后端开发春招实习面经 一面 1.讲一下计算机网络的五层架构,每层分别有什么协议 ​ 五层架构:应用层.运输层.网络层.数据链路层.物理层 ​ 2.什么是 Http 协议,各种 Ht ...

  7. Java后端开发书架

    本人摘录于江南白衣文章,文章地址:http://calvin1978.blogcn.com/articles/javabookshelf.html 书架主要针对Java后端开发. 3.0版把一些后来买 ...

  8. Java后端开发奋斗之路

    本人方向:Java后端开发方向,本文中内容持续更新中 Java技术栈:https://www.cnblogs.com/wyb666/p/10222070.html 推荐书籍:<程序员代码面试指南 ...

  9. Java后端开发

    Java后端开发 名称 内容 基本框架 Spring.Mybatis Linux服务器   数据库优化   消息服务 rabbitMQ.activeMq rocketMq 缓存服务 memcached ...

随机推荐

  1. vmware上安装centos7虚拟机

    1.1 Linux 的安装 安 装 采 用 在 虚 拟 机 中 安 装 , 以 方 便 不 同 班 级 授 课 时 , 需 要 重 复 安装的情况. 1.1.1 配置虚拟机 1. 在 VMware W ...

  2. 第三方日志库logrus使用

    日志是程序中必不可少的一个环节,由于Go语言内置的日志库功能比较简洁,我们在实际开发中通常会选择使用第三方的日志库来进行开发.本文介绍了logrus这个日志库的基本使用. logrus介绍 Logru ...

  3. Elasticsearch全文检索学习

    ElasticSearch官方网址:https://www.elastic.co ElasticSearch官方网址(中文):https://www.elastic.co/cn/ Elasticsea ...

  4. Django学习之文件下载

    在实际的项目中很多时候需要用到下载功能,如导excel.pdf或者文件下载,当然你可以使用web服务自己搭建可以用于下载的资源服务器,如nginx,这里我们主要介绍django中的文件下载. 我们这里 ...

  5. yii2 rules 规则

    required : 必须值验证属性 [['字段名'],required,'requiredValue'=>'必填值','message'=>'提示信息']; #说明:CRequiredV ...

  6. 【TencentOS tiny】深度源码分析(2)——调度器

    温馨提示:本文不描述与浮点相关的寄存器的内容,如需了解自行查阅(毕竟我自己也不懂) 调度器的基本概念 TencentOS tiny中提供的任务调度器是基于优先级的全抢占式调度,在系统运行过程中,当有比 ...

  7. 一个神秘现象引发对beego框架的思考

    小强最近在项目中遇到了一个很奇怪的问题:在整改日志规范时,为了避免影响现有的代码结构以及改动尽可能小的前提下,在调用记日志的SDK处将某一个字段值首字母改为大写,代码示例如下: fmt.Println ...

  8. 2018 php 面试

    排序算法 快速排序 快速排序是十分常用的高效率的算法,其思想是:先选一个标尺,用它把整个队列过一遍筛选,以保证左边的元素都不大于它,其右边都不小于它 function quickSort($arr){ ...

  9. MySQL学习(一)索引的基本认识

    MySQL中,所有的数据类型都可以被索引,包括普通索引,唯一性索引,全文索引,单列索引,多列索引和空间索引等. 额外的:我已知的自动创建索引的时机:创建主键,唯一,外键约束的时候 一.索引简介 1.1 ...

  10. cocos2dx 3.2 内存管理

    一.引用计数(cocos2d-x3.2的Node类中用到) 概念:记录当前对象被引用的次数.当次数为0时释放. 1 . retain  与 release 每调用一次retain()使计数+1 每调用 ...