基本知识

Zuul定义: 微服务网关-介于客户端和服务端的中间层
出现原因: 客户端与各个微服务直接通信存在很多问题, 比如:client会多次请求不同服务-存在客户端复杂性、存在跨域请求-某些场景下处理起来有些复杂、认证问题-每个微服务需单独认证、难以重构-微服务的拆分或合并较难实施(依赖于客户端直接与微服务通信)、微服务的安全性等等。
优点: 易于监控、易于认证、减少客户端与对微服务的直接交互
核心功能:(看看就好,可以理解成精简版的Nginx) image.png

说到Zuul,不得不提的是它的开发方——Netflix(网飞),很少有人会问,为什么在Spring Cloud全家桶中,是网飞引领着微服务模块管理上的潮流? 为什么是网飞搞出来Eureka、Zuul、熔断等服务?而不是其他大体量的纯IT公司?

对于我们开发人员来说,这种问题还是需要多问一问的———为什么视频网站引领了微服务的潮流,为什么Google搞出了k8s, 为什么Redhat搞出了Open shift等等。无论是领域驱动设计,还是业务构建需求,开发人员还是要多思考代码以外的世界,各行各业的解决方案,不同业务下的最优解等等。

对于为什么网飞搞出来了这一套解决方案,网上有很多人给出了理由,摘录如下:

1、首先,Netflix是一家做视频的网站,可以这么说该网站上的美剧应该是最火的。

2、Netflix是一家没有CTO的公司,正是这样的组织架构能使产品与技术无缝的沟通,从而能快速迭代出更优秀的产品。在当时软件敏捷开发中,Netflix的更新速度不亚于当年的微信后台变更,虽然微信比Netflix迟发展,但是当年微信的灰度发布和敏捷开发应该算是业界最猛的。

3、Netflix由于做视频的原因,访问量非常的大,从而促使其技术快速的发展在背后支撑着,也正是如此,Netflix开始把整体的系统往微服务上迁移。

4、Netflix的微服务做的不是最早的,但是确是最大规模的在生产级别微服务的尝试。也正是这种大规模的生产级别尝试,在服务器运维上依托AWS云。当然AWS云同样受益于Netflix的大规模业务不断的壮大。

5、Netflix的微服务大规模的应用,在技术上毫无保留的把一整套微服务架构核心技术栈开源了出来,叫做Netflix OSS,也正是如此,在技术上依靠开源社区的力量不断的壮大。

6、Spring Cloud是构建微服务的核心,而Spring Cloud是基于Spring Boot来开发的。

7、Pivotal在Netflix开源的一整套核心技术产品线的同时,做了一系列的封装,就变成了Spring Cloud;虽然Spring Cloud到现在为止不只有Netflix提供的方案可以集成,还有很多方案,但Netflix是最成熟的。
来源: Netflix是什么,与Spring Cloud有什么关系

还可以参考Netflix官方文章: How We Use Zuul At Netflix

闲言少叙,开始正题:

Zuul的基本使用

Zuul的知识体系依赖于Eureka,如果没接触过Eureka,建议先了解实践一下,可以参考我的另一篇文章(超级简单): [Spring Cloud] - Eureka 创建及使用

  1. 添加依赖 - 三个部分: Spring Cloud版本声明,zuul,eureka client

    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Hoxton.SR4</spring-cloud.version>
    </properties>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>
            spring-cloud-starter-netflix-eureka-client
        </artifactId>
    </dependency>
    
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
  2. 启动类加入 @EnableZuulProxy - 因为此注解已经包含了EnableEurekaClient注解,所以不需要加入@EnableEurekaClient
  3. application.yml中加入此应用名称和Eureka server的host:

    spring:
      application:
        name: zuulservice
    
    eureka:
      client:
        service-url:
          defaultZone: http://localhost:8761/eureka
  4. 启动即可

这样,一个最简单的Zuul service就完成了。
但是,现在zuul还没有获取到client service,也就是其他的微服务,所以目前无法做不同的跳转,如果此时用浏览器访问刚刚创建的zuul项目主页,会发现什么都没有,页面时spring boot的Whitelabel Error Page.

所以下一步我们需要注册几个demo service(即服务提供者)到eureka server。

添加服务提供者(service provider)

这一步很简单,可参考我的另一篇文档[Spring Cloud] - Eureka 创建及使用 的创建eureka client的步骤。
在这个实践中,我们创建两个eureka client。

注意: 创建Eureka Client一定要在配置文件中指定application.name。 否则zuul无法找到service。

创建完成后,访问Eureka server主页,类似如下:
image.png

目前的项目结构:

service service name url
zuul zuulgateway localhost:8088
server1 server1 localhost:8081
server2 defaultservice localhost:8082
eureka server N/A localhost:8761

注意: Eureka界面中显示的service name为大写,但在实际service里配置时的name是小写,这里注意,下面会提到。

此时就可以通过zuul访问其他service了。
访问的格式为: http://zuulhost/servicename/

比如,访问server1,url为localhost:8088/server1
image.png

访问defaultservice:
image.png


yizheng
301 声望27 粉丝

一蓑烟雨任平生


引用和评论

0 条评论