【夯实Spring Cloud】Spring Cloud中使用Zuul实现路由网关详解

版权声明:尊重博主原创文章,转载请注明出处 https://blog.csdn.net/eson_15/article/details/86689681

本文属于【夯实Spring Cloud】系列文章,该系列旨在用通俗易懂的语言,带大家了解和学习Spring Cloud技术,希望能给读者带来一些干货。系列目录如下:

【夯实Spring Cloud】Dubbo沉睡5年,Spring Cloud开始崛起!
【夯实Spring Cloud】Spring Cloud中基于maven的分布式项目框架的搭建
【夯实Spring Cloud】Spring Cloud中的Eureka服务注册与发现详解
【夯实Spring Cloud】Spring Cloud中如何完善Eureka中的服务信息
【夯实Spring Cloud】Spring Cloud中使用Eureka集群搭建高可用服务注册中心
【夯实Spring Cloud】Spring Cloud中的Eureka和Zookeeper的区别在哪?
【夯实Spring Cloud】Spring Cloud中使用Ribbon实现负载均衡详解(上)
【夯实Spring Cloud】Spring Cloud中使用Ribbon实现负载均衡详解(下)
【夯实Spring Cloud】Spring Cloud中自定义Ribbon负载均衡策略
【夯实Spring Cloud】Spring Cloud中使用Feign实现负载均衡详
【夯实Srping Cloud】Spring Cloud中使用Hystrix实现断路器原理详解(上)
【夯实Srping Cloud】Spring Cloud中使用Hystrix实现断路器原理详解(下)
【夯实Spring Cloud】Spring Cloud中使用Zuul实现路由网关详解
【夯实Spring Cloud】Spring Cloud分布式配置中心详解
【夯实Spring Cloud】未完待续


前面对 Hystrix 的知识做了比较详细的分析,这篇文章主要对 Zuul 来做一下讲解。

1. 什么是 Zuul?

官方 GitHub wiki:https://github.com/Netflix/zuul/wiki

Zuul 包含了对请求的路由和过滤两个最主要的功能。其中,路由功能负责将外部请求转发到具体的微服务实例上,是实现外部访问统一入口的基础。而过滤功能则是负责对请求的处理过程进行干预,是实现请求校验、服务聚合等功能的基础。

Zuul 和 eureka 进行整合,将 zuul 自身注册为eureka服务治理下的应用,同时从eureka中获得其他微服务的消息,也即以后的访问微服务都是通过zuul跳转之后获得。

所以,Zuul 提供:代理+路由+过滤三大功能。接下来,我们来看一看如何实现。

2. 落地实现

我们自定义一个新的项目工程:microservice-zuul-gateway。

2.1 依赖导入

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

我们需要将 zuul 注册到 eureka,所以也需要导入 eureka client 依赖。

2.2 主启动类注解

在主启动类中需要添加:@EnableZuulProxy 注解,表示开启 zuul 代理。

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

2.3 application.yml 配置文件

接下来看看 application.xml 配置文件,由于要注册到 eureka,所以和 eureka 相关的配置,也是需要的,如下:

# 服务端口号
server:
  port: 6001

spring:
  application:
    name: microservice-zuul-gateway # 对外暴露的服务名称

# 客户端注册进eureka服务列表里
eureka:
  client:
    service-url:
      defaultZone: http://eureka01:7001/eureka/,http://eureka02:7002/eureka/,http://eureka03:7003/eureka/,
    healthcheck:
      enabled: true
  instance:
    instance-id: zuul网关服务-6001  # 人性化显示出服务的信息
    prefer-ip-address: true    # 访问路径可显示ip地址
    lease-renewal-interval-in-seconds: 2
    lease-expiration-duration-in-seconds: 5

# 使用actuator来展示项目的基本信息
info:
  author.name: shengwu ni
  app.name: microservice
  server.port: ${server.port}
  application.name: ${spring.application.name}

2.4 测试一下

启动 eureka 集群、订单服务(8001)和 zuul-gateway(6001)。在浏览器中输入 http://eureka7001:7001 ,可以看到如下信息,说明服务都正常注册到 eureka。
eureka
我们首先直接访问一下订单服务,确保服务可用:http://localhost:8001/provider/order/get/1
然后我们通过 zuu l来访问该订单服务:http://localhost:6001/microservice-order/provider/order/get/1 ,也可以正常访问。microservice-order 是订单服务的服务名。即 zuul 在 eureka 里找到了一个叫 microservice-order 的订单服务,然后去请求数据。所以说,zuul 是可以根据注册到 eureka 中的服务名称来访问服务的。

那么我们自然会想到,如果我把三个订单服务都启动起来,因为它们的服务名称都是 microservice-order,zuul 到底会将请求转发给哪个服务呢?

启动下 8001、8002 和 8003,然后还是访问http://localhost:6001/microservice-order/provider/order/get/1 ,查看输出的信息,可以知道,zuul 中默认集成了轮询的规则,三个服务轮流调用。

3. 自定义路由规则

如果我们不想像上面那样在 url 中直接暴露微服务名称,可以在配置文件中配一下路由规则。

# 配置路由规则
zuul:
  routes:
    order:
      serviceId: microservice-order
      path: /order/**

这样的话,在配置了路由规则之后,就可以使用:http://localhost:6001/order/provider/order/get/1 来访问订单服务了。

但是这样的话,原来使用微服务名称的方式还是可以访问,所以我们可以禁用原来使用微服务名称的方式访问。如下:

# 配置路由规则
zuul:
  ignored-services: microservice-order # 不允许用微服务名访问了,如果禁用所有的,可以使用 "*"
  routes:
    # 如下指定新的映射
    order:
      serviceId: microservice-order
      path: /order/**

我们还可以给路由加一个统一的前缀:

# 配置路由规则
zuul:
  ignored-services: microservice-order # 不允许用微服务名访问了,如果禁用所有的,可以使用 "*"
  routes:
    prefix: /zuul # 给路由加一个统一的前缀
    # 如下指定新的映射
    order:
      serviceId: microservice-order
      path: /order/**

这样的话,就可以使用:http://localhost:6001/zuul/order/provider/order/get/1 来访问订单服务了。

OK,Spring Cloud 中使用 zuul 实现路由就介绍这么多。


源码下载地址:https://gitee.com/eson15/springcloud_study
更多优质文章请关注我的微信公众号【程序员私房菜】,回复“资源”和“架构”可以领取优质的视频学习资源。
程序员私房菜

没有更多推荐了,返回首页