引入pom
Gateway组件 和 Eureka客户端
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
yml配置
server:
port: 9527
spring:
application:
name: cloud-gateway
cloud:
gateway:
discovery:
locator:
enabled: true # 开启从注册中心动态创建路由的功能,利用微服务名称进行路由
routes:
- id: payment_route # 路由的id,没有规定规则但要求唯一,建议配合服务名
#匹配后提供服务的路由地址
#uri: http://localhost:8001
uri: lb://cloud-payment-service
predicates:
- Path=/payment/get/** # 断言,路径相匹配的进行路由
- id: payment_route2
#uri: http://localhost:8001
uri: lb://cloud-payment-service
predicates:
- Path=/payment/lb/** #断言,路径相匹配的进行路由
#- After=2020-05-27T11:45:00.000+08:00[Asia/Shanghai] #该时间后接口生效 Before Between
#- Cookie=username,agile #带Cookie,并且username的值为agile curl http://localhost:9527/payment/lb --cookie "username=agile"
#- Header=X-Request-Id,\d+ #请求头要有 X-Request-Id属性并且值为整数的正则表达式 curl http://localhost:9527/payment/lb -H "X-Request-Id:123"
eureka:
instance:
hostname: cloud-gateway-service
client:
fetch-registry: true
register-with-eureka: true
service-url:
defaultZone: http://eureka.com:7001/eureka/,http://eureka.com:7002/eureka/
启动类
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
/**
* @Author hzy
* @Date 2020/5/26 22:40
*/
@SpringBootApplication
@EnableEurekaClient
public class GatewayMain9527 {
public static void main(String[] args) {
SpringApplication.run(GatewayMain9527.class,args);
}
}
配置路由转发
yml方式配置路由
routes:
- id: payment_route # 路由的id,没有规定规则但要求唯一,建议配合服务名
#匹配后提供服务的路由地址
#uri: http://localhost:8001
uri: lb://cloud-payment-service#要转发的微服务名称
predicates:
- Path=/payment/get/** # 断言,路径相匹配的进行路由
也可以要求该请求在某个时间段请求、携带cookie等,配置如下
#- After=2020-05-27T11:45:00.000+08:00[Asia/Shanghai] #该时间后接口生效 Before Between
#- Cookie=username,agile #带Cookie,并且username的值为agile curl http://localhost:9527/payment/lb --cookie "username=agile"
#- Header=X-Request-Id,\d+ #请求头要有 X-Request-Id属性并且值为整数的正则表达式 curl http://localhost:9527/payment/lb -H "X-Request-Id:123"
Java方式配置路由
访问地址:http://localhost:9527/hello
import org.springframework.cloud.gateway.route.RouteLocator;
import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @Author hzy
* @Date 2020/5/26 23:00
*/
@Configuration
public class GateWayConfig {
//配置路由转发
@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder routeLocatorBuilder){
RouteLocatorBuilder.Builder routes = routeLocatorBuilder.routes();
routes.route("path_route_agile",
r->r.path("/hello")
.uri("http://www.baidu.com")).build();
return routes.build();
}
}
全局过滤器配置
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
import java.util.Date;
/**
* @Author hzy
* @Date 2020/5/27 15:53
*/
@Component
@Slf4j
public class MyLogFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
log.info("***********come in MyLogFilter: "+new Date());
String uname = exchange.getRequest().getQueryParams().getFirst("uname");
if(uname == null){
log.info("*********用户名null,非法用户");
exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE);
return exchange.getResponse().setComplete();
}
return chain.filter(exchange);
}
@Override
public int getOrder() {
return 0;
}
}
配置完过滤器此时上面的接口要携带参数:http://localhost:9527/hello?uname=123