Spring Cloud 服务网关Zuul
Spring Cloud 服务网关Zuul
服务网关是分布式架构中不可缺少的组成部分,是外部网络和内部服务之间的屏障,例如权限控制之类的逻辑应该在这里实现,而不是放在每个服务单元。
Spring Cloud Netflix 中的Zuul正是提供该功能的组件:
1. 提供路由功能,可屏蔽内部服务细节,并可提供负载均衡
2. 通过服务网关中的过滤器,在各阶段过滤请求和相应,提供对外的权限控制。
3. 实现了断路器,不会因为具体微服务的故障而导致服务网关的阻塞,依然可以对外服务。
下来通过简单的例子体验一下Zuul提供的功能:
1. 首先需要一个eureka单元注册服务,一个client单元提供服务,之前已创建
2.新建Spring Cloud项目,命名zuul
3.添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zuul</artifactId>
</dependency> <dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
4.增加主类
@EnableZuulProxy
@SpringCloudApplication
public class App
{
@Bean
public AccessFilter accessFilter() {
return new AccessFilter();
} public static void main( String[] args )
{
new SpringApplicationBuilder(App.class).web(true).run(args);
}
}
--- 添加EnableZuulProxy注解为开启Zuul网关代理
5.添加配置文件application.properties
server.port=8011
spring.application.name=zuul #自定义映射
#zuul.routes.api-a.path=/client/**
#zuul.routes.api-a.serviceId=client
zuul.routes.api-a.path=/bing/**
zuul.routes.api-a.serviceId=http://cn.bing.com/ #默认映射 无需配置
#http://zuulhost:zuulport/serviceId/** 请求会被转发到serviceId对应的服务,需要注册到eureka eureka.client.serviceUrl.defaultZone=http://localhost:8001/eureka/
---
6.增加过滤器类
public class AccessFilter extends ZuulFilter {
private static Logger log = LoggerFactory.getLogger(AccessFilter.class);
/**
pre:可以在请求被路由之前调用
routing:在路由请求时候被调用
post:在routing和error过滤器之后被调用
error:处理请求时发生错误时被调用
* @return
*/
@Override
public String filterType() {
return "pre";
}
//过滤器执行顺序
@Override
public int filterOrder() {
return 0;
}
//过滤器开关
@Override
public boolean shouldFilter() {
return true;
}
@Override
public Object run() {
RequestContext ctx = RequestContext.getCurrentContext();
HttpServletRequest request = ctx.getRequest();
Object accessToken = request.getParameter("token");
if(accessToken == null) {
log.warn("access token is empty");
ctx.setSendZuulResponse(false);
ctx.setResponseStatusCode(401);
ctx.setResponseBody(request.getMethod()+" "+request.getRequestURL().toString()+" no token");
return null;
}
log.info("access token ok");
return null;
}
}
---继承ZuulFilter类
7. 依次启动eureka 、client、 zuul ,访问测试
1. 访问 http://localhost:8001/ 查看服务是否已注册

2. 访问 http://localhost:8011/bing/token=1 查看是否跳转到bing主页
3. 访问 http://localhost:8011/bing 查看过滤器是否工作

4. 访问 http://localhost:8011/client/info?token=1 查看zuul默认映射规则是否生效
参考:http://projects.spring.io/spring-cloud/spring-cloud.html
end
Spring Cloud 服务网关Zuul的更多相关文章
- SPRING CLOUD服务网关之ZUUL
服务网关是微服务架构中一个不可或缺的部分.通过服务网关统一向外系统提供REST API的过程中,除了具备服务路由.均衡负载功能之外,它还具备了权限控制等功能.Spring Cloud Netflix中 ...
- spring cloud 路由网关zuul基本使用
在微服务架构中,需要几个关键的组件,服务注册与发现.服务消费.负载均衡.断路器.智能路由.配置管理等,由这几个组件可以组建一个简单的微服务架构.客户端的请求首先经过负载均衡(zuul.Ngnix),再 ...
- spring cloud 路由网关zuul的高可用
Zuul的高可用非常关键,因为外部请求到后端微服务的流量都会经过Zuul.故而在生产环境中,我们一般都需要部署高可用的Zuul以避免单点故障. 笔者分两种场景讨论Zuul的高可用. Zuul客户端也注 ...
- 跟我学SpringCloud | 第十七篇:服务网关Zuul基于Apollo动态路由
目录 SpringCloud系列教程 | 第十七篇:服务网关Zuul基于Apollo动态路由 Apollo概述 Apollo相比于Spring Cloud Config优势 工程实战 示例代码 Spr ...
- spring cloud 学习(6) - zuul 微服务网关
微服务架构体系中,通常一个业务系统会有很多的微服务,比如:OrderService.ProductService.UserService...,为了让调用更简单,一般会在这些服务前端再封装一层,类似下 ...
- Spring Cloud实战之初级入门(六)— 服务网关zuul
目录 1.环境介绍 2.api网关服务 2.1 创建工程 2.3 api网关中使用token机制 2.4 测试 2.5 小结 3.一点点重要的事情 1.环境介绍 好了,不知不觉中我们已经来到了最后一篇 ...
- Spring Cloud(十):服务网关 Zuul(路由)【Finchley 版】
Spring Cloud(十):服务网关 Zuul(路由)[Finchley 版] 发表于 2018-04-23 | 更新于 2018-05-09 | 通过之前几篇 Spring Cloud 中 ...
- Spring Cloud(十一):服务网关 Zuul(过滤器)【Finchley 版】
Spring Cloud(十一):服务网关 Zuul(过滤器)[Finchley 版] 发表于 2018-04-23 | 更新于 2018-05-07 | 在上篇文章中我们了解了 Spring ...
- 一起来学Spring Cloud | 第六章:服务网关 ( Zuul)
本章节,我们讲解springcloud重要组件:微服务网关Zuul.如果有同学从第一章看到本章的,会发现我们已经讲解了大部分微服务常用的基本组件. 已经讲解过的: 一起来学Spring Cloud | ...
随机推荐
- hdu 6113 度度熊的01世界(结构体的赋值问题)
题目大意: 输入n*m的字符串矩形,判断里面的图形是1还是0,还是什么都不是 注意:结构体中放赋值函数,结构体仍旧能定义的写法 #include <iostream> #include&l ...
- String.Remove
String.Remove方法注意事项: 1.该方法不改变元字符串: 2.str = ‘’: str.Remove(str.Length-3);明显超限,但是不报错,返回值为''; str = '1 ...
- SQL Plus常用命令
1.常用命令:显示当前用户名:show user登录到数据库:conn[etc] 用户名/密码@网络[as sysdba / as sysoper] 简单写法:conn 用户名/密码 con ...
- iOS使用Instruments的工具
使用Instruments的工具 iOSXcodeInstrumentsInstruments是一个官方提供的强大的性能调试工具集. 1.Blank(空模板):创建一个空的模板,可以从Library库 ...
- resizable可调整尺寸组件
Resizable 可调整尺寸不依赖于其他组件 1.用法:通过标记创建可调整尺寸(resizable)对象 <div class="easyui-resizable" sty ...
- shell getopts学习
#!/bin/bash while getopts i:vh name do case $name in i) opt=1 echo $OPTARG;; v) opt=2 echo 2;; h) op ...
- java语言基础-变量
一丶变量的基本概念 1.什么是变量 (1).内存中的一个存储区域 (2).该区域有自己的名称(变量名),和类型(数据类型) (3.)该区域的数据可以在同一类型范围内不断变化(定义变量的主要目的是因为数 ...
- egg.js源码解析之render()
作为阿里的开源node.js框架,我觉得egg.js是很有前途的,故而学之,github上down了一个项目下来(https://github.com/easy-team/egg-vue-webpac ...
- 深入理解Hystrix之文档翻译
转载请标明出处: http://blog.csdn.net/forezp/article/details/75333088 本文出自方志朋的博客 什么是Hystrix 在分布式系统中,服务与服务之间依 ...
- String.prototype.getParm
String.prototype.getParms=function(name){ var reg = new RegExp('(^|&)' + name + '=([^&]*)(&a ...