1 微服务网关技术产生的背景
1) 接口什么背景下产生?
在面向服务架构和微服务背景下产生 目的都是为了解耦
rpc远程调用中产生的
2) 接口如何分类
开放接口:
其他机构合作伙伴进行调用(必须在外网访问) 蚂蚁开放平台 微信公众号开发
需要通过appid+appsocet 生成saccessToken进行通讯. 对接支付开发 微信开发
目的可以授权一些接口权限OAuth2.0协议方式 第三方联合登陆
内部接口:
一般只能在局域网中进行访问,服务与服务调用之间都在同一个微服务系统中
目的是为了保证安全问题
面试题:现在让你去设计一套公司项目的接口,你会如何设计
考虑:
接口权限(开放接口 | 内部接口) 考虑幂等性 安全性(Https) 防止篡改数据(验证签名) 使用网关拦截
接口实现黑名单和白名单 接口使用http协议+json格式 restful目的是为了跨平台
考虑高并发 对接口服务实现保护 服务降级 熔断 隔离之类 最后使用统一API管理平台 Api swagger
2 微服务网关平台设计思想
1) 网关 API(接口) Gateway(网关) —-接口网关注意:接口没有界面
网关概念:相当于客户端请求统一先请求到网关服务器上,在由网关服务器进行转发到实际服务地址上. 类似于Nginx
3 微服务网关网关的作用
网关可以拦截客户端所有请求,对该请求进行权限控制,负载均衡,日志管理,接口调用监控等.
4 网关与过滤器区别
过滤器适用于单个tomcat服务器进行拦截请求.
网关是拦截整个微服务所有请求.
5 Nginx与Zuul区别
相同点:
Zuul和Nginx都可以实现负载均衡 , 反向代理 , 过滤请求 , 实现网关效果.
不同点:
Nginx采用C语言编写
Zuul采用java语言编写
Zuul负载均衡实现:采用ribbon+eureka实现本地负载均衡
Nginx负载均衡实现:采用服务器端实现负载均衡
Nginx比Zuul功能会更加强大,因为Nginx整合一些脚本语言 (Nginx + Lua)
Nginx适用于服务器端负载均衡 + 也可以实现网关
Zuul适合微服务中实现网关, 而且使用技术是java语言
建议: Nginx + Zuul实现网关
Nginx作用实现反向代理
Zuul对无服务实现网关拦截
6 搭建SpringCloudZuul网关平台
1)网关讲解:
2)相关配置:
7 Zuul网关拦截参数信息
可以通过继承重写进行业务逻辑实现,相当于获取请求头中的信息,然后对信息进行进行校验判断
8 搭建动态Zuul网关路由转发
思路:
首先在网关微服务中yml配置参数 + 结合码云上以 网关名称dev.yml 进行配置
其次在eureka注册微服务中配置上码云上的地址
即可动态刷新 获取到码云上配置的网关下的微服务信息
9 网关集群概述
1) 互联网公司中网关都是集群
Zuul如何搭建集群版本 Nginx + Zuul 一主一备 或者轮训 多个
2) 在微服务中,所有服务请求都会统一请求到Zuul网关中
3)流程解说:
10 Zuul管理整个微服务接口文档原理
注意:未截全的是 前端访问
11 swagger中参数含义解释
@Api:用在请求的类上,表示对类的说明
tags=”说明该类的作用,可以在UI界面上看到的注解”
value=”该参数没什么意义,在UI界面上也看到,所以不需要配置”
spring接口文档注解: @ApiOperation
如下如代码截图:
@ApOperation不是spring自带的注解 而是swagger里面的com.wordnik.swagger.annotations.ApiOperation;
详细介绍:
@ApiOperation和@ApiParam为添加的API相关注解,个参数说明如下:
@ApiOperation(value = “接口说明”, httpMethod = “接口请求方式”, response = “接口返回参数类型”, notes = “接口发布说明”;其他参数可参考源码;
@ApiParam(required = “是否必须参数”, name = “参数名称”, value = “参数具体描述”
@ApiImplicitParams:用在请求的方法上,表示一组参数说明
@ApiImplicitParam:用在@ApiImplicitParams注解中,指定一个请求参数的各个方面
name:参数名
value:参数的汉字说明、解释
required:参数是否必须传
paramType:参数放在哪个地方
header —> 请求参数的获取:@RequestHeader
query —> 请求参数的获取:@RequestParam
path(用于restful接口)—> 请求参数的获取:@PathVariable
body(不常用)
form(不常用)
dataType:参数类型,默认String,其它值dataType=”Integer”
defaultValue:参数的默认值
@ApiResponses:用在请求的方法上,表示一组响应
@ApiResponse:用在@ApiResponses中,一般用于表达一个错误的响应信息
code:数字,例如400
message:信息,例如”请求参数没填好”
response:抛出异常的类
@ApiModel:用于响应类上,表示一个返回响应数据的信息
(这种一般用在post创建的时候,使用@RequestBody这样的场景,
请求参数无法使用@ApiImplicitParam注解进行描述的时候)
@ApiModelProperty:用在属性上,描述响应类的属性
示例:
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serializable;
@ApiModel(description= "返回响应数据")
public class RestMessage implements Serializable{
@ApiModelProperty(value = "是否成功")
private boolean success=true;
@ApiModelProperty(value = "返回对象")
private Object data;
@ApiModelProperty(value = "错误编号")
private Integer errCode;
@ApiModelProperty(value = "错误信息")
private String message;
}
12 LoggerFactory.getLogger的用法
ava开发过程中经常需要打印日志信息,往往会在每个类的第一行加上形如以下代码:
protected static final Logger logger = LoggerFactory.getLogger(XXX.class);
目的:使用指定的类XXX初始化日志对象,方便在日志输出的时候,可以打印出日志信息所属的类。
示例:protected static final Logger logger = LoggerFactory.getLogger(XYZ.class);
logger.debug(“hello world”);
输出:XYZ:hello world