SpringCloud极简入门|zuul智能路由回退、认证、转发功能demo 第五讲
开篇点题
在微服务架构中,需要几个基础的服务治理组件,包括服务注册与发现、服务消费、负载均衡、断路器、智能路由、配置管理等,由这几个基础组件相互协作,共同组建了一个简单的微服务系统。
本章将讲解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 第五讲相关推荐
- [转载]芋道 Soul 极简入门(国产微服务网关)
摘要: 原创出处 http://www.iocoder.cn/Soul/install/ 「芋道源码」欢迎转载,保留摘要,谢谢! 由于原著写作时间时间有点久了:有部分类容需要更新,后去个人会再发布文章 ...
- RL极简入门:从MDP、DP MC TC到Q函数、策略学习、PPO
前言 22年底/23年初ChatGPT大火,在写ChatGPT通俗笔记的过程中,发现ChatGPT背后技术涉及到了RL/RLHF,于是又深入研究RL,研究RL的过程中又发现里面的数学公式相比ML/DL ...
- APISIX 极简入门(国产微服务网关)
1. 概述 APISIX 是基于 OpenResty + etcd 实现的云原生.高性能.可扩展的微服务 API 网关.它是国人开源,目前已经进入 Apache 进行孵化,牛逼!!! OpenRest ...
- 【2022·深度强化学习课程】深度强化学习极简入门与Pytorch实战
课程名称:深度强化学习极简入门与Pytorch实战 课程内容:强化学习基础理论,Python和深度学习编程基础.深度强化学习理论与编程实战 课程地址:https://edu.csdn.net/cour ...
- tensorflow平台极简方式_TensorFlow极简入门教程
原标题:TensorFlow极简入门教程 随着 TensorFlow 在研究及产品中的应用日益广泛,很多开发者及研究者都希望能深入学习这一深度学习框架.本文介绍了TensorFlow 基础,包括静态计 ...
- Zuul:智能路由和过滤(译)
2019独角兽企业重金招聘Python工程师标准>>> Zuul:智能路由和过滤(译) 博客分类: spring 微服务 Router and Filter: Zuul 路由是微服务 ...
- Docker极简入门
原 Docker极简入门 2018年05月22日 20:25:12 阅读数:44 一.Docker概述 Docker通过一个包括应用程序运行时所需的一切的可执行镜像启动容器,包括配置有代码.运行时.库 ...
- .Net Core in Docker极简入门(下篇)
点击上方蓝字"小黑在哪里"关注我吧 Docker-Compose 代码修改 yml file up & down 镜像仓库 前言 上一篇[.Net Core in Dock ...
- Nginx 极简入门教程
Nginx 极简入门教程 基本介绍 Nginx 是一个高性能的 HTTP 和反向代理 web 服务器,同时也提供了 IMAP/POP3/SMTP服务. Nginx 是由伊戈尔·赛索耶夫为俄罗斯访问量第 ...
最新文章
- 二叉树的前序,中序,后序的递归、迭代实现
- 如果有人问你新冠肺炎是什么?请这样告诉他
- Tomcat问题 无法启动
- pytorch 多进程队列
- 解析 this.initialize.apply(this, arguments)
- Hadoop Hive sql语法详解
- cx+oracle+sql含中文,sql 判断字段值是是否包含中文字符
- 移动社交如何玩?网易云信携手崽崽和Uki打造更多新场景!
- 牛津英语3a_空中课堂 | 牛津英语学霸笔记3A M3U2
- css居中的几种方法_CSS几种常用的水平垂直居中对齐方法
- 提高linux运行速度,提高Linux操作系统的运行速度
- informix使用得一些小常识
- matlab 课程设计心得与总结,(最新整理)课程设计心得体会
- 博客-需求说明答辩总结
- ios 常用的第三方库
- 生物化学 药物设计与研发笔记:变构(Allostery)药物设计
- android 高德地图动画,Android 高德地图上自定义动画
- 微信小程序开发一个小型商城(八、个人页面)
- 女人一生必看的15部电影
- qnx linux usb驱动,QNX USB device与host模式下驱动脚本详解