spring cloud搭建(zuul)

news2024/12/25 12:57:27

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


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


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

spring cloud搭建(zuul)

  • 一、zuul网关简介
  • 二、开发环境:
  • 三、包结构预览
  • 四、创建接口
    • 1. service1的请求控制类Service1ZuulController
    • 2. service1的请求控制类Service2ZuulController
  • 五、创建子项目zuul
    • 1. 创建zuul服务
    • 2. 配置zuul的依赖
    • 3. zuul的yml文件配置
    • 4. zuul的启动项
  • 六、启动服务并查看注册中心
    • 1. 启动eureka
    • 2. 启动service1
    • 3. 启动service2
    • 4. 启动zuul
    • 5. 访问注册中心地址
    • 6. 查看服务注册信息
  • 七、测试zuul功能是否可用
    • 1. service1接口测试
    • 2. service2接口测试
    • 3. zuul请求service1接口postman请求调用,测试zuul功能
    • 4. zuul请求service2接口postman请求调用,测试zuul功能
    • 5. 使用结论


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

  • eureka(注册中心服务)spring cloud搭建(eureka)
  • P-C service(服务提供者和服务调用者)spring cloud搭建(P-C service)
  • feign(接口调用)spring cloud搭建(feign)
  • hystrix(熔断器)spring cloud搭建(hystrix)
  • zuul(网关服务)本篇

本篇基于前两篇


一、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的使用了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/612841.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

路径规划算法:基于黏菌优化的路径规划算法- 附代码

路径规划算法&#xff1a;基于黏菌优化的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于黏菌优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用智能优化算法黏菌…

一百二十二、Git——Git上传代码(完善中)

方式一、用IDEA 第一步&#xff0c;IEDA拉项目 File——New——Project from Version Control——Git 输入URL&#xff0c;选择Directory&#xff0c;点击clone 第二步&#xff0c;把上传文件拉到IDEA项目&#xff0c;然后选中文件&#xff0c;右击Git,选择Reposity,如果上传…

中国人口增长预测

目录 问题分析 模型建立 Logistic模型 Leslie模型 模型求解 问题一 问题二 问题三 问题分析 问题 基本假设 &#xff08;1&#xff09;不考虑移民对人口总数的影响 &#xff08;2&#xff09;超过90岁按照90岁计算 &#xff08;3&#xff09;在较短时间内&#xff0c;平均…

深度学习预预训练与MMPretrain

MMPretrain算法库 优势&#xff1a; 含有各种主干网络模型自监督学习功能多模态学习功能丰富的数据集含有训练技巧和策略易用&#xff0c;例如可解释性分析、推理api 包含多种丰富任务的开箱即用推理api 图像分类图像语义描述视觉问答视觉定位检索 安装步骤 配置文件中含有…

python 社区发现算法

转载&#xff1a;这个Python库超级棒啊&#xff0c;包含Louvain 算法、Girvan-Newman 算法等多种社区发现算法&#xff0c;还具有可视化功能_11205354的技术博客_51CTO博客 熟知社区发现算法&#xff0c;你不能错过这个 Python 库。它涵盖 Louvain 算法、Girvan-Newman 算法等…

Java基础(项目2)——项目案例:控制台的一个云就业平台项目【应聘+招聘】

目录 引出项目的分层固定的流程反思1.entity --- 实体类2.dao ---数据库的CRUD【进化到Spring的JdbcTemplate】以职位投递的dao为例---进化到Spring的JdbcTemplate&#xff1a; 3.service --- 组织代码的业务【进化到servlet调用service】4.util ---需要用到的工具【进化到duri…

leetcode450. 删除二叉搜索树中的节点(java)

删除二叉搜索树中的节点 leetcode450. 删除二叉搜索树中的节点题目描述 解题思路代码演示二叉树专题 leetcode450. 删除二叉搜索树中的节点 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;https://leetcode.cn/problems/delete-node-in-a-bst 题目描述…

【SpringCloud——Elasticsearch(下)】

一、数据聚合 聚合&#xff0c;可以实现对文档数据的统计、分析、运算。常见的聚合有三类&#xff1a; ①、桶聚合&#xff1a;用来对文档做分组 TermAggregation&#xff1a;按照文档字段值分组。Date Histogram&#xff1a;按照日期解题分组&#xff0c;例如一周为一组&am…

10 - Linux进程层次分析

---- 整理自狄泰软件唐佐林老师课程 查看所有文章链接&#xff1a;&#xff08;更新中&#xff09;Linux系统编程训练营 - 目录 文章目录 1. 详解Linux进程组1.1 Linux进程组1.2 进程组示例程序1.3 编程实验&#xff1a;Linux进程组1.4 深入理解进程组1.4.1 进程组标识设置技巧…

Java实习生面试实录

你平时是怎么使用多线程的 我认为多线程使用我们可以就是你手动的&#xff0c;最初始学多线程就是可以去new Thread&#xff0c;然后去创建别的线程去异步执行一些任务&#xff0c;但是多线程的话最多使用可能在线程池这块会用到吧多线程技术就是创建线程池&#xff0c;然后由…

马尔可夫链蒙特卡罗算法(MCMC方法)

MCMC方法是什么 具体而言&#xff0c;假设我们要计算积分 μ ∫ S h ( θ ) π ( θ ∣ x ) d θ \mu\int_Sh(\theta)\pi(\theta|x)d\theta μ∫S​h(θ)π(θ∣x)dθ如果后验分布 π ( θ ∣ x ) \pi(\theta|x) π(θ∣x)难以直接抽样&#xff0c;那么我们就可以构造一条马氏…

Unity | HDRP高清渲染管线学习笔记:Volume

目录 一、Volume框架 二、Volume Profile 三、Volume重载 1.Visual Environment&#xff08;环境设置&#xff09; 1.1 Sky type 1.2 Ambient Mode 2.Sky 2.1 HDRI Sky&#xff08;HDRI天空&#xff09; 2.2 Gradient Sky&#xff08;渐变天空&#xff09; 2.3 Physi…

JAVA日志框架

JAVA日志框架 常见日志框架日志级别阿里日志规约什么时候打印日志配置文件log4j.propertieslogback-spring.xmllogback的默认配置 导入依赖日志使用方式&#xff0c;引入slf4j的API输出用户日志 常见日志框架 日志框架&#xff1a;Log4j 、Logback 。 日志门面&#xff1a;Slf…

第2章:SpringMVC的@RequestMapping注解

一、SpringMVC搭建框架 1.创建一个Maven程序的步骤 ①在pom.xml导入maven依赖 <!--打包方式是war--> <!--war 包通常用于网站&#xff0c;它是一个可以直接运行的 web 模块--> <packaging>war</packaging> <dependencies><!-- SpringMVC --…

二战阿里巴巴成功上岸,准备了小半年,拿23k也不算很高吧~

先说下我基本情况&#xff0c;本科不是计算机专业&#xff0c;现在是学通信&#xff0c;然后做图像处理&#xff0c;可能面试官看我不是科班出身没有问太多计算机相关的问题&#xff0c;因为第一次找工作&#xff0c;阿里的游戏专场又是最早开始的&#xff0c;就投递了&#xf…

如何获取 C#程序 内核态线程栈

一&#xff1a;背景 1. 讲故事 在这么多的案例分析中&#xff0c;往往会发现一些案例是卡死在线程的内核态栈上&#xff0c;但拿过来的dump都是用户态模式下&#xff0c;所以无法看到内核态栈&#xff0c;这就比较麻烦&#xff0c;需要让朋友通过其他方式生成一个蓝屏的dump&…

线程同步(一)

上篇文章讲述了什么是线程&#xff0c;以及在Linux系统下线程的相关操作 线程&#xff08;Linux系统实现&#xff09;_小梁今天敲代码了吗的博客-CSDN博客 本文将继续讲述线程的相关知识——线程同步 目录 1.线程同步的概念 2.线程不同步可能会发生什么 3.线程同步方式 …

机器学习——聚类算法详解

1.聚类问题 1&#xff09;聚类问题与核心概念 聚类算法做的事情&#xff0c;就是对无标签的数据&#xff0c;基于数据分布进行分群分组&#xff0c;使得相似的数据尽量落在同一个簇内。 我们先对比区分一下聚类和分类&#xff1a; 聚类是一种无监督学习&#xff0c;而分类是…

第十三届蓝桥杯C++B组j国赛

第十三届蓝桥杯C组 题目 2693: 蓝桥杯2022年第十三届决赛真题-卡牌 题目描述 这天&#xff0c;小明在整理他的卡牌。 他一共有 n 种卡牌&#xff0c;第 i 种卡牌上印有正整数数 i(i ∈ [1, n])&#xff0c;且第 i 种卡牌 现有 ai 张。 而如果有 n 张卡牌&#xff0c;其中…

硬件测试—温升测试之JinKo 多路温度测试仪使用说明

一、概述 1.1&#xff1a;测试概述 在硬件测试中&#xff0c;温升测试也是很重要的一项测试&#xff0c;产品各项器件在稳定的环境温度下满载工作的芯片温度&#xff0c;根据测试情况评估散热需求。 1.2&#xff1a;产品图片 1.3&#xff1a;使用设备 名称 厂家 型号 PC电脑…