spring cloud 2.x版本 Zuul路由网关教程

前言

本文采用Spring cloud本文为2.1.8RELEASE,version=Greenwich.SR3 html

本文基于前两篇文章eureka-server、eureka-client、eureka-ribbon和eureka-feign的实现。 参考java

概念

Zuul的主要功能是路由转发和过滤器。路由功能是微服务的一部分,例如将请求/api/goods转发到商品服务上、/api/order转发到订单服务上等。git

Zull默认和Ribbon结合实现了负载均衡功能。github

建立Zuul工程

1.1 建立sping boot工程:eureka-zuul

1.2 添加pom.xml相关依赖

<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
复制代码

1.3 application添加配置信息

spring:
 application:
 name: eureka-zuul
server:
 port: 8400

eureka:
 instance:
 hostname: localhost
 lease-renewal-interval-in-seconds: 5
 lease-expiration-duration-in-seconds: 10
 client:
 service-url:
 defaultZone: http://eureka1.server.com:8701/eureka/,http://eureka2.server.com:8702/eureka/,http://eureka3.server.com:8703/eureka/

zuul:
 routes:
 eureka-ribbon: #对应服务名称,能够自定义(最好保持一致)
 path: /ribbon/*
 serviceId: eureka-ribbon #对应服务名称
 eureka-feign:
 path: /eureka-feign/*
 serviceId: eureka-feign #对应服务名称
复制代码

1.4 启动类EurekaZuulApplication增长注解

package spring.cloud.demo.eurekazuul;

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

@EnableZuulProxy
@SpringBootApplication
public class EurekaZuulApplication {

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

}
复制代码

@EnableZuulProxy:开启Zuul网关注解spring

1.5 启动eureka-zuul服务

打开浏览器,分别输入http://localhost:8400/ribbon/sayHello,http://localhost:8400/eureka-feign/feign/sayHello,显示结果分别以下:apache

能够看到Zuul按照路由转发的配置规则,把/ribbon/*的请求转发到eureka-ribbon服务上,把/eureka-feign/*的请求转发到eureka-feign的服务上。api

至此,一个简单基于Zuul路由网关就搭建完成了。浏览器

彩蛋

添加自定义过滤器

Zuul过滤器有四种类型分别是app

  • pre 路由前
  • route 路由时
  • post 路由完毕
  • error 发生错误时

建立自定义过滤器filter

package spring.cloud.demo.eurekazuul.fillter;

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import org.apache.commons.lang.StringUtils;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/** * 简单filter过滤器 * @auther: maomao * @DateT: 2019-09-17 */
public class CommonFilter extends ZuulFilter {

    /** * 在请求被路由以前调用 * @return */
    @Override
    public String filterType() {
        return "pre";
    }

    /** * filter执行顺序,经过数字指定 ,优先级为0,数字越大,优先级越低 * @return */
    @Override
    public int filterOrder() {
        return 0;
    }

    /** * 是否执行该过滤器,此处为true,说明须要过滤 * @return */
    @Override
    public boolean shouldFilter() {
        return true;
    }

    @Override
    public Object run() throws ZuulException {
        RequestContext requestContext = RequestContext.getCurrentContext();
        HttpServletRequest request = requestContext.getRequest();

        //获取请求参数
        String token = request.getParameter("token");

        //校验token是否能够经过
        if (StringUtils.isNotBlank(token) && token.equals("maomao")) {
            requestContext.setSendZuulResponse(true);
            requestContext.setResponseStatusCode(200);
            requestContext.set("code", 1);
        } else {
            requestContext.setSendZuulResponse(false);
            requestContext.setResponseStatusCode(401);
            HttpServletResponse response = requestContext.getResponse();
            response.setHeader("content-type", "text/html;charset=utf-8");
            requestContext.setResponseBody("网关认证失败,中止路由");
            requestContext.set("code", 0);
        }
        return null;
    }
}
复制代码

将过滤器加入Bean,增长Config类

package spring.cloud.demo.eurekazuul.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import spring.cloud.demo.eurekazuul.fillter.CommonFilter;

/** * @auther: maomao * @DateT: 2019-09-17 */
@Configuration
public class ZuulFilterConfig {

    @Bean
    public CommonFilter commonFilter() {
        return new CommonFilter();
    }
}
复制代码

启动工程

在浏览器分别输入http://localhost:8400/ribbon/sayHello,http://localhost:8400/eureka-feign/feign/sayHello,显示结果以下:负载均衡

显示结果证实,过滤器已经生效。由于过滤CommonFilter中要求输入参入带token=maomao,因此请求被拦截,Zuul中止转发。

在浏览器中URL中增长token参数,显示以下:

显示结果证实,在token正确的状况下,Zuul转发成功。

至此,自定义的过滤器就演示完成。

总结

本文要实现了简单的Zuul路由转发应用。

代码地址

gitHub地址


《Srping Cloud 2.X小白教程》目录

转载请注明出处,

  • 联系方式:4272231@163.com
相关文章
相关标签/搜索