- Route(路由):路由是网关的基本单元,由ID、URI、一组Predicate、一组Filter组成,根据Predicate进行匹配转发。
- Predicate(谓语、断言):路由转发的判断条件,目前SpringCloud Gateway支持多种方式,常见如:Path、Query、Method、Header等。
- Filter(过滤器):过滤器是路由转发请求时所经过的过滤逻辑,可用于修改请求、响应内容。
- route的组成部分
id:路由的ID
uri:匹配路由的转发地址
predicates:配置该路由的断言,通过PredicateDefinition类进行接收配置。
order:路由的优先级,数字越小,优先级越高。
Gateway
//yml
spring:
cloud:
gateway:
routes:
- id: baidu_route
uri: https://www.baidu.com
predicates:
- Query=url,baidu
- id: qq_route
uri: https://www.qq.com
predicates:
- Query=url,qq
//bootstrap.properties
spring.application.name=gulimall-gateway
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
#配置空间
spring.cloud.nacos.config.namespace=09765b91-4303-4f83-b962-7b0a10348c3d
#配置分组
//application.properties
spring.application.name=gulimall-gateway
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
server.port=88
不需要数据库
//排除包
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
配置网关
1.// 修改 api接口请求地址
window.SITE_CONFIG['baseUrl'] = 'http://localhost:88';
2.在renren-fast中 引入gulimall-common包
3.在application.yml中配置名称 和nacos地址
spring
application:
name: renren-fast
cloud:
nacos:
server-addr: 127.0.0.1:8848
在 RenrenApplication 开启注册发现 @EnableDiscoveryClient
4.在nacos 服务管理-服务列表中能发现 renren-fast 已经上线
5.将所有请求 发给网关gulimall-gateway 配置application.yml
- id: admin_route
# 路由地址 lb负债均衡
uri: lb://renren-fast
# 断言
predicates:
- Path=/api/**
# 重写访问路径
filters:
- RewritePath=/api/(?<segment>.*),/renren-fast/$\{segment}
6.处理跨域报错has been blocked by CORS ---
check: No 'Access-Control-Allow-Origin'
7.配置跨域
@Configuration //配置spring并启动spring容器
public class CORSFilter {
@Bean //加入容器中
public CorsWebFilter corsWebFilter() {
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
CorsConfiguration corsConfiguration = new CorsConfiguration();
// 配置跨域
corsConfiguration.addAllowedHeader("*");
corsConfiguration.addAllowedMethod("*");
corsConfiguration.addAllowedOrigin("*");
corsConfiguration.setAllowCredentials(true);
source.registerCorsConfiguration("/**",corsConfiguration);
return new CorsWebFilter(source);
}
}
解决gulimall-product 路由问题
1.在gulimall-gateway的application.yml中配置(*注 放在 admin_route 防止被路由走)
- id: product_route
uri: lb://gulimall-product
predicates:
- Path=/api/product/**
filters:
- RewritePath=/api/(?<segment>.*),/$\{segment}
2.配置gulimall-product bootstrap.properties 添加nacos 命名空间
spring.application.name=gulimall-product
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
spring.cloud.nacos.config.namespace=61d7324e-8cb0-4c84-a874-313ab76be69a
3.给GulimallProductApplication 注册发下@EnableDiscoveryClient
spring:
cloud:
gateway:
routes:
# - id: baidu_route
# uri: https://www.baidu.com
# predicates:
# - Query=url,baidu
#
# - id: qq_route
# uri: https://www.qq.com
# predicates:
# - Query=url,qq
- id: product_route
uri: lb://gulimall-product
predicates:
- Path=/api/product/**,/hello
filters:
- RewritePath=/api/(?<segment>.*),/$\{segment}
- id: third_party_route
uri: lb://gulimall-third-party
predicates:
- Path=/api/thirdparty/**
filters:
- RewritePath=/api/thirdparty(?<segment>.*),/$\{segment}
- id: member_route
uri: lb://gulimall-member
predicates:
- Path=/api/member/**
filters:
- RewritePath=/api/(?<segment>.*),/$\{segment}
- id: ware_route
uri: lb://gulimall-ware
predicates:
- Path=/api/ware/**
filters:
- RewritePath=/api/(?<segment>.*),/$\{segment}
- id: admin_route
# 路由地址 lb负债均衡
uri: lb://renren-fast
# 断言
predicates:
- Path=/api/**
# 重写访问路径
filters:
- RewritePath=/api/(?<segment>.*),/renren-fast/$\{segment}
- id: gulimall_host_route
uri: lb://gulimall-product
predicates:
- Host=gulimall.com,item.gulimall.com
- id: gulimall_search_route
uri: lb://gulimall-search
predicates:
- Host=search.gulimall.com
- id: gulimall_auth_route
uri: lb://gulimall-auth-server
predicates:
- Host=auth.gulimall.com
- id: gulimall_cart_route
uri: lb://gulimall-cart
predicates:
- Host=cart.gulimall.com
- id: gulimall_order_route
uri: lb://gulimall-order
predicates:
- Host=order.gulimall.com