二十一、API网关服务:Spring Cloud Zuul

上面的博客已经对于Spring Cloud Netflix下的核心组件了解了一大半,这些组件基本涵盖了微服务架构中最基础的几个核心设施,已经可以构建一个简单的微服务。eg:通过Spring Cloud Eureka实现高可用的服务注册中心以及实现微服务的注册与发现;通过Spring Cloud Ribbon或者Feign实现服务间负载均衡的接口调用;同时,为了分布式系统更加健壮,对于依赖的服务调用使用Spring Ckloud Hystrix来进行包装,实现线程隔离并加入熔断机制,以避免在微服务架构中因为个别服务出现异常引起级联故障蔓延,如下图:
这里写图片描述

上图中服务集群包含内部服务Service A 和Service B,他们都会向Eureka Server集群中注册与订阅服务,而Open Service是一个对外的RESTful服务,他通过F5、Nginx等网络设备或工具软件实现对各个服务的路由与负载均衡,并公开给外部的客户端调用。

本篇博客主要学习对外服务,也称为边缘服务。

为了解决该架构下运维人员维护这些路由规则与服务列表实例的复杂和开发人员对对外接口校验逻辑的扩展和优化简单,API网关的概念就应用而生,API网关是一个更智能的应用服务器,他的定义类似面向对象设计模式中的Facade模式,他就是微服务系统的门面一样,所有的外部客户端访问都需要经过他来进行调度和过滤,他除了要实现请求路由、负载均衡、校验过滤等功能外,还需要更多的功能,比如与服务治理的结合,请求转发时的熔断机制、服务的聚合等一系列高级功能。

Spring Cloud 中提供了基于Net flix Zuul实现的API网关组件——–Spring Cloud Zuul。

解决上面两个问题:
1、对于路由规则与服务实例的维护问题。Spring Cloud Zuul通过与Spring Cloud Eureka进行整合,将自身注册为Eureka服务治理下的应用,同时从Eureka中获得了所有其他的微服务的实例信息,这样的设计巧妙的将服务治理体系中维护的实例利用起来,使得将维护服务实例的工作交给服务治理框架自动完成,不再需要人工介入,而对于路由规则的维护,Zuul默认会将通过以服务名作为ContextPath的方式来创建路由映射。大部分情况下,这样的默认设置已经可以实现我们的大部分路由需求’
2、对于类似签名校验、登陆校验在微服务架构中的冗余问题。理论上说这些校验逻辑在本质上与微服务应用自身的业务并没有多大关系,所以他们完全可以独立完成一个单独的服务。他并不是给各个微服务调用,而是在API网关服务上进行统一调用来对微服务接口做前置过滤,以实现对微服务的拦截和校验。

下面对Spring Cloud Zuul中封装的API网关是如何使用和运作,并应用到微服务架构中去。

构建网关

1、创建一个spring boot工程 命名为api-gateway,并在pom中应用spring-cloud-starter-zuul依赖,具体如下

这里写图片描述

<?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.example</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>demo</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.8.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.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <!--spring boot 单元测试 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <!--表明是一个web应用 -->
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-zuul</artifactId>
        </dependency>
    </dependencies>
    <!--服务注册中心-->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Camden.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:该依赖用来在网关服务中实现对微服务转发时候的保护机制,通过线程隔离和断路器,防止微服务的故障引发API网关资源无法释放,从而影响其他应用的对外服务。
spring-cloud-starter-ribbon:该依赖用来实现在网关服务进行路由转发时候的客户端负载均衡以及请求重试。
spring-boot-starter-actuator:该依赖用来提供常规的微服务管理端点。另外,在Spring Cloud Zuul中还特别提供了/routes端点来返回当前的所有路由规则。

明天继续!哈哈哈

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值