GateWay:springcloud提供请求过滤转发、负载均衡,的组件。
如果Consumer是集群状态默认进行负载均衡。
可以对请求进行过滤。
二、依赖 1、父项目 pom.xml2、GateWay网关项目 pom.xml文件8 8 1.8 2.3.2.RELEASE Hoxton.SR9 2.2.6.RELEASE pom org.springframework.boot spring-boot-dependencies${spring-boot.version} pom import org.springframework.cloud spring-cloud-dependencies${spring-cloud.version} pom import com.alibaba.cloud spring-cloud-alibaba-dependencies${spring-cloud-alibaba.version} pom import
三、配置文件org.springframework.boot spring-boot-starter-testtest com.alibaba.cloud spring-cloud-starter-alibaba-nacos-discovery2.2.6.RELEASE org.springframework.cloud spring-cloud-starter-gatewayorg.springframework.cloud spring-cloud-starter-netflix-hystrix
spring:
cloud:
gateway:
routes: #网关路由配置. 每一组路由包括: id(唯一标识), uri(转发目标服务器路径), predicates(断言,匹配方式), filters(过滤器)
- id: user-consumer
# uri: http://localhost:8180 #指定ip和端口转发
uri: lb://user-consumer #指定服务转发后面的是注册中心的名字
predicates:
- Path=/user
@SpringBootApplication
@EnableDiscoveryClient
// GateWay和熔断共用一个注解。所以需要添加该注解
@EnableCircuitBreaker
public class Gatewayapplication {
public static void main(String[] args) {
SpringApplication.run(Gatewayapplication.class,args);
}
}
五、通过网关项目访问Consumer
比如:上面配置文件写的路径这样就可以把我们的请求转发到对应的服务器上了。
http://localhost:8080/user-consumer/hello
http://localhost:8080/user-consumer/order
......
六、自定义全局过滤器-
为过滤器类实现接口 GlobalFilter,Ordered
-
添加@Component注解
-
getOrder()方法的值越小越先执行
@Component
public class orderfilter implements GlobalFilter, Ordered {
@Override
public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {
ServerHttpRequest request = exchange.getRequest();
ServerHttpResponse response = exchange.getResponse();
//执行目标业务
Mono filter = chain.filter(exchange);
//目标业务执行之后的操作
return filter;
}
@Override
public int getOrder() {
return 0;
}
}
2、直接返回json数据写法
@Component
public class orderfilter implements GlobalFilter, Ordered {
@Override
public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {
ServerHttpRequest request = exchange.getRequest();
ServerHttpResponse response = exchange.getResponse();
//执行目标业务
//不想执行可以重定向走
try {
JSONObject message = new JSONObject();
message.put("status",-1);
message.put("data","鉴定失败");
byte[] bits = message.toJSONString().getBytes(StandardCharsets.UTF_8);
DataBuffer buffer = response.bufferFactory().wrap(bits);
response.setStatusCode(HttpStatus.UNAUTHORIZED);
response.getHeaders().add("Content-Type","text/plain;charset=UTF-8");
return response.writeWith(Mono.just(buffer));
} catch (JSONException e) {
e.printStackTrace();
}
return chain.filter(exchange);
}
@Override
public int getOrder() {
return 0;
}
}



