1、什么是Zuul
Zull包含了对请求的路由(用来跳转的)和过滤两个最主要功能:
其中路由功能负责将外部请求转发到具体的微服务实例上,是实现外部访问统一入口的基础,而过滤器功能则负责对请求的处理过程进行干预,是实现请求校验,服务聚合等功能的基础。Zuul和Eureka进行整合,将Zuul自身注册为Eureka服务治理下的应用,同时从Eureka中获得其他服务的消息,也即以后的访问微服务都是通过Zuul跳转后获得。
注意:Zuul 服务最终还是会注册进 Eureka
提供:代理 + 路由 + 过滤 三大功能!
Zuul 能干嘛?
- 路由
- 过滤
官方文档:https://github.com/Netflix/zuul/
2、入门案例
创建一个新的子model:springcould-zuul-9527
我们创建用于实现zuul的微服务要和其他的服务提供者提供的服务一样,将zuul模块的提供的路由服务作为注册中心的一个注册服务,所以我们需要eureka的依赖,要使用zuul自然需要zuul的依赖
<dependencies>
<!--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>
</dependencies>
编写配置文件,将这个微服务作为一个服务提供者提供的程序注册到注册中心去,所以它的配置应该和前面服务提供者model的配置类似
#服务运行端口
server:
port: 9527
#这个微服务在注册中心中注册的时候使用的服务名称
spring:
application:
name: springcould-zuul-getway
#设置这个服务要注册到哪些注册中心中去
eureka:
client:
service-url:
defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
#设置这个注册到注册中心去的服务的描述信息显示的数据
instance:
instance-id: springcould-zuul-9002 #配置注册的服务的描述信息
prefer-ip-address: true #将描述信息对应的超链接设置为IP格式,而不是主机名称格式
#完善监控信息展示
info:
app.name: zuul-getway路由网关 #服务的名称
company.name: com.godfrey
为了方便使用,我们再去HOSTS文件中增加一个本地计算机地址的映射名称
127.0.0.1 www.godfrey.com
编写主启动类/入口程序
@SpringBootApplication
@EnableZuulProxy //开启zuul服务代理,这个注解的作用和普通注册到eureka注册中心服务需要写的注解@EnableEurekaClient的作用类似,可以开启eureka服务注册发现,否则这个model提供的服务不能被eureka注册中心扫描到
public class ZuulApplication_9527 {
public static void main(String[] args) {
SpringApplication.run(ZuulApplication_9527.class,args);
}
}
测试,按照顺序启动注册中心、服务提供者、zuul模块
直接访问服务提供者提供服务API
通过网关访问:主机名:zuul端口号/小写服务名称、服务提供者API
使用zuul隐藏真正提供服务的服务提供者注册的服务的名称
实现微服务名称的隐藏/映射的方式就是去配置文件中进行配置
zuul:
routes:
mydept.serviceId: springcould-provider-dept #微服务名称,key
mydept.path: /mydept/** #代替这个微服务名称的path变量,即只要是"主机名称:端口号/mydept/"下面的所有请求,都去注册中心的服务springcould-provider-dept中处理
这个时候我们通过zuul模块实现消费者对于服务提供者提供的服务进行消费,并且URL中没有出现这个服务提供者在注册中心中注册的服务的名称,这进一步提高了安全性
但是有一点,就是将path变量换回原来的服务名称也还是能够实现消费服务,这显然不是我们需要的,我们真实的需求应该是我在zuul中为这个服务的访问定义了path值之后,原来使用服务名称消费服务的方式就应该失效,否则设置path变量的意义/安全性将会大大降低
实现方式,还是在配置文件中进行zuul的配置
zuul:
routes:
mydept.serviceId: springcould-provider-dept #微服务名称,key
mydept.path: /mydept/** #代替这个微服务名称的path变量,即只要是"主机名称:端口号/mydept/"下面的所有请求,都去注册中心的服务springcould-provider-dept中处理
ignored-services: springcould-provider-dept #设置不能再在zuul中使用这个微服务在注册中心中注册的服务名称对这个微服务进行消费
通过将原来服务名称消费服务失效,就真正意义上实现了隐藏注册中心服务名称的目的,这才是提高安全的做法,将我们真实项目中的东西都隐藏起来了
但是在真实的开发中,我们不可能只隐藏上面例子中那样的一个微服务,而是应该将所有提高消费的微服务的名称全部隐藏起来,但是我们又不能写一个微服务就去配置文件中为它写上ignored-services配置,所以我们可以使用通配符
除此之外我们还可以为每一个zuul模块设置不同的前缀,同样是使用配置文件设置zuul的属性
zuul:
routes:
mydept.serviceId: springcould-provider-dept #微服务名称,key
mydept.path: /mydept/** #代替这个微服务名称的path变量,即只要是"主机名称:端口号/mydept/"下面的所有请求,都去注册中心的服务springcould-provider-dept中处理,value
#ignored-services: springcould-provider-dept #设置不能再在zuul中使用这个微服务在注册中心中注册的服务名称对这个微服务进行消费
ignored-services: "*" #隐藏所有的可消费的服务的名称
prefix: /godfrey #设置这个zuul模块配置的路由的访问前缀
在真实的开发中,我们一般将这个zuul模块的运行端口编程80,这样在通过它消费服务的时候就不需要设置端口号了,这就更像我们平时是的时候的样子了
小结
- 通过zuul模块的配置routes属性就可以实现路由
- 通过zuul模块的配置prefix属性就可以实现过滤
- 通过zuul模块的配置ignored-services属性就可以实现关闭使用服务名称通过zuul消费服务,提高整体的安全性