天行健,君子以自强不息;地势坤,君子以厚德载物。
每个人都有惰性,但不断学习是好好生活的根本,共勉!
文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。
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的使用了。