Gateway
客户端向Gateway 发送请求,通过在 Gateway Handler Mapping 中找到相匹配的路由,然后发送至Gateway Web Handler ,Handler再通过制定的过滤器将请求发送至实际的业务逻辑中
三大核心概念
1.Route(路由):路由是构建网关的基本模块,它由ID,目标URI,一系列的断言和过滤器组成,如果断 言为true则匹配该路由
2.Predicate(断言):参考的是java8的java.util.function.Predicate开发人员可以匹配HTTP请求中的所有内容(例如请求头或请求参数),如果请求与断言相匹配则进行路由
3.Filter(过滤):指的是Spring框架中GatewayFilter的实例,使用过滤器,可以在请求被路由前或者之后对请求进行修改。
一.路由route配置 创建新module springcloud-gateway-gateway9527
pom
//注意pom里不需要starter-web,starter-actuator
<dependencies>
<!--新增gateway-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
<groupId>com.psf.springcloud</groupId>
<artifactId>springcloud-api-commons</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
Gateway(网关)配置两种方法
1.yml配置
server:
port: 9527
spring:
application:
name: cloud-gateway
cloud:
gateway:
discovery:
locator:
enabled: true #开启从注册中心动态创建路由的功能,利用微服务名进行路由
routes:
- id: payment_routh #路由的ID,没有固定规则但要求唯一,建议配合服务名
#uri: http://localhost:8001 #匹配后提供服务的路由地址
uri: lb://SPRINGCLOUD-PAYMENT-SERVICE # springcloud-test8001
predicates:
- Path=/payment/lb #断言,路径相匹配的进行路由
- id: payment_routh2
#uri: http://localhost:8001
uri: lb://CLOUD-PROVIDER-HYSTRIX-PAYMENT #springcloud-provider-hystrix-payment8001
predicates:
- Path=/payment/hystrix/ok/** #断言,路径相匹配的进行路由
eureka:
instance:
hostname: cloud-gateway-service
client:
service-url:
register-with-eureka: true
fetch-registry: true
defaultZone: http://eureka7001.com:7001/eureka
成功
2.config @bean配置
@Configuration
public class GatewayConfig {
@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder){
RouteLocatorBuilder.Builder routes = builder.routes();
routes.route("path_route",r ->
//path是项目链接输入这个,就会跳转至uri
r.path("/baidu").uri("https://www.baidu.com")).build();
return routes.build();
}
}
输入 http://localhost:9527/baidu 会直接跳转至https://www.baidu.com
官方实例
一个eureka7001+两个服务提供者8001/8002
lb://serviceName是spring cloud gateway在微服务中自动为我们创建的负载均衡uri
yml
server:
port: 9527
spring:
application:
name: cloud-gateway
cloud:
gateway:
discovery:
locator:
enabled: true #开启从注册中心动态创建路由的功能,利用微服务名进行路由
routes:
- id: payment_routh #路由的ID,没有固定规则但要求唯一,建议配合服务名
#uri: http://localhost:8001 #匹配后提供服务的路由地址
uri: lb://cloud-payment-service
predicates:
- Path=/payment/get/** #断言,路径相匹配的进行路由
- id: payment_routh2
#uri: http://localhost:8001 #匹配后提供服务的路由地址
uri: lb://cloud-payment-service
predicates:
- Path=/payment/lb/** #断言,路径相匹配的进行路由
eureka:
instance:
hostname: cloud-gateway-service
client:
service-url:
register-with-eureka: true
fetch-registry: true
defaultZone: http://eureka7001.com:7001/eureka
启动类
@SpringBootApplication
@EnableEurekaClient
public class GetewayMain9527 {
public static void main(String[] args) {
SpringApplication.run(GetewayMain9527.class,args);
}
}
二.Gateway Predicate(断言)的使用
Predicate就是为了实现一组匹配规则,让请求过来找到对应的Route进行处理
配置api 4
比如 After的功能限制
时区时间的获取
ZonedDateTime zonedDateTime = ZonedDateTime.now();
System.out.println(zonedDateTime);
三.过滤器
1.Gateway过滤器
属于单一过滤器
配置api 5
2.自定义过滤器
全局过滤器
1.实现 impiemerts GlobalFilter ,Ordered
fliter
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.util.StringUtils;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
/**
* @ClassName: GlobalFilter
* @Auther: Administrator
* @Date: 2020/6/8 16:14
* @return version 1.0
*/
@Component
@Slf4j
public class GlobalFilters implements GlobalFilter, Ordered {
@Override
public int getOrder() {
return 0;
}
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
//exchange.getRequest().getQueryParams().getFirst("username") 获取连接username的值
String username = exchange.getRequest().getQueryParams().getFirst("username");
if(StringUtils.isEmpty(username)){
log.info("*****用户名为Null 非法用户,(┬_┬)");
exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE);//给人家一个回应
return exchange.getResponse().setComplete();
}
return chain.filter(exchange);
}
}
正确
失败
启动顺序 springcloud-eureka-server7001–>springcloud-provider-hystrix-payment8001–>springcloud-gateway-gateway9527
四.代码下载
其余
微服务工程构建(九)spingcloud整合eureka、 Hystrix断路器的降级、熔断、图形化
微服务工程构建(八)eureka环境OpenFeign使用
微服务工程构建(四) eureka集群环境构建 server与server之间相互注册配置 client修改成多个注册
END