一、网关概述

1.1 为什么需要网关

API网关的出现的原因是微服务架构的出现,不同的微服务一般有不同的网络地址,而外部客户端可能需要调用多个服务的接口才能完成完成一个业务需求,如果让客户端直接与各个微服务通信,会出现以下的问题。

  1. 客户端会多次请求不同的微服务,增加了客户端的复杂性。
  2. 存在跨域请求,在一定场景下处理相对复制。
  3. 认证复杂,每个服务都需要独立的认证。
  4. 难以重构,随着项目的迭代。可能需要重新划分微服务。如果客户端与微服务直接通信,那么重构将会很复杂。
  5. 某些微服务可能使用了防火墙/浏览器不友好的协议,直接访问会有一定的困难。

以上的问题可以借助API网关来解决。API网关是介于客户端和服务器端之间的中间层,所有的外部请求都会先经过API网关这一层。也就是说,API网关可以完成安全、性能、监控等功能,而服务提供者可以专门的完成具体的业务逻辑。
72 - SpringCloud - 04 - 网关 - 图1

1.2 网关的优点

  1. 易于监控,可以在网关收集监控数据并将其推送到外部系统进行分析;
  2. 易于认证,可以在网关进行认证,然后再将请求转发到后端的微服务,而无需在每个微服务中进行认证;
  3. 减少客户端和各个微服务之间的交互次数

    1.3 网关实现高可用

    在生产环境中,一般需要部署高可用的API网关集群来避免单点故障。

二、Zuul网关(了解)

2.1 新建Maven项目

image.png

2.2 导入依赖

  1. <dependency>
  2. <groupId>org.springframework.cloud</groupId>
  3. <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
  4. </dependency>
  5. <dependency>
  6. <groupId>org.springframework.cloud</groupId>
  7. <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
  8. </dependency>

2.3 启动类添加注解

启动类上添加注解:@EnableZuulProxy

@SpringBootApplication
@EnableZuulProxy
public class TicketZuulApplication {

    public static void main(String[] args) {
        SpringApplication.run(TicketZuulApplication.class, args);
    }

}

2.4 yml配置文件

server:
  port: 8080
spring:
  application:
    name: ticket-zuul

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/
zuul:
  routes:
    users:
      path: /user/**
      serviceId: ticket-user
    orders:
      path: /order/**
      serviceId: ticket-order

2.5 测试

注意:这里访问路径多了一个user
image.png

三、gateway网关(常用)

3.1 新建Maven项目

image.png

3.2 导入依赖

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

3.3 yml配置文件

server:
  port: 9005

spring:
  application:
    name: ticket-gateway
  cloud:
    gateway:
      routes:
        - id: users
          uri: lb://ticket-user
          predicates:
            - Path=/user/**
        - id: orders
          uri: lb://ticket-order
          predicates:
            - Path=/order/**

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/

3.4 测试

image.png