文章目录
0 环境
- 操作系统:win10
- 编辑器:idea
- springcloud版本:H版
1 前言
每个微服务地址都有可能发生变化 通过API聚合内部服务 分割内外部系统 屏蔽内部实现细节 (可能理解不到位 多多包涵 类比台式机(无外壳) --> 外壳 --> 使用者 直接用无外壳台式机就可以嘿嘿了 但是为了更加耐操 需要安装外壳 再去使用它 相对来说无盖灰尘更容易进去/液体/一激动不小心提到了等 为了保护内部部件嘛 使用者不能直接与其接触)
- 对外部请求的组件进行处理 -> 服务网关
- 好处
- 客户端调用更加简单
- 权限问题统一处理
- 数据分割和拼接
- 不同客户端可提供不同的网关支持
- 好处
- 常见的网关
- zuul
- gateway
2 zuul简介
- zuul功能(核心过滤器)
- 动态路由
- 监控
- 权限控制(认证鉴权)
- 静态资源处理
- 负载均衡
- 灰度发布
3 初识zuul
3.1 创建springboot项目(zuul)
用到eureka server和provider还有zuul 说启动就是重启/开启这个3个启动类 之后不在重复说了
3.2 yml配置
设置应用名 端口 连接eureka
spring:
application:
name: zuul
server:
port: 2021
eureka:
client:
service-url:
# defaultZone: http://localhost:1234/eureka
defaultZone: http://localhost:8761/eureka
3.3 在启动类上开启路由代理
@SpringBootApplication
// 开启网关代理
@EnableZuulProxy
public class ZuulApplication {
public static void main(String[] args) {
SpringApplication.run(ZuulApplication.class, args);
}
}
3.4 启动
- 访问http://localhost:2021/provider/hello
3.5 yml路由配置
- provider --> 太过显眼 我想起个别名去调用它里面的服务
# 路由规则配置 复杂版
#zuul:
# routes:
# newbie:
# path:
# /newbie/**
# service-id:
# provider
# 路由规则配置 精简版
zuul:
routes:
provider:
/newbie/**
- 重启zuul 访问http://localhost:2021/newbie/hello
3.6 小结
依赖添加 开启zuul代理 yml配置 zuul --> routes --> 服务名 --> 自定义服务名及范围
4 zuul过滤器
- zuul过滤器 4种类型
- pre: 在路由请求调用前 做验证
- routing: 路由请求调用中 做一下自定义逻辑
- post: 在routing和post之后被调用
- error: 处理请求调用时的错误
执行顺序 pre --> routing --> post(任何一个过滤器异常 都会进入error)
- 配置过滤器
// 简单权限过滤器(只是试验而已)
@Component
public class ParmPermissFilter extends ZuulFilter {
// 过滤器类型 权限判断一般是pre
@Override
public String filterType() {
return "pre";
}
// 过滤器优先级
@Override
public int filterOrder() {
return 0;
}
// 是否过滤 修改一下(true --> 是)
@Override
public boolean shouldFilter() {
return true;
}
// 判断逻辑
// 在源码已经说过了 该返回值忽略它 无所谓返回了
@Override
public Object run() throws ZuulException {
RequestContext context = RequestContext.getCurrentContext();
HttpServletRequest request = context.getRequest();
String name = request.getParameter("name");
if (!"烤肉".equals(name)) {
// 设置响应返回
// 设置响应头(乱码)
context.addZuulResponseHeader("content-type","text/html;charset=utf-8");
// 响应码
context.setResponseStatusCode(401);
context.setResponseBody("请求拦截");
context.setSendZuulResponse(false);
}
return null;
}
}
- 启动
访问
http://localhost:2021/newbie/hello?name=111
4 其他配置简介
- yml配置
# 注意
# /consumer/**与/consumer/hello/**属于包含关系
# 假设我想访问/consumer/hello/ --> 目标是consumer-a
# 但结果不是我们想要的(冲突) 但是我想访问consumer-a(因为yml有优先级的 只要调换它们位置即可)
# 在properties配置属于无序 调也没用
#zuul:
# routes:
# consumer:
# /consumer/**
# consumer-a:
# /consumer/hello/**
# 路径忽略
#zuul:
# # 忽略某类地址
# ignored-patterns: /**/art/**
# # 忽略服务
# ignored-services: provider
#前缀
#zuul:
# # 加前缀 所有请求地址都会多一个/milk
# prefix: /milk
# 本地跳转
#zuul:
# routes:
# 服务名:
# url:
# forward:/xxx