Zuul 网关路由
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 网关路由的更多相关文章
- zuul网关路由作用
为了方便客户端调用微服务,所以设计出了网关.在微服务实例地址发生改变的情况下,客户端调用服务要能够不受影响. 网关可以完成的功能:路由,反向代理,日志记录,权限控制,限流 在本例子中 Eureka ...
- Spring Cloud(Dalston.SR5)--Zuul 网关-路由配置
Spring Cloud 在 Zuul 的 routing 阶段实现了几个过滤器,这些过滤器决定如何进行路由工作. 简单路由(SimpleHostRoutingFilter) 该过滤器运行后,会将 H ...
- Spring Cloud之Zuul网关路由
前端请求先通过nginx走到zuul网关服务,zuul负责路由转发.请求过滤等网关接入层的功能,默认和ribbon整合实现了负载均衡 比如说你有20个服务,暴露出去,你的调用方,如果要跟20个服务打交 ...
- SpringCloud2.0 Zuul 网关路由 基础教程(十)
1.启动基础工程 1.1.启动[服务注册中心],工程名称:springcloud-eureka-server 参考 SpringCloud2.0 Eureka Server 服务中心 基础教程(二) ...
- Spring Cloud之搭建动态Zuul网关路由转发
传统方式将路由规则配置在配置文件中,如果路由规则发生了改变,需要重启服务器.这时候我们结合上节课内容整合SpringCloud Config分布式配置中心,实现动态路由规则. 将yml的内容粘贴到码云 ...
- SpringCloud之Zuul网关原理及其配置
Zuul是spring cloud中的微服务网关.网关: 是一个网络整体系统中的前置门户入口.请求首先通过网关,进行路径的路由,定位到具体的服务节点上. Zuul是一个微服务网关,首先是一个微服务.也 ...
- 非常全面的讲解SpringCloud中Zuul网关原理及其配置,看它就够了!
Zuul是spring cloud中的微服务网关.网关:是一个网络整体系统中的前置门户入口.请求首先通过网关,进行路径的路由,定位到具体的服务节点上. Zuul是一个微服务网关,首先是一个微服务.也是 ...
- 微服务深入浅出(7)-- 网关路由Zuul
Zuul用于构建边界服务,致力于动态路由,过滤,监控,弹性伸缩和安全等方向. 1.Zuul+Ribbon+Eureka结合,可以实现智能路由和负载均衡 2.网关将所有服务的API接口统一聚合统一暴露 ...
- Spring Cloud(十):服务网关 Zuul(路由)【Finchley 版】
Spring Cloud(十):服务网关 Zuul(路由)[Finchley 版] 发表于 2018-04-23 | 更新于 2018-05-09 | 通过之前几篇 Spring Cloud 中 ...
随机推荐
- springboot 工程启动报错之Consider defining a bean of type ‘XXX’ in your configuration.
一.前言: 使用springboot自动注入的方式搭建好了工程,结果启动的时候报错了!!!,错误如下图: Description: Field userEntityMapper in com.xxx. ...
- jmeter3.0下载及安装
http://blog.csdn.net/shizhiailian/article/details/52443169 下载: https://archive.apache.org/dist/jmete ...
- nw.js---开发一个百度浏览器
使用nw.js开发一个简单的百度浏览器就很简单了,只需要在配置里面写入: { // "main": "index.html", "main" ...
- react useRef()函数
"ref"对象是一个通用容器,其current属性是可变的 保存dom function Test() { const t = useRef(null); useEffect(() ...
- Educational Codeforces Round 1
598A - Tricky Sum 20171103$$ans=\frac{n(n+1)}{2} - 2\sum_{k=0}^{\left \lfloor \log_2 n \right \rf ...
- 每个JavaScript程序员都需要知道的5个数组方法
Array.forEach() .forEach() 方法能够方便的让你 遍历数组里的每个元素,你可以在回调函数里对每个元素进行操作..forEach()方法没有返回值,你不需要在回调函数里写retu ...
- 请大神留言:使用static方法和从Spring IOC 容器里面取出的方法有什么区别????
类的静态方法,不用new出对象,因为它在类的初始化阶段加载到jvm内存的. 而spring容器,是在启动服务的时候,new出容器所管理的对象. 本质区别就是一个在堆中产生了对象,一个没产生对象只在方法 ...
- 新版Ubuntu安装日文输入法
在Ubuntu的设置中安装日文输入法 本周在调试书上代码时需要安装日文输入法,我发现在百度上并没有在最新版Ubuntu下安装日文输入法的教程,于是我写了这篇博客来与大家分享一下我的安装过程. a.如图 ...
- css学习_css文字阴影、盒子阴影
文字阴影和盒子阴影的用法: 多阴影
- 解决url传中文参数问题
项目中要做一个表格导出功能,用的是location.url传值给后台导出表格数据.由于传中文会出现乱码现象.故需要给参数转码,具体如下: 对于url要传的中文参数进行两次编码(注意是两次),即enco ...