fegin
要调用的接口
feign调用客户端
feign调用
负载均衡
熔断
请求压缩
日志
- 先开启系统级别日志
gateway
Spring Cloud Gateway 是Spring Cloud团队的一个全新项目,基于Spring 5.0、SpringBoot2.0、Project Reactor 等技术开发的网关。 旨在为微服务架构提供一种简单有效统一的API路由管理方式。
Spring Cloud Gateway 作为SpringCloud生态系统中的网关,目标是替代Netflix Zuul。Gateway不仅提供统一路由方式,并且基于Filter链的方式提供网关的基本功能。例如:安全,监控/指标,和限流。
本身也是一个微服务,需要注册到Eureka client
网关的核心功能路由 过滤
核心概念通过画图解释
- 路由(route) localhost:18085 转发到哪里
- 断言Predicate函数路由转发规则/user localhost:18081 /order localhost:18085
- 过滤器(Filter)
通过网关配置一个路由功能,用户访问网关的时候,如果用户请求的路径是以/user
开始,则路由到user-provider
服务去
- 静态路由
spring:
application:
# 应用名
name: api-gateway
cloud:
gateway:
routes:
#id唯一标识,可自定义
- id: user-service-route
#路由的服务地址
uri: http://localhost:18081
# 路由拦截的地址配置(断言)
predicates:
- Path=/user/**
- 动态路由
过滤器
过滤器作为Gateway的重要功能。常用于请求鉴权、服务调用时长统计、修改请求或响应header、限流、去除路径等等.
过滤器的分类
默认过滤器:出厂自带,实现好了拿来就用,不需要自己实现
全局默认过滤器
局部默认过滤器
自定义过滤器:根据需求自己实现,实现后需配置,然后才能用哦。
全局过滤器:作用在所有路由上。
局部过滤器:配置在具体路由下,只作用在当前路由上。
默认过滤器几十个,常见如下:
过滤器名称 | 说明 |
---|---|
AddRequestHeader | 对匹配上的请求加上Header |
AddRequestParameters | 对匹配上的请求路由增加参数 |
AddResponseHeader | 对从网关返回的响应添加Header |
StripPrefix | 对匹配上的请求路径去除前缀 |
详细说明官方链接
修改配置文件
spring:
cloud:
gateway:
# 配置全局默认过滤器
default-filters:
# 往响应过滤器中加入信息
- StripPrefix=2
局部过滤器:通过局部默认过滤器,修改请求路径。局部过滤器在这里介绍两种:添加路径前缀、去除路径前缀。
自定义过滤器
自定义过滤器也有两个:全局自定义过滤器,和局部自定义过滤器。
模拟登陆校验
基本逻辑:如果请求中有Token参数,则认为请求有效放行,如果没有则拦截提示授权无效
校验步骤:
1.用户请求发送到gateway
2.自定义全局过滤器拦截请求,验证请求的url里面有没有token参数
3.有token正常返回数据/没有token返回410错误
全局过滤器自定义:
1.在gateway-service工程编写全局过滤器类GlobalFilter,Ordered
2.编写业务逻辑代码
3.访问接口测试,加token和不加token。
实现过程:
在gateway-service
中创建com.itheima.filter.LoginGlobalFilter
全局过滤器类,代码如下:
@Component
public class LoginGlobalFilter implements GlobalFilter, Ordered {
/***
* 过滤拦截
* @param exchange
* @param chain
* @return
*/
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
//获取请求参数
String token = exchange.getRequest().getQueryParams().getFirst("token");
//如果token为空,则表示没有登录
if(StringUtils.isEmpty(token)){
//没登录,状态设置403
exchange.getResponse().setStatusCode(HttpStatus.PAYLOAD_TOO_LARGE);
//结束请求
return exchange.getResponse().setComplete();
}
//放行
return chain.filter(exchange);
}
/***
* 定义过滤器执行顺序
* 返回值越小,越靠前执行
* @return
*/
@Override
public int getOrder() {
return 0;
}
}
局部过滤器定义
自定义局部过滤器,该过滤器在控制台输出配置文件中指定名称的请求参数及参数的值
实现步骤:
1. 在gateway-service中编写MyParamGatewayFilterFactory类(命名后缀必须是GatewayFilterFactory=)
2. 实现业务代码:循环请求参数中是否包含name,如果包含则输出参数值
3. 修改配置文件
4. 访问请求测试,带name参数
实现过程:
在gateway_service中编写MyParamGatewayFilterFactory类(标黄的名称不能变)
@Component
public class MyParamGatewayFilterFactory extends AbstractGatewayFilterFactory<MyParamGatewayFilterFactory.Config> {
/**
* 定义需要处理的参数
*/
public static final String PARAM_NAME = "name";
/****
* 处理过程
* @param config
* @return
*/
@Override
public GatewayFilter apply(MyParamGatewayFilterFactory.Config config) {
return new GatewayFilter() {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
String name = exchange.getRequest().getQueryParams().getFirst("name");
if(!StringUtils.isEmpty(name)){
System.out.println("名字参数:"+name);
}
String username = exchange.getRequest().getQueryParams().getFirst("username");
if(!StringUtils.isEmpty(username)){
System.out.println("名字参数:"+username);
}
return chain.filter(exchange);
}
};
}
/***
* 构造函数
*/
public MyParamGatewayFilterFactory() {
super(MyParamGatewayFilterFactory.Config.class);
}
/***
* 处理字段的排序
* @return
*/
@Override
public List<String> shortcutFieldOrder() {
return Arrays.asList(PARAM_NAME);
}
/****
* 定义一个内部类
* 需要处理的参数
* name:和处理的参数名字保持一致
*/
public static class Config {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
}
修改application.yml配置文件
测试访问,检查后台是否输出name和itcast;访问<http://localhost:18084/api/user/find/2?name=itheima&token=aaa>
会输出。
config配置中心
文件命名有规则:
配置文件的命名方式:{application}-{profile}.yml或{application}-{profile}.properties
application为应用名称
profile用于区分开发环境dev,测试环境test,生产环境pro等
开发环境 user-dev.yml
测试环境 user-test.yml
生产环境 user-pro.yml