遇到的问题:断言处理,uri: http:// 访问没问题,uri:lb:// 服务名 负载时出现问题,正常会执行
LoadBalancerClientFilter,查看源码只执行了 RouteToRequestUrlFilter,通过调试最终是版本兼容问题
gateway pom主要依赖:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.5.RELEASE</version>
<relativePath/>
</parent>
<properties>
<java.version>1.8</java.version>
<spring-cloud-version>2.1.3.RELEASE</spring-cloud-version>
<spring-boot-version>2.2.2.RELEASE</spring-boot-version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
<version>${spring-cloud-version}</version>
</dependency>
<!--nacos的配置-->
<!--<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>-->
<!--nacos注册与发现-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<!--<exclusions>
<exclusion>
<groupId>com.netflix.ribbon</groupId>
<artifactId>ribbon</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflex-ribbon</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</exclusion>
</exclusions>-->
</dependency>
<!--<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.1.14.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
<version>2.2.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>-->
</dependencies>
<dependencyManagement>
<dependencies>
<!--整合spring cloud-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Greenwich.SR3</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--整合spring cloud alibaba-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.1.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
yml 文件配置
spring:
cloud:
nacos:
discovery:
# 指定nacos server的地址
server-addr: 127.0.0.1:8848
group: DEFAULT_GROUP
gateway:
discovery:
locator:
# 让gateway通过服务发现组件找到其他的微服务,从而自动转发请求
enabled: true
lower-case-service-id: true
routes:
- id: micro-web-1 # 路由的唯一标识,这种形式下通常是微服务名称
uri: lb://micro-web # lb代表从注册中心获取服务 # http://localhost:18083 # lb://micro-web
#order: 18083 # 路由的优先级,数字越小,优先级越高
predicates:
# 指定具体的路径进行匹配, uri中出现的服务名不能再出现path路径中
- Path=/myweb/**
# 当客户端访问http://localhost:8888/myweb/micro-web/user/queryMonitor 会路由到↓
# http://localhost:18083/myweb/user/queryMonitor,
# filters: #过滤
# - StripPrefix=1 #请求转发的时候会去掉 /web访问路径 最终转发请求的服务地址:
loadbalancer:
retry:
enabled: false
扩展:如何解决gateway跨域问题?
1、yml配置
1 spring:
2 cloud:
3 gateway:
4 globalcors:
5 cors‐configurations:
6 '[/**]':
7 allowedOrigins: "*"
8 allowedMethods:
9 ‐ GET
10 ‐ POST
11 ‐ DELETE
12 ‐ PUT
13 ‐ OPTION
2、通过Java配置的方式
@Configuration
public class CorsConfig {
@Bean
public CorsWebFilter corsFilter() {
CorsConfiguration config = new CorsConfiguration();
config.addAllowedMethod("*");
config.addAllowedOrigin("*");
config.addAllowedHeader("*");
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(new
PathPatternParser());
source.registerCorsConfiguration("/**", config);
return new CorsWebFilter(source);
}
}