我们在进行分布式开发的时候,会用到多个服务(微服务),那么我们在调用这些微服务的时候,都是用的每一个微服务所在主机的IP加端口号进行调用的,这样会导致路由很复杂也不安全。我们希望能够通过统一放入IP和端口号来调用不同的服务,因此就出现了路由网关。
一、什么是zuul
Zuul的主要功能是路由转发和过滤器。路由功能是微服务的一部分,比如 /api/user 转发到到 user 服务, /api/shop 转发到到 shop 服务。zuul 默认和 Ribbon 结合实现了负载均衡的功能。
本节我们主要讲解Zuul的路由转发,Zuul 的路由转发用到了 Eureka,在 SpringCloud 的项目中,每一个 springboot 服务都会注册到注册中心 Eureka 中,那么 Zuul 就可以在注册中心中拉去服务,并且通过 springboot 服务的注册名进行服务的访问,从而避免暴露 springboot 服务的 IP 以及 端口号。
二、通过zuul实现路由网关
第一步:我们需要创建一个 springboot 服务(springcloud-zuul-9527)
springcloud-zuul-9527 服务是用于路由网关的服务(我使用的 springboot 版本是 2.2.5RELEASE )。
第二步:导入pom依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- eureka依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
<version>2.2.5.RELEASE</version>
</dependency>
<!-- zuul 依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
<version>2.2.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
第三步:编写配置,目前先不自定义 zuul 配置(application.yaml)
server:
port: 9527
spring:
application:
name: springcloud-zuul
eureka:
client:
service-url:
defaultZone: http://eurekaserver7001.com:7001/eureka/,http://eurekaserver7001.com:7001/eureka/,http://eurekaserver7001.com:7001/eureka/ # EurekaServer端的url
instance:
instance-id: this service is zuul and port of 9527 # 修改 Eureka 的状态(Status)信息
prefer-ip-address: true #显示真是的IP地址
# actuator 配置
info:
app.info: this is a zuul server and port of 9527
author.name: StudiousTiger
author.email: studioustiger@163.com
author.blog: https://blog.csdn.net/m0_45067620
第四步:开启 zuul 支持注解
在主启动类上添加 @EnableZuulProxy 注解,开启 zuul 代理服务。
@SpringBootApplication
@EnableZuulProxy //开启zuul代理
public class SpringcloudZuul9527Application {
public static void main(String[] args) {
SpringApplication.run(SpringcloudZuul9527Application.class, args);
}
}
第五步:开启springcloud-eureka-7001
、springcloud-provider-dept-hystrix-8001
和springcloud-zuul-9527
访问localhost:8001/dept/select/2
,成功获取数据
因为我们配置了 zuul,所以我们可以通过 zuul 服务实现访问注册进 Eureka 的服务,格式:zuul的IP:端口号/注册进Eureka的服务名/具体放入url。
访问localhost:9527/springcloud-provider-dept-hystrix/dept/select/2
,成功获取数据,这样我们就可以不通过微服务的IP和端口号进行访问,从而可以进行统一管理和安全。
但是,这样还是不太好,因为我们还是暴露了服务在 Eureka 注册的应用名,为了隐藏服务在 Eureka 注册的应用名,我们可以进行如下的配置(application.yaml)。
ignored-services:禁止使用服务在 Eureka注册的应用名进行服务的访问,其类型是一个 set 或 array
。
prefix:设置访问路径前缀。
routes:设置路由映射,其类型是键值对(key-value)
。zuul 还是要通过微服务在Eureka中注册的应用名进行服务的访问,所以需要对微服务在Eureka中注册的应用名做一个映射(别名)。
zuul:
ignored-services: # ignored-services是set集合/arr数组
- springcloud-provider-dept-hystrix # 不能使用这个路径访问
prefix: /tiger # 设置访问前缀
routes: # 设置路由映射(别名)
mydept.serviceId: springcloud-provider-dept-hystrix
mydept.path: /blog/**
经过上述的配置,一方面我们进制使用 springcloud-provider-dept-hystrix 进行访问,另一方面也设置了前缀与路由映射。访问如下: