spring clude ---服务网关组件Netflix Zuul
介绍:服务网关是微服务架构中一个不可或缺的部分。通过服务网关统一向外系统提供REST API的过程中,除了具备服务路由、均衡负载功能之外,它还具备了权限控制等功能。
Zuul是Netflix开源的微服务网关,他可以和Eureka,Ribbon,Hystrix等组件配合使用。Zuul组件的核心是一系列的过滤器,这些过滤器可以完成以下功能:
#身份认证和安全: 识别每一个资源的验证要求,并拒绝那些不符的请求
#审查与监控:
#动态路由:动态将请求路由到不同后端集群
#压力测试:逐渐增加指向集群的流量,以了解性能
#负载分配:为每一种负载类型分配对应容量,并弃用超出限定值的请求
#静态响应处理:边缘位置进行响应,避免转发到内部集群
搭建一个Zuul服务网关
1.新建模块ZuulGateWay,增加所需依赖包
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
注意,eureka-client导包,是:spring-cloud-starter-netflix-eureka-client
不是:spring-cloud-netflix-eureka-client
2.在程序启动类增加注解@EnableZuulProxy开启Zuul
@SpringCloudApplication注解,通过源码我们看到,它整合了@SpringBootApplication、@EnableDiscoveryClient、@EnableCircuitBreaker,主要目的还是简化配置。
package com.offcn;import com.offcn.filter.AccessFilter;
import org.springframework.boot.SpringApplication;
import org.springframework.cloud.client.SpringCloudApplication;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
import org.springframework.context.annotation.Bean;@SpringCloudApplication //组合注解
@EnableZuulProxy
public class ZuulGatwayStarter {public static void main(String[] args) {SpringApplication.run(ZuulGatwayStarter.class,args);}//初始化过滤器为bean@Beanpublic AccessFilter createAccessFilter(){return new AccessFilter();}
}
3.修改application.yml属性配置文件
spring:application:name: ZUULGATEWAY
server:port: 80
完成上面的工作后,Zuul已经可以运行了,但是如何让它为我们的微服务集群服务,还需要我们另行配置,下面详细的介绍一些常用配置内容。
Zuul服务网关路由配置
方式一:通过url直接映射
1.修改项目ZuulGateWay的属性配置文件application.yml
zuul:routes:userprovider001:path: /userprovider001/**url: http://localhost:9003/userprovider002:path: /userprovider002/**url: http://localhost:9004/
该配置,定义了,所有到Zuul中的规则为:/userprovider001/**的访问都映射到http://localhost:9003/上,也就是说当我们访问http://localhost/userprovider001/的时候,Zuul会将该请求路由到:http://localhost:9003/上
注意:配置属性zuul.routes.userprovider001.path中的userprovider001部分为路由的名字,可以任意定义,但是一组映射关系的path和url要相同
2测试url直接映射方式
(测试该服务的某个接口功能)
http://localhost/userprovider001/user/getAll
方式二:通过在Eureka服务注册的serviceId进行映射
通过url映射的方式对于Zuul来说,并不是特别友好,Zuul需要知道我们所有微服务的地址,才能完成所有的映射配置。而实际上,我们在实现微服务架构时,服务名与服务实例地址的关系在eureka server中已经存在了,所以只需要将Zuul注册到eureka server上去发现其他服务,我们就可以实现对serviceId的映射。
1.修改服务网关ZuulGateWay的属性配置文件application.yml
eureka:client:service-url:defaultZone: http://localhost:10086/eureka,http://localhost:10087/eureka
zuul:routes:userprovider:path: /service/** #自定义访问规则service-id: USERPROVIDER #注册的提供服务名,就不需要再配置服务地址了
2.测试ServiceId映射方式
http://localhost/service/user/getAll
3.修改客户端调用Zuul网关地址
使用Fegin方式实现接口的
1.修改注解FeignClient
@FeignClient(value = “ZUULGATEWAY”,configuration = feignConfig.class,fallback = UserServiceImpl.class)
2.调用方法按照Zuul定义的规则修改即可
例:
@GetMapping("/service/user/getAll")
public List getAll(…);
Zuul服务网关过滤器使用
在服务网关中定义过滤器只需要继承ZuulFilter抽象类实现其定义的四个抽象函数就可对请求进行拦截与过滤。
比如下面的例子,定义了一个Zuul过滤器,实现了在请求被路由之前检查请求中是否有accessToken参数,若有就进行路由,若没有就拒绝访问,返回401 Unauthorized错误。
1.编写Zuul过滤器(在模块ZuulGateWay下)
package com.offcn.filter;import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;import javax.servlet.http.HttpServletRequest;public class AccessFilter extends ZuulFilter {//设置过滤器的类型,决定了过滤器的执行时间@Overridepublic String filterType() {//常见过滤器类型pre 路由请求转发之前执行 routing 在路由转发同时执行 post 在routing和error过滤器之后被调用 error:处理请求时发生错误时被调用return "pre";}@Overridepublic int filterOrder() {return 0; //过滤器的执行顺序,数字越小越先执行}//开关@Overridepublic boolean shouldFilter() {return true; //true 表示丐萝氯气处于可运行状态 false表示该过滤器不可用}//该过滤器做身份验证@Overridepublic Object run() throws ZuulException {//获取到当前请求上下文环境RequestContext context = RequestContext.getCurrentContext();//从上下文环境获取当前请求对象HttpServletRequest request = context.getRequest();//从请求对象获取传递的凭证String token = request.getParameter("token");//判断凭证是否存在if(token==null){//凭证不存在,禁止路由转发context.setSendZuulResponse(false);//提示错误状态码 401 权限不足的意思context.setResponseStatusCode(401);}return null;}
}
2.实例化该过滤器
我们只需要在启动类中增加如下内容:
@Beanpublic AccessFilter accessFilter() {return new AccessFilter();}
3.测试过滤器
http://localhost/service/user/getAll
发现:
因为没有传token的值,所以被过滤器拦截了
我们再测试:
http://localhost/service/user/getAll?token=token
可以发现能正常访问该接口了
spring clude ---服务网关组件Netflix Zuul相关推荐
- 服务网关配置:Zuul
目录 第一章 Zuul介绍 1.1.什么是Zuul 1.2.为啥用Zuul 第二章 Zuul路由功能 2.1.项目准备与启动 2.2.工程搭建与测试 2.3.配置自定义路由 2.4.禁止默认的路由 2 ...
- SPRING CLOUD服务网关之ZUUL
服务网关是微服务架构中一个不可或缺的部分.通过服务网关统一向外系统提供REST API的过程中,除了具备服务路由.均衡负载功能之外,它还具备了权限控制等功能.Spring Cloud Netflix中 ...
- Spring Cloud服务网关 Zuul
服务网关是在微服务前边设置一道屏障,请求先到服务网关,网关会对请求进行过滤.校验.路由等处理.有了服务网关可以提高微服务的安全性,校验不通过的请求将被拒绝访问. Spring Cloud Zuul是整 ...
- Spring Cloud服务网关(Zuul)的配置项sensitiveHeaders
如果我们在一个服务中添加了Cookie,如下图所示: public static void set(HttpServletResponse response,String name,String va ...
- spring cloud服务发现组件Eureka详解
Eureka是Netflix开发的服务发现组件,本身是一个基于REST的服务.Spring Cloud将它集成在其子项目spring-cloud-netflix中,以实现Spring Cloud的服务 ...
- 微服务网关总结之 —— zuul
前言 随着微服务的盛行和广泛的使用,选择一套完整的微服务架构解决方案是作为技术选型的前置条件,不管是基于dubbo的或是spring-cloud,还是基于alibaba的升级版cloud的微服务,应用 ...
- 【SpringCloud】服务网关 gateway 和 zuul
文章目录 1.概述 2.特性 3.区别 3. zuul1 模型 4. Spring Cloud Gateway 5. 3大核心概念 6.案例 6.1 案例1 6.1.1 maven 6.1.2 主类 ...
- 微服务实战|微服务网关Zuul入门与实战
网关的作用 微服务架构中,服务实例的地址可能经常会发生变化,所以我们不能直接将服务的地址暴露出来.如果每一个微服务都直接暴露接口,会导致一系列的问题,比如调用过于复杂,涉及到账户.权限不能统一处理等. ...
- 《深入理解 Spring Cloud 与微服务构建》第十一章 服务网关
<深入理解 Spring Cloud 与微服务构建>第十一章 服务网关 文章目录 <深入理解 Spring Cloud 与微服务构建>第十一章 服务网关 一.服务网关简介 二. ...
最新文章
- TVM设计与构架构建
- 用Python解“龟兔赛跑”题
- Python3字符串的编码
- WIN10 vnc 与Jeson ubuntu18.04 vncserver 远程控制的实现(亲测有效)
- Jexus针对Asp.net core应用程序的六大不可替代的优势
- MySQL checkpoint机制详解
- 使用 pyinstaller 打包 py 文件成 exe 程序
- 面向对象【day07】:新式类和经典类(八)
- Android仿苹果版QQ下拉刷新实现(二) ——贝塞尔曲线开发鼻涕下拉粘连效果
- java代码求IP和mac地址
- android开发mvp,Android开发模式之MVP
- 一种全新易用的基于Word-Word关系的NER统一模型,刷新了14种数据集并达到新SoTA...
- 【Sencha Toucha】Sencha Touch ExtJs 给 Button 添加图片
- java jconsole 远程连接_jconsole连接远程tomcat
- python断言语句_Python断言assert的用法代码解析
- 低盈利、高现金流:紫光财报背后的半导体另类求生之路
- 【面试题记录】2020前端秋招笔试面试题目记录
- 直播带货行业如何入局?先了解一下直播商城源码吧
- 广域网接口规范(v.35)
- Python挑战游戏( PythonChallenge)闯关之路Level- 1