天翼网关 ddns设置_19,微服务网关之Zuul

这一次给大家分享微服务网关的相关知识,这个也是微服务架构中,相当重要的组件之一,来,下面听我徐徐道来

1,API网关概览

1.1,现有的交互模式存在什么问题?

目前,是客户端会直接跟多个微服务直接交互,这种模式存在什么问题?

1,客户端会请求多个不同的服务,需要维护不同的请求地址,增加开发难度

2,在某些场景下存在跨域请求的问题,也会降低访问的效率

3,加大身份认证的难度,每个微服务都需要独立认证

因此,我们需要一个微服务网关,介于客户端与服务器之间的中间层,所有的外部请求都会先经过微服务网关处理,之后再交给相关的业务服务进行处理。

客户端只需要与网关交互,只知道一个网关地址即可,这样简化了开发还有以下优点:

1,方便客户端调用

2,方便做统一身份认证

3,减少了客户端与各个微服务之间的交互次数

1.2,什么是微服务网关?

API网关是一个服务器,是系统对外的唯一入口。

API网关封装了系统内部架构,为每个客户端提供一个定制的API。

API网关方式的核心要点是,所有的客户端和消费端都通过统一的网关接入微服务,在网关层处理所有的非业务功能。

API网关提供REST/HTTP的访问API

1.3,网关的实现方案有哪些?

Zuul 
Netflix开源,功能丰富,使用JAVA开发,易于二次开发;需要运行在web容器中,如Tomcat。 
问题:缺乏管控,无法动态配置;依赖组件较多;处理Http请求依赖的是Web容器,性能不如 Nginx; 
​
Spring Cloud Gateway  
SpringCloud提供的网关服务
​
Nginx
如果只是需要一个基础的具备转发功能的网关,那么使用Ngnix是一个不错的选择。
​
比如:路由,过滤处理(nginx+lua)
location  /api-index { proxy_pass http://127.0.0.1:8081/; }
location  /api-product { proxy_pass http://127.0.0.1:8082/; }

2,Zuul

2.1,什么是Zuul

zuul是Netflix开源的微服务网关,它可以和Eureka、Ribbon、Hystrix等组件配合使用,Zuul组件的核心是一系列的过滤器,这些过滤器可以完成以下功能:

动态路由:动态将请求路由到不同后端集群

负载分配:为每一种负载类型分配对应容量,并弃用超出限定值的请求

身份认证和安全: 识别每一个资源的验证要求,并拒绝那些不符的请求。

Spring Cloud对Zuul进行 了整合和增强,让我们可以轻松上手。

2.2,Zuul网关的构成

1,客户端发送一个请求,经过网关,将这个请求转到合适的服务, 这个过程,叫做路由(路由规则,起到映射的作用)

2,核心是一系列过滤器 前置(pre),后置(post),路由(Route),错误(Error)

405a492e751e1ab77bda118f3f03fa74.png

2.3,搭建Zuul网关服务工程

1,创建网关工程

api-zuul-server

2,引入依赖

<dependency>

3,启动类添加注解

@EnableZuulProxy

2.4,网关核心功能-路由

1,配置

server:port: 8888
eureka:client:service-url:defaultZone: http://localhost:9090/eureka/
spring:application:name: api-zuul-server

2,检验效果

【1】,默认提供的路由规则,可以帮助我们路由到后台的服务,如下:

访问规则:网关地址:端口/微服务服务名称/微服务请求地址

访问案例:http://localhost:8888/product-service/product/list

0e29f4be81021242c3977ea8915df3c7.png

默认zuul就已经提供了好了路由规则,无需任何配置,就可以实现路由

路由,本质就是映射

【2】,自定义路由规则

#自定义路由规则,默认的规则依然生效
zuul:routes:api-index:path: /index/**serviceId: index-serviceapi-product:path: /product/**serviceId: product-service

注意:原先的路由规则依然有效

新配置的路由规则也生效

6319b9794e56a828be21849987b5f815.png

【3】,需求 :不想让默认的服务对外暴露接口

zuul:routes:api-index:path: /index/**serviceId: index-serviceapi-product:path: /product/**serviceId: product-service#统一入口为上面的配置,其他入口忽略ignored-patterns: /*-service/**#处理http请求头为空的问题sensitive-headers:#默认zuul会屏蔽cookie,cookie不会传到下游服务,这里设置为空则取消默认的黑名单,表示会传递到下游服务,比如product-service

2.5,网关核心功能-过滤

1,ZuulFilter简介

Zuul中的过滤器跟我们之前使用的 javax.servlet.Filter 不一样,javax.servlet.Filter是通过配置 urlPatterns 来拦截对应的请求。而 Zuul 中的过滤器是分为不同的类型,每种类型都有对应的使用场景。

1,PRE:这种过滤器在请求被路由之前调用。我们可利用这种过滤器实现身份验证、记录访问日志等等。

2,ROUTING:这种过滤器将请求路由到微服务。这种过滤器用于构建发送给微服务的请求,并使用 Apache HttpClient或Netfilx Ribbon请求微服务。 注意,此处的过滤器类型应该写为route

3, POST:这种过滤器在路由到微服务以后执行,可以对响应的信息做处理。

4,ERROR:在其他阶段发生错误时执行该过滤器

过滤器的应用场景:

请求鉴权:一般放在pre类型,如果发现没有访问权限,直接就拦截了 
异常处理:一般会在error类型和post类型过滤器中结合来处理。 
服务调用时长统计:pre和post结合使用。

2,ZuulFilter接口说明

/*** @author huangguizhao*/
public class MyZuulFilter extends ZuulFilter{@Overridepublic String filterType() {return null;}
​@Overridepublic int filterOrder() {return 0;}
​@Overridepublic boolean shouldFilter() {return false;}
​@Overridepublic Object run() throws ZuulException {//具体的过滤处理逻辑return null;}
}

方法说明:

filterType返回一个字符串代表过滤器的类型,在zuul中定义了四种不同生命周期的过滤器类型pre:路由之前routing:路由之时post: 路由之后error:发生错误调用
filterOrder通过返回的int值来定义过滤器的执行顺序,数字越小优先级越高。 
shouldFilter返回一个 Boolean 值,判断该过滤器是否需要执行。返回true执行,返回false 不执行。
run过滤器的具体逻辑,比如判断当前用户是否有合法权限,没有,则不放行我们假设以请求中的token为例http://localhost:8888/product/product/list?token=666

3,自定义ZuulFilter

@Component
public class MyZuulFilter extends ZuulFilter{@Overridepublic String filterType() {return "pre";}@Overridepublic int filterOrder() {return 0;}@Overridepublic boolean shouldFilter() {return true;}@Overridepublic Object run() throws ZuulException {//请求上下文RequestContext ctx = RequestContext.getCurrentContext();HttpServletRequest request = ctx.getRequest();System.out.println("--->拦截请求:" + request.getRequestURI());String token = request.getParameter("token");if(token == null){//此处让请求不再往下分发ctx.setSendZuulResponse(false);try {//给客户端响应信息ctx.getResponse().getWriter().print("Token is null!");} catch (IOException e) {e.printStackTrace();}}return null;}
}

4,RequestContext说明

RequestContext:用于在过滤器之间传递消息,它的数据保存在每个请求的ThreadLocal中;它用于存储请求路由到哪里、错误、HttpServletRequest、HttpServletResponse都存储在 RequestContext中。

所有的zuulFilter都可以共享到此块数据。

2.6,搭建高可用的zuul集群架构

配置多个实例,保证下面的配置是一致的即可

spring:application:name: api-zuul-server

SpringCloud让我们非常方便对组件进行水平扩展!

2.7,zuul网关存在的问题

【问题一】

Zuul1x版本本质上就是一个同步Servlet,采用多线程阻塞模型进行请求转发。简单讲,每来 一个请求,Servlet容器要为该请求分配一个线程专门负责处理这个请求,直到响应返回客户端,这个线程才会被释放返回容器线程池。如果后台服务调用比较耗时,那么这个线程就会被阻塞,阻塞期间线程资源被占用,不能干其它事情。我们知道Servlet容器线程池的大小是有 限制的,当前端请求量大,而后台慢服务比较多时,很容易耗尽容器线程池内的线程,造成容器无法接受新的请求。

【问题二】

且不支持websocket这种长连接的方式。

【解决方案】

2018 年 5 月,Zuul 2.x(基于 Netty,也是非阻塞的,支持长连接)发布,但 Spring Cloud 暂时还没有整合计划。所以,我们可以看到,整合的zuul版本还是1X版本。

430af7a4bf92d7c71c5669539216b549.png

下期,我们分享SpringCloudGateway,另一款微服务网关的实现,如果对您有帮助,就点个赞吧

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/470741.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

利用bds和dfs解决 LeetCode 107. Binary Tree Level Order Traversal II

问题简述 给定一棵二叉树&#xff0c;返回该二叉树自底向上遍历的结点值&#xff08;即从左到右&#xff0c;自底向上&#xff09; 比如给定一颗二叉树 [3,9,20,null,null,15,7] 3/ \9 20/ \15 7 返回的结果为 [[15,7],[9,20],[3] ] 解决方案 解法1&#xff1a;广度优…

MongoDB 数据库创建、删除、表(集合) 创建删除、数据的增、删、改、查

一、 连接数据库 1、连接数据库 清屏命令&#xff1a;cls 查看所有数据库列表:show dbs 二、 创建数据库、查看、删除数据库 1、使用数据库、创建数据库 use itying 如果真的想把这个数据库创建成功&#xff0c;那么必须插入一个数据。 数据库中不能直接插入数据&#xff0…

纯CSS方块转化梯形动画

http://jasonning92.github.io/JasonsBlog/pages/%E7%BA%AFCSS%E6%96%B9%E5%9D%97%E8%BD%AC%E5%8C%96%E6%A2%AF%E5%BD%A2%E5%8A%A8%E7%94%BB.html转载于:https://www.cnblogs.com/sanqianjin/p/5439364.html

如何编程两个android 手机进行通信_100+ 队伍激烈角逐 Geek Online 2020 编程挑战赛完美收官 - 业界动态...

2020春季的一场疫情&#xff0c;让远程办公和在线教育在全球范围内成为一种常态。疫情终将过去&#xff0c;但疫情为人们带来的新的工作及生活方式却将持续地影响着我们。后疫情时代&#xff0c;远程实时互动技术的重要性被提到了新的高度&#xff0c;下一代互联网通信云将如何…

从LeetCode 210. Course Schedule II 了解拓扑排序

问题简述 给定n节课&#xff0c;每节课按0~n-1编号。 在修某些课的时候需要有其它课的基础&#xff0c;必须先上先修课。现在用pair的形式来表示要先修的课&#xff0c;比如 [ [0,1], [1,2] ] 就表示在修课程1之前必须先修课程0&#xff0c;修课程2之前必须修课程1。现在需要给…

LeetCode题解 343.Integer Break

题目&#xff1a;Given a positive integer n, break it into the sum of at least two positive integers and maximize the product of those integers. Return the maximum product you can get. For example, given n 2, return 1 (2 1 1); given n 10, return 36 (10 …

MongoDb 大数据查询优化、 MongoDB 索引、复合索引、唯一索引、 explain 分 析查询速度

一、索引基础 索引是对数据库表中一列或多列的值进行排序的一种结构&#xff0c;可以让我们查询数据库变得 更快。 MongoDB 的索引几乎与传统的关系型数据库一模一样&#xff0c;这其中也包括一些基本的查询优化技巧。 下面是创建索引的命令&#xff1a; db.user.ensureIndex…

ipconfig不是内部或外部_晶振有什么作用,如何选择合适的晶振,为什么有时候用内部晶振?...

一、 什么是晶振晶振&#xff0c;全名叫"晶体振荡器"&#xff0c;它在电路当中起到产生振荡频率的作用&#xff0c;我们都知道&#xff0c;单片机可以看成是在时钟驱动下的时序逻辑电路&#xff0c;那么这个所需要的时钟就是晶振来产生&#xff0c;可以说它的单片机的…

利用哈希表和dfs解决LeetCode 399. Evaluate Division

问题简介 给定一些由变量组成的等式组&#xff0c;然后根据这些等式推算出所闻的等式的结果&#xff0c;如果无法推算&#xff0c;则返回-1.0。 比如&#xff1a; 给定等式组 a / b 2.0, b / c 3.0 求出 a / c ?, b / a ?, a / e ?, a / a ?, x / x ? 返回结果为…

Mongodb 账户权限配置

Mongodb 账户权限配置 1、第一步创建超级管理用户 use admindb.createUser({ user:admin, pwd:admin, roles:[{role:root,db:admin}] })2、第二步修改 Mongodb 数据库配置文件 默认路径&#xff1a;路径&#xff1a;C:\Program Files\MongoDB\Server\4.0\bin\mongod.cfg 打开…

笔记本电脑关机快捷键_2020年双十一值得入手的高性价比笔记本电脑外设推荐...

本文更新日期&#xff1a;2020.10.21 篇幅较长&#xff0c;请提前收藏关注电脑外设就是除主机外的大部分硬件设备都可称作外部设备&#xff0c;或叫外围设备&#xff0c;简称外设。计算机系统没有输入输出设备&#xff0c;就如计算机系统没有软件一样&#xff0c;是毫无意义的。…

CentOS 7 gedit编辑器中文乱码解决方法

无需root登陆 打开终端输入如下命令&#xff1a; gsettings set org.gnome.gedit.preferences.encodings auto-detected "[GB18030, GB2312, GBK, UTF-8, BIG5, CURRENT, UTF-16]" gsettings set org.gnome.gedit.preferences.encodings shown-in-menu "[GB1803…

MongoDB 的高级查询 aggregate 聚合管道

一、MongoDB 聚合管道&#xff08;Aggregation Pipeline&#xff09; 使用聚合管道可以对集合中的文档进行变换和组合。 实际项目&#xff1a;表关联查询、数据的统计。 MongoDB 中使用 db.COLLECTION_NAME.aggregate([{<stage>},...]) 方法 来构建和使用聚合管道。 先…

python函数在传参的时候,到底在传些什么?

C这样的语言用多了之后&#xff0c;在Python函数传递参数的时候&#xff0c;经常会遇到一个问题&#xff0c;我要传递一个引用怎么办&#xff1f; 比如我们想要传一个x到函数中做个运算改变x的值&#xff1a; def change(y):y 1x 1 print ("before change:", x) …

android学习笔记五。2、其他组件

一、ContentProvider内容提供者.是是android中一个应用向第三方共享数据的方式,android中的联系人,sms(短信记录)等都是通过这一方式来向外提供的 1、使用&#xff1a; 在应用中使用ContentProvider提供的数据并不是直接使用的,而是需要通过ContentResolver来实现的,ContentRes…

一维条形码识别c语言_条形码的优点

条形码是迄今为止最经济、实用的一种自动识别技术。条形码技术具有以下几个方面的优点A&#xff0e;输入速度快&#xff1a;与键盘输入相比&#xff0c;条形码输入的速度是键盘输入的5倍&#xff0c;并且能实现“即时数据输入”。B&#xff0e;可靠性高&#xff1a;键盘 输入数…

mongodb数据库导出备份

mongodb数据库导出备份 语法&#xff1a; mongodump-h dbhost-d dbname-o cdbdirectorg 参数说明&#xff1a; “-h:MongDB所在服务器地址&#xff0c;例如&#xff1a;127.0.0.1&#xff0c;当然也可以指定端口号&#xff1a;127.0.0.1&#xff1a;27017 -d&#xff1a;需要…

气象数据领航无人飞行器线路优化大赛解决方案(3rd place)

1 队伍介绍 队伍名称&#xff1a;酒后写诗 队伍成员&#xff1a;陈权、林望黎、黄章炜 队伍名次&#xff1a;3 / 1646 2 问题简介 这个问题说起来其实挺简单&#xff08;但实现起来困难重重&#xff09;&#xff0c;就是提供了气象局得到的10个模型的预测数据&#xff08;…

C#之 十九 使用WinForm控件

十九 使用Win Form控件 比如说电脑有显示器&#xff0c;鼠标&#xff0c;主机以及键盘的基本元素组成。在windows窗体中也有其基本控件&#xff0c;这些控件在每一个窗体中都要用到&#xff0c;也就是说无所不在。有些控件可能外观不同但是他们的使用方式都基本上一样。 …

mac最好用的markdown_「建议收藏」PCMaclinux,最好用Markdown编辑器清单

文章很长&#xff0c;不想看&#xff0c;请直接拉到底看简略版清单&#xff01;&#xff01;如果您曾经用Word写过文章&#xff0c;并尝试将文本移动到CMS中(头条、百家号等)&#xff0c;那么您可能已经花费了大量时间&#xff0c;来调整这种跨平台转换导致的格式杂乱。因此&am…