<dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency></dependencies>
网关服务里 pom.xml里加上如上命令
yml文件:
server:port: 80spring:cloud:gateway:discovery:locator:enabled: true # 启用gateway 服务发现功能lower-case-service-id: true # 启用小驼峰的服务名称访问服务routes: # 自定义路由机制-id: admin-service-router # /admin/**--->admin-serviceuri: lb://admin-servicepredicates:-Path = admin/**-id: member-service-router # /member/**--->member-serviceuri: lb://member-servicepredicates:-Path = member/**- id: finance-service-router # /finance/**--->finance-serviceuri: lb://finance-servicepredicates:- Path = finance/**- id: chan-service-router # /chan/**--->chan-serviceuri: lb://chan-servicepredicates:- Path = chan/**- id: statistics-service-router # /statistics/**--->statistics-serviceuri: lb://statistics-servicepredicates:- Path=statistics/**- id: match-service-router # /match/**--->match-serviceuri: lb://match-servicepredicates:- Path=match/**- id: exchange-service-router # /exchange/**--->exchange-serviceuri: lb://exchange-servicepredicates:- Path=match/**nacos:server-addr: 192.168.19.128:8848
config文件夹里有一个解决跨域的类:
package com.oy.config;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.web.cors.CorsConfiguration;import org.springframework.web.cors.reactive.CorsWebFilter;import org.springframework.web.cors.reactive.UrlBasedCorsConfigurationSource;/*** 解决跨域问题*/@Configurationpublic class CorsConfig {@Beanpublic CorsWebFilter corsWebFilter(){CorsConfiguration corsConfiguration = new CorsConfiguration();corsConfiguration.addAllowedHeader("*");corsConfiguration.addAllowedOrigin("*");corsConfiguration.addAllowedMethod("*");UrlBasedCorsConfigurationSource urlBasedCorsConfigurationSource = new UrlBasedCorsConfigurationSource();urlBasedCorsConfigurationSource.registerCorsConfiguration("/**",corsConfiguration);return new CorsWebFilter(urlBasedCorsConfigurationSource) ;}}
JWTFilter: 拦截用户请求,判断用户是否需要token
package com.bjsxt.filter;import com.alibaba.fastjson.JSONObject;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Value;import org.springframework.cloud.gateway.filter.GatewayFilterChain;import org.springframework.cloud.gateway.filter.GlobalFilter;import org.springframework.core.Ordered;import org.springframework.core.io.buffer.DataBuffer;import org.springframework.data.redis.core.StringRedisTemplate;import org.springframework.http.HttpHeaders;import org.springframework.http.HttpStatus;import org.springframework.http.server.reactive.ServerHttpResponse;import org.springframework.stereotype.Component;import org.springframework.util.StringUtils;import org.springframework.web.server.ServerWebExchange;import reactor.core.publisher.Flux;import reactor.core.publisher.Mono;import java.util.Set;@Componentpublic class JwtCheckFilter implements GlobalFilter, Ordered {@Autowiredprivate StringRedisTemplate redisTemplate ;@Value("${no.require.urls:/admin/login,/user/gt/register,/user/login,/user/users/register,/user/sms/sendTo,/user/users/setPassword}")private Set<String> noRequireTokenUris ;/*** 过滤器拦截到用户的请求后做啥* @param exchange* @param chain* @return*/@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {// 1 : 该接口是否需要token 才能访问if(!isRequireToken(exchange)){return chain.filter(exchange) ;// 不需要token ,直接放行}// 2: 取出用户的tokenString token = getUserToken(exchange) ;// 3 判断用户的token 是否有效if(StringUtils.isEmpty(token)){return buildeNoAuthorizationResult(exchange) ;}Boolean hasKey = redisTemplate.hasKey(token);if(hasKey!=null && hasKey){return chain.filter(exchange) ;// token有效 ,直接放行}return buildeNoAuthorizationResult(exchange) ;}/*** 给用户响应一个没有token的错误* @param exchange* @return*/private Mono<Void> buildeNoAuthorizationResult(ServerWebExchange exchange) {ServerHttpResponse response = exchange.getResponse();response.getHeaders().set("Content-Type","application/json");response.setStatusCode(HttpStatus.UNAUTHORIZED) ;JSONObject jsonObject = new JSONObject();jsonObject.put("error","NoAuthorization") ;jsonObject.put("errorMsg","Token is Null or Error") ;DataBuffer wrap = response.bufferFactory().wrap(jsonObject.toJSONString().getBytes());return response.writeWith(Flux.just(wrap)) ;}/*** 从 请求头里面获取用户的token* @param exchange* @return*/private String getUserToken(ServerWebExchange exchange) {String token = exchange.getRequest().getHeaders().getFirst(HttpHeaders.AUTHORIZATION);return token ==null ? null : token.replace("bearer ","") ;}/*** 判断该 接口是否需要token* @param exchange* @return*/private boolean isRequireToken(ServerWebExchange exchange) {String path = exchange.getRequest().getURI().getPath();if(noRequireTokenUris.contains(path)){return false ; // 不需要token}return Boolean.TRUE ;}/*** 拦截器的顺序* @return*/@Overridepublic int getOrder() {return 0;}}
controller:
@RestControllerpublic class GatewayFlowRulesController {/*** 获取当前系统的限流策略*/@GetMapping("/gw/flow/rules")public Set<GatewayFlowRule> getCurrentGatewayFlowRules(){return GatewayRuleManager.getRules() ;}/*** 获取我定义的api分组*/@GetMapping("/gw/api/groups")public Set<ApiDefinition> getApiGroups(){return GatewayApiDefinitionManager.getApiDefinitions() ;}}
启动类:
@SpringBootApplication@EnableDiscoveryClient //注册到nacospublic class GatewayServerApplication {public static void main(String[] args) {SpringApplication.run(GatewayServerApplication.class ,args) ;}}
在启动的时候报错:
百度一直说是因为gateway里有webfull包。把这个webfux包排除就好。
终于启动好。弄了很久

我最后在pom.xml上做的更改: 这样是能启动成功的。
<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>coin-iaas</artifactId><groupId>com.bjsxt</groupId><version>1.0</version></parent><modelVersion>4.0.0</modelVersion>//之前一直好多包都下不下来,在那个右侧的maven那里报红。加上下面这段代码就好了//主要是 <url>http://maven.apache.org</url>, 我在别的项目有看到<groupId>com.bjsxt</groupId><artifactId>gateway-server</artifactId><version>1.0-SNAPSHOT</version><name>culture-cloud-gateway</name><url>http://maven.apache.org</url><dependencies>//这个依赖我注释掉了。因为spring-cloud-starter-alibaba-nacos-discovery里有引入这个依赖<!-- <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId><exclusions><exclusion><groupId>org.springframework.boot</groupId><artifactId>>spring-boot-starter-webflux</artifactId></exclusion></exclusions></dependency>--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId><exclusions><exclusion><groupId>org.springframework.boot</groupId><artifactId>>spring-boot-starter-webflux</artifactId></exclusion></exclusions></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId></dependency><dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-datasource-nacos</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-spring-cloud-gateway-adapter</artifactId><exclusions><exclusion><groupId>org.springframework.boot</groupId><artifactId>>spring-boot-starter-webflux</artifactId></exclusion></exclusions></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId><exclusions><exclusion><groupId>org.springframework.boot</groupId><artifactId>>spring-boot-starter-web</artifactId></exclusion></exclusions></dependency></project>
接下来我想重现一下出错。看到底是哪个地方出的错:
我把所有排除webflux的地方一个个注释掉启动都能成功。但是如下,把spring-cloud-starter-gateway这个jar包放开,还是不行。报错在如下图:
<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>coin-iaas</artifactId><groupId>com.bjsxt</groupId><version>1.0</version></parent><modelVersion>4.0.0</modelVersion><groupId>com.bjsxt</groupId><artifactId>gateway-server</artifactId><version>1.0-SNAPSHOT</version><name>culture-cloud-gateway</name><url>http://maven.apache.org</url><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId><!-- <exclusions><exclusion><groupId>org.springframework.boot</groupId><artifactId>>spring-boot-starter-webflux</artifactId></exclusion></exclusions>--></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId><!-- <exclusions><exclusion><groupId>org.springframework.boot</groupId><artifactId>>spring-boot-starter-webflux</artifactId></exclusion></exclusions>--></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId></dependency><dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-datasource-nacos</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-spring-cloud-gateway-adapter</artifactId><!-- <exclusions><exclusion><groupId>org.springframework.boot</groupId><artifactId>>spring-boot-starter-webflux</artifactId></exclusion></exclusions>--></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId><!-- <exclusions><exclusion><groupId>org.springframework.boot</groupId><artifactId>>spring-boot-starter-web</artifactId></exclusion></exclusions>--></dependency></dependencies></project>
报错图:

如下是可以正常启动:把spring-cloud-starter-gateway注释掉。 那引起这个原因其实就是因为spring-cloud-alibaba-sentinel-gateway里有引用spring-cloud-starter-gateway,然后又引用一遍spring-cloud-starter-gateway。重复了。
<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>coin-iaas</artifactId><groupId>com.bjsxt</groupId><version>1.0</version></parent><modelVersion>4.0.0</modelVersion><groupId>com.bjsxt</groupId><artifactId>gateway-server</artifactId><version>1.0-SNAPSHOT</version><name>culture-cloud-gateway</name><url>http://maven.apache.org</url><dependencies><!-- <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId><exclusions><exclusion><groupId>org.springframework.boot</groupId><artifactId>>spring-boot-starter-webflux</artifactId></exclusion></exclusions></dependency>--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId><!-- <exclusions><exclusion><groupId>org.springframework.boot</groupId><artifactId>>spring-boot-starter-webflux</artifactId></exclusion></exclusions>--></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId></dependency><dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-datasource-nacos</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-spring-cloud-gateway-adapter</artifactId><!-- <exclusions><exclusion><groupId>org.springframework.boot</groupId><artifactId>>spring-boot-starter-webflux</artifactId></exclusion></exclusions>--></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId><!-- <exclusions><exclusion><groupId>org.springframework.boot</groupId><artifactId>>spring-boot-starter-web</artifactId></exclusion></exclusions>--></dependency></dependencies></project>

