项目地址: 链接:https://pan.baidu.com/s/1Mxo0ltvZbpz_r8mCU-mSpw
提取码:3j4a
1.问题答疑:
网关API(接口) Gateway(网关) ---接口网关注意: 接口没有界面
1.网关概念:相当于客户端请求统一先请求到网关服务器上,在由网关服务器进行转发到实际服务地址上,类似Nginx
2.网关作用:网关可以拦截客户端所有请求,对该请求进行权限控制,负载均衡,日志管理,接口调用监控等
3.网关和过滤器区别是什么?
网关是拦截整个微服务所有请求, 过滤器是拦截单个tomcat服务器请求
4.Nginx与Zuul区别?
相同点: Nginx和Zuul都可以实现负载均衡,反向代理,过滤请求,实现网关效果.
不同点: Nginx采用C语言编写,Zuul采用java语言编写. Zuul负载均衡实现:采用ribbon+eureka实现本地负载均衡
Nginx负载均衡实现:采用服务器端实现负载均衡.Nginx比Zuul功能会更加强大,因为Nginx整合一些脚本语言 (Nginx+Lua) 可以实现一些其他功能.
Nginx适合于服务器负载均衡 + 也可以实现网关. Zuul适合微服务中实现网关,而且使用技术是java语言
Nginx作用实现反向代理,Zuul对微服务实现网关拦截. 标配最好Nginx+Zuul实现网关.
5.接口什么背景下产生? 在面向服务架构和微服务背景下产生,目的都是为了解耦,RPC远程调用中产生
6.接口如何分类?
开放接口:其他机构合作伙伴进行调用(必须在外网访问) 蚂蚁开放平台 ,微信公众号开发
需要通过appid+appsocet生成accessToken进行通讯.对接支付开发,微信开发,目的可以
授权一些接口权限OAuth2.0协议方式 如:第三方联合登录
内部接口:一般只能在局域网中进行访问,服务与服务调用之间关系都在同一个微服务系统中,目的是为了
保证安全问题
设计一套公司项目的接口,你会如何设计?
接口权限(开放接口(遵循OAuth2.0协议)|内部接口),考虑幂等性,安全性(Https) 防止篡改数据(验证签名),
使用网关拦截接口实现黑名单和白名单 , 接口使用http协议+json格式restful风格目的为了跨平台.
考虑高并发 对接口服务实现保护.服务降级熔断隔离等.最后使用API统一管理平台 Swagger UI
2.搭建Zuul网关
1.添加pom.xml依赖
<!--SpringBoot整合WEB组件-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--SpringBoot整合Eureka客户端组件-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!--SpringCloud整合 zuul网关-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
2.添加配置文件application.properties
#指定运行端口
server.port=80
#服务名称
spring.application.name=zuul-gateway
#配置注册中心地址
eureka.client.service-url.defaultZone=http://localhost:8000/eureka/
#zuul网关配置 start
#当客户端发送请求127.0.0.1:80/api-member开头的,都会转发到会员服务
zuul.routes.api-member.path=/api-member/**
#服务别名 zuul网关默认整合ribbon 自动实现负载均衡轮询效果
zuul.routes.api-member.service-id=member
#当客户端发送请求127.0.0.1:80/api-order开头的,都会转发到订单服务
zuul.routes.api-b.path=/api-order/**
#服务别名
zuul.routes.api-b.service-id=order
#zuul网关配置 end
3.配置启动类
@SpringBootApplication
@EnableEurekaClient
@EnableZuulProxy //开启zuul 网关
public class AppGateWay {
public static void main(String[] args) {
SpringApplication.run(AppGateWay.class,args);
}
}
4,访问测试
5,添加Zuul过滤器
@Component
public class TokenFilter1 extends ZuulFilter {
//过滤类型
//pre:在请求被路由(转发)之前调用
//route:在路由(请求)转发时被调用
//error:服务网关发生异常时被调用
//post:在路由(转发)请求后调用
@Override
public String filterType() {
return "pre";
}
//过滤器执行顺序,当一个请求在同一个阶段的时候存在多个过滤器的时候,多个过滤器执行顺序
@Override
public int filterOrder() {
return 0;
}
//判断过滤器是否生效
@Override
public boolean shouldFilter() {
return true;
}
//编写过滤器拦截业务逻辑代码
@Override
public Object run() throws ZuulException {
//案例:拦截所有的服务接口,判断服务接口上是否有传递userToken参数
//1.获取上下文
RequestContext currentContext = RequestContext.getCurrentContext();
// 2.获取request对象
HttpServletRequest request = currentContext.getRequest();
// 3.获取token的时候从请求头中过去 ,此处测试,直接获取url上值
//String userToken = request.getHeader("userToken");
String userToken = request.getParameter("userToken");
if(StringUtils.isEmpty(userToken)){
//不会继续执行...不会去调用服务接口,网关服务直接响应给客户端
currentContext.setSendZuulResponse(false);
//返回一个错误提示
currentContext.setResponseBody("userToken is null");
currentContext.setResponseStatusCode(401);
return null;
}
//正常执行调用其他服务接口.....
return null;
}
}