天行健,君子以自强不息;地势坤,君子以厚德载物。


每个人都有惰性,但不断学习是好好生活的根本,共勉!


文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。


spring cloud 相关组件搭建(建议顺序):

本篇基于前两篇


一、zuul网关简介

Zuul是一个路由网关(GateWay)
有两个作用:

  • 路由:将外部请求转发到指定的微服务实例上,实现外部访问统一入口
  • 过滤:对外部请求的处理过程进行控制,实现请求校验、服务聚合等功能

应用:
将zuul作为一个服务注册到eureka中,同时从eureka中获取其他服务信息,对微服务的访问都通过zuul进行跳转,即可实现所有服务请求统一入口管理,也可进行请求校验等操作。


二、开发环境:

JDK版本:1.8
maven版本:3.9.0
开发工具:IDEA社区版ideaIC-2018.3
项目框架:spring boot 版本为 2.2.4.RELEASE springboot搭建传送门spring cloud 版本为Hoxton.SR12
为什么选择这两个版本,因为使用zuul时,用其他版本都报错,目前只知道两个版本一起用没问题

以下均基于父项目和eureka子项目创建后的操作

父项目和eureka的配置请参考:spring cloud搭建(eureka)

三、包结构预览

最后创建好的服务及包结构如下
在这里插入图片描述
在这里插入图片描述

四、创建接口

在service1和service2中创建简单的请求接口
注:这两个服务只需要开启eureka注册服务即可,zuul会到注册中心获取两个服务的信息

1. service1的请求控制类Service1ZuulController

Service1ZuulController.java

package com.service1.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @ClassDescription: service1服务zuul调用的测试请求
 * @Author:李白
 * @Date:2023/6/2 14:06
 */
@RestController
@RequestMapping("/service1-pre")
public class Service1ZuulController {
    @RequestMapping("/service1/zuul/test1/11")
    public String service2Test1(){
        return "service1-zuul-test1-11";
    }
    @RequestMapping("/service1/zuul/test2/22")
    public String service2Test2(){
        return "service1-zuul-test2-22";
    }
}

2. service1的请求控制类Service2ZuulController

package com.service2.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @ClassDescription: service2服务zuul调用的测试请求
 * @Author:李白
 * @Date:2023/6/2 14:11
 */
@RestController
@RequestMapping("/service2-pre")
public class Service2ZuulController {
    @RequestMapping("/service2/zuul/test1/11")
    public String service2Test1(){
        return "service2-zuul-test1-11";
    }
    @RequestMapping("/service2/zuul/test2/22")
    public String service2Test2(){
        return "service2-zuul-test2-22";
    }
}

五、创建子项目zuul

1. 创建zuul服务

此处省略,可参考本片目录下方spring cloud搭建流程中的第一篇

2. 配置zuul的依赖

在zuul的pom.xml中配置zuul网关需要的依赖
注:在zuul服务的pom中配置zuul的相关依赖时,如果使用的其他版本出现依赖报错,将父项目pom的相关依赖版本控制做一下修改,亲测可用:
将spring boot的版本换为2.2.4.RELEASE将spring cloud的版本换为Hoxton.SR12
zuul服务的完整pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>spring_cloud_demo</artifactId>
        <groupId>com.cloud</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>spring_cloud_zuul</artifactId>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    <dependencies>
        <!--spring cloud eureka client-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <!--spring cloud zuul-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
            <version>2.2.10.RELEASE</version>
        </dependency>
    </dependencies>

</project>

因为zuul依赖中包含spring-boot-starter-web所以可省略spring boot启动依赖的引入
在这里插入图片描述

3. zuul的yml文件配置

application.yml

server:
  port: 8004

spring:
  #服务相关信息
  application:
    #服务名称 会出现在注册中心
    name: Zuul-app

#注册中心
eureka:
  client:
    #默认开启 是否将本服务注册到注册中心
#    register-with-eureka: ture
    #默认开启 是否获取注册中心服务信息
#    fetch-registry: true
    #注册中心服务地址
    service-url:
      #默认地址
      defaultZone: http://localhost:8001/eureka/
  #服务实例相关
  instance:
    #点击具体的微服务,右下角是否显示ip
    prefer-ip-address: true
    #显示微服务的名称(在注册中心的别名)
    instance-id: zuul-8004


#服务网关(路由)
zuul:
  #请求前缀
#  prefix: /service2-pre
  #配置路由表
  routes:
    #配置所需路由的服务信息,配置多个服务信息时默认最后一个有效,其余不可用
    #对每个服务都可以指定一个唯一key,该值可以任意指定
    service1-app:
      #将以/user-service/开头的请求映射到service1-app这个服务上
      #被路由的服务请求路径
#      path: /service1-pre/**
      path: /**
      #路由接收的服务实例名称,依赖于eureka,通过实例名来在eureka中获取服务地址及端口,再进行路由拼接访问
      serviceId: Service1-app
      #如果不用实例名也可以用服务的具体url,使用url时是不依赖于eureka的,会根据url拼接路径访问跳转
#      url: http://localhost:8002/
    #对每个服务都可以指定一个唯一key,该值可以任意指定
    service2-app:
      #将以/user-service/开头的请求映射到service1-app这个服务上
      #被路由的服务请求路径
#      path: /service2-pre/**
      path: /**
      #路由接收的服务实例名称,依赖于eureka,通过实例名来在eureka中获取服务地址及端口,再进行路由拼接访问
      serviceId: Service2-app
      #如果不用实例名也可以用服务的具体url,使用url时是不依赖于eureka的,会根据url拼接路径访问跳转
#      url: http://localhost:8003/



#ribbon:
  #负载均衡时是否开启eureka
#  eureka:
#    enable: false
  # 添加ribbon的超时时间设置
#  ReadTimeout: 3000
#  ConnectTimeout: 3000

这里注释可能有点多,不过根据注释应该都能知道每个参数的意思

4. zuul的启动项

需要在启动类上添加@EnableEurekaClient和@EnableZuulProxy开启eureka客户端和zuul代理来使用相关功能
ZuulApplication.java

package com.zuul;

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

/**
 * @ClassDescription: zuul启动类
 * @Author:李白
 * @Date:2023/5/31 9:55
 */
@EnableEurekaClient
@EnableZuulProxy
@SpringBootApplication
public class ZuulApplication {
    public static void main(String[] args) {
        SpringApplication.run(ZuulApplication.class, args);
    }
}

六、启动服务并查看注册中心

1. 启动eureka

先启动eureka服务,看如下红框即是启动成功
在这里插入图片描述

2. 启动service1

在这里插入图片描述

3. 启动service2

在这里插入图片描述

4. 启动zuul

再启动zuul服务,看到如下红框即是启动成功
在这里插入图片描述

5. 访问注册中心地址

http://localhost:8001

6. 查看服务注册信息

在这里插入图片描述
可看到三个服务均出现在注册中心

七、测试zuul功能是否可用

首先使用postman分别直接调用service1和service2的接口,结果正常后,再使用zuul网关调用两个服务的接口,如果正常返回则表示zuul网关功能可用。

1. service1接口测试

使用postman直接调用service1的接口进行测试(service1的端口号是8002)
service1的test1 url:

http://localhost:8002/service1-pre/service1/zuul/test1/11

service1的test1 结果正常
在这里插入图片描述

2. service2接口测试

使用postman直接调用service2的接口进行测试(service2的端口号是8003)
service2的test2 url

http://localhost:8003/service2-pre/service2/zuul/test2/22

service2的test2 结果正常
在这里插入图片描述

3. zuul请求service1接口postman请求调用,测试zuul功能

使用postman直接通过zuul调用service1的接口进行测试(service1的端口号是8002,通过zuul调用就是将访问地址中的端口号改为zuul的端口号8004)
zuul调用service1的test1 url

http://localhost:8004/service1-pre/service1/zuul/test1/11

zuul调用service1的test1 结果异常(404)
在这里插入图片描述

4. zuul请求service2接口postman请求调用,测试zuul功能

使用postman直接通过zuul调用service2的接口进行测试(service2的端口号是8003,通过zuul调用就是将访问地址中的端口号改为zuul的端口号8004)
zuul调用service2的test2 url

http://localhost:8004/service2-pre/service2/zuul/test2/22

zuul调用service2的test2 结果正常
在这里插入图片描述

5. 使用结论

  • 使用zuul网关时,依赖版本冲突严重,需要配指定的某些版本,局限性比不用zuul时的spring cloud更大。
  • 配置的yml文件zuul相关参数,routes下的服务名可随意指定且可定义多个,但经过测试定义两个时会默认生效后者,前者无法生效(即文章中配置的zuul.routes.service1-app不可用,但service2-app正常)。如此一来便只能转发一个服务了,这是有问题的,但目前还未发现问题出在哪里。
  • service1-app下的path参数用拼接方式配置如/service1-pre/**这种前缀时,不可用,只能用杠星星来使用,然后在routes同级上加prefix参数,来指定路由前缀,这也是一个问题,但目前还未发现问题出在哪里。
  • 跟path同级的serviceId参数是每个服务的spring.application.name参数值,也就是服务的别名,会展示在注册中心,通过这个服务别名实现指定服务的转发,当然也可以用服务的url,更直接,且不会受到eureka的局限,也就是说,使用serviceId来配置,必须有eureka才行,但配置rul,则有没有eureka都可以,因为url指定的是具体的服务地址,而非注册中心的服务别名。

其中的一些问题还请知道如何解决的大佬留言指教一二,感谢。

以上就是zuul的使用了。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐