我在公司的工作内容是,对于一个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. docker 使用及基本命令

    一.docker简单使用 a.列出镜像 docker images b.从docker hub拉取最新版本镜像 docker pull xxx 错误: Error response from daem ...

  2. LeetCode正则表达式匹配

    题目描述 给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 '.' 和 '*' 的正则表达式匹配. '.' 匹配任意单个字符 '*' 匹配零个或多个前面的那一个元素 所谓匹配,是要涵盖 整个 ...

  3. MongoDB 学习笔记之 地理空间索引入门

    地理空间索引: 地理空间索引,可用于处理基于地理位置的查询. Point:用于指定所在的具体位置,我们以restaurants为例: db.restaurants.insert({name: &quo ...

  4. python程序设计基础(嵩天)第五章课后习题部分答案

    第五章p1515.2:实现isodd()函数,参数为整数,如果参数为奇数,返回true,否则返回false.def isodd(s): x=eval(s) if(x%2==0): return Fal ...

  5. 数据库审计 DBAudit - Yearning 最新版

    数据库审计 DBAudit 2019/09/26 Chenxin 数据库审计 基本概念 数据库审计(简称DBAudit)能够实时记录网络上的数据库活动,对数据库操作进行细粒度审计的合规性管理,对数据库 ...

  6. 二次函数,为什么a>0就可以知道开口向上.

    最近自考. 学习高等数学. 学习高等数学过程中发现高中数学不会,,于是乎开始补高中数学. 学习高中数学过程中又发现初中数学有的不会,,于是乎开始补初中数学.. 可怕(→_→). 今天遇到一个二次函数, ...

  7. 如何在github上下载单个文件夹?

    前言:在查看源码的过程中,相信很多人都像我一样,遇到某个公司或个人的repository是几个项目的集合整理,而我只要其中某个项目文件夹.那不依赖其他软件,怎么通过git去下载呢??? 下面直接给个例 ...

  8. 数据存储检索之B+树和LSM-Tree

    作为一名应用系统开发人员,为什么要关注数据内部的存储和检索呢?首先,你不太可能从头开始实现一套自己的存储引擎,往往需要从众多现有的存储引擎中选择一个适合自己应用的存储引擎.因此,为了针对你特定的工作负 ...

  9. VMware ESXI6.0服务器安装系列:U盘安装问题汇总之网卡驱动安装

    本文转载至:http://blog.51cto.com/huanwenli/1749298 在给物理服务器安装ESXI的过程中经常会遇到网卡驱动问题,如果是买的是Dell.HP.IBM等厂商的服务器, ...

  10. WPF编程,C#中对话框自动关闭的一种方法(转载)

    本文原文链接:https://blog.csdn.net/qq_43307934/article/details/84933196———————————————— MessageBoxTimeout是 ...