开篇点题

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

本章将讲解zuul(路由)这个组件,希望大家可以有个简单的入门。

Zuul简介

Zuul的主要功能是路由转发和过滤器。路由功能是微服务的一部分,比如/api/user转发到到user服务,/api/shop转发到到shop服务。zuul默认和Ribbon结合实现了负载均衡的功能。

zuul有以下功能:

Authentication
Insights
Stress Testing
Canary Testing
Dynamic Routing
Service Migration
Load Shedding
Security
Static Response handling
Active/Active traffic management

本章要点

1.学会配置zuul和eureka集成

2.zuul常用配置介绍

3.zuul调用方式介绍

...评论区内所有解答(有问必有答)

好了我们先开始个简单的入门

(今天2019.1.6 晚上10:40简单记录下)

Demo开始

本章节所有代码以springcloud-02-getway-zuul模块进行讲解(文末共享代码)

模块构建:

构建两个生产者、注册中心、路由

spring-cloud-producter1-002(生产者1)
spring-cloud-producter2-002(生产者2)

spring-cloud-eureka-002(注册中心)

spring-cloud-zuul-002(智能路由,本章讲解内容)

操作流程启动 注册中心(自然第一个先启动)、之后再启动两个生产者

验证是否启动成功,怎么验证?好了,别闹,访问注册中心不就可以了吗

通过下图我们可以看到生产者已经注册进来了,可以看到相应的启动端口

至于生产者和注册中心的代码在前面已讲解,本篇不再重复。

路由zuul构建

pom引入

       <dependency><groupId>org.springframework.retry</groupId><artifactId>spring-retry</artifactId></dependency><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>

启动类 加注解@EnableZuulProxy

@Bean注入了token认证的一个bean(演示其他功能使用)

@SpringBootApplication
@EnableZuulProxy
public class SpringCloudZuul002Application {public static void main(String[] args) {SpringApplication.run(SpringCloudZuul002Application.class, args);System.out.println("/***************success  zuul 6001 启动成功******************/");}@Beanpublic TokenFilter tokenFilter() {return new TokenFilter();}}

配置文件:

spring:application:name: spring-cloud-zuul-002
server:port: 6001
eureka:client:service-url:defaultZone: http://localhost:7001/eurekazuul:retryable: falseroutes:producer:path: /api1/**serviceId: spring-cloud-producter1-002baidu:path: /bd/**url: http://www.baidu.com

filter:token拦截

public class TokenFilter  extends ZuulFilter{private Logger logger= LoggerFactory.getLogger(TokenFilter.class);@Overridepublic String filterType() {return "pre"; // 可以在请求被路由之前调用}@Overridepublic int filterOrder() {// filter执行顺序,通过数字指定 ,优先级为0,数字越大,优先级越低return 0;}@Overridepublic boolean shouldFilter() {// 是否执行该过滤器,此处为true,说明需要过滤return true;}@Overridepublic Object run() throws ZuulException {RequestContext ctx = RequestContext.getCurrentContext();HttpServletRequest request = ctx.getRequest();logger.info("--->>> TokenFilter {},{}", request.getMethod(), request.getRequestURL().toString());String token = request.getParameter("token");// 获取请求的参数if (StringUtils.isNotBlank(token)) {ctx.setSendZuulResponse(true); //对请求进行路由ctx.setResponseStatusCode(200);ctx.set("isSuccess", true);return null;} else {ctx.setSendZuulResponse(false); //不对其进行路由ctx.setResponseStatusCode(400);ctx.setResponseBody("token is empty");ctx.set("isSuccess", false);return null;}}
}
FallbackProvider
@Component
public class ProviderFallBack   implements FallbackProvider{private Logger logger= LoggerFactory.getLogger(ProviderFallBack.class);//指定要处理的 service。@Overridepublic String getRoute() {
//        api服务id,如果需要所有调用都支持回退,则return "*"或return nullreturn "spring-cloud-producter2-002";}/*** 如果请求用户服务失败,返回什么信息给消费者客户端*/@Overridepublic ClientHttpResponse fallbackResponse(String route, Throwable cause) {return new ClientHttpResponse() {/*** 网关向api服务请求是失败了,但是消费者客户端向网关发起的请求是OK的,* 不应该把api的404,500等问题抛给客户端* 网关和api服务集群对于客户端来说是黑盒子*/@Overridepublic HttpStatus getStatusCode() throws IOException {return HttpStatus.OK;}@Overridepublic int getRawStatusCode() throws IOException {return 200;}@Overridepublic String getStatusText() throws IOException {return "ok";}@Overridepublic void close() {}@Overridepublic InputStream getBody() throws IOException {logger.info("/***********获取getBody  *******************/");Map r = new HashMap();r.put("state", "9999");r.put("msg", "系统错误,请求失败");//返回异常信息return new ByteArrayInputStream("The service is unavailable.".getBytes("UTF-8"));}@Overridepublic HttpHeaders getHeaders() {HttpHeaders headers = new HttpHeaders();//和body中的内容编码一致,否则容易乱码
//                headers.setContentType(MediaType.APPLICATION_JSON);headers.setContentType(MediaType.APPLICATION_JSON_UTF8);return headers;}};}}

内容比较多我们现在开始测试讲解

测试过程

启动zuul服务后,我们同样访问注册中心页面,发现已注册成功。

1. token认证实现

在我们构建接口的时候往往会有认证,此时怎么实现呢?

结合 filter:token拦截 代码(需要注册成组件,在启动类或者加注解可以)

我们可以看到程序对参数进行了token参数值的一个获取,很简单,验证是否为空即可(一般放在header里进行传递,有不明白的可以留言)

要是没有token会怎样呢?服务进行拦截,不再进行转发到生产者

无token访问

有token访问 

2.测试一中spring-cloud-producter1-002?这个是啥

解答:zuul路由注册到注册中心后通过服务的名称是可以直接调用生产者的,也就是spring-cloud-producter1-002是生产者1的名称

3.换种访问方式,猜猜api1是什么?

我们可以看到测试1中返回的结果是一样的,自然api1就代表着生产者1的服务

在zuul的配置文件中指定即可

访问百度的时候  localhost:6001/bd?token=1  也是可以跳转的。

4.重点

一、zuul:开启重试机制

pom引入

<dependency><groupId>org.springframework.retry</groupId><artifactId>spring-retry</artifactId>
</dependency>

配置文件可以配置如下重试策略(结合文档看)

二、api服务网关zuul回退fallback hystrix有fallback回退能力,及如果服务调用出现了异常,则执行指定的fallback方法。

zuul对api服务集群进行了反向代理,集成了hystrix,那zuul也能fallback了。

我们访问生产者2

为什么或这样,可以看到信息是在ProviderFallBack类定义的,说明生产者2没有调通,所有zuul回退返回了上面信息

生产者2controller如下:sleep很长时间,所以zuul调用超时,触发回退机制

End:

zuul的讲解就结束了,比较简单,但是很重要!很重要!智能路由在服务中发挥着直观重要的作用

我们现在zuul换成了spring cloud gateway,正在不断地开发新的功能,关于gateway的相关知识我们会用很多篇介绍也是整个微服务课程的重点(主要着做智能路由这块业务),有机会会开源相关插件,供大家参考

回到原点,即使springcloud不打算集成zuul2.x,但是简单了解下,面试或者工作还是有好处的,你说对吧?

编程之路期待你的参与 ,欢迎小伙伴加入 @架构师速成记

下载:https://github.com/shinians/springcloud-demos

SpringCloud极简入门|zuul智能路由回退、认证、转发功能demo 第五讲相关推荐

  1. [转载]芋道 Soul 极简入门(国产微服务网关)

    摘要: 原创出处 http://www.iocoder.cn/Soul/install/ 「芋道源码」欢迎转载,保留摘要,谢谢! 由于原著写作时间时间有点久了:有部分类容需要更新,后去个人会再发布文章 ...

  2. RL极简入门:从MDP、DP MC TC到Q函数、策略学习、PPO

    前言 22年底/23年初ChatGPT大火,在写ChatGPT通俗笔记的过程中,发现ChatGPT背后技术涉及到了RL/RLHF,于是又深入研究RL,研究RL的过程中又发现里面的数学公式相比ML/DL ...

  3. APISIX 极简入门(国产微服务网关)

    1. 概述 APISIX 是基于 OpenResty + etcd 实现的云原生.高性能.可扩展的微服务 API 网关.它是国人开源,目前已经进入 Apache 进行孵化,牛逼!!! OpenRest ...

  4. 【2022·深度强化学习课程】深度强化学习极简入门与Pytorch实战

    课程名称:深度强化学习极简入门与Pytorch实战 课程内容:强化学习基础理论,Python和深度学习编程基础.深度强化学习理论与编程实战 课程地址:https://edu.csdn.net/cour ...

  5. tensorflow平台极简方式_TensorFlow极简入门教程

    原标题:TensorFlow极简入门教程 随着 TensorFlow 在研究及产品中的应用日益广泛,很多开发者及研究者都希望能深入学习这一深度学习框架.本文介绍了TensorFlow 基础,包括静态计 ...

  6. Zuul:智能路由和过滤(译)

    2019独角兽企业重金招聘Python工程师标准>>> Zuul:智能路由和过滤(译) 博客分类: spring 微服务 Router and Filter: Zuul 路由是微服务 ...

  7. Docker极简入门

    原 Docker极简入门 2018年05月22日 20:25:12 阅读数:44 一.Docker概述 Docker通过一个包括应用程序运行时所需的一切的可执行镜像启动容器,包括配置有代码.运行时.库 ...

  8. .Net Core in Docker极简入门(下篇)

    点击上方蓝字"小黑在哪里"关注我吧 Docker-Compose 代码修改 yml file up & down 镜像仓库 前言 上一篇[.Net Core in Dock ...

  9. Nginx 极简入门教程

    Nginx 极简入门教程 基本介绍 Nginx 是一个高性能的 HTTP 和反向代理 web 服务器,同时也提供了 IMAP/POP3/SMTP服务. Nginx 是由伊戈尔·赛索耶夫为俄罗斯访问量第 ...

最新文章

  1. 二叉树的前序,中序,后序的递归、迭代实现
  2. 如果有人问你新冠肺炎是什么?请这样告诉他
  3. Tomcat问题 无法启动
  4. pytorch 多进程队列
  5. 解析 this.initialize.apply(this, arguments)
  6. Hadoop Hive sql语法详解
  7. cx+oracle+sql含中文,sql 判断字段值是是否包含中文字符
  8. 移动社交如何玩?网易云信携手崽崽和Uki打造更多新场景!
  9. 牛津英语3a_空中课堂 | 牛津英语学霸笔记3A M3U2
  10. css居中的几种方法_CSS几种常用的水平垂直居中对齐方法
  11. 提高linux运行速度,提高Linux操作系统的运行速度
  12. informix使用得一些小常识
  13. matlab 课程设计心得与总结,(最新整理)课程设计心得体会
  14. 博客-需求说明答辩总结
  15. ios 常用的第三方库
  16. 生物化学 药物设计与研发笔记:变构(Allostery)药物设计
  17. android 高德地图动画,Android 高德地图上自定义动画
  18. 微信小程序开发一个小型商城(八、个人页面)
  19. 女人一生必看的15部电影
  20. qnx linux usb驱动,QNX USB device与host模式下驱动脚本详解

热门文章

  1. CSS选择器优先级顺序是什么
  2. Python(10)文件操作(IO 技术)、OS模块、递归
  3. 一文看懂Bluetooth 5.1 AoA到达角度位置服务实现原理
  4. Linux内核中的向上取整
  5. Python-Mac 怎么下载Easygui
  6. AccessibilityService灰色地带
  7. Moviepy+OpenCV-python 结合进行音视频剪辑处理的一种建议模式
  8. 初识Blender并制作小模型
  9. 【无标题】酸性固化剂的危害
  10. Java 原码反码补码