网关的作用

微服务架构中,服务实例的地址可能经常会发生变化,所以我们不能直接将服务的地址暴露出来。如果每一个微服务都直接暴露接口,会导致一系列的问题,比如调用过于复杂,涉及到账户、权限不能统一处理等。另外基于高内聚低耦合的设计准则来讲,我们也应该将内部系统和外部系统做切割。

因此,这时就需要有一个独立的组件来处理外部的请求,这个组件就是服务网关。服务网关就是为了简化前端的调用逻辑,通常情况下也会实现相关的认证逻辑,根据外部不同的请求响应不同的数据,从而简化内外部系统之间调用的复杂度。

服务网关负责服务请求路由、组合及协议转换。客户端的所有请求都首先经过服务网关,然后由它将请求路由到合适的微服务。服务网关经常会通过调用多个微服务并合并结果来处理一个请求,它可以在系统外部与内部响应之间友好的转换。

本文将先着重介绍Zuul组件。

Spring Cloud 网关组件Zuul介绍

Zuul 是 Netflix 公司开源的产品,被称为第一代网关,也是 Spring Cloud 前几个版本默认使用的一款提供动态路由微服务网关组件。Zuul 接收所有外来请求,并将请求转发到对应的后端服务。作为一个前置服务,Zuul 旨在实现动态路由,监控,弹性和安全性等功能。

Zuul 提供了不同类型的 filter 用于处理请求,这些 filter 可以让我们实现以下功能:

  1. 权限控制和安全性:可以识别认证需要的信息和拒绝不满足条件的请求。
  2. 监控:与边缘位置追踪有意义的数据和统计结果,从而带来精确的生产视图。
  3. 动态路由:根据需要动态地路由请求到后台的不同集群。
  4. 压力测试:逐渐增加指向集群的流量,以了解性能。
  5. 负载均衡:为每一种负载类型分配对应容量,并弃用超出限定值的请求
  6. 静态资源处理:直接在 zuul 处理静态资源的响应,从而避免其转发到内部集群。

Zuul网关实战

之前的介绍中,我们启动了注册中心registry,dms服务,和app服务,请求时,直接调用了app服务的接口,app服务又调用了dms服务:

加上网关服务之后,就会变成如下:

接下来,我们创建zuul服务:

1、创建服务

创建子模块zuul,pom.xml引入eureka-client 和zuul的依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><!-- feign --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency><!-- zuul路由 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-zuul</artifactId></dependency><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version></dependency>

2、创建配置文件

server:port: 8004
spring:application:name: zuuleureka:client:service-url:defaultZone: http://localhost:8001/eureka/
feign:hystrix:enabled: true
zuul:routes:app: #活动path: /app/** #配置请求URL的请求规则serviceId: app #指定Eureka注册中心中的服务iddms: #活动path: /dms/** #配置请求URL的请求规则serviceId: dms #指定Eureka注册中心中的服务id
logging:pattern:console: '%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %logger{15} - %msg%n'

3、创建Zuul过滤器

/*** @Author:公众号:程序员965* @create 2022-06-30**/
@Component
public class MyZuulFilter extends ZuulFilter {//    pre :可以在请求被路由之前调用
//    route :在路由请求时候被调用
//    post :在route和error过滤器之后被调用
//    error :处理请求时发生错误时被调用@Overridepublic String filterType() {return "pre";// 前置过滤器}//通过int值来定义过滤器的执行顺序,优先级为0,数字越大,优先级越低@Overridepublic int filterOrder() {return 0;}//返回一个boolean类型来判断该过滤器是否要执行,所以通过此函数可实现过滤器的开关@Overridepublic boolean shouldFilter() {return true;//此处为true,说明需要过滤}//过滤器的具体逻辑。@Overridepublic Object run() throws ZuulException {// 获取上下文RequestContext currentContext = RequestContext.getCurrentContext();HttpServletRequest request = currentContext.getRequest();String accessToken = request.getParameter("accessToken");if (StringUtils.isEmpty(accessToken)) {//setSendZuulResponse(false)令zuul过滤该请求,不进行路由currentContext.setSendZuulResponse(false);//设置返回的错误码currentContext.setResponseStatusCode(401);currentContext.setResponseBody("AccessToken is null");return null;}System.out.println("获取到AccessToken为:"+accessToken);// 否则正常执行业务逻辑.....return null;}
}

4、编写启动类

注意增加@EnableZuulProxy注解

/*** @Author:公众号:程序员965* @create 2022-06-30**/
@EnableZuulProxy
@EnableEurekaClient
@SpringBootApplication
public class ZuulApplication {public static void main(String[] args) {SpringApplication.run(ZuulApplication.class, args);}
}

5、启动验证

这个时候,我们将直接请求app的接口地址,改成网关zuul的地址和端口:http://localhost:8004/app/index

可以看到,请求中没有token访问授权认证失败!

总结

总结下网关的作用:

  1. 简化客户端调用的复杂度,统一处理外部请求。
  2. 数据的裁剪和聚合,根据不同的接口需求,对数据加工后对外提供接口
  3. 多平台的支持,对不同的客户端提供不同的网关支持。
  4. 遗留系统的微服务化改造,可以作为新老系统的中转组件。
  5. 统一处理调用过程中的安全、权限问题。

微服务实战|微服务网关Zuul入门与实战相关推荐

  1. SpringCloud Alibaba微服务实战(七) - 路由网关(Gateway)全局过滤

    说在前面 全局过滤器作用于所有的路由,不需要单独配置,我们可以用它来实现很多统一化处理的业务需求,比如权限认证,IP 访问限制,监控,限流等等. 创建路由网关(Gateway)启动服务cloud-ac ...

  2. controller调用controller的方法_SpringCloud Alibaba微服务实战三 - 服务调用

    导读:通过前面两篇文章我们准备好了微服务的基础环境并让accout-service 和 product-service对外提供了增删改查的能力,本篇我们的内容是让order-service作为消费者远 ...

  3. SpringCloud Alibaba微服务实战三 - 服务调用

    SpringCloud Alibaba微服务实战三 - 服务调用 通过前面两篇文章我们准备好了微服务的基础环境并运行注册服务到nacos上了 统一接口返回结构 在开始今天的正餐之前我们先把上篇文章中那 ...

  4. Spring Cloud微服务网关Zuul过滤链和整合OAuth2+JWT入门实战

    一.Spring Cloud Zuul 过滤链 1.1 工作原理 Zuul的核心逻辑是由一系列的Filter来实现的,他们能够在进行HTTP请求或者相应的时候执行相关操作.Zuul Filter的主要 ...

  5. Spring Cloud 微服务实战系列-Spring Boot再次入门(一)

    导语   看到标题大家都疑惑,为什么叫做再入门呢?在之前的博客中也分享过相关的内容,但为了让Spring Cloud 微服务实战系列更加完整就再次编写一个入门的内容,也是为了这个系列的内容更加的完整, ...

  6. go语言高并发与微服务实战_go-micro+gin+etcd微服务实战之服务注册与发现

    在构建微服务时,使用服务发现可以减少配置的复杂性,本文以go-micro为微服务框架,使用etcd作为服务发现服务,使用gin开发golang服务. 使用gin 的原因是gin能够很好的和go-mic ...

  7. Spring-Cloud 微服务网关Zuul、ZuulFilter过滤器和限流

    微服务网关 一. Zuul网关 1. 创建工程 并导入依赖 2. application.yml 配置文件 3. 启动类添加注解 4. 依次启动服务 5. 进入浏览器访问测试 二. ZuulFilte ...

  8. 微服务网关Zuul迁移到Spring Cloud Gateway

    https://juejin.im/post/5ba8daa56fb9a05cfe486ebf 背景 在之前的文章中,我们介绍过微服务网关Spring Cloud Netflix Zuul,前段时间有 ...

  9. SpringCloud Alibaba微服务实战(六) - 路由网关(Gateway)

    什么是 Spring Cloud Gateway? Spring Cloud Gateway 是 Spring 官方基于 Spring 5.0,Spring Boot 2.0 和 Project Re ...

最新文章

  1. 《3+1团队》【Alpha】Scrum meeting 4
  2. mysql eager mode_MySQL Connector Net 6.6.5 Entity Framework 显式预加载 Eager Load Bug
  3. Python初学——Python简易介绍及操作
  4. 怎么时装linux可用空间变大,[合集]OpenSUSE安装octave时装1G多texliv - 精华区 - 优秀的Free OS(Linux)版 - 北大未名BBS...
  5. Spring+Hibernate 零散知识点
  6. 图片加载------reactVirtualized
  7. 谈谈应届生应聘的一点看法
  8. WebComponent魔法堂:深究Custom Element 之 从过去看现在
  9. Caused by: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Incorrect datetime value:
  10. PHP pathinfo() 函数【获取文件后缀】
  11. LeetCode-124.二叉树中的最大路径和
  12. 在计算机上格式u盘启动,U盘制作dos启动盘几种简单方法
  13. c语言枪战游戏代码,FPS射击游戏《林海雪原》完整源代码
  14. appium实现屏幕截图
  15. 基于大数据的NBA球员数据分析及预测系统
  16. RNA-seq数据分析
  17. 小米8android p慢,给力 小米8青春版获得Android P更新
  18. oracle 误删数据恢复
  19. Android Studio Buid缓慢问题
  20. java日期类型_Java 学习笔记 (三) Java 日期类型

热门文章

  1. mysql 1054错误 Unknown column 'xxx' in 'field list'
  2. ftp软件下载,推荐5款免费的ftp软件下载工具
  3. 企业微信机器人读取服务器,智能机器人如何对接到企业微信?
  4. Android应用《撕开美女衣服》的实现过程及源代码
  5. 计算机一级wpsoffice知识点,2016年计算机一级《WPS Office》考试大纲
  6. 利用mkdocs部署静态网页至GitHubpages(更新版)
  7. wifi信号桥怎么设置_WiFi信号桥是什么意思
  8. 手把手教你摆地摊之地摊形式有哪些
  9. OpenGL ES渲染之Shader准备
  10. 【比赛报告】2018.10.15校赛[2015-9-13 NOIP模拟赛 by hzwer] NOIP练习赛卷十四