Zuul 网关路由

路由是微服务架构中不可或缺的一部分,例如:/api/user映射到user服务,/api/shop映射到shop服务。 Zuul是一个基于JVM的路由和服务端的负载均衡器。Zuul的规则引擎是用JVM语言写的,支持Java和Groovy。

一、如何使用Zuul

首先我们引入zuul的jar包,由于zuul要从注册中心寻找服务,所以也要引入eureka-client的jar包。

<dependencies>
<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>
</dependencies>

  

并且在启动类上加上注解@EnableZuulProxy

@SpringBootApplication
@EnableZuulProxy
public class Application { public static void main(String[] args) {
SpringApplication.run(Application.class,args);
}
}

  

接下来,我们看看如何配置我们的路由,在yml中配置如下:

zuul:
routes:
service-order: /myorders/**

  

所有/myorders的请求都会转发到service-order服务,例如:/myorders/order/detail会转发到/order/detail。 zuul.routes是一个map,上面这种方式是简便的写法,key对应服务id,value对应访问路径。 为了获得细粒度的控制,配置应按照如下的方式写:

zuul:
routes:
service-order:
path: /myorders/**
serviceId: service-order

  

routes的key可以任意,只要保证唯一即可,routes的value中,path对应访问路径,serviceId对应服务id。

为了防止服务被自动的添加,我们增加如下配置:

zuul:
ignoredServices: '*'
routes:
service-order:
path: /myorders/**
serviceId: service-order

  

上面配置的意思是除了service-order服务,其他服务都忽略掉。

除了映射服务,我们也可以映射url,如下:

zuul:
ignoredServices: '*'
routes:
service-order:
path: /myorders/**
url: http://order.example.com/order_service

  

如果我们在转发时,不想忽略前缀,可以设置zuul.stripPrefix=false

我们启动之前的eureka注册中心、service-order-1、service-order-2和这次的zuul服务,我们访问 http://localhost:8080/myorders/order/detail,并不断刷新,返回结果如下:

{"id":123123,"totalPrice":87.98,"orderStatus":"未支付"}
{"id":123123,"totalPrice":87.98,"orderStatus":"已付款"}

  

说明zuul已经将请求转发到了service-order服务,并实现了负载均衡。

二、Cookie和敏感头部信息的转发

你可以在同一个系统的服务之间共享header信息,但不想将敏感的header信息转发到外部系统,你可以在routes中配置忽略的header信息。 Cookie是一个重要的角色,因为它是被认为敏感的。在做转发时,我们可以设置不转发。 其中,Cookie,Set-Cookie,Authorization是默认不转发的。如果后台服务需要,我们可以设置一个空的List

zuul:
ignoredServices: '*'
routes:
service-order:
path: /myorders/**
serviceId: service-order
sensitiveHeaders:

  

sensitiveHeaders放在zuul下,是通用的配置,对所有的转发都生效。也可以放在routes的每一个entry下,只对当前的转发规则有效。 我们改造一下service-order,将cookie打印出来。

@RequestMapping("detail")
public Order getOrderInfo(HttpServletRequest request, HttpServletResponse response){
System.out.println("cookie : "+request.getCookies());
if (request.getCookies()!=null&&request.getCookies().length>0){
for (Cookie cookie : request.getCookies()) {
System.out.println(cookie.getName()+":"+cookie.getValue());
}
} Cookie cookie = new Cookie("zuul","test");
response.addCookie(cookie);
return order;
}

  

重启两个service-order,访问zuul,后台打印结果如下:

cookie : [Ljavax.servlet.http.Cookie;@5ddaf631
zuul:test
UM_distinctid:1635c7498fc835-0e31e368c7058d-f373567-fa000-1635c7498fd31c
Hm_lvt_843ed5a4bd8ee47602fc045103b88cd7:1526264538
CNZZDATA1256538031:1367993951-1526263181-null%7C1526280080
Idea-12589d:10a72288-7f81-410b-9b97-b5fb28153a0d
JSESSIONID:6D27CF78C556DD7DFFD5422E71951BAA

  

说明cookie转发成功,我们将sensitiveHeaders注释掉,重启zuul服务并访问 后台结果如下:

cookie : null

  

说明cookie并没有转发。

项目示例:https://github.com/liubo-tech/spring-cloud-eureka

Zuul 网关路由的更多相关文章

  1. zuul网关路由作用

    为了方便客户端调用微服务,所以设计出了网关.在微服务实例地址发生改变的情况下,客户端调用服务要能够不受影响. 网关可以完成的功能:路由,反向代理,日志记录,权限控制,限流 在本例子中 Eureka  ...

  2. Spring Cloud(Dalston.SR5)--Zuul 网关-路由配置

    Spring Cloud 在 Zuul 的 routing 阶段实现了几个过滤器,这些过滤器决定如何进行路由工作. 简单路由(SimpleHostRoutingFilter) 该过滤器运行后,会将 H ...

  3. Spring Cloud之Zuul网关路由

    前端请求先通过nginx走到zuul网关服务,zuul负责路由转发.请求过滤等网关接入层的功能,默认和ribbon整合实现了负载均衡 比如说你有20个服务,暴露出去,你的调用方,如果要跟20个服务打交 ...

  4. SpringCloud2.0 Zuul 网关路由 基础教程(十)

    1.启动基础工程 1.1.启动[服务注册中心],工程名称:springcloud-eureka-server 参考 SpringCloud2.0 Eureka Server 服务中心 基础教程(二) ...

  5. Spring Cloud之搭建动态Zuul网关路由转发

    传统方式将路由规则配置在配置文件中,如果路由规则发生了改变,需要重启服务器.这时候我们结合上节课内容整合SpringCloud Config分布式配置中心,实现动态路由规则. 将yml的内容粘贴到码云 ...

  6. SpringCloud之Zuul网关原理及其配置

    Zuul是spring cloud中的微服务网关.网关: 是一个网络整体系统中的前置门户入口.请求首先通过网关,进行路径的路由,定位到具体的服务节点上. Zuul是一个微服务网关,首先是一个微服务.也 ...

  7. 非常全面的讲解SpringCloud中Zuul网关原理及其配置,看它就够了!

    Zuul是spring cloud中的微服务网关.网关:是一个网络整体系统中的前置门户入口.请求首先通过网关,进行路径的路由,定位到具体的服务节点上. Zuul是一个微服务网关,首先是一个微服务.也是 ...

  8. 微服务深入浅出(7)-- 网关路由Zuul

    Zuul用于构建边界服务,致力于动态路由,过滤,监控,弹性伸缩和安全等方向. 1.Zuul+Ribbon+Eureka结合,可以实现智能路由和负载均衡 2.网关将所有服务的API接口统一聚合统一暴露 ...

  9. Spring Cloud(十):服务网关 Zuul(路由)【Finchley 版】

    Spring Cloud(十):服务网关 Zuul(路由)[Finchley 版]  发表于 2018-04-23 |  更新于 2018-05-09 |  通过之前几篇 Spring Cloud 中 ...

随机推荐

  1. 集合(从本部分开始涉及API)

    集合(从本部分开始涉及API) 集合是指一个对象容纳了多个对象,这个集合对象主要用来管理维护一系列相似的对象. 数组就是一种对象.(练习:如何编写一个数组程序,并进行遍历.) java.util.*定 ...

  2. VS IISExpress REST DELETE 405 Method Not Allowed

    [参考].net IIS MVC Rest api 跨域 PUT DELETE 404 无法使用问题解决方案 今日在使用泛型處理常式處理檔案上傳時,使用了 HTTP 動詞的 PUT.DELETE 進行 ...

  3. 【QT】文件读写操作

    读取输出: QFile file("D:/Englishpath/QTprojects/1.dat"); if(!file.open(QIODevice::ReadOnly)) { ...

  4. Jquery EasyUI Combotree只能选择叶子节点且叶子节点有多选框

    Jquery EasyUI Combotree只能选择叶子节点且叶子节点有多选框 Jquery EasyUI Combotree单选框,Jquery EasyUI Combotree只能选择叶子节点 ...

  5. Git文件常见下标符号说明

    Git文件常见下标符号说明 git是一种分布式的版本控制工具.     不用联网也能实现版本控制,很实用. 它是一款现在比较流行的版本控制工具. git的文件上的图标,可以反映出当前文件或者文件夹的状 ...

  6. C# 求俩个正整数的最小公倍数和最大公约数

    C# 求俩个正整数的最小公倍数和最大公约数 1.公倍数.最小公倍数 两个或多个整数公有的倍数叫做它们的公倍数,其中除0以外最小的一个公倍数就叫做这几个整数的最小公倍数 翻开小学5年级下册PPT 1.1 ...

  7. python __setattr__、__getattr__、__getattribute__全面详解

    一.属性引用函数 hasattr(obj,name[,default])getattr(obj,name)setattr(obj,name,value)delattr(obj,name) 二.属性引用 ...

  8. 【python】——sql模拟

    一.作业需求: 当然此表你在文件存储时可以这样表示 1,Alex Li,22,13651054608,IT,2013-04-01 现需要对这个员工信息文件,实现增删改查操作 可进行模糊查询,语法至少支 ...

  9. java 查看线程死锁

    那我们怎么确定一定是死锁呢?有两种方法. 1>使用JDK给我们的的工具JConsole,可以通过打开cmd然后输入jconsole打开. 1)连接到需要查看的进程.

  10. SVN操作步骤

    1.第一次检出 svn co svn://192.168.1.1:5555/MMM 2.代码更新 svn update 3.代码提交 svn add *.c svn commit -m "d ...