SpringCloud之Zuul网关简介、映射vs过滤配置使用
目的:
Zuul路由网关简介及基本使用
Zuul路由映射配置
Zuul请求过滤配置
Zuul路由网关简介及基本使用
Zuul简介:
Zuul是从设备和网站到Netflix流应用程序后端的所有请求的
前门
。作为边缘服务应用程序,Zuul旨在实现动态路由,监控,弹性和安全性。它还可以根据需要将请求路由到多个合适的服务弹性收缩组。Zuul官网地址:https://github.com/Netflix/zuul/wiki
Zuul使用一系列不同类型的过滤器,这些过滤器可帮助我们执行以下功能:
- 身份验证和安全性 - 识别每个资源的身份验证要求并拒绝不满足这些要求的请求。
- 洞察和监控 - 在边缘跟踪有意义的数据和统计数据,以便为我们提供准确的生产视图。
- 动态路由 - 根据需要动态地将请求路由到不同的后端群集。
- 压力测试 - 逐渐增加群集的流量以衡量性能。
- Load Shedding - 为每种类型的请求分配容量并删除超过限制的请求。
- 静态响应处理 - 直接在边缘构建一些响应,而不是将它们转发到内部集群
- 多区域弹性 - 跨AWS区域路由请求,以使我们的ELB使用多样化,并使我们的优势更接近我们的成员。
基本使用(路由配置)
我们新建一个工程,microservice-zuul-3001
zuul也注册到eureka服务里,端口3001
我们修改下Hosts,专门为zuul搞个本地域名映射
找到本机C:\Windows\System32\drivers\etc 地址下的host文件
加下:
127.0.0.1 zuul.ht.com
microservice-zuul-3001完整pom依赖:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.ht</groupId>
<artifactId>htSpringCloud</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>microservice-zuul-3001</artifactId> <properties>
<java.version>1.8</java.version>
</properties> <dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<!-- actuator监控 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- hystrix容错 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<!--zuul网关-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zuul</artifactId>
</dependency>
</dependencies> <build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build> </project>
修改application.yml 文件
server:
port:
context-path: /
spring:
application:
name: microservice-zuul
eureka:
instance:
instance-id: microservice-zuul:
prefer-ip-address: true
client:
service-url:
defaultZone: http://eureka2001.ht.com:2001/eureka/,http://eureka2002.ht.com:2002/eureka/,http://eureka2003.ht.com:2003/eureka/
info:
groupId: com.ht.htSpringCloud
artifactId: microservice-zuul-
version: 1.0-SNAPSHOT
userName: http://ht.com
phone:
在启动类:ZuulApplication_3001中加下@EnableZuulProxy注解
package com.ht.microservicezuul3001; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy; @SpringBootApplication(exclude={DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class})
@EnableZuulProxy
public class MicroserviceZuul3001Application { public static void main(String[] args) {
SpringApplication.run(MicroserviceZuul3001Application.class, args);
} }
我们测试下:
启动三个eureka 然后再启动下一个1004服务,以及 zuul网关服务
我们直接请求:http://localhost:1001/student/list 能获取到数据;
我们用 http://zuul.ht.com:3001/microservice-student/student/list 域名+端口+服务名称+请求地址 也能请求到数据;
我们的路由基本配置成功了
Zuul路由映射配置
综上所述我们可以看到访问路径很容易就暴露了提供者的名字,安全性不高。
那么映射配置就是为了把唯一标识名隐藏更换,提高安全性
至于怎么配置见下:
在yml文件中添加一段zuul相关配置:
zuul:
routes:
studentServer.serviceId: microservice-student
studentServer.path: /studentServer/** #替代microservice-student项目名称
ignored-services: "*" #将原来的服务提供者唯一标识名禁用
prefix: /ht #类似于一个命名空间的前缀
开启Eureka,zuul网关,服务提供者fegin用来做测试:
这次访问换成配置过后修改过的域名访问,看能否成功。
配置完毕后可通过以下链接做测试
http://zuul.ht.com:3001/ht/studentServer/student/list
很明显成功了。
Zuul请求过滤配置
由上我们晓得路由访问提高了安全性,其实zuul请求过滤也是为了提升性能和提高安全性;
怎么说就是每个用户来访问微服务提供的接口时也是有限制的,微服务的接口不会全部开放但是路由就不一样了;
只要你访问它就会给你跳转到你想要的页面并且返回结果集,但是我们又不能给每个用户都设置一套身份验证吧,这样让代码显得很冗余还要提高复杂度;那么zuul请求过滤恰恰就解决了这个问题,将问题简单化也降低了代码的复杂度。
从下图看的出来就是从API网关中实现对客户端请求的检验,只要你访问时API携带了用户相关信息那么就开放接口让你访问,若是没有携带反之关闭。
那么下面就直接上代码:
先定义一个 AccessFilter类让它去接收上下文数据,继承zuul自带的ZuulFilter 类进行过滤
package com.ht.microservicezuul3001.filter;
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import org.apache.log4j.Logger; import javax.servlet.http.HttpServletRequest; public class AccessFilter extends ZuulFilter { Logger logger=Logger.getLogger(AccessFilter.class); /**
* 判断该过滤器是否要被执行
*/
@Override
public boolean shouldFilter() {
return true;
} /**
* 过滤器的具体执行逻辑
* run方法中获取了整个上下文
*/
@Override
public Object run() throws ZuulException {
RequestContext ctx = RequestContext.getCurrentContext();
HttpServletRequest request = ctx.getRequest(); //请求
//接收到了一个token令牌,也就相当于接收用户信息一样,验证过滤要用的
String parameter = request.getParameter("accessToken");
logger.info(request.getRequestURL().toString()+" 请求访问");
if(parameter==null){
logger.error("accessToken为空!");
ctx.setSendZuulResponse(false);
ctx.setResponseStatusCode(401);
ctx.setResponseBody("{\"result\":\"accessToken is empty!\"}");
return null;
}
// token判断逻辑
logger.info(request.getRequestURL().toString()+" 请求成功");
return null;
} /**
* 过滤器的类型 这里用pre,代表会再请求被路由之前执行
* return "pre"是不能乱填的,要根据你继承的父类去选择,不单单这一种写法
*/
@Override
public String filterType() {
return "pre";
} /**
* 过滤器的执行顺序
*/
@Override
public int filterOrder() {
return 0;
} }
然后再新建一个ZuulConfig类去开启下 Filter配置:
package com.ht.microservicezuul3001.config; import com.ht.microservicezuul3001.filter.AccessFilter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; @Configuration
public class ZuulConfig { @Bean
public AccessFilter accessFilter(){
return new AccessFilter();
}
}
我们带着accessToken令牌去访问,可以看到是访问成功的
反之,没有携带accessToken令牌去访问,访问失败。
谢谢观看!
SpringCloud之Zuul网关简介、映射vs过滤配置使用的更多相关文章
- SpringCloud之Zuul网关原理及其配置
Zuul是spring cloud中的微服务网关.网关: 是一个网络整体系统中的前置门户入口.请求首先通过网关,进行路径的路由,定位到具体的服务节点上. Zuul是一个微服务网关,首先是一个微服务.也 ...
- 非常全面的讲解SpringCloud中Zuul网关原理及其配置,看它就够了!
Zuul是spring cloud中的微服务网关.网关:是一个网络整体系统中的前置门户入口.请求首先通过网关,进行路径的路由,定位到具体的服务节点上. Zuul是一个微服务网关,首先是一个微服务.也是 ...
- SpringCloud实战-Zuul网关服务
为什么需要网关呢? 我们知道我们要进入一个服务本身,很明显我们没有特别好的办法,直接输入IP地址+端口号,我们知道这样的做法很糟糕的,这样的做法大有问题,首先暴露了我们实体机器的IP地址,别人一看你的 ...
- springcloud学习之路: (三) springcloud集成Zuul网关
网关就是做一下过滤或拦截操作 让我们的服务更加安全 用户访问我们服务的时候就要先通过网关 然后再由网关转发到我们的微服务 1. 新建一个网关服务Module 2. 依然选择springboot工程 3 ...
- SpringCloud Zuul网关的简单理解
Zuul网关功能 请求路由.服务路由.请求过滤 请求路由 参数配置如下所示,所有能够配置path规则的请求,都会被zuul网关转发到对应的url上. zuul.routes.user-service. ...
- springcloud使用Zuul构建微服务网关入门
为什么要使用微服务网关 不同的微服务一般会经过不同的网络地址,而外部客户端可能需要调用多个服务的接口才能完成一个业务需求. 如果让客户端直接与各个微服务通信,会有以下的问题: 客户端会多次请求不同的微 ...
- Spring-Cloud之Zuul路由网关-6
一.为什么需要Zuul? Zuul 作为微服务系统的网关组件,用于构建边界服务( Edge Service ),致力于动态路由.过滤.监控.弹性伸缩和安全.Zuul 作为路由网关组件,在微服务架构中有 ...
- SpringCLoud之搭建Zuul网关集群
1.使用技术 Springboot,SpringCloud,Zuul,Nignx 2.目的 使用Zuul搭建微服务高可用的网关 3.项目创建 3.1 创建注册中心(略) 3.2 创建一个hello-s ...
- springcloud(七,多个服务消费者配置,以及zuul网关案例)
spring cloud (一.服务注册demo_eureka) spring cloud (二.服务注册安全demo_eureka) spring cloud (三.服务提供者demo_provid ...
随机推荐
- 转载:SVD
ComputeSVD 在分布式矩阵有CoordinateMatirx, RowMatrix, IndexedRowMatrix三种.除了CoordinateMatrix之外,Indexe ...
- mysql 通配符%以及_
%匹配任意长度 _ 匹配单个字符 mysql> select * from table1; +----------+------------+-----+-------------------- ...
- TypeScript规则整理
介绍我在初学 TS 开发项目中遇到的一些问题,希望对你有所帮助~ 因为我们的JavaScript是弱类型语言,如果项目过大,或者团队人数很多,不仅代码风格不统一,以后还会很难维护 Ty ...
- Android中如何引入已经存在的标题栏
在写程序中很多时候很多页面的标题布局大致都是一样的,这时候不需要挨着都写一遍,只需要写一个xml文件,在所需要的时候进行引用就可以了 只需要这一行代码: <include layout=&quo ...
- 因在缓存对象中增加字段,而导致Redis中取出缓存转化成Java对象时出现反序列化失败的问题
背景描述 因为业务需求的需要,我们需要在原来项目中的一个DTO类中新增两个字段(我们项目使用的是dubbo架构,这个DTO在A项目/服务的domain包中,会被其他的项目如B.C.D引用到).但是这个 ...
- js注册表单中实现地区选择效果
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- hdoj - 1248 寒冰王座
Problem Description 不死族的巫妖王发工资拉,死亡骑士拿到一张N元的钞票(记住,只有一张钞票),为了防止自己在战斗中频繁的死掉,他决定给自己买一些道具,于是他来到了地精商店前.死亡骑 ...
- 刷题记录:[FBCTF2019]Products Manager
目录 刷题记录:[FBCTF2019]Products Manager 一.知识点 1.基于约束的SQL注入攻击 刷题记录:[FBCTF2019]Products Manager 题目复现链接:htt ...
- Dependency Parsing
句子的依赖结构表现在哪些单词依赖哪些单词.单词之间的这种关系及可以表示为优先级之间的关系等. Dependency Parsing 通常情况下,对于一个输入句子:\(S=w_{0} w_{1} \do ...
- Mybatis源码研究7:缓存的设计和实现
Mybatis源码研究7:缓存的设计和实现 2014年11月19日 21:02:14 酷酷的糖先森 阅读数:1020 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog ...