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(一)
大多数情况下,为了保证对外服务的安全性,我们在服务端实现的为服务接口时往往都会有一定的权限校验机制,比如对用户登录状态的校验等:同时为了防止客户端在发起请求时被篡改等安全方面的考虑,还会有一些签名校验 ...
随机推荐
- javascript总结41:表格全选反选,经典案例详解
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- 机器学习及其matlab实现—从基础到实践
第1周 MATLAB入门基础 第2周 MATLAB进阶与提高 第3周 BP神经网络 第4周 RBF.GRNN和PNN神经网络 第5周 竞争神经网络与SOM神经网络 第6周 支持向量机(Support ...
- Javascript 的addEventListener()及attachEvent()对比
Mozilla中: addEventListener的使用方式: target.addEventListener(type, listener, useCapture); target: 文档节点.d ...
- 用layer-list做一个卡片背景
<?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android=" ...
- Java文件路径
几大常用的方法 Class.getResource("") 返回的是当前Class这个类所在包开始的位置 getClassLoader().getResource(" ...
- MongoDb安全配置:简单的身份认证
mongod默认启动不加任何参数时,是没有身份认证的,任何人都可以登录上进行任何操作 启动时添加--auth可以使用身份验证模式 使用mongod -f mongod.conf配置文件启动时,配置文件 ...
- Android-广播发送与接收(Java代码中订阅)
Android四大组件之一广播,使用的也比较多,广播可大致分为两种,一种是Android系统区域的广播,是由系统指令发出,例如:点亮屏幕广播,开机过程中的一些广播 省略…, 然而还有一种广播就是我们自 ...
- Qt学习(二):项目学习
1. 概述 Qt做UI设计后,通常会生成Form Files文件夹下的ui文件.Generated File文件夹下的ui_xxx等头文件和源文件.Header Files文件夹下的头文件.Sourc ...
- C# 汉语生成拼音(微软官方方案)
项目开发中用户的登录名是管理员在后台输入汉字姓名后自动生成的拼音.例如输入:张三,则登录名自动生成ZHANGSAN. 我在网上查阅了很多方法: 如:http://blog.csdn.net/nengz ...
- 小程序:怎么在两层列表循环(wx:for)的时候判断是否为最后一个元素
问题说明: 如下图所示,在箭头所指的最后一个选项的底线与底部操作栏的上边线重叠,需要清除掉最后一个元素的底线: 想到的解决方案: 通过判断是否为最后一个元素,然后通过条件渲染(wx:if)动态添加对 ...