前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SpringCloud教程(Finchley版本)-07:网关(Zuul)

SpringCloud教程(Finchley版本)-07:网关(Zuul)

作者头像
IT云清
发布2019-01-22 15:39:38
5380
发布2019-01-22 15:39:38
举报
文章被收录于专栏:IT云清IT云清
在微服务架构中,后端服务往往不会直接开放给调用端,而是通过一个网关根据请求的url,路由到相应的服务。当添加网关后,在第三方调用端和服务提供方之间就创建了一面墙,这面墙直接与调用方通信进行权限控制,后将请求均衡分发给后台服务端。在Spring Cloud体系中, Spring Cloud Zuul就起到了网关的作用,它可以提供动态路由,监控,弹性,安全等的边缘服务。本文示例一下zuul的简单使用,主要分为以下几个步骤:
  • 1.创建项目
  • 2.引入依赖
  • 3.修改配置文件
  • 4.添加启动注解
  • 5.自定义Filter
  • 6.启动项目,测试

1.创建项目

新建一个Springboot项目zuul_server1。

2.引入依赖

代码语言:javascript
复制
		<!--eureka client-->
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
		</dependency>

		<!--zuul-->
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
		</dependency>
代码语言:javascript
复制
	<dependencyManagement>
		<dependencies>
			<dependency>
				<groupId>org.springframework.cloud</groupId>
				<artifactId>spring-cloud-dependencies</artifactId>
				<version>${spring-cloud.version}</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>
		</dependencies>
	</dependencyManagement>
代码语言:javascript
复制
	<spring-cloud.version>Finchley.SR2</spring-cloud.version>

3.修改配置文件

zuul需要注册到eureka上,然后我们配置路由,配置指定类型的请求路由到指定的服务上:当请求path是以/api-a/开头的,就转发到feign-server1服务上,当请求path是以/api-b/开头的,就转发到service-ribbon服务上,如果有其他路由,在routes下继续添加即可:

代码语言:javascript
复制
server:
  port: 8018

spring:
  application:
    name: zuul-server

eureka:
  client:
    service-url:
      default: http://localhost:8761/eureka

zuul:
  routes:
    apia:
      path: /api-a/**
      serviceId: feign-server1
    apib:
      path: /api-b/**
      serviceId: service-ribbon

4.添加启动注解

代码语言:javascript
复制
//开启zuul的功能
@EnableZuulProxy
@EnableEurekaClient
@EnableDiscoveryClient
@SpringBootApplication
public class ZuulServer1Application {

	public static void main(String[] args) {
		SpringApplication.run(ZuulServer1Application.class, args);
	}
}

5.自定义Filter

zuul提供的功能,不仅仅是路由,我们还可以把所有的请求,在网关这一层,做个安全的校验,过滤,或者,也可以做一些其的处理。这里做个简单的token是否为空的校验,我们需要用到Filter.

Filter是Zuul的核心,用来实现对外服务的控制。Filter的生命周期有4个,分别是“PRE”、“ROUTING”、“POST”、“ERROR”,Zuul大部分功能都是通过过滤器来实现的,这些过滤器类型对应于请求的典型生命周期。

  • PRE: 这种过滤器在请求被路由之前调用。我们可利用这种过滤器实现身份验证、在集群中选择请求的微服务、记录调试信息等。
  • ROUTING:这种过滤器将请求路由到微服务。这种过滤器用于构建发送给微服务的请求,并使用Apache HttpClient或Netfilx Ribbon请求微服务。
  • POST:这种过滤器在路由到微服务以后执行。这种过滤器可用来为响应添加标准的HTTP Header、收集统计信息和指标、将响应从微服务发送给客户端等。
  • ERROR:在其他阶段发生错误时执行该过滤器。 除了默认的过滤器类型,Zuul还允许我们创建自定义的过滤器类型。例如,我们可以定制一种STATIC类型的过滤器,直接在Zuul中生成响应,而不将请求转发到后端的微服务。

此部分更具体的内容,可以参考:click here

我们来自定义一个Filter,用来校验token是否为空,自定义Filter,需要继承ZuulFilter,并实现其中的一些方法。我们在run中,多请求做个校验,当token为空时,就直接返回,不再向后端服务转发。

代码语言:javascript
复制
@Component
public class RequestFilter extends ZuulFilter{

  private static Logger logger = LoggerFactory.getLogger(RequestFilter.class);

  /**
   * pre 路由之前
   * routing 路由之时
   * post 路由之后
   * error 发送错误调用
   * @return
   */
  @Override
  public String filterType() {
    return "pre";
  }

  /**过滤的顺序,数字越小越先执行*/
  @Override
  public int filterOrder() {
    return 0;
  }

  /**这里可以写逻辑判断,是否要过滤,true表示过滤,false表示不过滤*/
  @Override
  public boolean shouldFilter() {
    return true;
  }

  /**filter需要执行的具体操作*/
  @Override
  public Object run() throws ZuulException {
    RequestContext currentContext = RequestContext.getCurrentContext();
    HttpServletRequest request = currentContext.getRequest();
    String token = request.getParameter("token");
    if(StringUtils.isEmpty(token)){
      logger.warn("=======>token is empty");
      currentContext.setSendZuulResponse(false);//不对其进行路由
      currentContext.setResponseStatusCode(401);
      try {
        currentContext.getResponse().getWriter().write("token is empty");
      }catch (Exception ex){
        ex.printStackTrace();
      }
    }else {
      currentContext.setSendZuulResponse(true);//进行路由
      currentContext.setResponseStatusCode(200);
    }
    return null;
  }
}

6.启动项目,测试

我们需要启动前几篇文章创建的几个服务,然后启动本文的服务。然后先访问:http://localhost:8018/api-a/getCompany?id=234, 这个请求中没有带token参数的,查看结果:

在这里插入图片描述
在这里插入图片描述

会发现,这个请求,并没有到后台服务,直接在网关这里就被拦截返回了。我们再请求一下:http://localhost:8018/api-b/getCompany?id=234&token=qweqew, 查看结果:

在这里插入图片描述
在这里插入图片描述

由于带的有token,请求顺利的到了后台,请求到了指定服务。

完整源码参考:https://github.com/myJava4all/springcloudfinchley

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018年12月15日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 在微服务架构中,后端服务往往不会直接开放给调用端,而是通过一个网关根据请求的url,路由到相应的服务。当添加网关后,在第三方调用端和服务提供方之间就创建了一面墙,这面墙直接与调用方通信进行权限控制,后将请求均衡分发给后台服务端。在Spring Cloud体系中, Spring Cloud Zuul就起到了网关的作用,它可以提供动态路由,监控,弹性,安全等的边缘服务。本文示例一下zuul的简单使用,主要分为以下几个步骤:
  • 1.创建项目
  • 2.引入依赖
  • 3.修改配置文件
  • 4.添加启动注解
  • 5.自定义Filter
  • 6.启动项目,测试
相关产品与服务
多因子身份认证
多因子身份认证(Multi-factor Authentication Service,MFAS)的目的是建立一个多层次的防御体系,通过结合两种或三种认证因子(基于记忆的/基于持有物的/基于生物特征的认证因子)验证访问者的身份,使系统或资源更加安全。攻击者即使破解单一因子(如口令、人脸),应用的安全依然可以得到保障。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档