Spring Cloud认知学习(五):网关Zuul的使用
💡上一篇介绍一个新的组件Hystrix,Hystrix是一个熔断器,可以用于解决微服务调用中发送的服务熔断和服务降级问题。 Spring Cloud认知学习(四):熔断器Hystrix的使用
💡这一篇介绍一个新的组件Zuul,Zuul是网关组件,对Api请求进行了统一的接收,基于网关,我们可以对所有的请求来进行处理,进行日志记录,请求授权等操作。
zuul
- zuul可以作为微服务的网关,所谓网关,其实就是服务消费者通过网关来访问服务消费者,就好像网络环境中我们都是把请求丢给网关,网关再向外请求的。
- zuul是Netfilx OSS的一员,可以与其他的Netfilx OSS的兄弟,如Eureka,Ribbon,Hystrix很好的配合。
- 为了应对zuul的更新问题,spring 团队也自己开发了一个网关组件--Spring Cloud Gateway,但还是像我之前说的,学这个一方面是为了了解多种知识,一方面是为了避免需要接手zuul项目或者把zuul项目改造成gateway的却缺少zuul知识的问题,而且zuul还没凉不是吗
作用:
💡使用网关来隐藏了具体的服务的URL,外部调用API接口的时候都是使用网关的URL,避免了服务的敏感信息的泄露。
💡由于所有的请求都经过网关,所以可以在网关做身份认证和权限认证。
💡可以在网关做统一的日志记录。
💡可以在网关做统一的监控处理。
💡可以与eureka、ribbon等结合,可以实现对请求的负载均衡。
简单示例:
下面的代码可以参考zuul整合使用实验
0.创建模块
0.创建新模块spring-cloud-zuul-10001
1.导入依赖:
<dependencies>
<!--引入公共依赖包 start-->
<dependency>
<groupId>com.progor.study</groupId>
<artifactId>spring-cloud-common-data</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!--引入公共依赖包 end-->
<!--导入zuul-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
<!--导入eureka-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!--导入actuator-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--导入hystrix-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
<!--导入web相关-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
2.主程序增加注解:
@SpringBootApplication
@EnableZuulProxy
@EnableEurekaClient // 需要加eureka,因为他也需要拉取服务列表
public class SpringCloudZuul10001Application {
public static void main(String[] args) {
SpringApplication.run(SpringCloudZuul10001Application.class, args);
}
}
3.配置application.yml:
server:
port: 10001
spring:
application:
name: spring-cloud-zuul
# 为了负载均衡之类的和拉取服务之类的,也需要配置eureka
eureka:
client:
service-url:
defaultZone: http://localhost:7001/eureka
instance:
instance-id: zuul-10001.com
prefer-ip-address: true
# 配置zuul
zuul:
routes: # 配置路由
UserService.serviceId: USERSERIVE # 服务名
UserService.path: /myuser/** # 在本地用什么来映射,比如/user/list会映射成本地的/myuser/user/list
4.测试
🔴启动spring-cloud-user-service-8001
,spring-cloud-zuul-10001
,spring-cloud-eureka-server-7001
,
🔴访问http://localhost:10001/myuser/user/list
,你会发现与调用http://localhost:8001/user/list
的效果一致,所以上面的配置成功了,我们通过zuul的10001作为一个网关调用到了8001的服务,那么以后的消费者都可以调用网关的接口来间接调用服务接口。
配置语法:
路由
zuul:
routes: # 配置路由
UserService.serviceId: USERSERIVE # serviceId用来服务名。UserService.前缀是用来分组映射的,可以是自定义的前缀。
UserService.path: /myuser/** # 在本地用什么来映射,比如/user/list会映射成本地的/myuser/user/list
也可以是:
zuul:
routes: # 配置路由
UserService:
serviceId: USERSERIVE # 服务名
path: /myuser/** # 在本地用什么来映射,比如/user/list会映射成本地的/myuser/user/list
MessageService:
serviceId: MESSAGESERIVE # 服务名
path: /mymsg/** #
💡ignored-services:默认情况下,zuul会对能拉取到的服务都进行映像。在eureka有MessageService,但我们没有配置的时候,你访问http://localhost:10001/messageserive/msg/list
也可以访问到MessageService,因为默认会采取http://ip:port/服务名
来映射。如果你不需要默认映射,只采用你手动配置的映射,那么需要配置zuul.ignored-services = '*'
。
💡prefix:用来指定一个全局的前缀,比如说上面的是/mymsg/** ,如果你配置了zuul.prefix=/api
,那么你以后需要调用/api/mymsg/**
才能访问到MESSAGESERIVE的接口。
# 配置zuul
zuul:
prefix: /api
routes: # 配置路由
UserService:
serviceId: USERSERIVE # 服务名
path: /myuser/** # 在本地用什么来映射,比如/user/list会映射成本地的/myuser/user/list
ignored-services: '*'
补充:
- 作为网关,可以在网关层做很多功能,更多内容将在单独章节zuul中讲解,这里只是简单的讲解作为一个网关的最基础的作用而已。