这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos
spring: application: name: hello-gateway cloud: gateway: routes: - id: path_route uri: http://127.0.0.1:8082 predicates: - Path=/hello/**
spring:
application:
name: hello-gateway
cloud:
gateway:
routes:
- id: path_route
uri: http://127.0.0.1:8082
predicates:
- Path=/hello/**
<?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>spring-cloud-tutorials</artifactId> <groupId>com.bolingcavalry</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>gateway-dynamic-route</artifactId> <dependencies> <dependency> <groupId>com.bolingcavalry</groupId> <artifactId>common</artifactId> <version>${project.version}</version> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency> </dependencies> <build> <plugins> <!-- 如果父工程不是springboot,就要用以下方式使用插件,才能生成正常的jar --> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <mainClass>com.bolingcavalry.gateway.GatewayDynamicRouteApplication</mainClass> </configuration> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </plugins> </build></project>
<?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>spring-cloud-tutorials</artifactId>
<groupId>com.bolingcavalry</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>gateway-dynamic-route</artifactId>
<dependencies>
<dependency>
<artifactId>common</artifactId>
<version>${project.version}</version>
</dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependencies>
<build>
<plugins>
<!-- 如果父工程不是springboot,就要用以下方式使用插件,才能生成正常的jar -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<mainClass>com.bolingcavalry.gateway.GatewayDynamicRouteApplication</mainClass>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
package com.bolingcavalry.gateway;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplicationpublic class GatewayDynamicRouteApplication { public static void main(String[] args) { SpringApplication.run(GatewayDynamicRouteApplication.class,args); }}
package com.bolingcavalry.gateway;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class GatewayDynamicRouteApplication {
public static void main(String[] args) {
SpringApplication.run(GatewayDynamicRouteApplication.class,args);
}
package com.bolingcavalry.gateway.filter;import lombok.Data;import lombok.ToString;import lombok.extern.slf4j.Slf4j;import org.springframework.cloud.gateway.filter.GatewayFilter;import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;import org.springframework.cloud.gateway.route.Route;import org.springframework.http.HttpHeaders;import org.springframework.http.HttpMethod;import org.springframework.http.server.reactive.ServerHttpRequest;import org.springframework.stereotype.Component;import org.springframework.util.MultiValueMap;import org.springframework.web.util.UriComponentsBuilder;import java.net.URI;import static org.springframework.cloud.gateway.support.ServerWebExchangeUtils.GATEWAY_ROUTE_ATTR;@Component@Slf4jpublic class BizLogicRouteGatewayFilterFactory extends AbstractGatewayFilterFactory<BizLogicRouteGatewayFilterFactory.BizLogicRouteConfig> { private static final String TAG_TEST_USER = "tag-test-user"; public BizLogicRouteGatewayFilterFactory() { super(BizLogicRouteConfig.class); } @Override public GatewayFilter apply(BizLogicRouteConfig config) { return (exchange, chain) -> { // 本次的请求对象 ServerHttpRequest request = exchange.getRequest(); // 调用方请求时的path String rawPath = request.getURI().getRawPath(); log.info("rawPath [{}]", rawPath); // 请求头 HttpHeaders headers = request.getHeaders(); // 请求方法 HttpMethod httpMethod = request.getMethod(); // 请求参数 MultiValueMap<String, String> queryParams = request.getQueryParams(); // 这就是定制的业务逻辑,isTestUser等于ture代表当前请求来自测试用户,需要被转发到测试环境 boolean isTestUser = false; // 如果header中有tag-test-user这个key,并且值等于true(不区分大小写), // 就认为当前请求是测试用户发来的 if (headers.containsKey(TAG_TEST_USER)) { String tageTestUser = headers.get(TAG_TEST_USER).get(0); if ("true".equalsIgnoreCase(tageTestUser)) { isTestUser = true; } } URI uri; if (isTestUser) { log.info("这是测试用户的请求"); // 从配置文件中得到测试环境的uri uri = UriComponentsBuilder.fromHttpUrl(config.getTestEnvUri() + rawPath).queryParams(queryParams).build().toUri(); } else { log.info("这是普通用户的请求"); // 从配置文件中得到正式环境的uri uri = UriComponentsBuilder.fromHttpUrl(config.getProdEnvUri() + rawPath).queryParams(queryParams).build().toUri(); } // 生成新的Request对象,该对象放弃了常规路由配置中的spring.cloud.gateway.routes.uri字段 ServerHttpRequest serverHttpRequest = request.mutate().uri(uri).method(httpMethod).headers(httpHeaders -> httpHeaders = httpHeaders).build(); // 取出当前的route对象 Route route = exchange.getAttribute(GATEWAY_ROUTE_ATTR); //从新设置Route地址 Route newRoute = Route.async().asyncPredicate(route.getPredicate()).filters(route.getFilters()).id(route.getId()) .order(route.getOrder()).uri(uri).build(); // 放回exchange中 exchange.getAttributes().put(GATEWAY_ROUTE_ATTR,newRoute); // 链式处理,交给下一个过滤器 return chain.filter(exchange.mutate().request(serverHttpRequest).build()); }; } /** * 这是过滤器的配置类,配置信息会保存在此处 */ @Data @ToString public static class BizLogicRouteConfig { // 生产环境的服务地址 private String prodEnvUri; // 测试环境的服务地址 private String testEnvUri; }}
package com.bolingcavalry.gateway.filter;
import lombok.Data;
import lombok.ToString;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import org.springframework.cloud.gateway.route.Route;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.stereotype.Component;
import org.springframework.util.MultiValueMap;
import org.springframework.web.util.UriComponentsBuilder;
import java.net.URI;
import static org.springframework.cloud.gateway.support.ServerWebExchangeUtils.GATEWAY_ROUTE_ATTR;
@Component
@Slf4j
public class BizLogicRouteGatewayFilterFactory extends AbstractGatewayFilterFactory<BizLogicRouteGatewayFilterFactory.BizLogicRouteConfig> {
private static final String TAG_TEST_USER = "tag-test-user";
public BizLogicRouteGatewayFilterFactory() {
super(BizLogicRouteConfig.class);
@Override
public GatewayFilter apply(BizLogicRouteConfig config) {
return (exchange, chain) -> {
// 本次的请求对象
ServerHttpRequest request = exchange.getRequest();
// 调用方请求时的path
String rawPath = request.getURI().getRawPath();
log.info("rawPath [{}]", rawPath);
// 请求头
HttpHeaders headers = request.getHeaders();
// 请求方法
HttpMethod httpMethod = request.getMethod();
// 请求参数
MultiValueMap<String, String> queryParams = request.getQueryParams();
// 这就是定制的业务逻辑,isTestUser等于ture代表当前请求来自测试用户,需要被转发到测试环境
boolean isTestUser = false;
// 如果header中有tag-test-user这个key,并且值等于true(不区分大小写),
// 就认为当前请求是测试用户发来的
if (headers.containsKey(TAG_TEST_USER)) {
String tageTestUser = headers.get(TAG_TEST_USER).get(0);
if ("true".equalsIgnoreCase(tageTestUser)) {
isTestUser = true;
URI uri;
if (isTestUser) {
log.info("这是测试用户的请求");
// 从配置文件中得到测试环境的uri
uri = UriComponentsBuilder.fromHttpUrl(config.getTestEnvUri() + rawPath).queryParams(queryParams).build().toUri();
} else {
log.info("这是普通用户的请求");
// 从配置文件中得到正式环境的uri
uri = UriComponentsBuilder.fromHttpUrl(config.getProdEnvUri() + rawPath).queryParams(queryParams).build().toUri();
// 生成新的Request对象,该对象放弃了常规路由配置中的spring.cloud.gateway.routes.uri字段
ServerHttpRequest serverHttpRequest = request.mutate().uri(uri).method(httpMethod).headers(httpHeaders -> httpHeaders = httpHeaders).build();
// 取出当前的route对象
Route route = exchange.getAttribute(GATEWAY_ROUTE_ATTR);
//从新设置Route地址
Route newRoute =
Route.async().asyncPredicate(route.getPredicate()).filters(route.getFilters()).id(route.getId())
.order(route.getOrder()).uri(uri).build();
// 放回exchange中
exchange.getAttributes().put(GATEWAY_ROUTE_ATTR,newRoute);
// 链式处理,交给下一个过滤器
return chain.filter(exchange.mutate().request(serverHttpRequest).build());
};
/**
* 这是过滤器的配置类,配置信息会保存在此处
*/
@Data
@ToString
public static class BizLogicRouteConfig {
// 生产环境的服务地址
private String prodEnvUri;
// 测试环境的服务地址
private String testEnvUri;
server: #服务端口 port: 8086spring: application: name: gateway-dynamic-route cloud: gateway: routes: - id: path_route uri: http://0.0.0.0:8082 predicates: - Path=/hello/** filters: - name: BizLogicRoute args: prodEnvUri: http://127.0.0.1:8082 testEnvUri: http://127.0.0.1:8087
server:
#服务端口
port: 8086
name: gateway-dynamic-route
uri: http://0.0.0.0:8082
filters:
- name: BizLogicRoute
args:
prodEnvUri: http://127.0.0.1:8082
testEnvUri: http://127.0.0.1:8087
package com.bolingcavalry.provider.controller;import com.bolingcavalry.common.Constants;import org.springframework.web.bind.annotation.*;import java.text.SimpleDateFormat;import java.util.Date;import java.util.Map;@RestController@RequestMapping("/hello")public class Hello { private String dateStr(){ return new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new Date()); } /** * 返回字符串类型 * @return */ @GetMapping("/str") public String helloStr() { return Constants.HELLO_PREFIX + ", " + dateStr() + " (from test enviroment)"; }}
package com.bolingcavalry.provider.controller;
import com.bolingcavalry.common.Constants;
import org.springframework.web.bind.annotation.*;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
@RestController
@RequestMapping("/hello")
public class Hello {
private String dateStr(){
return new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new Date());
* 返回字符串类型
* @return
@GetMapping("/str")
public String helloStr() {
return Constants.HELLO_PREFIX + ", " + dateStr() + " (from test enviroment)";
学习路上,你不孤单,欣宸原创一路相伴...
原文链接:https://www.cnblogs.com/bolingcavalry/p/17507693.html
本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728