Zuul:Zuul 是在云平台上提供动态路由,监控,弹性,安全等边缘服务的框架。Zuul 相当于是设备和 Netflix 流应用的 Web 网站后端所有请求的前门。

在微服务盛行的时代,客户端与系统之间的交互基本上如下图:

客户端想要请求到服务,首先请求到zuul网关,然后zuul网管将请求分发到对应的服务去。

新建一个springcloud_zuul(8766),pom文件加入zuul依赖,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 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.dalaoyang</groupId><artifactId>springcloud_zuul</artifactId><version>0.0.1-SNAPSHOT</version><packaging>jar</packaging><name>springcloud_zuul</name><description>springcloud_zuul</description><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>1.5.9.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><java.version>1.8</java.version><spring-cloud.version>Edgware.SR1</spring-cloud.version></properties><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-eureka</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-zuul</artifactId></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

然后在启动类上添加@EnableZuulProxy启动zuul,完整代码如下:

package com.dalaoyang;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;@SpringBootApplication
@EnableZuulProxy
public class SpringcloudZuulApplication {public static void main(String[] args) {SpringApplication.run(SpringcloudZuulApplication.class, args);}}

在配置文件加入如下配置:

##端口号
server.port=8766##服务名称
spring.application.name=service-zuul##注册中心地址
eureka.client.service-url.defaultZone=http://eureka.dalaoyang.cn/eureka/##zuul路由转发 service-a转发到service_ribbon
zuul.routes.service-a.path=/service-a/**zuul.routes.service-a.service-id=service_ribbon##zuul路由转发 service-b转发到service
zuul.routes.service-b.path=/service-b/**zuul.routes.service-b.service-id=service

然后分别启动之前service(8762),service_ribbon(8764)和springcloud_zuul(8766)。

先看一下http://eureka.dalaoyang.cn,如下:

然后在浏览器上分别访问http://localhost:8766/service-a,如下

http://localhost:8766/service-b,如下

zuul网关的简单配置到这里基本上完成了。

然后介绍一个zuul的过滤器,新建一个过滤器的类RequestLogFilter,这个类需要继承ZuulFilter,需要实现几个方法。

filterType:这个方法返回过滤器的类型,pre(路由前执行),route(路由中执行),post(路由后执行),error(发生错误后执行)

filterOrder:返回一个int来指定过滤器的执行顺序

shouldFilter:返回boolean值来决定过滤器是否执行,true执行,false不执行。

run:过滤器要执行的操作。

本项目中过滤器代码如下:

package com.dalaoyang.filter;import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import javax.servlet.http.HttpServletRequest;/*** @author dalaoyang* @Description* @project springcloud_learn* @package com.dalaoyang.filter* @email yangyang@dalaoyang.cn* @date 2018/4/22*/
public class RequestLogFilter extends ZuulFilter {Logger logger = LoggerFactory.getLogger(RequestLogFilter.class);@Overridepublic String filterType() {return "pre";}@Overridepublic boolean shouldFilter() {return true;}@Overridepublic int filterOrder() {return 0;}@Overridepublic Object run() {RequestContext requestContext = RequestContext.getCurrentContext();HttpServletRequest httpServletRequest = requestContext.getRequest();logger.info("请求路径:"+httpServletRequest.getRequestURL().toString());return null;}
}

修改一下启动类:

package com.dalaoyang;import com.dalaoyang.filter.RequestLogFilter;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
import org.springframework.context.annotation.Bean;@SpringBootApplication
@EnableZuulProxy
public class SpringcloudZuulApplication {public static void main(String[] args) {SpringApplication.run(SpringcloudZuulApplication.class, args);}@Beanpublic RequestLogFilter requestLogFilter(){return new RequestLogFilter();}
}

在重启项目,访问http://localhost:8766/service-a,然后看控制台可以看到如下图:

有时会出现这样的情况,比如本文的service实例down了,如下图这种情况

那么在访问,就会无法转发,其实zuul也提供了失败回调的方法。
新建一个ServiceFallback类实现ZuulFallbackProvider接口,需要重写2个方法。

其中getRoute方法中可以指定为哪个微服务回退,*为所有服务。

代码如下:

package com.dalaoyang.fallback;import org.springframework.cloud.netflix.zuul.filters.route.ZuulFallbackProvider;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.client.ClientHttpResponse;
import org.springframework.stereotype.Component;import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.Charset;/*** @author dalaoyang* @Description* @project springcloud_learn* @package com.dalaoyang.fallback* @email yangyang@dalaoyang.cn* @date 2018/4/22*/
@Component
public class ServiceFallback implements ZuulFallbackProvider {@Overridepublic String getRoute() {return "*";}@Overridepublic ClientHttpResponse fallbackResponse() {return new ClientHttpResponse() {@Overridepublic HttpStatus getStatusCode() throws IOException {return HttpStatus.OK;}@Overridepublic int getRawStatusCode() throws IOException {return this.getStatusCode().value();}@Overridepublic String getStatusText() throws IOException {return this.getStatusCode().getReasonPhrase();}@Overridepublic void close() {}@Overridepublic InputStream getBody() throws IOException {return new ByteArrayInputStream("当前访问服务不可用!".getBytes());}@Overridepublic HttpHeaders getHeaders() {HttpHeaders httpHeaders = new HttpHeaders();MediaType mediaType = new MediaType("application", "json",Charset.forName("UTF-8"));httpHeaders.setContentType(mediaType);return httpHeaders;}};}
}

重启项目,访问http://localhost:8766/service-a如下图所示:

源码下载 :大老杨码云

个人网站:https://www.dalaoyang.cn

路由网关---zuul相关推荐

  1. 第九章:路由网关(Zuul)的使用

    2019独角兽企业重金招聘Python工程师标准>>> 第九章:路由网关(Zuul)的使用 前言 介绍完分布式配置中心,结合前面的文章.我们已经有了一个微服务的框架了,可以对外提供a ...

  2. 史上最简单的SpringCloud教程 | 第五篇: 路由网关(zuul)

    转:https://blog.csdn.net/forezp/article/details/69939114 最新版本: 史上最简单的SpringCloud教程 | 第五篇: 路由网关(zuul)( ...

  3. springcloud 之 路由网关 zuul

    话不多说,先上图(图是丑陋了点,大家别介意哈),这幅图是我根据公司现有的业务设计出来的一个简单的基于springcloud微服务架构图. 在springcloud微服务体系中,我们一般不对外直接暴露服 ...

  4. 【微服务架构】SpringCloud之路由网关(zuul)

    什么是zuul zuul 是netflix开源的一个API Gateway 服务器, 本质上是一个web servlet应用. Zuul 在云平台上提供动态路由,监控,弹性,安全等边缘服务的框架.Zu ...

  5. 企业分布式微服务云SpringCloud SpringBoot mybatis (五)路由网关(zuul)

    在微服务架构中,需要几个基础的服务治理组件,包括服务注册与发现.服务消费.负载均衡.断路器.智能路由.配置管理等,由这几个基础组件相互协作,共同组建了一个简单的微服务系统.一个简答的微服务系统如下图: ...

  6. SpringCloud教程- 路由网关Zuul (SpringCloud版本Greenwich.SR4)

    文章目录 Zuul简介 创建zuul-gateway工程 服务过滤 代码地址:github-spring-cloud地址 Zuul简介 Zuul是NetFlix开源的微服务网关,它可以和Eureka. ...

  7. SpringCloud之路由网关zuul(五)

    2019独角兽企业重金招聘Python工程师标准>>> 在微服务架构中,需要几个基础的服务治理组件,包括服务注册与发现.服务消费.负载均衡.断路器.智能路由.配置管理等,由这几个基础 ...

  8. 【SpringCloud】第五篇: 路由网关(zuul)

    前言: 必需学会SpringBoot基础知识 简介: spring cloud 为开发人员提供了快速构建分布式系统的一些工具,包括配置管理.服务发现.断路器.路由.微代理.事件总线.全局锁.决策竞选. ...

  9. 第五篇:路由网关(zuul) zuul路由 服务过滤 (Finchley版本)V2.0_dev

    前言: 在微服务架构中,需要几个基础的服务治理组件,包括服务注册与发现.服务消费.负载均衡.断路器.智能路由.配置管理等,由这几个基础组件相互协作,共同组建了一个简单的微服务系统. 在Spring C ...

  10. 企业级 SpringCloud 教程 (五)路由网关(zuul)

    在微服务架构中,需要几个基础的服务治理组件,包括服务注册与发现.服务消费.负载均衡.断路器.智能路由.配置管理等,由这几个基础组件相互协作,共同组建了一个简单的微服务系统.一个简答的微服务系统如下图: ...

最新文章

  1. 第一百一十四节,JavaScript文档对象,DOM进阶
  2. spring中resource设计与实现
  3. 将matlab的.m文件打包为独立可执行程序.exe —— 基于Matlab R2015b
  4. 如何远程调试部署在CloudFoundry平台上的nodejs应用
  5. Js Date对象 简单操作
  6. 通过设置代理解决AndroidStudio无法下载gradle问题
  7. [周榜单]极乐小程序榜单(第十一期)
  8. 2021南航计算机专硕上岸经验贴
  9. java 命令行工具_分享java自带命令行工具jmap、jhat与jinfo的方法详解
  10. 开放式社区?太小儿科了,智慧城市才是重点
  11. 微信小程序 云开发 图片内容安全 珊瑚图片内容安全 api
  12. python实现高级计算器_高级计算器功能Tkinter GUI和variab
  13. 老男孩mysql运维dba实战21部完整版_老男孩MySQL DBA 运维课程全套,资源教程下载...
  14. Teradata使用笔记(2)--数据库操作
  15. Mybatis学习-动态SQL
  16. 我tcp可是铁齿金不换,诚实可靠小郎君——谈谈可靠数据传输服务
  17. hosts 域名配置
  18. 程序员犯的错误都这么屌吗?
  19. excel拖动滑动滚动条卡死问题解决办法
  20. 新产品设计和产品研发的流程有哪些?

热门文章

  1. 四舍五入 java_Java中四舍五入
  2. 多重背包问题——庆功会
  3. 项目进度经常延误,该怎么破?
  4. Zynq实现分布式Fir滤波器
  5. C语言练习题-循环练习题
  6. python3.x程序设计基础周元哲答案_周元哲
  7. android 摄像头检测工具,检摄app下载-检摄软件(检测摄像头)下载 v1.0.7安卓版_5577安卓网...
  8. 交换机半双工通信测试
  9. 杭州电子科技大学全国计算机排名,杭电排名为什么比211还高,杭州电子科技大学是211吗...
  10. MeterSphere一站式开源持续测试平台