目录
一、如何定义一个接口?
1、确定协议
定义一个接口首先确定接口的协议,Http协议及具体的方法(GET、POST、PUT、DELETE)
2、请求
接下来需要分析请求及响应的数据格式与内容
get 请求时,前端请求key/value串,SpringMVC采用基本数据类型 (String、Integer等)或自定义类
型接收。
Post请求时,前端请Form表单数据 (application/x-www-form-urlencoded) 和Json数据(Content-Type=application/ison)、多部件类型数据 (multipart/form-data),对于Json数据SpringMVC使用@RequestBody注解解析请求的json数据
3、响应
基本上都是返回Json格式的响应结果
4、生成接口文档
使用swagger注解描述接口的内容,使用Swagger生成接口文档
二、如何进行接口开发?
1、首先要仔细阅读接口文档,搞清楚接口的协议、请求及响应的数据格式、http状态码要求等。
2、使用代码生成器生成Mapper接口、Mapper xml文件和PO类
3、编写Service接口与Service实现。
4、对自定义的Mapper与Service方法进行单元测试。
5、在Controller调用Service完成业务逻辑处理
6、使用HttpClient工具测试Controller接口
三、 接口异常如何处理?
接口在过程中存在异常由统一异常处理器进行处理
1、处理自定义异常
程序在编写代码时根据校验结果主动抛出自定义异常类XueChengPlusException的对象,并编写详细的异常信息,异常处理器捕获异常信息记录异常日志并响应给用户。
2、处理未知异常
接口执行过程中的一些运行时异常也会由异常处理器统一捕获,记录异常日志,统一响应给用户500错误及统一的异常信息。
异常处理器使用控制器增加注解@ControllerAdvice和异常处理注解@ExceptionHandler来实现。
四、 如何进行接口测试和前后端联调?
每个接口开发完成在本地使用HttpClient工具进行测试
一个模块的接口开发完成后会和前端进行前后端联调。
什么是前后端联调?
前期接口定义好,前后端的工程师就开始并行开发了,前端开发人员在展示数据时会使用mock数据即假数据或叫虚拟数据进行开发,当前后端代码完成后,通常以模块为单位前后端工程开始进行接口联调,前端工程师将mock数据删除改为请求后端接口获取,前端代码请求后端服务测试接口是否正常这个过程是前后端联调。
当前后端联调出现问题需要根据测试环境下接口的请求及响应数据内容去判断是否符合接口文档的要求。查出是前端或后端的问题由具体的工程师负责修改,修改后再次回归测试。
五、如何解决接口跨域问题?
什么是跨域问题?
当浏览器通过Ajax调用服务端接口出现 No Access-Control-Allow-Origin' header..的信息时说明浏览器在调用接口时出现了跨域问题。
跨域是基于浏览器的同源策略,去判断是否跨域请求,同源策略是浏览器的一种安全机制,从一个地址请求另一个地址,如果协议、主机、端口三者相同则不是跨域,否则就是跨域请求。
比如下边的跨域例子:
从http://localhost:8601 到 http://localhost:8602 由于端口不同,是跨域从http://192.168.101.10:8601 到 http://192.168.101.11:8601 由于主机不同,是跨域.从http://192.168.101.10:8601 到 https://192.168.101.11:8601 由于协议不同,是跨域。解决跨域问题的方法如下:
1、JSONP
通过script标签的src属性进行跨域请求,如果服务端要响应内容则首先读取请求参数callback的值callback是一个回调函数的名称,服务端读取callback的值后将响应内容通过调用callback函数的方式告诉请求方。如下图:
2、添加响应头
服务端定义过滤器,在响应头添加 Access-Control-AllowiOrigin:*
3、通过nginx代理跨域
由于服务端之间没有跨域,浏览器通过nginx去访问跨域地址下边是一个示例说明
六、微服务之间接口如何调用?
微服务之间使用Feign进行远程调用,每个微服务都将自己注册到了服务注册中心nacos中,微服务在远程调用时会从服务注册中心找到目标服务的地址进行远程调用。当目标服务异常在远程调用时发生熔断,此时调用方要定义降级方法保证请求快速响应项目中使用FeignClient的fallbackFactory 编写降级方法,使用fallbackFactory 的好处可以获取发生熔断的异常信息。
七、什么是熔断降级?
熔断:
当下游服务异常而断开与上游服务的交互,它就相当于保险丝,下游服务异常触发了熔断,从而保证上游服务不受影响。
降级:
当下游服务异常触发熔断后,上游服务就不再去调用异常的微服务而是执行了降级处理逻辑,这个降级处理逻辑可以是本地一个单独的方法。
八、如何解决微服务雪崩?
1.什么是雪崩效应?
微服务的雪崩效应表现在服务与服务之间调用,当其中一个服务无法提供服务可能导致其它服务也死掉,比如:服务B调用服务A,由于A服务异常导致B服务响应缓慢,最后B、C等服务都不可用,像这样由一个服务所引起的一连串的多个服务无法提供服务即是微服务的雪崩效应。
2.如何解决微服务雪崩效应?
发生服务等待的原因可能是Feign的请求超时过长,也可能是Tomcat的线程用完,解决前者只要配置Feiqn的连接超时时长小一些即可,解决后者则需要线程隔离,给高并发的方法设置自己的专属线程池,这样当高并发到来其它的接口不受高并发方法的影响。
另外在还可以从以下方面去预防微服务雪崩:
1、熔断
当目标服务无法请求可以通过熔断将链路断开
使用histrix框架实现。
2、降级
当熔断发生走降级方法可以返回预先设置的数据
使用histrix框架实现。
3、限流
对于高并发请求的接口要进行限流,避免无限制的请求压力全部到达系统限流的方法可以用nginx实现,也可以用sentinel等中间件。