Spring Cloud 7:Gateway

Zuul 网关

Zuul 是 Netfilx 开源的一个 API Gateway 服务器,本质是一个 Web Servlet 应用。其在微服务架构体系中提供动态路由、监控、弹性、安全等边缘服务。

使用 Zuul 作为网关,其主要原因有以下几点:

1、Zuul、Ribbon 以及 Consul 客户端结合使用,能够轻松实现智能路由、负载均衡功能;
2、在网关层统一对外提供 API 接口,保护了实际提供接口的微服务实现细节,同时也方便测试人员对微服务接口进行测试;
3、在网关层能够统一添加身份认证、鉴权等功能,防止对微服务 API 接口的非法调用;
4、在网关层可以方便地对访问请求进行记录,实现监控相关功能;
5、在网关层实现流量监控,在流量比较大时,方便对服务实施降级。

Zuul 工作原理

Zuul 的核心是一系列的 Filters,其作用可以类比 Servlet 框架的 Filter,或者 AOP。Zuul 中定义了四种标准过滤器类型,分别是 pre、post、routing 以及 error 过滤器。

1、pre 过滤器:在请求路由到具体微服务之前执行,其主要用于身份验证、鉴权等功能;
2、routing 过滤器:其主要功能是将请求路由到具体的微服务实例;
3、post 过滤器:在对具体微服务调用之后执行,其主要用于收集统计信息、指标以及对请求响应数据进行处理等;
4、error 过滤器:在以上三种过滤器执行出错时执行。

yang-gateway

pom.xml
    <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.1.0.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><java.version>1.8</java.version><spring-cloud.version>Greenwich.M3</spring-cloud.version></properties><dependencies><!--Actuator--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><!--Consul--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-consul-discovery</artifactId></dependency><!--Zuul--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-zuul</artifactId></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement>
View Code
bootstrap.yml
server:port: 1003
spring:application:name: yang-gatewaycloud:consul:host: 127.0.0.1port: 8500discovery:register: truehealthCheckPath: /server/consul/healthhealthCheckInterval: 10sinstance-id: ${spring.application.name}
zuul:routes:yang-service:path: /**serviceId: yang-diver
Application.java
@SpringBootApplication
@EnableZuulProxy
public class GatewayApplication {public static void main(String[] args) {SpringApplication.run(GatewayApplication.class, args);}
}
访问路径:http://localhost:1003/user/list

此时Gateway访问到了yang-diver服务的内容了。

路由配置

传统的路由配置

在不依赖于服务发现机制的情况下,通过在配置文件中具体指定每个路由表达式与服务实例的映射关系来实现API网关对外部请求的路由。

单实例配置

通过一组zuul.routes.<route>.path与zuul.routes.<route>.url参数对的方式配置。

server:port: 1003
spring:application:name: yang-gateway
zuul:routes:yang-service:path: /yang-diver/**url: http://localhost:1002/

凡是路径为:http://localhost:1003/yang-diver/** 的请求,都会转发请求到http://localhost:1002/** 地址

多实例配置

通过一组zuul.routes.<route>.path与zuul.routes.<route>.serviceId参数对的方式配置

zuul:routes:yang-service:path: /yang-diver/**serviceId: yang-diverribbon:eureka:enabled: false # 没有配置服务治理(Eureka)就需要关闭,否则会找不到服务yang-service:ribbon:# 为serviceId去指定具体的服务实例地址listOfServers: http://localhost:1001/,http://localhost:1002/ 

此时,凡是路径为:http://localhost:1003/yang-diver/** 的请求,都会转发请求到http://localhost:1001/** 和http://localhost:1002/** 地址

服务路由配置

整合服务治理后,只需要提供一组zuul.routes.<route>.path与zuul.routes.<route>.serviceId参数对的配置即可。

server:port: 1003
spring:application:name: yang-gatewaycloud:consul:host: 127.0.0.1port: 8500discovery:register: truehealthCheckPath: /server/consul/healthhealthCheckInterval: 10sinstance-id: ${spring.application.name}
zuul:routes:yang-service:path: /**serviceId: yang-diver

还可以通过zuul.routes.<serviceId>=<path>,直接进行路由转。,其中<serviceId>用来指定路由的具体服务名,<path>用来配置匹配的请求表达式。

zuul:routes:yang-diver:path: /**
#      serviceId: yang-diver

实际上,服务注册中心已经维护了serverId与实例地址的映射关系。当Gateway注册到服务注册中心后,就能从注册中心获取所有服务以及它们的实例清单。

服务网关之过滤器

Spring Cloud Zuul的过滤器的作用。

以权限控制为例。每个系统并不会将所有的微服务接口都开放出去。为了实现对客户端请求的安全校验和权限控制,有以下几点方案:
1、为每个微服务应用都实现一套用于校验签名和鉴别权限的过滤器或拦截器。【权限的实现方式大同小异,开发繁琐、维护困难,不推荐】
2、实现鉴权服务,直接在微服务应用中通过调用鉴权服务来实现校验。【分离不彻底】
3、通过前置的网关服务来完成这些非业务性质的校验,即通过在网关中完成校验和过滤。【推荐】

AccessFilter
```
/*** 系统访问 Filter** @Author YangXuyue* @Date 2018/11/28 23:34*/
@Component("accessFilter")
public class AccessFilter extends ZuulFilter {private static final Logger LOGGER = LoggerFactory.getLogger(AccessFilter.class);/*** 过滤器的类型,它决定过滤器在请求的哪个生命周期中执行。* 这里定义为pre,代表会在请求被路由之前执行** @return* @Author YangXuyue* @Date 2018/11/28 23:39*/@Overridepublic String filterType() {return "pre";}/*** 过滤器的执行顺序。当请求在一个阶段中存在多个过滤器时,需要根据该方法返回的值来依次执行** @return* @Author YangXuyue* @Date 2018/11/28 23:39*/@Overridepublic int filterOrder() {return 0;}/*** 判断该过滤器是否需要被执行** @return* @Author YangXuyue* @Date 2018/11/28 23:39*/@Overridepublic boolean shouldFilter() {return true;}/*** 过滤器的具体逻辑* 实现在请求被路由之前检查HttpServletRequest中是否有accessToken参数* 若有就进行路由,若没有就拒绝访问,返回401 Unauthorized错误。** @return* @throws ZuulException* @Author YangXuyue* @Date 2018/11/28 23:37*/@Overridepublic Object run() throws ZuulException {RequestContext ctx = RequestContext.getCurrentContext();HttpServletRequest request = ctx.getRequest();LOGGER.info("send {} request to {}", request.getMethod(), request.getRequestURL().toString());Object accessToken = request.getParameter("accessToken");if (accessToken == null) {LOGGER.warn("access token is empty");ctx.setSendZuulResponse(false);// 未授权ctx.setResponseStatusCode(401);return null;}LOGGER.info("access token ok");return null;}
}

此时访问:http://localhost:1003/user/list出现401未授权的问题

 

如果访问:http://localhost:1003/user/list?accessToken=true请求就能成功被转发。

 

转载于:https://www.cnblogs.com/yang21/p/10030043.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/395905.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

nodejs开发工程师前景_Google NodeJS运行时团队的工程师Matt Loring访谈

nodejs开发工程师前景by Sameer Khoja通过Sameer Khoja Google NodeJS运行时团队的工程师Matt Loring访谈 (An Interview with Matt Loring, an engineer on Google’s NodeJS Runtime team) I had the pleasure of interviewing Matt Loring (Cornell class of 2015) who wor…

计算机EI期刊2020,2020年Ei Compendex收录的中国期刊目录( JANUARY 1, 2020 )

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼2020年Ei Compendex收录的中国期刊目录更新了&#xff0c;合计222本。本文根据最新 JANUARY 1, 2020 更新《2020年Ei Compendex收录出版物期刊目录》整理&#xff0c;需要提醒&#xff0c;目录EI是不定时更新的&#xff0c;但根据小…

mysql联合索引顺序调整_MySQL 关于联合索引的字段顺序规则讨论

联合索引的顺序&#xff0c;难道不是哪个查询条件最多用就放在前面的吗&#xff1f;比如商品有三个分类A&#xff0c;B&#xff0c;C&#xff0c;类似「界门纲目科属种」那样&#xff0c;越左类别越大。还有一个是商品来源D&#xff0c;不一定会用于查询条件中。举个例子&#…

python基础-第三篇-函数编程

基本数据类型之set set是无序不允许重复的集合set创建&#xff1a;s set&#xff08;&#xff09; 创建空集合 s {11,22,33}转换s set&#xff08;可迭代数据&#xff09;li [11,22,33,44] s set(li) print(s) #结果为{33, 11, 44, 22} 集合元素的添加与清空se {11,22,…

10个 Linux/Unix下 Bash 和 KSH shell 的作业控制实例

Linux 和 Unix 属于多任务的操作系统&#xff0c;也就是说一个系统在同一时间段内能运行多重任务(进程)。在这个新的博客系列&#xff0c;我将会列出相关的 Linux 和 Unix 作业&#xff08;job&#xff09;控制的命令&#xff0c;你可以通过这些命令在 Bash 或 Korn 还有 POSIX…

微信小程序 - 骨架屏

骨架屏 - “与其等待网络加载&#xff0c;不如提前给点暗示” 注&#xff1a;不适用复杂交互效果 演示 示例解释以及使用全在index.wxml中&#xff0c;观看需了解组件使用. 示例下载&#xff1a;微信小程序-骨架屏演示 转载于:https://www.cnblogs.com/cisum/p/10032448.html

图解机器学习 github_使用Github和Cloudflare建立网站的图解指南

图解机器学习 githubby Karan Thakkar由Karan Thakkar 使用GitHub和Cloudflare建立网站的插图指南 (An illustrated guide to setting up your website using GitHub and Cloudflare) You should read this if…如果...&#xff0c;您应该阅读此内容 You want to setup custo…

ajax拼接显示不同样式,Ajax重点整理

Ajax工作流程Ajax:在不刷新页面的情况下向服务器请求数据1.创建XMLHttpRequest对象(俗称小黄人)var xhr new XMLHttpRequest();XMLHttpRequest &#xff1a; http请求对象&#xff0c;负责实现ajax技术2.设置请求xhr.open(get, url);url:服务器地址3.发送请求xhr.send();4.注册…

java与mysql的交互_java与数据库交互常用到的一些方法

下面我整理了一下java中常用的几个与数据库交互的常用方法&#xff0c;仅供参考&#xff1a;1.执行SQL(dao层的实现类中)(1)SQL查询&#xff1a;//import org.hibernate.Query;//import org.hibernate.Session;/*** 通过名称查找id*parampsname*returnid*/OverridepublicString…

xbmc电脑版本和手机版本学习教程

XBMC改名为Kodi了&#xff0c;IOS系统&#xff0c;Cydia源地址也同样发生了变化&#xff0c;新的源是&#xff1a;http://mirrors.kodi.tv/apt/ios/先了解一下几点知识&#xff1a; 教程中的各项操作&#xff0c;默认起始点都是“主界面”或“各分类菜单&#xff08;视频、音乐…

线程管理(七)守护线程的创建和运行

声明&#xff1a;本文是《 Java 7 Concurrency Cookbook 》的第一章&#xff0c; 作者&#xff1a; Javier Fernndez Gonzlez 译者&#xff1a;郑玉婷 校对&#xff1a;方腾飞 守护线程的创建和运行 Java有一种特别的线程叫做守护线程。这种线程的优先级非常低&#xff0c;通常…

vue2中的keep-alive使用总结及注意事项

问题总结;最近在写vue移动端的项目的时候,当我切换菜单,再切换换回去的时候,发现页面出现闪动的效果,其原因是因为切换回去之后,页面重新渲染了;为了解决这一问题:查阅资料,只需要在 入口文件 App.vue 的router-view外层包裹一个keep-active标签,表示该组件被保存在内存中,不需…

grove 套件_如何通过使用Andy Grove的High Leverage Activities加快发展?

grove 套件by Guido Schmitz由Guido Schmitz 如何通过使用Andy Grove的High Leverage Activities加快发展&#xff1f; (How to speed up your development by using Andy Grove’s High Leverage Activities ?) Youre constantly building on new features, fixing new bugs…

ajax php 观察者模式,JavaScript观察者模式定义和dom事件实例详解

观察者模式(发布-订阅模式)&#xff1a;其定义对象间一种一对多的依赖关系&#xff0c;当一个对象的状态发生改变时&#xff0c;所有依赖于它的对象都将得到通知。在JavaScript中&#xff0c;一般使用事件模型来替代传统的观察者模式。好处&#xff1a;(1)可广泛应用于异步编程…

python中代码段的标志是什么车_请问这段Python代码是什么意思?

ord(p) - ord(a)这个意思是以 a 为序号0&#xff0c;计算字符p的序号。在ASCII字符集中&#xff0c;小写字母a-z是连续排列的&#xff0c;因此如果a是0的话&#xff0c;那么b就是1&#xff0c;c就是2……以此类推。ord(p) - ord(a) 3前面一段我们解释过了&#xff0c;那么这一…

servlet和jsp页面过滤器Filter的作用及配置

刚刚有个朋友问我&#xff0c;Servlet的过滤器有什么作用&#xff1f; 现在发个帖子说明一下&#xff0c; 过滤器是一个对象&#xff0c;可以传输请求或修改响应。它可以在请求到达Servlet/JSP之前对其进行预处理&#xff0c;而且能够在响应离开Servlet /JSP之后对其…

tar命令速查

tar -c: 建立压缩档案-x&#xff1a;解压-t&#xff1a;查看内容-r&#xff1a;向压缩归档文件末尾追加文件-u&#xff1a;更新原压缩包中的文件 这五个是独立的命令&#xff0c;压缩解压都要用到其中一个&#xff0c;可以和别的命令连用但只能用其中一个。下面的参数是根据需要…

附005.Docker Compose文件详解

一 Docker Compose文件简介 compose文件使用yml格式&#xff0c;主要分为了四个区域&#xff1a;version&#xff1a;用于指定当前docker-compose.yml语法遵循哪个版本services&#xff1a;服务&#xff0c;在它下面可以定义应用需要的一些服务&#xff0c;每个服务都有自己的名…

如何使用TensorFlow构建简单的图像识别系统(第2部分)

by Wolfgang Beyer沃尔夫冈拜尔(Wolfgang Beyer) 如何使用TensorFlow构建简单的图像识别系统(第2部分) (How to Build a Simple Image Recognition System with TensorFlow (Part 2)) This is the second part of my introduction to building an image recognition system wi…

网站 服务器 用sqlite,sqlite服务器数据库

sqlite服务器数据库 内容精选换一换简要介绍SQLite是一款轻量级的关系型数据库&#xff0c;它的运算速度非常快&#xff0c;占用资源很少&#xff0c;不仅支持标准的SQL语法&#xff0c;还遵循了数据库的ACID事务。编写语言&#xff1a;C一句话概述&#xff1a;轻量级的关系型数…