`

SringCloud | 第五篇: 路由网关(zuul)(路由转发和过滤功能)

 
阅读更多
在微服务架构中,需要几个基础的服务治理组件,包括服务注册与发现、服务消费、负载均衡、断路器、智能路由、配置管理等,由这几个基础组件相互协作,共同组建了一个简单的微服务系统。一个简答的微服务系统如下图:



注意:A服务和B服务是可以相互调用的,作图的时候忘记了。并且配置服务也是注册到服务注册中心的。

在Spring Cloud微服务系统中,一种常见的负载均衡方式是,客户端的请求首先经过负载均衡(zuul、Ngnix),再到达服务网关(zuul集群),然后再到具体的服。,服务统一注册到高可用的服务注册中心集群,服务的所有的配置文件由配置服务管理(下一篇文章讲述),配置服务的配置文件放在git仓库,方便开发人员随时改配置。

一、Zuul简介
Zuul的主要功能是路由转发和过滤器。路由功能是微服务的一部分,比如/api/user转发到到user服务,/api/shop转发到到shop服务。zuul默认和Ribbon结合实现了负载均衡的功能。

zuul有以下功能:

Authentication
Insights
Stress Testing
Canary Testing
Dynamic Routing
Service Migration
Load Shedding
Security
Static Response handling
Active/Active traffic management

二、准备工作
继续使用上一节的工程。在原有的工程上,创建一个新的工程。

三、创建service-zuul工程
其pom.xml文件如下:
<?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">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.forezp</groupId>
    <artifactId>service-zuul</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>service-zuul</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.2.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-zuul</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Dalston.RC1</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

    <repositories>
        <repository>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <url>https://repo.spring.io/milestone</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>
</project>


在其入口applicaton类加上注解@EnableZuulProxy,开启zuul的功能:

@EnableZuulProxy
@EnableEurekaClient
@SpringBootApplication
public class ServiceZuulApplication {

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


加上配置文件application.yml加上以下的配置代码:

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/
server:
  port: 8769
spring:
  application:
    name: service-zuul
zuul:
  routes:
    api-a:
      path: /api-a/**
      serviceId: service-ribbon
    api-b:
      path: /api-b/**
      serviceId: service-feign


首先指定服务注册中心的地址为http://localhost:8761/eureka/,服务的端口为8769,服务名为service-zuul;以/api-a/ 开头的请求都转发给service-ribbon服务;以/api-b/开头的请求都转发给service-feign服务;

依次运行这五个工程;打开浏览器访问:http://localhost:8769/api-a/hi?name=forezp ;浏览器显示:

hi forezp,i am from port:8762

打开浏览器访问:http://localhost:8769/api-b/hi?name=forezp ;浏览器显示:

hi forezp,i am from port:8762

这说明zuul起到了路由的作用

四、服务过滤
zuul不仅只是路由,并且还能过滤,做一些安全验证。继续改造工程;

@Component
public class MyFilter extends ZuulFilter{

    private static Logger log = LoggerFactory.getLogger(MyFilter.class);
    @Override
    public String filterType() {
        return "pre";
    }

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

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

    @Override
    public Object run() {
        RequestContext ctx = RequestContext.getCurrentContext();
        HttpServletRequest request = ctx.getRequest();
        log.info(String.format("%s >>> %s", request.getMethod(), request.getRequestURL().toString()));
        Object accessToken = request.getParameter("token");
        if(accessToken == null) {
            log.warn("token is empty");
            ctx.setSendZuulResponse(false);
            ctx.setResponseStatusCode(401);
            try {
                ctx.getResponse().getWriter().write("token is empty");
            }catch (Exception e){}

            return null;
        }
        log.info("ok");
        return null;
    }
}


filterType:返回一个字符串代表过滤器的类型,在zuul中定义了四种不同生命周期的过滤器类型,具体如下:
pre:路由之前
routing:路由之时
post: 路由之后
error:发送错误调用
filterOrder:过滤的顺序
shouldFilter:这里可以写逻辑判断,是否要过滤,本文true,永远过滤。
run:过滤器的具体逻辑。可用很复杂,包括查sql,nosql去判断该请求到底有没有权限访问。
这时访问:http://localhost:8769/api-a/hi?name=forezp ;网页显示:

token is empty

访问 http://localhost:8769/api-a/hi?name=forezp&token=22 ;
网页显示:

hi forezp,i am from port:8762

转自:http://blog.csdn.net/forezp/article/details/69939114

















  • 大小: 85.5 KB
分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    SpringCloudLearning_forezp.tar.gz

    史上最简单的SpringCloud教程 | 第五篇: 路由网关(zuul)(Finchley版本) 史上最简单的SpringCloud教程 | 第六篇: 分布式配置中心(Spring Cloud Config)(Finchley版本) 史上最简单的SpringCloud教程 | 第七篇: 高可用...

    【微服务架构】SpringCloud之路由网关(zuul)

    在微服务架构中,Spring Cloud Zuul 是一个重要的组件,它作为边缘服务或者说是路由网关,承担着请求分发、过滤以及安全控制等职责。本文将深入探讨Spring Cloud Zuul 的核心概念、功能和使用方法。 首先,Zuul 是 ...

    SpringCloud之六 路由网关zuul

    Zuul路由网关的主要功能和特性 #### 1.1 路由转发 路由转发是Zuul最核心的功能之一。它能够将外部请求转发到后端的微服务上。例如,如果有一个路径为`/api/user`的请求,Zuul可以配置将其转发到对应的user服务上;...

    zuul网关登陆鉴权/动态路由

    Zuul 过滤器分为四种类型:pre(前置过滤器)、route(路由过滤器)、post(后置过滤器)和 error(错误过滤器)。对于登录鉴权,通常会在 pre 过滤器阶段进行处理,因为这一步发生在请求被路由到具体服务之前。 1....

    06Spring Cloud Zuul:API网关服务1

    Spring Cloud Zuul 是 Spring Cloud Netflix 子项目的核心组件之一,可以作为微服务架构中的 API 网关使用,支持动态路由与过滤功能。API 网关为微服务架构中的服务提供了统一的访问入口,客户端通过 API 网关访问...

    华为-微服务路由网关-Zuul-实战作业

    华为微服务路由网关Zuul实战作业的知识点主要涵盖了微服务架构下使用Zuul作为反向代理和路由网关的全过程,详细包括了Zuul网关的配置、使用以及与Eureka服务注册与发现的整合,还涉及了如何在华为云DevCloud平台上...

    第六章 SpringCloud Zuul网关.pdf

    在ZuulApplication.java文件中,需要添加@EnableZuulProxy和@EnableDiscoveryClient注解,以启用Zuul的代理服务器功能和服务注册发现功能: ```java @SpringBootApplication @EnableZuulProxy @...

    《深入理解Spring Cloud与微服务构建》学习笔记(十八)~路由网关Spring Cloud Zuul~熔断器

    在深入探讨Spring Cloud和微服务构建的过程中,Spring Cloud Zuul是一个关键组件,它扮演着路由网关和熔断器的角色。本文将详细讲解Zuul的功能、原理以及如何在Spring Boot应用中集成和配置。 首先,Spring Cloud ...

    SpringCloud(zuul路由网关)

    SpringCloud是微服务架构中的一个核心组件,它提供了一套完整...以上就是关于SpringCloud中的Zuul路由网关的关键知识点。通过合理使用Zuul,可以极大地提升微服务架构的效率和稳定性,实现更高效的资源调度和服务治理。

    史上最简单的SpringCloud教程 | 第二篇: 服务消费者(rest+ribbon)

    在本教程中,我们将深入探讨...对于初学者来说,这是一个很好的起点,为进一步学习Spring Cloud的其他组件,如Hystrix(断路器)、Zuul(API网关)等打下基础。同时,熟悉源码和工具的使用也是提升开发效率的重要途径。

    22-Spring Cloud网关Zuul&过滤器&集群方案1

    Spring Cloud网关Zuul是微服务架构中常用的边缘服务组件,用于提供路由、过滤等功能,实现对API的集中式管理。Zuul的主要优点在于能够统一处理跨服务的公共逻辑,如认证、限流、监控等,减轻了每个微服务自身的负担...

    《深入理解Spring Cloud与微服务构建》学习笔记(十六)~路由网关Spring Cloud Zuul

    在本篇学习笔记中,我们将深入探讨Spring Cloud框架中的一个重要组件——Spring Cloud Zuul,它是一个强大的路由网关。Zuul的主要职责是为微服务架构提供统一的入口,进行请求过滤、路由转发等操作,使得后端服务对...

    spring-cloud-zuul(包含注册中心、服务生产者、服务消费者、zuul网关路由).zip

    《Spring Cloud Zuul:构建微服务的路由网关》 Spring Cloud Zuul 是一个基于 Netflix Zuul 的微服务网关,它提供了动态路由、过滤器以及面向服务的路由功能,是构建分布式系统的重要组件。在Spring Cloud生态中,...

    springcloud zuul网关服务

    SpringCloud Zuul是基于Spring Cloud框架的一个核心组件,它扮演着API网关的角色,负责路由转发、过滤器处理以及安全控制等任务。Zuul的主要功能包括动态路由、过滤器机制、安全控制、负载均衡、健康检查等。下面将...

    Spring Cloud Zuul路由网关服务过滤实现代码

    Spring Cloud Zuul 路由网关服务过滤实现代码是基于 Spring Cloud Zuul 框架实现的路由网关服务过滤功能,主要用于微服务架构中对服务的路由和过滤。 Zuul 框架提供了路由转发和过滤器功能,能够将请求路由到对应的...

    Spring Cloud Zuul动态路由demo

    本篇文章将深入探讨如何使用Spring Cloud Zuul实现动态路由,并通过实际的代码示例——"Spring Cloud Zuul动态路由demo"来展示这一功能。 1. **Zuul简介** Zuul是Netflix开源的一个边缘服务,主要功能包括路由转发...

    动态Zuul网关路由:构建智能微服务路由的秘诀

    4. **Zuul**:微服务网关,提供路由、访问过滤等功能 。 5. **Config**:分布式配置中心,支持版本控制和属性变更通知 。 6. **Bus**:事件、消息总线,用于集群中状态变化的传播 。 7. **Stream**:消息驱动的...

    springcloud教程之zuul路由网关的实现

    * 云计算平台:在云计算平台中, Zuul 路由网关可以提供了云服务之间的路由转发和安全控制功能。 Zuul 路由网关是一个功能强大且灵活的路由网关解决方案,可以满足微服务架构、 API 网关、云计算平台等多种场景的...

    zuul网关配置参考

    总之,Zuul 作为 Spring Boot 微服务架构中的 API 网关,提供了路由、过滤等功能,使得微服务间的通信更加规范和便捷。通过合理的配置和自定义过滤器,我们可以实现诸如负载均衡、安全控制、性能监控等多种功能。

Global site tag (gtag.js) - Google Analytics