Spring Cloud Netflix(六)—— Zuul(API网关、Zuul实现路由)

一、API网关

原先IOS、Android、PC客户端调用服务的地方,需要多个URL地址,有订单的、商品的、用户的。微服务化后就必须有统一的出入口,这种情况下,API Gateway就出现了。API Gateway很好的解决了微服务下调用、统一接入等问题。
作为UI端(即IOS、Android、PC客户端用户界面),在展示页面时可能需要从多个微服务中聚合数据,而且服务的划分位置结构可能会有所改变如下图所示:
Spring Cloud Netflix(六)—— Zuul(API网关、Zuul实现路由)_第1张图片

有了API网关之后,各个API服务提供团队可以专注于自己的业务逻辑处理,而API网关更专注于安全、流量、路由等问题,本文主角Zuul就属于该种类型的API网关

当然,除了以上常见的API网关外,现在也存在其他架构类型的API网关,即为每种客户端定义了单独的API网关

在此示例中,有三种客户端:Web应用程序,移动应用程序和外部第三方应用程序。有三种不同的API网关。每个都为其客户端提供一个API

关于API网关,详细信息科参考《微服务架构的设计模式》一书的作者的文章:https://microservices.io/patterns/apigateway.html

二、Zuul简介

Zuul是Spring Cloud Netflix中的微服务API网关,Zuul包含了对请求的路由和过滤两个最主要的功能(当然也包含更多功能)
其中路由功能负责将外部请求转发到具体的微服务实例上,是实现外部访问统一入口的基础,而过滤器功能则负责对请求的处理过程进行干预,是实现请求校验,服务聚合等功能的基础。Zuul和Eureka进行整合,将Zuul自身注册为Eureka服务治理下的应用,同时从Eureka中获得其他微服务的消息,也即以后的访问微服务都是通过Zuul跳转后获得,Zuul服务最终还是会注册进Eureka

三、代码实现Zuul路由功能

新建springcloud-zuul-9003,这里是一个单独的微服务,即所有请求都会经过该微服务进行路由,由于需要将该服务注册进入Eureka,因此除了Zuul的依赖,还需要Eureka的依赖


<dependency>
    <groupId>org.springframework.cloudgroupId>
    <artifactId>spring-cloud-starter-zuulartifactId>
    <version>1.4.6.RELEASEversion>
dependency>

<dependency>
    <groupId>org.springframework.cloudgroupId>
    <artifactId>spring-cloud-starter-eurekaartifactId>
    <version>1.4.6.RELEASEversion>
dependency>

配置文件

server:
  port: 9003

spring:
  application:
    name: springcloud-zuul

eureka:
  client:
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
  instance:
    instance-id: zuul9003.com
    prefer-ip-address: true
    
info:
  app.name: SpringCloud-Study
  
zuul:
  routes:
    mydept.serviceId: springcloud-provider-dept
    mydept.path: /mydept/**
  ignored-services: "*"  # 不能再使用这个路径访问了,ignored : 忽略,隐藏全部的~

在C:\Windows\System32\drivers\etc\hosts中添加

127.0.0.1    myzuul.com

最后在主启动类上开启Zuul代理路由功能

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

@SpringBootApplication
@EnableZuulProxy
public class ZuulApplication_9003 {
    public static void main(String[] args) {
        SpringApplication.run(ZuulApplication_9003.class,args);
    }
}

启动Eureka注册中心,一个服务提供者,还有springcloud-zuul-9003
访问 :http://localhost:7001/,可以看到Zuul服务已经注册进入Eureka Server
在这里插入图片描述
这时,访问原先的http://localhost:8081/dept/list,可以看到访问成功了

再通过http://myzuul.com:9003/springcloud-provider-dept/dept/list访问,即通过路由网关访问,同样可以访问成功,注意访问规则为网关/微服务名(小写)/具体服务
Spring Cloud Netflix(六)—— Zuul(API网关、Zuul实现路由)_第2张图片
至此,我们配置的路由网关已经生效,但我们也能看到,可以不通过路由网关访问服务,以及访问路径暴露了真实微服务等诸多问题,要解决这些问题,就需要配置路由访问映射规则

配置路由访问映射规则

问题:http://myzuul.com:9003/springcloud-provider-dept/dept/list 这样去访问,暴露了我们真实微服务的名称,要解决这个问题,可以如下配置,其中mydept表示用于替换真实服务名的第二服务名,mydept.serviceId指定了真实服务实例为springcloud-provider-dept,映射路径为/mydept/**

zuul:
  routes:
    mydept.serviceId: springcloud-provider-dept
    mydept.path: /mydept/**

配置后,我们就可以通过配置的第二服务名来访问,即http://myzuul.com:9003/mydept/dept/list
Spring Cloud Netflix(六)—— Zuul(API网关、Zuul实现路由)_第3张图片
但此时访问原路径依旧可以访问,因此需要配置原真实服务名忽略

zuul:
  routes:
    mydept.serviceId: springcloud-provider-dept
    mydept.path: /mydept/**
  ignored-services: "*"  # 不能再使用这个路径访问了,ignored : 忽略,隐藏全部的

此时,再访问之前的服务名,就不能访问到了
Spring Cloud Netflix(六)—— Zuul(API网关、Zuul实现路由)_第4张图片

你可能感兴趣的:(Spring,Cloud)