11 微服务集群网关Zuul介绍

  在实际环境中,我们的应用程序会有多个服务调用者,如何将其组织起来统一对外提供服务呢?我们可以使用Netflix的Zuul框架构建微服务集群网关来解决这个问题。

1. Zuul框架介绍

  1.1 关于Zuul

  Spring Cloud提供了多个组件用于集群内部的通信,例如服务管理组件Eureka,负载均衡组件Ribbon,REST客户端组件Feign等等。如果集群提供可一个API或者Web服务,需要与外部进行通信,最好的方式就是添加一个网关,将集群的服务都隐藏到网关后面,这种做法对于外部客户端来说,无需关心集群的内部结构,只需关心网关的配置信息;对于Spring Cloud集群来说,不必过多的暴露服务,提高了集群的安全性。

  代理层作为应用集群的大门,在技术选择上尤为重要,很多传统的解决方案,在软件选择上使用了Nginx、Apache等服务器。Netflix提供了自己的解决方案:Zuul。Zuul是Netflix的一个子项目,Spring Cloud对其进行了进一步的封装与实现,将其整合到了spring-netflix项目中,为微服务集群提供代理、过滤和路由等功能。

  1.2 Zuul的功能

  Zuul将外部的请求划分为不同阶段,每个阶段都提供了一系列的过滤器,这些过滤器可以帮我们实现以下的功能:

  》 身份验证和安全性:对需要身份验证的资源进行过滤,拒绝处理不服个身份认证的请求;

  》观察和监控:跟踪重要的数据,为我们展示准确的请求状况;

  》动态路由:将请求动态路由到不同的服务器;

  》负载分配:设置每种请求的处理能力,删除那些超出限制的请求;

  》静态相应处理:提供一些静态的过滤器,直接响应一些请求,而不将他们转发到集群内部;

  》路由的多样化:除了可以将请求路由到Spring Cloud集群外,还可以将请求路由到其他服务。

2. 在Web项目中使用Zuul

  下面将开发一个简单的程序,初步展示Zuul的功能。,程序架构如下

  

  2.1 Web项目整合Zuul

  新建一个maven的测试项目,测试项目的目录结构及架构图如下

  

  其中网关项目firstrouter在8080端口启动,而服务项目bookserver在8090端口启动。在firstrouter项目中引入相关的依赖,代码清单如下

  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.triheart</groupId>
    <artifactId>firstrouter</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Dalston.SR1</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-zuul</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
            <version>4.5.3</version>
        </dependency>
    </dependencies>
</project>

  我们需要为项目加入spring-cloud-stater-zuul依赖,由于Zuul底层使用了HttpClient,因此需要加入相应的依赖。为了能让Web项目开启对Zuul项目的支持,我们需要在启动类中加入@EnableZuulProxy注解,代码清单如下

  RouterApp.java

package com.triheart.firstrouter;

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

/**
 * @author 阿遠
 * Date: 2018/9/2
 * Time: 14:33
 */
@SpringBootApplication
@EnableZuulProxy
public class RouterApp {

    public static void main(String[] args){
        new SpringApplicationBuilder(RouterApp.class).properties("server.port=8080").run(args);
    }
}

  我们项目的启动端口设置为8080,现在我们已经完成了一个拥有Zuul功能的Web项目,接下来,我们测试其路由功能。

  2.2测试路由功能

  新建名为bookserver的maven项目,该项目是一个普通的Spring Boot项目,依赖如下

  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.triheart</groupId>
    <artifactId>bookserver</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>1.5.4.RELEASE</version>
        </dependency>
    </dependencies>

</project>

  再为bookserver添加一个/hello服务,为了简单起见我们将项目的启动器和控制器写在一起,代码清单如下

  ServerApp.java

package com.triheart.bookserver;

import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author 阿遠
 * Date: 2018/9/2
 * Time: 14:37
 */
@SpringBootApplication
@RestController
public class ServerApp {

    @RequestMapping(value = "/hello/{name}", method = RequestMethod.GET)
    public String hello(@PathVariable("name") String name) {
        return "hello  " + name;
    }

    public static void main(String[] args){
        new SpringApplicationBuilder(ServerApp.class).properties("server.port=8090").run(args);
    }
}

  我们将项目的端口设置为8090,在控制器中,建立了一个/hello/{name}的服务,服务成功调用后,会返回相应的字符串。接下来,我们修改firstrouter项目的配置文件,让其进行转发工作。

  为firstrouter项目添加application.yml文件,代码清单如下

  application.yml

zuul:
  routes:
    books:
      url: http://localhost:8090

  加入以上的配置后,发送给http://localhost:8080/books的所有请求会被转发到8090端口,也就是访问firstrouter项目,实际上会调用bookserver的服务。启动两个应用,在浏览器中访问http://localhost:8080/books/hello/ayun,可以看到浏览器的输出如下:

  我们可以看到,发送的请求已经被转发到bookserver进行处理。

3.过滤器运行机制

  在前面的项目中,我们使用了@EnableZuulProxy注解。开启该注解后,在Spring容器初始化时,会将Zuul的相关配置初始化,其中包含一个Spring Boot的Bean:ServletRegistrationBean,该类主要用于注册Servlet。Zuul提供了一个ZuulServlet类,在Servlet的Service方法中,执行各种Zuul过滤器(ZuulFilter)。下图为HTTP请求在ZuulServlet中的生命周期。

  

  ZuulServlet的Service方法接受到请求后,会执行pre阶段的过滤器,再执行routing阶段的过滤器,最后执行post阶段的过滤器。其中routing阶段的过滤器会将请求转发到“源服务”,源服务可以使第三方的Web服务,也可以是Spring Cloud的集群服务。在执行pre和routing阶段的过滤器时,如果出现异常,则会执行error过滤器。整个过程的HTTP请求、HTTP响应、状态等数据,都会被封装到一个RequestContext对象中。   

原文地址:https://www.cnblogs.com/a-yuan/p/9573993.html

时间: 2024-08-04 13:49:13

11 微服务集群网关Zuul介绍的相关文章

Spring Cloud(Dalston.SR5)--Zuul 网关-微服务集群

通过 url 映射的方式来实现 zuul 的转发有局限性,比如每增加一个服务就需要配置一条内容,另外后端的服务如果是动态来提供,就不能采用这种方案来配置了.实际上在实现微服务架构时,服务名与服务实例地址的关系在 eureka server 中已经存在了,所以只需要将Zuul注册到 eureka server上去发现其他服务,就可以实现对 serviceId 的映射,并且启用了 eureka server 同时也会启用 ribbon 对服务进行负载均衡调用,加入 Zuul 到微服务集群架构图如下:

springCloud搭建微服务集群+Zuul服务器端负载均衡

概述 最近研究了一下springCloud的微服务集群,主要用到了SpringCloud的服务发现和服务器端负载均衡,所有的项目都是用的springboot,可以和springCloud无缝对接. 技术选型服务发现:eureka负载均衡:zuul 实现Eureka集群(eurekaServer):8001.8002.8003服务提供方(eurekaClient):9001.9002服务端负载均衡服务:9100 1.新建工程eureka服务器,用idea创建springboot项目,引入eurek

基于spring-cloud的微服务(4)API网关zuul

API网关是微服务架构中的很重要的一个部分,内部有多个不同的服务提供给外部来使用,API网关可以对外做统一的入口,也可以在网关上做协议转换,权限控制和请求统计和限流等其他的工作 spring-cloud封装了Netflix提供的开源的API网关实现zuul,我们可以很方便地启动一个zuul网关的实例,并支持向eureka进行注册,并对在eureka上已经注册的服务进行代理 使用IDEA的spring initializer来创建一个zuul项目 填写相关的group类型等信息,选择使用gradl

分布式-微服务-集群 的概念和区别

分布式:一个业务分拆多个子业务,部署在不同的服务器上 集群:同一个业务,部署在多个服务器上 微服务的意思也就是将模块拆分成一个独立的服务单元通过接口来实现数据的交互. 分布式是指将不同的业务分布在不同的地方.而集群指的是将几台服务器集中在一起,实现同一业务. 分布式中的每一个节点,都可以做集群.而集群并不一定就是分布式的. 分布式,从窄意上理解,也跟集群差不多,但是它的组织比较松散,不像集群,有一个组织性,一台服务器垮了,其它的服务器可以顶上来. 分布式的每一个节点,都完成不同的业务,一个节点垮

SpringCloud微服务(04):Turbine组件,实现微服务集群监控

本文源码:GitHub·点这里 || GitEE·点这里 一.聚合监控简介 1.Dashboard组件 微服务架构中为了保证程序的可用性,防止程序出错导致网络阻塞,出现了断路器模型.断路器的状况反应程序的可用性和健壮性,它是一个重要指标.HystrixDashboard是作为断路器状态的一个组件,提供了数据监控和直观的图形化界面. 2.Turbine组件 Hystrix Dashboard组件监控服务的熔断情况时,每个服务都有图形界面,当微服务数量很多时,监控非常繁杂.为了同时监控多个服务的熔断

.net core 跨平台开发 微服务架构 基于Nginx反向代理 服务集群负载均衡

1.概述 反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器. 服务器集群就是指将很多服务器集中起来一起进行同一种服务,在客户端看来就像是只有一个服务器.集群可以利用多个计算机进行并行计算从而获得很高的计算速度,也可以用多个计算机做备份,从而使得任何一个机器坏了整个系统还是能正常运行. 负载均衡,英文名称为Load

AspNetCore微服务下的网关-Kong(一)

Kong是Mashape开源的高性能高可用API网关和API服务管理层.它基于OpenResty,进行API管理,并提供了插件实现API的AOP.Kong在Mashape 管理了超过15,000 个API,为200,000开发者提供了每月数十亿的请求支持.本文将从架构.API管理.插件三个层面介绍Kong. 架构 按照康威定律,我们系统架构会拆的很散,系统由一堆服务组成,如下图所示: 库存服务.优惠券服务.价格服务时之前都会做一些特殊处理,如限流.黑白名单,日志.请求统计.而这些处理几乎是所有服

买单侠微服务的API网关演化之路

伴随着买单侠业务的快速发展,能够支持独立开发.独立部署.独立扩展的微服务在秦苍得到了广泛应用和蓬勃发展,短短3年左右时间,已经发展到了300+个微服务,并且还在快速增长中. 研发逐渐意识到伴随着微服务规模化的增长,必需要重视微服务的基础设施建设(API网关.服务注册中心.调用链跟踪等)才能保持开发效率和产品的质量. API网关作为访问微服务的大门, 是访问后台服务的入口,作为最常用的基础服务之一,其重要性不言而喻.在买单侠微服务的发展道路上,经过了以下摸索发展阶段,希望能给规模化应用微服务的攻城

微服务之API网关 kong 使用场景之路由功能

API网关,在介绍spring cloud的时候我们也曾提到过zuul,并使用zuul做了一个简单的实验证明zuul是可以实现网关的路由功能的,在这篇文章中,我们会同样使用类似简单的例子来验证kong在此种场景下的使用. spring cloud之zuul的类似实现 spring cloud的zuul的类似功能和实现,可参看下文: spring cloud之api网关 https://blog.csdn.net/liumiaocn/article/details/53941354 场景说明 项目