SpringCloud---API网关服务---Spring Cloud Zuul
1、概述
1.1 微服务架构出现的问题 及 解决:
1.1.1 前言
每个微服务应用都提供对外的Restful API服务,它通过F5、Nginx等网络设备或工具软件实现对各个微服务的路由与负载均衡,并公开给外部客户端使用;
1.1.2 出现的问题
运维人员角度:
开发人员角度:
为了保证对外服务的安全性,在服务端实现都会加入一定的权限校验,同时为了安全,还会有签名校验等;
这样导致每个微服务应用都需要有冗余的代码,后期维护量非常大;
1.1.3 解决
为了解决这些常见的架构问题,API网关应运而生;
API网关:
更为智能的应用服务器;
类似于面向对象设计模式中的Facade模式,就像是 整个微服务架构系统 的门面一样,所有的外部客户端访问都需要经过API网关进行调度、过滤;
要实现请求路由、负载均衡、校验过滤、与服务治理框架的结合、请求转发时的熔断机制、服务的聚合等;
Spring Cloud提供了Spring Cloud Zuul来解决;
1.2 Spring Cloud Zuul:
基于Netflix Zuul实现的API网关组件;
Spring Cloud Zuul如何解决这2个普遍的问题?
1.1.1 路由规则 与 服务实例 的问题
服务实例:Spring Cloud Zuul通过与Spring Cloud Eureka进行整合,将自身注册为Eureka服务治理下的应用,同时从Eureka中获得所有其他微服务的实例信息;这样的设计巧妙地将服务治理体系中维护的实例信息利用起来,使得将维护实例的工作交给服务治理框架自动完成,不需要人工介入;
路由规则:Zuul默认将通过以服务名作为ContextPath的方式来创建路由映射,大部分情况下,这样的默认设置已可以实现我们大部分的路由需求,除了一些特殊情况还需要作特别的配置;
1.1.2 签名校验、登录校验在微服务中冗余问题
理论上说,这些校验逻辑在本质上与微服务应用自身的业务没有多大的关系,所以它们完全可以独立成一个单独的服务存在,但是它们被剥离、独立出来后,并不是给各个微服务调用,而是在API网关服务上进行统一调用来对微服务接口做前置过滤,以实现对微服务接口的拦截和校验;
Spring Cloud Zuul提供了一套过滤器机制,可以很好地支持这样的任务;
开发者可以通过使用Zuul来创建各种校验过滤器,然后指定哪些规则的请求需要执行校验逻辑,只有通过校验的才会被路由到具体的微服务接口,不然返回错误提示;
2、快速入门
1.1 构建网关
pom.xml中引入spring-cloud-starter-zuul依赖;
启动类加@EnableZuulProxy注解开启Zuul的API网关服务功能;
1.2 请求路由
面向服务的路由
Spring Cloud Zuul实现了与Spring Cloud Eureka的无缝整合,我们可以让路由的path不是具体的URL,而是让它映射到某个具体的服务,而具体的URL则交给Eureka的服务发现机制去自动维护;
pom中引入spring-cloud-starter-eureka依赖;
a,Zuul允许开发者在API网关上通过 自定义过滤器 来实现对请求的拦截与过滤:
自定义过滤器 需要继承ZuulFilter抽象类并实现它定义的4个抽象函数 即可完成对请求的拦截与过滤;
package com.an.filter;
import com.netflix.zuul.ZuulFilter;
public class AccessFilter extends ZuulFilter {
@Override
public String filterType() {
return null;
}
@Override
public int filterOrder() {
return 0;
}
@Override
public boolean shouldFilter() {
return false;
}
@Override
public Object run() {
//...
return null;
}
}
b,在启动类注入自定义过滤器;
package com.an; import com.an.filter.AccessFilter;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.cloud.client.SpringCloudApplication;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
import org.springframework.context.annotation.Bean; /**
* @EnableZuulProxy 开启Zuul的API网关功能
*/
@EnableZuulProxy
@SpringCloudApplication
public class ZuulApplication {
public static void main(String[] args){
new SpringApplicationBuilder(ZuulApplication.class).web(true).run(args);
} @Bean
public AccessFilter accessFilter(){
return new AccessFilter();
}
}
SpringCloud---API网关服务---Spring Cloud Zuul的更多相关文章
- 网关服务spring cloud zuul
Zuul例子配置文件 spring.application.name=switch-gateway server.port=5555 请求路由 传统路由方式 zuul.routes.api-a-url ...
- API网关服务Zuul-Spring Cloud学习第五天(非原创)
文章大纲 一.Zuul是什么二.Zuul的基本实现三.路由配置细节四.异常处理细节五.项目源码与参考资料下载六.参考文章 一.Zuul是什么 到目前为止,我们Spring Cloud中的内容已 ...
- 网关服务Spring Cloud Gateway(一)
Spring 官方最终还是按捺不住推出了自己的网关组件:Spring Cloud Gateway ,相比之前我们使用的 Zuul(1.x) 它有哪些优势呢?Zuul(1.x) 基于 Servlet,使 ...
- api网关揭秘--spring cloud gateway源码解析
要想了解spring cloud gateway的源码,要熟悉spring webflux,我的上篇文章介绍了spring webflux. 1.gateway 和zuul对比 I am the au ...
- 网关服务Spring Cloud Gateway(二)
上一篇文章服务网关 Spring Cloud GateWay 初级篇,介绍了 Spring Cloud Gateway 的相关术语.技术原理,以及如何快速使用 Spring Cloud Gateway ...
- 网关服务Spring Cloud Gateway(三)
上篇文章介绍了 Gataway 和注册中心的使用,以及 Gataway 中 Filter 的基本使用,这篇文章我们将继续介绍 Filter 的一些常用功能. 修改请求路径的过滤器 StripPrefi ...
- Consul集群加入网关服务(Spring Cloud Gateway)
Consul集群加入网关服务 架构示意图 外部的应用或网站通过外部网关服务消费各种服务,内部的生产者本身也可能是消费者,内部消费行为通过内部网关服务消费. 一个内部网关和一个外部网关以及一个Consu ...
- Spring Cloud Zuul 1(API 网关服务)
API网关是一个更为智能的应用服务器,它的存在就像是整个微服架构系统的门面一样,所有的外部客户端访问都需要经过它来进行调度和过滤. 它实现的功能包括:请求路由.负载均衡.校验过滤等功能. Spring ...
- SpringCloud开发学习总结(八)—— API网关服务Zuul(一)
大多数情况下,为了保证对外服务的安全性,我们在服务端实现的为服务接口时往往都会有一定的权限校验机制,比如对用户登录状态的校验等:同时为了防止客户端在发起请求时被篡改等安全方面的考虑,还会有一些签名校验 ...
随机推荐
- C# chart.DataManipulator.FinancialFormula()公式的使用 线性回归预测方法
最近翻阅资料,找到 chart.DataManipulator.FinancialFormula()公式的使用,打开另一扇未曾了解的窗,供大家分享一下. 一 DataManipulator类 运行时, ...
- 将std::string当字节流使
string是C++标准定义的字符串类,它不但支持文本,而且支持二进制字节流.给一个string变量赋值有多种方法: 1) 拷贝构造函数 2) 等号赋值函数 3) append成员函数 4) push ...
- 【小梅哥SOPC学习笔记】系统时钟的使用
给NIOS II CPU添加一颗澎湃的心——系统时钟的使用 本实验介绍如何在Qsys中添加一个定时器作为NIOS II的心跳定时器,并在NIOS II中软件编程使用该定时器. 将上一个实验watchd ...
- 2、Semantic-UI之网格布局
2.1 网格布局 在semantic-ui中提供了16个网格,使用class="column",当然也可以通过数字来表示当前网格大小. 在Semantic-UI中定义的网格 ...
- Linq实战 之 DataSet操作详解
Linq实战 之 DataSet操作详解 一:linq to Ado.Net 1. linq为什么要扩展ado.net,原因在于给既有代码增加福利.FCL中在ado.net上扩展了一些方法. 简单一 ...
- [gcc warnings] -Wtrigraph warnings
[gcc warnings] -Wtrigraph warnings 背景 三字符组(trigraph)与双字符组(Digraph)是程序设计语言(如C语言)中3个或者2个字符的序列,在编译器预扫描源 ...
- 单例模式(Singleton)小记
概念 引用维基百科对单例的说明: 单例模式,也叫单子模式,是一种常用的软件设计模式.在应用这个模式时,单例对象的类必须保证只有一个实例存在. 继续引用维基百科的实现思路: 实现单例模式的思路是:一个类 ...
- Eclipse中mvn install 报错error in opening zip file
报错信息 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:2.3.2:compile (de ...
- 「JXOI 2018」 排序问题
题目链接 戳我 \(Solution\) \(50\ pts\) 我们来看一下题目,可以很容易的写出来答案的式子: \[\frac{(n+m)!}{a_1!a_2!...a_{tot}!}\] \(a ...
- [HAOI2010]计数(组合数学)(数位DP)
原题题意也就是给的数的全排列小于原数的个数. 我们可以很容易的想到重复元素的排列个数的公式. 但是我们发现阶乘的话很快就会爆long long啊(如果您想写高精请便) 之后我就尝试质因数分解....但 ...