天行健,君子以自强不息;地势坤,君子以厚德载物。
每个人都有惰性,但不断学习是好好生活的根本,共勉!
文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。
spring cloud 相关组件搭建(建议顺序):
本篇基于前两篇
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会到注册中心获取两个服务的信息
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";
}
}
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";
}
}
此处省略,可参考本片目录下方spring cloud搭建流程中的第一篇
在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启动依赖的引入
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
这里注释可能有点多,不过根据注释应该都能知道每个参数的意思
需要在启动类上添加@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);
}
}
http://localhost:8001
首先使用postman分别直接调用service1和service2的接口,结果正常后,再使用zuul网关调用两个服务的接口,如果正常返回则表示zuul网关功能可用。
使用postman直接调用service1的接口进行测试(service1的端口号是8002)
service1的test1 url:
http://localhost:8002/service1-pre/service1/zuul/test1/11
使用postman直接调用service2的接口进行测试(service2的端口号是8003)
service2的test2 url
http://localhost:8003/service2-pre/service2/zuul/test2/22
使用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)
使用postman直接通过zuul调用service2的接口进行测试(service2的端口号是8003,通过zuul调用就是将访问地址中的端口号改为zuul的端口号8004)
zuul调用service2的test2 url
http://localhost:8004/service2-pre/service2/zuul/test2/22
其中的一些问题还请知道如何解决的大佬留言指教一二,感谢。
以上就是zuul的使用了。