Spring-Cloud之Zuul


Zuul 是Netflix开源的是一个网关服务,提供动态路由、监控、弹性、安全等功能。源码:https://github.com/Netflix/zuul

那么为什么需要网关呢? 举个简单的场景例子:我们现在都是前后端分离的,同时使用的是微服务构建系统,即每个服务都有一个路径,那么给前端的域名就会有多个(后面服务集群部署也会有问题),一旦服务多起来后就不方便管理了,此时若接入网关那么就只需要给前端一个域名路径,也方便前端管理,同时在网关中也可以对接口进行一些统一的处理,这就是为什么要引入网关。

我们下面将介绍Zuul中一些功能的使用,让你快速的入门。

说明

下面示例使用的Spring-Cloud的版本是Hoxton.SR12,Spring-Boot的版本是2.7.2.RELEASE。示例项目的源代码

添加maven依赖:

<!-- 网关zuul -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>

在启动类上添加 @EnableZuulProxy 注解。

@SpringBootApplication
@EnableZuulProxy
public class ZuulApplication {

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

这样一个基本的Zuul网关服务就搭建好了,接下来我们开始介绍它的一些功能使用。

常用功能示例

我们需要准备2个服务 server_a、server_b(都成功注册到eureka);其中server_a的端口号为8081;server_b端口号8082;它们共有如下3个路由接口:

server_a
    http://127.0.0.1:8081?id=100
    
server_b
    http://127.0.0.1:8082/query?id=10
    http://127.0.0.1:8082/del?id=10

接入Eureka

我们使用spring cloud 全家桶时,通常会使用eureka作为服务注册中心,供各个服务间进行互相通信的需求。

注意若不使用eureka则不用引入eureka的依赖包

添加maven依赖

<!--eureka注册中心客户端-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

在application.yml中配置eureka的相关配置信息

# 注册中心eureka配置
eureka:
  client:
    serviceUrl:
      defaultZone: http://127.0.0.1:8761/eureka/

配置路由转发

不使用eureka注册中心,直接配置地址

这种方式不用引入eureka;我们可以直接配置IP或域名

# 配置路由转发规则
zuul:
  routes:
    server_a:
      # 匹配的路径
      path: /store/**
      # 转发到具体的服务,会将 /store 去掉
      url: http://127.0.0.1:8081
    server_b:
      path: /user/**
      url: http://127.0.0.1:8082

此时通过网关访问对应地址的转发关系如下:

网关:http://127.0.0.1:9000/store?id=100      转发到:http://127.0.0.1:8081?id=100
网关:http://127.0.0.1:9000/user/query?id=10  转发到:http://127.0.0.1:8082/query?id=10
网关:http://127.0.0.1:9000/user/del?id=10    转发到:http://127.0.0.1:8082/del?id=10

这种方式我们通常是让各个服务使用域名来访问,通过Nginx来做分发以此实现服务集群之间的访问。

使用注册中心eureka

需要引入注册中心相关的配置和依赖包,eureka配置参加上面。示例:

# 配置路由转发规则
zuul:
  routes:
    # 服务名,和eureka 中注册的名称保持一致
    server_a:
      # 匹配的路径
      path: /store/**
    server_b:
      path: /user/**

通过网关访问的地址就变更为下面这样的:

网关:http://127.0.0.1:9000/store?id=100      转发到:http://server_a?id=100
网关:http://127.0.0.1:9000/user/query?id=10  转发到:http://server_b/query?id=10
网关:http://127.0.0.1:9000/user/del?id=10    转发到:http://server_b/del?id=10

上面的配置是一个简化的配置,完整的写法是这样的

zuul:
  routes:
    server_b:
      path: /user/**
      serviceId: server_b
屏蔽部分服务和路径

其实我们在上面是可以直接通过服务名来访问接口,如下:

网关:http://127.0.0.1:9000/server_a?id=100      转发到:http://server_a?id=100
网关:http://127.0.0.1:9000/server_b/query?id=10  转发到:http://server_b/query?id=10
网关:http://127.0.0.1:9000/server_b/del?id=10    转发到:http://server_b/del?id=10

可以通过添加如下配置来解决

zuul:
    # 通过正则表达式匹配,来屏蔽服务的直接访问;这样就只能使用网关配置的路径访问
  ignored-patterns: /server_*/**

如果某个服务只在内部访问,不需要网关代理出去,可以通过如下配置来屏蔽服务

zuul:
  # 忽略某些服务不对外提供,多个使用英文逗号分割
  ignored-services: server_a,server_b

特别提醒:扫码关注微信订阅号'起岸星辰',实时掌握IT业界技术资讯! 转载请保留原文中的链接!
  目录