Spring Cloud(四) API网关Zuul

前文回顾:

Spring Cloud(一)Eureka Server-单体及集群搭建

Spring Cloud(二) 配置Eureka Client

Spring Cloud(三) 熔断器Hystrix

一.API网关

API网关旨在用一套单一且统一的API入口点,来组合一个或多个内部API。

API网关定位为应用系统服务接口的网关,区别于网络技术的网关,但是原理是一样的。API网关统一服务入口,可方便实现对平台众多服务接口进行管控,如对访问服务的身份认证、防报文重放与防数据篡改、功能调用的业务鉴权,以及相应数据的脱敏、流量与并发控制,甚至基于API调用的计量或计费等。

API网关常用于以下场景:

  • 黑白名单:实现通过IP地址控制禁止访问网关功能

  • 日志:实现访问日志的记录,可用于分析访问,处理性能指标,同时将分析结果支持其它模块功能应用

  • 协议适配:实现通信协议校验、适配转换的功能

  • 身份认证:负责网关访问身份认证验证

  • 计流限流:实现微服务访问流量计算,基于流量计算分析进行限流,可以定义多种限流规则

  • 路由:是API网关很核心的模块功能,此模块实现根据请求锁定目标微服务,并将请求进行转发

API网关所带来的好处:

  • 避免将内部信息泄露给外部

  • 为微服务添加额外的安全层

  • 支持混合通信协议

  • 降低构建微服务的复杂性

  • 微服务模拟与虚拟化

二.Zuul

Zuul是Netflix出品的一个基于JVM路由和服务端的负载均衡器。

Zuul 在云平台上提供动态路由,监控,弹性,安全等边缘服务的框架。Zuul 相当于是设备和 Netflix 流应用的 Web 网站后端所有请求的前门。

Zuul可以通过加载动态过滤机制,从而实现以下各项功能:

  • 验证与安全保障: 识别面向各类资源的验证要求并拒绝那些与要求不符的请求。

  • 审查与监控: 在边缘位置追踪有意义数据及统计结果,从而为我们带来准确的生产状态结论。

  • 动态路由: 以动态方式根据需要将请求路由至不同后端集群处。

  • 压力测试: 逐渐增加指向集群的负载流量,从而计算性能水平。

  • 负载分配: 为每一种负载类型分配对应容量,并弃用超出限定值的请求。

  • 静态响应处理: 在边缘位置直接建立部分响应,从而避免其流入内部集群。

  • 多区域弹性: 跨越AWS区域进行请求路由,旨在实现ELB使用多样化并保证边缘位置与使用者尽可能接近。

三.代码示例

1.pom中添加依赖

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.3.RELEASE</version>
        <relativePath/>
    </parent>
​
    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Greenwich.SR1</spring-cloud.version>
    </properties>
​
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
            <version>2.1.0.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
        </dependency>
​
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
​
    <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.Application启动类中添加注解

  • @EnableZuulProxy:支持网关路由

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

3.配置文件

spring.application.name=gateway-service-zuul
server.port=8888
​
zuul.routes.api-a.path=/producer/**
zuul.routes.api-a.serviceId=spring-cloud-producer
​
eureka.client.serviceUrl.defaultZone=http://localhost:8000/eureka/

4.测试

依次启动 spring-cloud-eurekaspring-cloud-producergateway-service-zuul-eureka,访问:http://localhost:8888/producer/hello?name=yfy

返回:hello yfy,welcome to Spring Cloud

测试集群,修改端口号,启动spring-cloud-producer

@RestController
public class HelloController {
​
    @RequestMapping("/hello")
    public String index(@RequestParam String name) {
        return "hello " + name + ",welcome to Spring Cloud:product2";
    }
}

修改完成后启动spring-cloud-producer-2,重启gateway-service-zuul-eureka。测试多次访问http://localhost:8888/producer/hello?name=yfy,依次返回:

hello yfy,welcome to Spring Cloud
hello yfy,welcome to Spring Cloud:product2
hello yfy,welcome to Spring Cloud
hello yfy,welcome to Spring Cloud:product2
...

说明通过zuul成功调用了producer服务并且做了均衡负载。

5.网关的默认路由规则

如果后端服务多达十几个的时候,每一个都这样配置也挺麻烦的,spring cloud zuul已经帮我们做了默认配置。默认情况下,Zuul会代理所有注册到Eureka Server的微服务,并且Zuul的路由规则如下:

http://ZUUL_HOST:ZUUL_PORT/微服务在Eureka上的serviceId/**会被转发到serviceId对应的微服务。

我们注销掉gateway-service-zuul-eureka项目中关于路由的配置:

#zuul.routes.api-a.path=/producer/**
#zuul.routes.api-a.serviceId=spring-cloud-producer

重新启动后,访问http://localhost:8888/spring-cloud-producer/hello?name=yfy,测试返回结果和上述示例相同,说明Spring cloud zuul默认已经提供了转发功能。

猜你喜欢

转载自blog.csdn.net/fy_java1995/article/details/94175111