Spring Cloud Zuul 基础搭建

简介:通过前几篇文章的介绍,我们了解了Spring Cloud Eureka 如何搭建注册中心,Spring Cloud Ribbon 如何做负载均衡,Spring Cloud Hystrix 断路器如何保护我们的服务,以防止雪崩效应的出现,Spring Cloud Feign进行声明式服务调用都有哪些应用,相比Ribbon和Hystrix都有哪些改善。可以说,以上几个组件都是搭建一套微服务架构所必须的。

一、Zuul 介绍

通过前几篇文章的介绍,我们了解了Spring Cloud Eureka 如何搭建注册中心,Spring Cloud Ribbon 如何做负载均衡,Spring Cloud Hystrix 断路器如何保护我们的服务,以防止雪崩效应的出现,Spring Cloud Feign进行声明式服务调用都有哪些应用,相比Ribbon和Hystrix都有哪些改善。可以说,以上几个组件都是搭建一套微服务架构所必须的。通过以上思路,能够梳理出下面这种基础架构:

无服务 关的架构图

在此架构中,我们的服务集群是内部ServiceA 和 ServiceB,他们都会向Eureka Server集群进行注册与订阅服务。而OpenService是一个对外的Restful API 服务,它通过F5,Nginx等 络设备或工具软件实现对各个微服务的路由与负载,公开给外部客户端调用

那么上述的架构存在什么问题呢?从运维的角度来看,当客户端单机某个功能的时候往往会发出一些请求到后端,这些请求通过F5,Nginx等设施的路由和负载均衡分配后,被转发到各个不同的实例上,而为了让这些设施能够正确的路由与分发请求,运维人员需要手动维护这些实例列表,当系统规模增大的时候,这些看似简单的维护回变得越来越不可取。从开发的角度来看,为了保证服务的安全性,我们需要在调用内部接口的时候,加一层过滤的功能,比如权限的校验,用户登陆状态的校验等;同时为了防止客户端在请求时被篡改等安全方面的考虑,还会有一些签名机制的存在。

正是由于上述架构存在的问题,API 关被提出,API 关更像是一个智能的应用服务器,它的定义类似于设计模式中的外观模式,它就像是一个门面的角色,结婚时候女方亲属堵门时候的角色,我去参加婚礼当伴郎的时候去村子里面见新娘,女方亲属会把鞋子藏起来,有可能藏在屋子里有可能藏在身上,这得需要你自己去寻找,找到了鞋子之后,你才能够给新娘穿上才能正式的会见家长。API 关真正实现的功能有请求路由,负载均衡,校验过滤,请求转发的熔断机制,服务的聚合等一系列功能。

Spring Cloud Zuul通过与Spring Cloud Euerka进行整合,将自身注册为Eureka服务治理下的应用,同时从Eureka中获得了所有的微服务的实例信息。者可以通过使用Zuul来创建各种校验过滤器,然后指定哪些规则的请求需要执行校验逻辑,只有通过校验的才会被路由到具体的微服务接口。下面我们就来搭建一下Spring Cloud Zuul服务 关

二、构建Spring Cloud Zuul 关

下面我们就来实际搭建一下Zuul 关,来体会一下 关实际的用处

构建 关

在实现各种API 关服务的高级功能之前,我们先来启动一下前几章搭建好的服务server-provider,feign-consumer,eureka-server,虽然之前我们一直将feign-consumer视为消费者,但是在实际情况下,每个服务既时服务消费者,也是服务提供者,之前我们访问的
http://localhost:9001/feign-consumer等一系列接口就是它提供的服务。这里就来介绍一下详细的构建过程

  • 创建一个Spring Boot功能,命名为api-gateway,并在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>    <parent>        <groupId>org.springframework.boot</groupId>        <artifactId>spring-boot-starter-parent</artifactId>        <version>1.3.7.RELEASE</version>        <relativePath/> <!-- lookup parent from repository -->    </parent>    <groupId>com.api.gateway</groupId>    <artifactId>api-gateway</artifactId>    <version>0.0.1-SNAPSHOT</version>    <name>api-gateway</name>    <description>Demo project for Spring Boot</description>    <properties>        <java.version>1.8</java.version>    </properties>    <dependencies>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter</artifactId>        </dependency>        <dependency>            <groupId>org.springframework.cloud</groupId>            <artifactId>spring-cloud-starter-zuul</artifactId>            <version>1.3.5.RELEASE</version>        </dependency>        <dependency>            <groupId>org.springframework.cloud</groupId>            <artifactId>spring-cloud-starter-eureka</artifactId>        </dependency>    </dependencies>    <dependencyManagement>        <dependencies>            <dependency>                <groupId>org.springframework.cloud</groupId>                <artifactId>spring-cloud-dependencies</artifactId>                <version>Brixton.SR5</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></project>

    对于spring-cloud-starter-zuul 依赖,可以通过查看依赖配置了解到,它不仅包含了Netflix Zuul的核心依赖zuul-core,还包括了下面这些 关的重要依赖

  • spring-cloud-starter-hystrix: 该依赖用在 关服务中实现对微服务转发时候的保护机制,通过线程隔离和断路器,防止因为微服务故障引发的雪崩效应
  • spring-cloud-starter-ribbon: 该依赖用在实现 关服务进行负载均衡和请求重试
  • spring-cloud-starter-actuactor: 该依赖用来提供常规的微服务管理端点。另外,Spring Cloud Zuul 中还特别提供了/routes端点来返回当前的路由规则
  • 在ApiGatewayApplication 主入口中添加@EnableZuulProxy注解开启服务 关功能
  • @EnableZuulProxy    @SpringBootApplication    public class ApiGatewayApplication {        public static void main(String[] args) {            SpringApplication.run(ApiGatewayApplication.class, args);        }    }
  • 在application.properties 中配置Zuul应用的基础信息,包括应用名,端口 ,具体如下
  • spring.application.name=api-gateway    server.port=5555

    下面,我们通过一个简单的示例来为上面构建的 关增加请求路由的功能,为了演示请求路由的功能,我们先将之前的Eureka服务注册中心和微服务应用都启动起来。观察下面的服务列表,可以看到两个微服务应用已经注册成功了

    传统路由方式

    使用Spring Cloud Zuul实现路由功能非常简单,只需要对api-gateway服务增加一些关于路由的配置规则,就能实现传统路由方式

    zuul.routes.api-a-url.path=/api-a-url/**  # 映射具体的url路径  zuul.routes.api-a-url.url=http://localhost:8080/

    该配置定义了发往API 关服务的请求中,所有符合/api-a-url/** 规则的访问都将被路由转发到 http://localhost:8080 的地址上,也就是说,当我们访问
    http://localhost:5555/api-a-url/hello 的时候,API 关服务会将该请求路由到
    http://localhost:8080/hello 提供的微服务接口中。其中,配置属性
    zuul.routes.api-a-url.path 中的api-a-url部分为路由的名字,可以任意定义,但是一组path和url映射关系的路由名要相同

    点击链接查看原文,获取更多福利!

    https://developer.aliyun.com/article/1068916?spm=a2c6h.12873581.group.dArticle1068916.407a2bdd2JE3WB?utm_content=g_1000363137

    声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

    上一篇 2022年10月1日
    下一篇 2022年10月1日

    相关推荐