`

SpringCloud分布式微服务云架构 第五篇: 路由网关(zuul)(Finchley版本)

阅读更多

SpringCloud分布式微服务云架构 第五篇: 路由网关(zuul)(Finchley版本)

在微服务架构中,需要几个基础的服务治理组件,包括服务注册与发现、服务消费、负载均衡、断路器、智能路由、配置管理等,了解springcloud架构可以加求求:三五三六二四七二五九,由这几个基础组件相互协作,共同组建了一个简单的微服务系统。一个简答的微服务系统如下图:

 

在这里插入图片描述注意: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>com.forezp</groupId>
        <artifactId>sc-f-chapter5</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>

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



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

@SpringBootApplication
@EnableZuulProxy
@EnableEurekaClient
@EnableDiscoveryClient
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

 

 

 

分享到:
评论

相关推荐

    基于Spring Cloud(Finchley版本)架构体系

    Spring Cloud Finchley是Spring Cloud的一个重要版本,它提供了一套微服务开发的工具集,用于构建分布式系统,如服务发现、配置管理、断路器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导选举、分布式...

    SpringCloudLearning_forezp.tar.gz

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

    SpringCloud分布式系统开发.docx

    - **开发流程**:在开发过程中,可以通过 SpringCloud 的各种子项目来快速搭建分布式系统的基本框架,如使用 Spring Cloud Config 进行配置管理,利用 Spring Cloud Netflix 实现服务间的调用和容错处理。...

    Spring Cloud Finchley.RELEASE 官方中文文档.rar

    Spring Cloud是基于Spring Boot进行快速构建云应用的工具集,它涵盖了配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导选举、分布式会话、集群状态等多种功能。Finchley.RELEASE...

    SpringCloud 70道面试题和答案.docx

    使用 SpringBoot 开发分布式微服务时面临的问题 * 与分布式系统相关的复杂性 * 服务发现 * 冗余 Spring Cloud 的使用场景 * 分布式系统开发 * 微服务架构 * 服务注册与发现 * 配置管理 * 路由 * 负载均衡 * 断路...

    springcloud完整项目

    而SpringCloud Finchley则是SpringCloud的一个版本,它为开发者提供了在分布式系统(如配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导选举、分布式会话、集群状态)操作的开发...

    Spring Cloud Greenwich SR2 官方文档

    Spring Cloud是基于Spring Boot构建的,旨在简化开发分布式系统(如配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导选举、分布式会话、集群状态)的服务。以下是对Spring Cloud ...

    springcloud微服务框架实例

    SpringCloud是一个基于SpringBoot实现的云应用开发工具集,它为开发者提供了在分布式系统(如配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导选举、分布式会话、集群状态)操作...

    springcloud 微服务,Sring cloud Greenwich-xmfcn-spring-cloud.zip

    Spring Cloud 是一个基于 Spring Boot 实现的云应用开发工具,它为开发者提供了在分布式系统(如配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导选举、分布式会话、集群状态)中...

    SpringCloud集成Python-1017

    首先,SpringCloud Finchley.SR1是2018年的一个稳定版本,它包含了多个核心组件,如Eureka(服务注册与发现)、Zuul(API网关)、Ribbon(客户端负载均衡器)等,这些组件为构建高可用、松耦合的微服务提供了基础。...

    2024年java面试题-SpringCloud面试题

    #### 八、使用Spring Boot开发分布式微服务时面临的问题 - **复杂性增加**:分布式系统引入了额外的网络延迟、安全等问题。 - **服务发现挑战**:如何高效地管理和定位集群中的服务实例。 - **数据一致性**:跨服务...

    微服务springcloud搭建以及组件介绍.docx

    Spring Cloud包含多个版本,如Edgware、Finchley等,每个版本又包含一系列子模块,如Spring Cloud AWS用于简化Amazon Web Service的集成,Spring Cloud Bus用于实现消息总线功能等。 3. Spring Cloud的实施步骤 ...

    Spring Cloud微服务教程-西安汇杰-最新版1

    - **Spring Cloud子项目**:包括Eureka(服务注册与发现)、Zuul(API网关)、Hystrix(断路器)、Spring Cloud Config(配置管理)、Spring Cloud Bus(事件、消息总线)等,这些子项目为构建微服务提供了强大的...

    spring-cloud.7z

    Spring Cloud Finchley.SR3则进一步完善了服务治理能力,引入了Spring Cloud Gateway,这是一个基于Spring Framework 5和Project Reactor的现代化API网关,提供了更强大的路由和过滤器功能。此外,它还加强了Spring ...

    十次方微服务开发v1.1--第7章1

    4. 服务网关:Spring Cloud Netflix Zuul是边缘服务和动态路由组件,可以作为API网关,处理所有微服务的进出场站,实现路由转发和过滤器功能。 5. 分布式配置:Spring Cloud Config支持分布式系统中的外部配置,...

    十次方微服务开发v1.0--第7章1

    在本节中,我们将深入探讨Spring Cloud,这是一个用于构建微服务架构的强大工具集。Spring Cloud是一系列框架的集成,旨在简化分布式系统开发,包括服务发现、配置管理、负载均衡、断路器、监控等多个关键领域。它...

    springboot2.0和springcloud Finchley版项目搭建(包含eureka,gateWay,Freign,Hystrix)

    Spring Boot 2.0 和 Spring Cloud Finchley 版本的集成是现代微服务架构中的重要技术栈。Spring Boot 提供了一种快速构建独立运行的、生产级别的基于Spring的应用程序方式,而Spring Cloud Finchley则是Spring Cloud...

    springcloud-Finchley-example

    在Java微服务领域,SpringCloud Finchley是SpringCloud生态中的一个重要版本,它为开发者提供了构建分布式系统所需的各种模式、工具和服务。本篇将深入探讨SpringCloud Finchley的核心概念、关键组件以及如何通过...

Global site tag (gtag.js) - Google Analytics