SpringCloud实战八:Gateway之 Spring Cloud Zuul

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhuyu19911016520/article/details/85036877
1.Zuul相关概念

Zuul是netflix开源的一个API Gateway 网关, 本质上是一个web servlet应用,用来做统一认证与鉴权、动态路由、监控、弹性、安全等边缘服务的框架,它的核心是做服务转发。

2.为什么需要网关

使用微服务架构后,大型系统往往会拆分为多个微服务,前端页面可能有商品,评价,广告、推荐模块等等,如果没有网关,前端页面就需要自己关心后端各个服务模块的地址,如果服务发布多个节点,或者发布地址变更后,前端页面要对应改过来,这就会很复杂。有了网关后,前端只需要向网关发起请求,不需要关心服务是否发布多份,服务地址是否变动,屏蔽后端的复杂性,它还能将多个API调用逻辑进行聚合,从而减少客户端的请求数

3.Zuul的工作原理

Zuul的核心是一系列的filters,它能在进行 HTTP请求或者响应时执行相关操作,其作用可以类比Servlet框架的Filter,它主要有以下几点特性:

  • Filter类型:pre、post、route、error,类型决定filter在Filter链中的执行顺序
  • Filter执行顺序:同一类型的Filter执行顺序通过 filterOrder()方法设定
  • Filter的执行条件:决定该filter是否执行,为true就会执行,为false就不执行
  • Filter的run方法,执行filter 实际上就是运行run()方法中的代码
  • Filter过滤链数据传递是通过RequestContext共享的,它内部是线程ThreadLocal实现
4. Zuul 与 Spring Cloud Zuul
  • Zuul是Netflix 2012年3月开源的,最开始1.0版本,默认是Servlet开发的(同步阻塞模式),原生Zuul是支持动态过滤器的,因为网关发布后,它承受大量流量,不能经常重启,能支持动态添加过滤器就会很方便,动态过滤器是通过Groovy脚本,也就是java代码,能动态编译、执行。
  • Zuul2.0版本是 Netfilx 2018-5月开源的,它把 Servlet换成了 Netty,事件处理器(handler)Netty Server接收请求,Netty Client响应(异步非阻塞),至于对比1.x版本有性能的提升,netfilx官方和网友都有测试,同时支持WebSocket和其他特性
  • Spring Cloud Zuul 是Pivotal 整合 Netfilx Zuul 到Spring Cloud 生态中,命名为Spring Cloud Zuul,它阉割了原生zuul的动态过滤器功能,整合与优化某些功能,如:使用注解就能启用Zuul网关,大大提高了开发效率
5.Spring Cloud Zuul 实践

为了高效的开发,下面使用Spring Cloud 整合的Zuul,非原生 Netfilx的Zuul,以下统称 Zuul。
了解以上概念后进行代码实践,思路:利用Zuul网关做服务转发,有3个角色,eureka注册中心,zuul网关,服务提供者,eureka与服务提供者项目请参考之前的博客,都有代码实践。

  • 创建Spring Cloud Zuul项目,引用eureka-client与zuul:
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
  • 在启动主类上启用注册中心与Zuul
@EnableZuulProxy
@EnableDiscoveryClient
@SpringBootApplication
public class ZuulApplication {

	public static void main(String[] args) {
		SpringApplication.run(ZuulApplication.class, args);
	}
}
  • 配置文件中配置注册中心与路由规则:
server.port=9999
spring.application.name=zuul-service
eureka.instance.prefer-ip-address=true
#配置eureka-server security的账户信息
eureka.client.serviceUrl.defaultZone=http://zy:zy123@localhost:10025/eureka/

#定义zuul的路由规则,请求的路径是provider的,就转发到provider-service
zuul.routes.provider-service.serviceId=provider-service
zuul.routes.provider-service.path=/provider/**

简单的zuul网关就完成了

  • 启动eureka与服务提供者,看看注册中心,已经有 ZUUL-SERVICE、PROVIDER-SERVICE服务了
    在这里插入图片描述

  • 服务提供者的代码很简单,根据传入的name参数,返回字符串

    @RequestMapping("/hello")
    public String hello(String name){
        return  "hello " + name;
    }

可以看到,请求已经正确转发到 Provider-Service服务上了
网关的目的是转发请求,加个认证与鉴权就好,不要写太多业务逻辑,Zuul1.x版本是同步阻塞模式,会降低吞吐量
此示例只是简单的介绍 Zuul 网关的转发功能,生产环境请自行扩展一些高级功能,如限流、动态路由、灰度发布等

代码已上传至码云,源码,项目使用的版本信息如下:

- SpringBoot 2.0.6.RELEASE
- SpringCloud Finchley.SR2

猜你喜欢

转载自blog.csdn.net/zhuyu19911016520/article/details/85036877