Spring Cloud入门实战(四)------网关

前言

这一篇主要介绍如何构建服务网关,以及通过过滤器拦截请求。

正文

实例项目路径

第一步,依赖

Maven的.pom文件中网关所需依赖:

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-eureka</artifactId>
        <version>1.3.1.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-zuul</artifactId>
        <version>1.3.1.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <version>1.5.3.RELEASE</version>
        <exclusions>
            <exclusion>
                <groupId>com.fasterxml.jackson.core</groupId>
                <artifactId>jackson-databind</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

第二步,配置

定义配置文件,命名为application.yml或application.properties均可。

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8762/eureka/
server:
  port:
    8888
spring:
  application:
    name: zuul
zuul:
  routes:
    provider:
      path: /provider/**
      serviceId: provider
    consumer:
      path: /consumer/**
      serviceId: consumer

当访问/provider/getInfo的时候,网关会根据连接找到对应的【provider】Service对应的getInfo方法进行调用并返回结果。

第三步,过滤器

package com.silence.spring.cloud.zuul.filter;

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;
import java.io.IOException;

@Component
public class MyZuulFilter extends ZuulFilter {

    @Override
    public String filterType() {
        return "pre";
    }

    @Override
    public int filterOrder() {
        return 0;
    }

    @Override
    public boolean shouldFilter() {
        return false;
    }

    @Override
    public Object run() {

        RequestContext ctx = RequestContext.getCurrentContext();
        HttpServletRequest request = ctx.getRequest();
        Object token = request.getParameter("token");
        if (token != null) {
            return null;
        }
        ctx.setSendZuulResponse(false);
        ctx.setResponseStatusCode(401);
        try {
            ctx.getResponse().getWriter().write("auth fail!");
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;

    }

}

当系统需要对请求的URL进行拦截时,可以继承ZuulFilter,时而对拦截的URL进行处理,比如token验证等等。

第四步,启动

构建启动类:

package com.silence.spring.cloud.zuul;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;

@EnableZuulProxy
@EnableEurekaClient
@SpringBootApplication
public class ZuulApplication {

    public static void main(String[] args) {

        SpringApplication.run(ZuulApplication.class, args);

    }

}

验证

同样,查看注册中心http://localhost:8762/,如果出现如下图,证明连接注册中心成功。

验证结果

启动运行后,键入http://localhost:8888/consumer/printInfo 链接,可以获取与运行http://localhost:7000/printInfo 链接相同的结果:

运行结果

猜你喜欢

转载自blog.csdn.net/keysilence1/article/details/80228189
今日推荐