SpringCloud 第二代微服务网关

SpringCloud Zuul 微服务网关是 netflex 集成于其他服务,Zuul 2.0停止更新
SpringCloud Gateway 是 Spring 自己研发的

1. 官网地址

1. https://spring.io/guides/gs/gateway/
2. 根据官方文档可以进行了解使用

2. Gateway -- 简单例子

第一部分先简单的实现一个小的Demo

1. 工程使用的Spring Boot版本为2.0.1.RELEASE,Spring Cloud版本为Finchley.M7
2. 新建一个 Maven 工程 SpringCloud_Gateway_demo1
3. pom.xml 配置文件
    
        <!-- 管理依赖 -->
        <dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-dependencies</artifactId>
                    <version>Finchley.M7</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
            </dependencies>
        </dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-gateway</artifactId>
            </dependency>
        </dependencies>
        <!-- 注意: 这里必须要添加, 否者各种依赖有问题 -->
        <repositories>
            <repository>
                <id>spring-milestones</id>
                <name>Spring Milestones</name>
                <url>https://repo.spring.io/libs-milestone</url>
                <snapshots>
                    <enabled>false</enabled>
                </snapshots>
            </repository>
        </repositories>
4. 创建一个简单的路由 : 
    1. 在SpringCloud Gateway中使用 RouteLocator 的Bean 进行路由转发
    将请求进行处理,发送到目标服务,类似于nignx的反向代理
    r -> r.path("/taobao").url("http://www.163.com); 使用的是java 中的lambda 表单式
@Bean
    public RouteLocator customerRouteLocator(RouteLocatorBuilder routeLocatorBuilder){
        /*return routeLocatorBuilder.routes().route(
                r -> r.path("/taobao")
                        .filters(f -> f.addRequestHeader("Hello","World"))
                        .uri("http://www.163.com")
        )
                .build();*/

        return routeLocatorBuilder.routes().route(new Function<PredicateSpec, RouteLocatorBuilder.Builder>() {
            @Override
            public RouteLocatorBuilder.Builder apply(PredicateSpec predicateSpec) {
                return predicateSpec.path("/taobao")
                        .filters(new Function<GatewayFilterSpec, UriSpec>() {
                            @Override
                            public UriSpec apply(GatewayFilterSpec gatewayFilterSpec) {
                                return gatewayFilterSpec.addRequestHeader("Hello","world");
                            }
                        })
                        .uri("http://163.com");
            }
        }).build();
    }
    2. 在上边中的 customerRouteLocator 方法中,使用 RouteLocatorBuilder 进行路由的创建
    RouteLocatorBuilder可以让你添加各种predicates和filters,predicates断言的意思,顾名思义就是根据      
    具体的请求的规则,由具体的route去处理,filters是各种过滤器,用来对请求做各种判断和修改.
    3. 在访问地址时,打开网络调试,可以发现在请求头中添加了 Hello : "world"
    

### 3. Gateway 中使用 Hystrix

1. 在SpringCloud Gateway 中可以使用 Hystrix,Hystrix是 spring cloud中一个服务熔断降级的组件,在微服务系统有着十分重要的作用。 
Hystrix是 spring cloud gateway中是以filter的形式使用的    
@Bean
    public RouteLocator customerRouteLocator(RouteLocatorBuilder routeLocatorBuilder){
       return routeLocatorBuilder.routes().route(
                r -> r.path("/taobao")
                        .filters(
                                f -> f.addRequestHeader("Hello","World")
                        )
                        .uri("http://httpbin.org:80")
        ).route(
                r -> r.host("*.hystrix.com")
                        .filters(f -> f.hystrix(config -> config
                                .setName("mycmd")
                                .setFallbackUri("forward:/fallback"))).uri("http://httpbin.org:80")
        ).build();
    }
我们使用了另外一个router,该router使用host去断言请求是否进入该路由,当请求的host有“*.hystrix.com”,都会进入该router,该router中有一个hystrix的filter,该filter可以配置名称、和指向性fallback的逻辑的地址,比如本案例中重定向到了“/fallback”。     

郭鹏飞
12 声望3 粉丝

有志者事竟成,向着心中的目标(20K)努力