前言:上一篇介绍了关于Cloud的应急保护机制 Hystrix,今天来介绍一下有关zuul的相关知识。
1、什么是服务网关?
服务网关充当着服务客户端和被调用的服务之间的中介。传统调用方式,客户端需要与每一个微服务联系,都得记住每一个微服务的服务名,端口号。如下图:
如果应用程序就几个微服务还不成什么大问题,当是当应用程序拥有越来越多的微服务的时候,就遍对开发人员造成了很大影响,这个时候,必须找出一个中介代理去寻找服务。转发请求。那么遍有了网关。如下图:
这样,我们只需要网关中配置相应的路径映射发送请求的时候,网关就会转发我们的请求到对应的 服务中。
2、 Zuul介绍
Zuul就充当了一个网关服务的角色,spring cloud 将他整合,我们只遇需要极少的配置就可以使用它了。Zuul提供了许多功能
- 可以将一个微服务的所有服务都映射到一个url,值提供一个路口点就可以访问。
- 可以对网关请求的时候,设置过滤器,添加额外的操作,下面都会介绍。
3、网关基础工程搭建。
目标:
1、创建网关模块microservice_zuul_9527
1、在父工程下面新建model
2、引入相关依赖
因为需要注册到Eureka中去,所以也要引入Eureka客户端的依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zuul</artifactId>
</dependency>
</dependencies>
3、编写配置文件application.yml
server:
port: 9527
spring:
application:
name: microservice-zuul
eureka: #设置eureka注册服务的地址
client:
service-url:
defaultZone: http://eureka7001:7001/eureka,http://eureka7003:7003/eureka,http://eureka7002:7002/eureka
instance:
instance-id: microservice-zuul-9527 #配置服务的别名
prefer-ip-address: true # 注册的时候使用ip注册
zuul: #配置路由规则
routes:
microservice-product-provider8001:
path: /provider/**
serviceId: microservice-provider
在边配置了路由规则 意思是然后/privider/**的请求都会到microservice-provider中去找。
4、开始测试
启动服务
microservice_eureka_7001
microservice_eureka_7002
microservice_eureka_7003
microservice_zuul_9527
microservice_product_provider8001
服务启动成功之后,先是通过原生的url进行访问http://localhost:8001/product/list
返回:
[{"pid":1,"dbSource":"springcloud001","pname":"舒肤佳"},{"pid":2,"dbSource":"springcloud001","pname":"可口可乐"},{"pid":3,"dbSource":"springcloud001","pname":"百事可乐"},{"pid":4,"dbSource":"springcloud001","pname":"冰箱"},{"pid":5,"dbSource":"springcloud001","pname":"电视"},{"pid":6,"dbSource":"springcloud001","pname":"苹果"}]
通过网关访问 http://localhost:9527/provider/product/list
返回:
[{"pid":1,"dbSource":"springcloud001","pname":"舒肤佳"},{"pid":2,"dbSource":"springcloud001","pname":"可口可乐"},{"pid":3,"dbSource":"springcloud001","pname":"百事可乐"},{"pid":4,"dbSource":"springcloud001","pname":"冰箱"},{"pid":5,"dbSource":"springcloud001","pname":"电视"},{"pid":6,"dbSource":"springcloud001","pname":"苹果"}]
说明我们通过访问网关,通过也能访问到我们的微服务。这样网关起到了转发的作用。
5、网关的过滤器
Zuul网关代理的所有请求确实可以简化服务的调用,但是能在网关服务调用的时候,自定义逻辑时,Zuul的真正的作用才发挥出来。这种作用类似于拦截器的效果,可以在方法调用前后实现我们自定义的一些逻辑。
(1)创建过滤器
只需要继承一个类----ZuulFilter
重写相关方法
/**
* 过滤器的类型
* pre 请求之前
* route 路由时
* post rout和error之后
* error 发生error时调用
* @return
*/
@Override
public String filterType() {
return "pre";
}
/**
* 过滤器的优先级别 当有多个数值越小优先级越高
* @return
*/
@Override
public int filterOrder() {
return 0;
}
/**
* 是否开启过滤器
* true 开启
* false 关闭
* @return
*/
@Override
public boolean shouldFilter() {
return true;
}
/**
* 过滤器的主要执行方法
* 返回然后object 代表继续执行
* requestContext.setSendZuulResponse(false)//终止运行
* @return
* @throws ZuulException
*/
@Override
public Object run() throws ZuulException {
/**
* 这里就是编写逻辑的主要代码
*用于判断哪种情况应该拦截
*哪种情况放行
*/
//如果返回的只要是 object对象 就能继续执行
//如果 requestContext.setSendZuulResponse(false)则代表这次执行不通过
//1、需要放行一些最基本的请求比如:登录
//放行网关转发的第一次请求 OPTIONS
return null;
}
当我们需要这个过滤器的时候,只要使用@Component
注解 添加到容器即可。这里就不做演示