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,一经查实,立即删除!

相关文章

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

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…

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

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

type-c接口图片_TypeC接口除了充电还能干吗?这些功能都不知道,简直是在浪费...

Type C手机接口相信每个使用智能手机的朋友都很熟悉&#xff0c;目前已经广泛使用在智能手机领域&#xff0c;并且得到用户一致好评。但是对于Type C接口真正的用处很少有人知道&#xff0c;大部分用户只了解正反面都可充电&#xff0c;其他方面一概不知&#xff0c;对于这一点…

Zookeeper的api的简单使用(转载)

转载自: http://www.cnblogs.com/sunddenly/p/4031881.html 1.API 2.API 示例 ZooKeeper中的组成员关系 理解ZooKeeper的一种方法就是将其看作一个具有高可用性的文件系统。但这个文件系统中没有文件和目录&#xff0c;而是统一使用“节点”(node)的概念&#xff0c;称为znode…

1.1好素数

题目 题意&#xff1a;一个好素数的定义是&#xff0c;他是一个素数&#xff0c;然后他的左右两边10区间内存在素数&#xff0c;那么他就是好素数&#xff0c;现在让你输入一个数字&#xff0c;这个数字以内的好素数的数量。 解题方法&#xff1a;先把每一个数字是不是素数判断…

python 矩阵获取行数_4个最佳项目创意的代码片段和示例,旨在为Python和机器学习构建出色的简历!...

点击上方“小白学视觉”&#xff0c;选择加"星标"或“置顶”重磅干货&#xff0c;第一时间送达一篇文章带你了解4个最佳项目创意的代码片段和示例Python是一种特殊的编程语言&#xff0c;适用于从初学者到中级用户。由于它的灵活性&#xff0c;它正逐渐成为一种非常流…

Android 多状态加载布局的开发 Tips

2019独角兽企业重金招聘Python工程师标准>>> 什么是多状态 Layout 对于大多数 App 而言&#xff0c;项目中都有多状态加载 View 这种需求&#xff0c;如下图所示。 对应到开发中&#xff0c;我们通常会开发一个对应的自定义 layout 用于根据页面不同的状态来显示不同…

iis mysql5.7_手动配置网站环境 IIS 10+PHP 7.1+MySQL 5.7

之前配置环境一直用的一键安装包&#xff0c;不管是phpStudy还是lnmp&#xff0c;昨天尝试在自己电脑配置一下iis的环境&#xff0c;也踩了一些坑&#xff0c;整理了一下。测试电脑是Windows10&#xff0c;理论上Win7和IIS7.5都支持的。安装 IIS1&#xff1a;控制面板 > 程序…

node webkit(nw.js) 设置自动更新

原理&#xff1a;把更新的文件放在服务器上&#xff0c;设置一个客户端版本号&#xff0c;每次打开客户端的时候&#xff0c;通过接口获取服务器上的版本&#xff0c;如果高于本地的版本就下载服务器上的代码&#xff0c;低于或等于就不更新 1 <script>2 var htt…

mysql8.0版1130_navicat premium连接mysql 8.0报错error 10061和error1130问题

昨天安装了最新版的mysql navicat premium, 但没来得及测试使用Navicat连接。今天上班时&#xff0c;使用Navicat premium连接mysql时&#xff0c;出现报错ERROR 2003 (HY000): Can’t connect to MySQL server on ‘1XX.XX.XX.XX’ (10061).起初以为是mysql没有安装成功&#…

Java挂起线程

2019独角兽企业重金招聘Python工程师标准>>> 不优雅的suspend import java.util.concurrent.TimeUnit;public class SuspendTest {static Object lock new Object();SuppressWarnings("deprecation")public static void main(String[] args) {Suspend s1…

华为p4用鸿蒙系统吗_华为p40pro是鸿蒙系统吗

华为的鸿蒙OS是一款“面向未来”的操作系统&#xff0c;一款基于微内核的面向全场景的分布式操作系统&#xff0c;此前mate30系列并没有搭载鸿蒙系统。那华为p40pro是鸿蒙系统吗&#xff1f;品牌型号&#xff1a;华为p40pro华为p40pro是鸿蒙系统吗&#xff1f;华为p40pro没有搭…

Web优化 --利用css sprites降低图片请求

sprites是鬼怪&#xff0c;小妖精&#xff0c;调皮鬼的意思&#xff0c;初听这个高端洋气的名字我被震慑住了&#xff0c;一步步掀开其面纱后发觉非常easy的东西。作用却非常大 什么是CSS Sprites CSS Sprites是指把网页中非常多小图片&#xff08;非常多图标文件&#xff09;做…

mysql取消mvvc机制_MySQL探秘(六):InnoDB一致性非锁定读

一致性非锁定读(consistent nonlocking read)是指InnoDB存储引擎通过多版本控制(MVVC)读取当前数据库中行数据的方式。如果读取的行正在执行DELETE或UPDATE操作&#xff0c;这时读取操作不会因此去等待行上锁的释放。相反地&#xff0c;InnoDB会去读取行的一个快照。上图直观地…

APP应用 HTTP/1.0中keep-alive

在HTTP/1.0中keep-alive不是标准协议&#xff0c;客户端必须发送Connection:Keep-Alive来激活keep-alive连接。https://www.imooc.com/article/31231HTTP协议是无状态的协议&#xff0c;即每一次请求都是互相独立的。因此它的最初实现是&#xff0c;每一个http请求都会打开一个…

安装mysql8._安装MySQL8(附详细图文)

安装MySQL8(附详细图文)删除mysql服务&#xff1a;mysqld -remove mysql1、下载 mysql 8下载地址&#xff1a;https://dev.mysql.com/downloads/mysql/2、配置 mysql 配置文件打开 mysql 8 的安装目录&#xff1a;my.ini注意设置自己对应的 mysql 安装目录 和数据存放目录[mysq…