精华内容
下载资源
问答
  • 网关服务的意义
    千次阅读
    2020-06-30 21:55:08

    一、什么是服务网关

    服务网关 = 路由转发 + 过滤器

    1、路由转发:接收一切外界请求,转发到后端的微服务上去;

    2、过滤器:在服务网关中可以完成一系列的横切功能,例如权限校验、限流以及监控等,这些都可以通过过滤器完成(其实路由转发也是通过过滤器实现的)。

    二、为什么需要服务网关

    上述所说的横切功能(以权限校验为例)可以写在三个位置:

    每个服务自己实现一遍

    写到一个公共的服务中,然后其他所有服务都依赖这个服务

    写到服务网关的前置过滤器中,所有请求过来进行权限校验

    第一种,缺点太明显,基本不用;

    第二种,相较于第一点好很多,代码开发不会冗余,但是有两个缺点:

    由于每个服务引入了这个公共服务,那么相当于在每个服务中都引入了相同的权限校验的代码,使得每个服务的jar包大小无故增加了一些,尤其是对于使用docker镜像进行部署的场景,jar越小越好;

    由于每个服务都引入了这个公共服务,那么我们后续升级这个服务可能就比较困难,而且公共服务的功能越多,升级就越难,而且假设我们改变了公共服务中的权限校验的方式,想让所有的服务都去使用新的权限校验方式,我们就需要将之前所有的服务都重新引包,编译部署。

    而服务网关恰好可以解决这样的问题:

    将权限校验的逻辑写在网关的过滤器中,后端服务不需要关注权限校验的代码,所以服务的jar包中也不会引入权限校验的逻辑,不会增加jar包大小;

    如果想修改权限校验的逻辑,只需要修改网关中的权限校验过滤器即可,而不需要升级所有已存在的微服务。

    所以,需要服务网关!!!

    这里推荐一下我的JAVA架构学习交流群:835544715 ,想要学习Java高架构、分布式架构、高可扩展、高性能、高并发、性能优化、Spring boot、Redis、ActiveMQ、Nginx、Mycat、Netty、Jvm大型分布式项目实战学习架构师视频都有整理,送给每一位JAVA小伙伴,有想学习JAVA架构的,或是转行,还有工作中想提升自己能力的,正在学习的小伙伴欢迎加入学习。

    三、服务网关技术选型

    引入服务网关后的微服务架构如上,总体包含三部分:服务网关、open-service和service。

    1、总体流程:

    服务网关、open-service和service启动时注册到注册中心上去;

    用户请求时直接请求网关,网关做智能路由转发(包括服务发现,负载均衡)到open-service,这其中包含权限校验、监控、限流等操作open-service聚合内部service响应,返回给网关,网关再返回给用户

    2、引入网关的注意点

    增加了网关,多了一层转发(原本用户请求直接访问open-service即可),性能会下降一些(但是下降不大,通常,网关机器性能会很好,而且网关与open-service的访问通常是内网访问,速度很快);

    网关的单点问题:在整个网络调用过程中,一定会有一个单点,可能是网关、nginx、dns服务器等。防止网关单点,可以在网关层前边再挂一台nginx,nginx的性能极高,基本不会挂,这样之后,网关服务就可以不断的添加机器。但是这样一个请求就转发了两次,所以最好的方式是网关单点服务部署在一台牛逼的机器上(通过压测来估算机器的配置),而且nginx与zuul的性能比较,根据国外的一个哥们儿做的实验来看,其实相差不大,zuul是netflix开源的一个用来做网关的开源框架;

    网关要尽量轻。

    3、服务网关基本功能

    智能路由:接收外部一切请求,并转发到后端的对外服务open-service上去;

    注意:我们只转发外部请求,服务之间的请求不走网关,这就表示全链路追踪、内部服务API监控、内部服务之间调用的容错、智能路由不能在网关完成;当然,也可以将所有的服务调用都走网关,那么几乎所有的功能都可以集成到网关中,但是这样的话,网关的压力会很大,不堪重负。

    权限校验:只校验用户向open-service服务的请求,不校验服务内部的请求。服务内部的请求有必要校验吗?

    API监控:只监控经过网关的请求,以及网关本身的一些性能指标(例如,gc等);

    限流:与监控配合,进行限流操作;

    API日志统一收集:类似于一个aspect切面,记录接口的进入和出去时的相关日志。

    上述功能是网关的基本功能,网关还可以实现以下功能:

    A|B测试:A|B测试时一块比较大的东西,包含后台实验配置、数据埋点(看转化率)以及分流引擎,在服务网关中,可以实现分流引擎,但是实际上分流引擎会调用内部服务,所以如果是按照上图的架构,分流引擎最好做在open-service中,不要做在服务网关中。

    4、技术选型

    技术选型参考如下:

    开发语言:java + groovy,groovy的好处是网关服务不需要重启就可以动态的添加filter来实现一些功能;

    微服务基础框架:springboot;

    网关基础组件:netflix zuul;

    服务注册中心:consul;

    权限校验:jwt;

    API监控:prometheus + grafana;

    API统一日志收集:logback + ELK;

    压力测试:Jmeter;

    更多相关内容
  • 网关需要与客户端保证连接。这里网关使用Netty4来做为网络通信框架。它也是目前在Java游戏服务器开发中,长连接使用最多的框架。 1,管理与客户端的连接 客户端连接到网关之后,并且验证过之后,我们需要把连接的...

    网关需要与客户端保证连接。这里网关使用Netty4来做为网络通信框架。它也是目前在Java游戏服务器开发中,长连接使用最多的框架。

    1,管理与客户端的连接

    客户端连接到网关之后,并且验证过之后,我们需要把连接的channel和用户绑定起来,这样方便使用用户id查询到它和客户端的连接,就可以给客户端返回消息了。因为是需要管理所有的客户端连接。所以会涉及到多线程的操作。在每个连接验证成功之后,会在当前连接的channel之中添加用户id和channel的映射到一个map集合中。简单点这个map可以是ConcurrentHashMap,它是线程安全的。但是如果并发理大的话,由于ConcurrentHashMap使用了锁会产生大量的上下文切换。所以我们这里采用无锁的单线程模式实现。即同一个用户id的操作都会放到同一个线程中去执行,而不加锁。

    2,消息的定义

    这里说的消息定义是指客户端与服务器长连接的情况下,使用消息进行数据交互。一个消息代表客户端发出的一个请求,或服务器返回给客户端的一个响应。

    由于服务器由网关和逻辑服务组成,所以消息又分为外部消息和内部消息,和客户端交互的叫外部消息,在服务器内部交互的叫内部消息。

    外部请求消息的组成

    包头信息:

    • 消息Id:消息的唯一id,用于区分每个消息的逻辑意义,知道这个消息是干什么的

    • 消息发送时间

    • 是否压缩

    • 是否加密

    • 服务类型,这个主要用于分布式服务。

    • crc32校验码,用于保证消息的完整性。

    • 消息序列Id: 每个用户登陆之后,从给服务器发送第一条消息起,开始累计计数,叫序列id,Id主要用于服务器判断消息的唯一性,对消息做等幂处理。

    • 包体信息 消息体,向服务器发送的请求内容,这个部分可以根据自己的业务需要自行设计,可以是json,也可以是由protobuf序列化组成的。而且这部分信息可以加密码,压缩。

    外部返回消息组成

    • 消息序列Id:
      每个用户登陆之后,从给服务器发送第一条消息起,开始累计计数,叫序列id,Id主要用于服务器判断消息的唯一性,对消息做等幂处理。
    • 消息Id:消息的唯一id,处理于区分每个消息
    • 服务类型:返回消息的服务类型。
    • 服务器发送时间
    • 是否压缩
    • 错误码:如果服务器处理的消息有错误,以错误码的形式返回给客户端,在这里定义返回的错误码
    • 消息体,向服务器发送的请求内容,这个部分是由protobuf或json序列化组成的。

    3,消息编码与解码

    通信协议就是一份约定。在网络通信中,所有的数据都是以二进制的形式传输的,不管是客户端还是服务器端,在收到二进制的消息之后,都需要把二进制转化为明文的形式,以方便在代码里面使用。把明文数据转化为二进制的过程叫序列化的过程,把二进制转化为明文的过程中反序列化的过程,也叫编码和解码。由于我们使用的是netty的tcp协议,它是一种流协议,没有明确的界限,所以我们需要知道我们每次传输的数据的大小,每次收到消息后,只有得到整个包才能正解的反序列化出来。这就需要处理好断包和粘包的总理了。不过在服务器端,netty已帮我们实现好了,我们只需要配置一下就可以了。

    请求协议编码解码格式:

    数据总长度(short(2)) + 消息序列号(int(4)) +  消息发送时间(long(8)) +消息id(ishort(2))   + 服务类型(short(2)) + 是否压缩(1+ 是否加密(1+ crc32 (32)  + 消息体
    
    数据总长度:等于所有的位置占用字节数的总和 = 2 + 4 + 8 + 2  + 2 + 1 + 1 + 32   + 消息体长度
    

    返回协议的编码解码格式:

    数据总长度(short(2)) + 消息序列号(int(4)) + 消息id(short(2)) + 服务类型(short(2)+ 服务器发送时间(8+ 是否压缩(1+ 错误码(short(2))  + 消息体
    
      数据总长度:等于所有的位置占用字节数的总和 = 2 + 4 + 2  + 2 + 8+ 1 + 2  + 消息体长度
    

    网关消息向服务器转发

    网关与业务服务之间是一种一对多的关系,当网关收到客户端消息的时候,需要把它转发或叫路由到业务服务上面,而且为了使业务服务可以动态扩展,当多个业务服务启动或关闭时,网关都应该能感应到。所以需要有一个服务发现的服务。为了统一框架,我们采用springcloud中的Eureka做为服务的注册和发现。每个服务都有一个服务类型和服务id,两者组成一个唯的标识符标记一个唯一服务。服务类型表示服务提供哪些功能,比如活动服务,但是有时候为了动态扩展,当服务压力过大时,一活动服务不能满足要求,可能需要启动两台活动服务,为了区别服务实例,需要一个服务id。所以同个服务类型,可以由多个服务id的服务组成,这样可以做动态负载。

    在这里插入图片描述

    为了提高性能,网关与业务服务之间采用异步的通信方式,而且为了防止客户端请求负载的波动,需要缓存部分请求。所以可以使用消息队列负责网关与服务器之间的通信,使用现成的消息中间件,可以减少对底层网络的关注,减少网络层的开发时间,减少bug的出现。消息队列还可以缓存消息,起到消峰的作用。还可以使用消息的订阅、发布功能,方便的解决网关与业务服务一对多的问题。

    当网关收到客户端的消息时,需要知道消息是属于哪个服务类型的,根据服务类型,找到这个服务类型所有的服务实例,然后根据角色id% 实例数量路由消息到一个服务实例上。我使用阿里的Rockketmq做为消息中间件。网关向业务服务发送消息就是publish一个消息,需要一个publsh topic和唯一的tag, 这个tag可以标识一个唯一的消息,它由:prefix + messageId + serverType + serverId ,而业务服务在启动的时候,会监听这个服务处理的消息,监听同样的topic和tag。

    业务服务向网关发送消息

    当业务服务处理完请求之后,需要给网关返回结果,再由网关把结果返回给客户端。网关监听一个公开的topic ,它的tag就是网关实例Id。 这样就算有多个网关的话,也可以准确的返回消息。所以业务服务收到的消息中要携带消息来源的服务实例id.这样业务服务就可以publish topic到网关了。

    在这里插入图片描述
    内部消息的通信协议

    网关与业务服务之间交互的消息格式编码与解码:

    • roleId (long)
    • userId (long)
    • 消息序列号(int)
    • 消息Id (short)
    • 服务类型 (short)
    • 消息发送时间(long)
    • 消息来源的服务实例Id (short)
    • 消息要到达的服务实例id (short)
    • 错误码(short)
    • ip字符串长度
    • 客户端的ip地址 (string)
    • 消息体(byte[])

    消息的封装和具体实现在GitHub:https://github.com/youxijishu/xinyue-game-frame/tree/master/game-frame-server/game-network-message

    展开全文
  • API网关意义 API网关旨在用一套单一且统一的API入口点,来组合一个或多个内部API。 API网关定位为应用系统服务接口的网关,区别于网络技术的网关,但是原理是一样的。API网关统一服务入口,可方便实现对平台众多...

    API网关意义

    API网关旨在用一套单一且统一的API入口点,来组合一个或多个内部API。

    API网关定位为应用系统服务接口的网关,区别于网络技术的网关,但是原理是一样的。API网关统一服务入口,可方便实现对平台众多服务接口进行管控,如对访问服务的身份认证、防报文重放与防数据篡改、功能调用的业务鉴权,以及响应数据的脱敏、流量与并发控制,甚至基于API调用的计量或计费等。

    API并不能适用于所有场景

    在基于微服务的架构设计中,往往包含多个服务,这些服务并不能适用于所有场景。例如,在一个面向PC的Web应用中,服务所要提供的API是要返回一个页面,而非单纯的数据,那么这样的API只能适用于Web应用,而不能适用于移动APP。

    又如,在移动APP的架构设计中,由于网络带宽的限制,在设计API时,往往会考虑较少的网络传输次数及更少的传输数据。而面向PC的Web应用却无须考虑这些限制。

    图10-1展示了不同场景下的API网关使用情况。

    API网关常用于以下场景。

    • 黑白名单:实现通过IP地址控制禁止访问网关功能。
    • 日志:实现访问日志的记录,可用于分析访问、处理性能指标,同时将分析结果支持其他模块功能应用。
    • 协议适配:实现通信协议校验、适配转换的功能。
    • 身份认证:负责网关访问身份认证验证。
    • 计流限流:实现微服务访问流量计算,基于流量计算分析进行限流,可以定义多种限流规则。
    • 路由:是API网关很核心的模块功能,此模块实现根据请求锁定目标微服务,并将请求进行转发。

    API网关所带来的好处

    API网关能够为外部消费方提供一套统一的入口点,且不会受到内部微服务的具体数量与组成的影响。

    API网关为微服务架构系统带来了如下好处。

    1.避免将内部信息泄露给外部

    在数据安全方面,API网关能够将外部公共API与内部微服务API区分开来,使各项微服务在添加或变更时,能有明确的安全边界。这样,微服务架构就能随时间推移而始终通过重组来保证系统安全,且不会对外部绑定客户造成影响。另外,其还能够为全部微服务提供单一入口点,从而避免外部客户进行服务发现及版本控制信息查看。

    2.为微服务添加额外的安全层

    API网关能够提供─套额外的保护层,足以应对SQL注入、XML解析攻击及拒绝服务(DoS)攻击等常见威胁因素,从而实现额外的保护层效果。系统的权限控制也可以在这一层来实施。

    3.支持混合通信协议

    面向外部的API,由于考虑到平台和语言的无关性,往往向外提供基于HTTP或REST的API。但内部微服务往往会采用不同的通信协议。此类协议包括ProtoBuf、AMQP或其他集成有SOAP、JSON-RPC或XML-RPC的系统。API网关可跨越这些协议,提供一个外部统一的、基于REST的API,并允许各团队以此为基础选择最适合内部架构的协议方案。

    4.降低构建微服务的复杂性

    微服务架构系统往往拥有比单个架构更多的管理复杂度,如API令牌验证、访问控制及速率限制等。每一项功能的实施,都会给相关实现服务带来影响,进而会延长微服务的开发时间。API网关能够从代码层面隔离这些功能项,使开发人员在构建单个微服务时,能够专注于实际的核心业务。

    5.微服务模拟与虚拟化

    通过将微服务内部API与外部API加以区分,大家可以模拟或虚拟化自己的服务,从而满足设

    计要求或配合集成测试。

    API网关的弊端

    虽然使用API网关会给微服务架构带来一定的好处,但同时仍然要考虑如下的弊端。

    • 由于额外API网关的加入,会使整个开发在架构上考虑更多的编排与管理工作。
    • 在开发过程中,对路由逻辑配置要进行统一的管理,从而能够确保以合理的路由方式对接外部API与专用微服务。
    • 除非架构本身充分适应高可用性与规模化要求,否则API网关往往会成为一项限制性因素,甚至引发单点故障。

    常见API网关的实现方式

    业界常用的API网关方式有很多,技术方案也很成熟,其中也不乏很多开源的产品,如NG-INX、Tyk、Kong、API Umbrella、ApiAxle、Zuul、WSO2 API Manager等。下面介绍三种常见的API网关方案。

    NGINX

    NGINX是一个免费的、开源的、高性能的HTTP服务器和反向代理,以及一个IMAP/POP3代理服务器。NGINX以其高性能、稳定性、丰富的功能集、简单的配置和低资源消耗而闻名。

    NGINX是为解决C10K问题而编写的少数服务器之一。与传统服务器不同,NGINX不依赖于线程来处理请求。相反,它使用可扩展的事件驱动(异步)架构。这种架构在负载下使用小的但更重要的可预测的内存量。即使用户不希望处理数千个并发请求,仍然可以从NGINX的高性能和小内存中获益。NGINX在各个方向扩展:从最小的VPS一直到大型服务器集群。

    NGINX拥有诸如Netflix、Hulu、Pinterest、CloudFlare、Airbnb、WordPress.com、GitHub、SoundCloud、Zynga、Eventbrite、Zappos、Media Temple、Heroku、RightScale、Engine、Yard,MaxCDN等众多高知名度网站。

    NGINX具有很多非常优越的特性。

    • 作为Web服务器;相比Apache,NGINX使用更少的资源,支持更多的并发连接,体现更高的效率,这点使NGINX尤其受到虚拟主机提供商的欢迎。
    • 作为负载均衡服务器:NGINX既可以在内部直接支持Rails和PHP,也可以支持作为HTTP代理服务器对外进行服务。NGINX用C语言编写,系统资源开销小,CPU使用效率高。
    • 作为邮件代理服务器:NGINX同时也是一个非常优秀的邮件代理服务器(最早开发这个产品的目的之一也是作为邮件代理服务器)。

    将NGINX作为API网关

    NGINX用server_name来定义服务器名称,所以它可以决定哪一个server块将用来处理给定的请求,也就是实现了API网关的功能。

    NGINX可以使用精确名称、通配符、正则表达式来定义服务器名称。下面是一个例子。

    server{
    listen
    80;
    server name example.org www.example.org;
    server {
    listen 80;
    server name .example.org;
    ..
    server{
    listen
     80;
    server namemail.*;
    server {
    listen
    80;
    server name~^(?<user>.+).examplel.net$;
    。。。
    }

    当寻找一个虚拟服务器的名称时,如果指定的名称匹配多个变量,如通配符和正则表达式都匹配,将会按照以下的顺序选择第一个匹配的变量。

    • 精确名称。
    • 以星号“*”开头的最长的通配符,如“*.example.org”。
    • 以星号“*”结尾的最长的通配符,如“mail.*”。
    • 第一个匹配的正则表达式(根据在配置文件中出现的顺序)。

    Spring Cloud Zuul

    Zuul是Netflix公司开源的一个API网关组件,提供了认证、鉴权、限流、动态路由、监控、弹性、安全、负载均衡、协助单点压测、静态响应等边缘服务的框架。

    Zuul的基本功能如下。

    • 验证与安全保障:识别面向各类资源的验证要求并拒绝那些与要求不符的请求。
    • 审查与监控:在边缘位置追踪有意义的数据及统计结果,从而为用户带来准确的生产状态结论。
    • 动态路由:以动态方式根据需要将请求路由至不同后端集群处。
    • 压力测试:逐渐增加指向集群的负载流量,从而计算性能水平。
    • 负载分配:为每一种负载类型分配对应容量,并弃用超出限定值的请求。
    • 静态响应处理:在边缘位置直接建立部分响应,从而避免其流入内部集群。

    Zuul处理每个请求的方式是针对每个请求使用一个线程来处理。通常情况下,为了提高性能,所有请求会被放到处理队列中,从线程池中选取空闲线程来处理该请求。2016年年底,Netlix将它们的网关服务Zuul进行了升级,全新的Zuul 2将HTTP请求的处理方式从同步变成了异步,以提升其处理性能。

    Spring Cloud Zuul是基于Netflix Zuul的微服务路由和过滤器的解决方案,也用于实现API网关。

    有关Zuul的内容,将会在本文后续章节中详细介绍。

    Kong

    Kong 是专注于提供微服务API网关的管理平台,它本身是基于NGINX的,但比NGINX提供了更为简单的配置方式,并且提供了一些优秀的插件,如验证、日志、调用频次限制等。

    Kong 另外一个强大之处在于提供了大量的插件来扩展应用,通过设置不同的插件,可以为服务提供各种增强的功能。Kong 的插件平台可以访问
    https://konghq.com/pluginsl。

    Kong具有以下特性。

    • 支持云部署:可以运行在Kubernetes管理的平台上。
    • 动态负载均衡。
    • 服务器发现
    • webSocket。
    • OAuth2.0。
    • 日志。
    • 安全:ACL(访问控制)、CORS(跨域资源共享)、动态SSL、IP限制、爬虫检测实现。
    • 系统日志。
    • SSL。
    • 监控。
    • 认证:HMAC、JWT、Basic等。
    • 速率限制。
    • 缓存。
    • RESTAPI。
    • 集群。
    • 可扩展。

    图10-2展示了Kong 的架构示意图,该图来自Kong官网。

    本篇文章内容给大家讲解的是API网关的意义和常见API网关的实现方式

    1. 下篇文章给大家讲解如何集成 Zuul和实现API网关;
    2. 觉得文章不错的朋友可以转发此文关注小编;
    3. 感谢大家的支持
    展开全文
  • springcloud服务网关详细讲解

    千次阅读 2019-12-05 16:24:23
    1.为什么要用网关?它解决了什么问题? 当我们的微服务越来越多的时候,这时候网关就起到了统筹全局的作用,可以指挥所有的微服务。...4.减少客户端与服务的耦合,服务可以独立发展,通过网关层...

    1.为什么要用网关?它解决了什么问题?

    当我们的微服务越来越多的时候,这时候网关就起到了统筹全局的作用,可以指挥所有的微服务。

    解决的问题:
    1.统一入口:为全部微服务提供唯一入口点,网关起到外部和内部隔离,保障了后台服务的安全性。
    2.鉴权校验:识别每个请求的权限,拒绝不符合要求的请求。
    3.动态路由:动态的将请求路由到不同的后端集群中。
    4.减少客户端与服务的耦合,服务可以独立发展,通过网关层来做映射。

    简单的网关例子

    首先建一个项目,这是项目的目录结构:
    在这里插入图片描述
    在pom文件中加入依赖:

    <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>
    

    配置文件中的代码:

    spring.application.name=zull-gateway
    server.port=9010
    eureka.client.serviceUrl.defaultZone=http://user:test@eureka2:8762/eureka/,http://user:test@eureka1:8761/eureka/
    eureka.instance.perferIpAddress=true
    

    ZuulApplication代码:

    @SpringBootApplication
    @EnableZuulProxy
    public class ZuulApplication {
    	public static void main(String[] args) { 
    		SpringApplication.run(ZuulApplication.class, args);
    	}
    }
    

    现在就OK了,启动一个product,然后启动网关就可以了。
    测试结果:
    在这里插入图片描述
    在product/list的前面加上product的名称就可以访问了。

    路由器的4种路由规则方法

    zuul的路由规则分别是:
    1.采用URL指定路由方法
    2.采用服务指定路由方法
    3.路由的排除方法
    4.路由的添加前缀方法

    重新创建一个项目,创建基本和简单例子一样,需要修改的地方就是配置文件。我在这里就只贴配置文件的代码:

    spring.application.name=zull-gateway
    server.port=9010
    eureka.client.serviceUrl.defaultZone=http://user:test@eureka2:8762/eureka/,http://user:test@eureka1:8761/eureka/
    eureka.instance.perferIpAddress=true
    ## 1 ############# 路由指定:URL指定  #################
    ## URL匹配关键字,如果包含关键字就跳转到指定的URL中 
    #zuul.routes.book-product.path=/book-product/**
    #zuul.routes.book-product.url=http://127.0.0.1:8084/
    ## 2 ########### 路由指定:服务指定1  ##############
    ##将路径的/book-product/引到 eureka的e-book-product服务上
    ##规则:zuul.routes.路径名.path
    ##规则:zuul.routes.路径名.serviceId=eureka的服务名
    ##http://127.0.0.1:9010/book-product/product/list
    ##等同于
    ##http://127.0.0.1:9010/e-book-product/product/list
    #zuul.routes.book-product.path=/book-product/**
    #zuul.routes.book-product.serviceId=e-book-product
    ## 3 ########## 路由指定:服务指定1   #################
    #zuul.routes后面跟着的是服务名,服务名后面跟着的是路径规则,这种配置方式更简单。
    #zuul.routes.e-book-product.path=/book-product/**
    ## 4 ############ 路由排除:排除某几个服务  ################
    ##排除后,这个地址将为空 #http://127.0.0.1:9010/e-book-product/product/list 
    ## 多个服务逗号隔开
    #zuul.ignored-services=e-book-product
    ## 5 ############### 路由排除:排除所有服务  ###################由于服务太多,不可能手工一个个加,故路由排除所有服务,然后针对要路由的服务进行手工加
    #zuul.ignored-services=*
    #zuul.routes.e-book-consumer-hystrix.path=/book-consumer/**
    ## 6 ####### 路由排除:排除指定关键字的路径  ##################
    # 排除所有包括/list/的路径
    #zuul.ignored-patterns=/**/list/**
    #zuul.routes.e-book-product.path=/book-product/**
    ## 7 ########## 路由添加前缀:为所有路径添加前缀  ##############
    ##http://127.0.0.1:9010/book-product/product/list
    ##必须改成
    ##http://127.0.0.1:9010/api/book-product/product/list
    zuul.prefix=/api
    zuul.routes.e-book-product.path=/book-product/**
    

    1.URL指定:
    URL匹配关键字,如果包含关键字就调转到指定的URL中
    测试结果:
    在这里插入图片描述
    2.路由指定:
    1)将路径的/book-product/引到 eureka的e-book-product服务上
    测试结果:
    http://127.0.0.1:9010/book-product/product/list和http://127.0.0.1:9010/e-book-product/product/list都可以访问
    2)路由指定:它的配置比第一种更加的简单,可以看我上面的代码。

    3.路由排除:
    1)排除某几个服务,排除过后就不能访问。
    2)排除所有服务,由于服务太多,不可能手工一个个加,故路由排除所有服务,然后针对要路由的服务进行手工加
    3)排除指定关键字的路径。详细可看配置文件注释。

    4.路由的添加前缀
    为所有路径添加前缀
    测试结果:
    在这里插入图片描述

    定义自己的过滤器

    目录结构:
    在这里插入图片描述
    pom中加入依赖:

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

    配置文件:

    spring.application.name=zull-gateway
    server.port=9010
    eureka.client.serviceUrl.defaultZone=http://user:test@eureka2:8762/eureka/,http://user:test@eureka1:8761/eureka/
    eureka.instance.perferIpAddress=true
    ribbon.ReadTimeout=60000  //可不加
    ribbon.ConnectTimeout=60000  //可不加,看你是否报错
    

    ZuulApplication代码:

    @SpringBootApplication
    @EnableZuulProxy
    public class ZuulApplication {
    	public static void main(String[] args) { 
    		SpringApplication.run(ZuulApplication.class, args);
    	}
    }
    

    LogFilter代码:

    @Component
    public class LogFilter extends ZuulFilter {
    	private static final Logger logger = LoggerFactory.getLogger(LogFilter.class);
    	/* (non-Javadoc)
    	 * @see com.netflix.zuul.IZuulFilter#run()
    	 * 过滤器的作用,打印请求的信息
    	 */
    	@Override
    	public Object run() throws ZuulException {
    		RequestContext rc = RequestContext.getCurrentContext();
    		HttpServletRequest request = rc.getRequest();
    		logger.info("method={},url={}", request.getMethod(),request.getRequestURI().toString());
    		
    		return null;
    	}
    	/* (non-Javadoc)
    	 * @see com.netflix.zuul.IZuulFilter#shouldFilter()
    	 * 开启过滤器(true)
    	 */
    	@Override
    	public boolean shouldFilter() {
    		return true;
    	}
    	@Override
    	public int filterOrder() {
    		// TODO Auto-generated method stub
    		return 0;
    	}
    	@Override
    	public String filterType() {
    		return "pre";
    	}
    }
    

    访问http://localhost:9010/e-book-product/product/list,测试结果:
    在这里插入图片描述

    过滤器的类型

    过滤器类型:
    在这里插入图片描述
    zuul请求的生命周期表:
    在这里插入图片描述
    demo资料请加QQ997355706

    展开全文
  • 网关和API网关

    2021-07-29 10:46:05
    网关(Gateway) 又称网间连接器、协议转换器。 网关运行在OSI 7层协议的顶层–应用层。 从一个网络向另一个网络发送信息,也必须经过一道“关口”,这道关口就是网关。 我们所讲的“网关”均指TCP/IP协议下的网关。 ...
  • API网关服务综述

    2018-05-23 13:37:12
    API网关服务综述从以下几个方面对互联网上出现的API网关服务进行介绍: 1. API 网关的分类2. 网关的架构3. 对具备服务网关能力(Nginx / Orange/kong / API Umbrella/DJ / Amazon /Netflix/阿里)的产品介绍 1. ...
  • 概念------为什么------如何使用oclet-----内部概念(上游和下游)、路由-----ocelot内部运行原理-----如何做步骤-----ocelot配置文件介绍----路由基本使用----路由负载均衡------路由consul支持-----路由多个服务操作...
  • Spring Cloud —— Gateway 服务网关

    千次阅读 2021-09-30 16:11:28
    导航一、什么是服务网关二、业界常见网关组件三、Spring Cloud Gateway四、Gateway 快速入门4.1 创建 gateway 服务4.2 添加 gateway 依赖和 nacos 依赖4.3 配置路由信息4.4 测试路由转发五、Gateway 执行流程六、...
  • 网关服务

    千次阅读 2017-05-19 19:14:50
    网关网关管理从云端发送的数据包和通知。数据包可以是能被PredixMachine及其处理的命令、容器、软件或配置信息或PredixMachine及其能与之通信的任意应用程序。例如,云网关下载命令并将其交给命令调度...2.服务...
  • 什么是API网关, API 网关的作用

    千次阅读 2022-03-31 11:36:16
    我们知道在微服务架构中,大型服务都被拆分成了独立的微服务,每个微服务通常会以RESTFUL API的形式对外提供服务。但是在UI方面,我们可能需要在一个页面上显示来自不同微服务的数据,此时就会需要一个统一的入口来...
  • 使用Zuul构建微服务网关

    千次阅读 2018-07-26 14:57:06
    之前没有使用网关的微服务可能存在的问题? 客户端直接和微服务交互,增加了复杂度; 某些场景下可能存在跨域; 如果一个功能点需要调用多个微服务,每个服务都需要身份认证,使得身份验证复杂冗余; ...
  • 什么是网关 网关地址是什么

    千次阅读 2021-08-01 06:46:30
    网关的英文名称:gateway,又叫做网间连接器、协议转换器。网关是在采用不同体系结构或协议的网络之间进行互通时,用于提供协议转换、路由选择、数据交换等网络兼容功能的设施。网关在传输层上以实现网络互连,是最...
  • Http API网关服务模块设计方案1. 概述 网关作为服务生产者和服务消费者之间的接口,一方面通过“服务路由”为服务消费找到所需服务的具体位置并调用;另一方面为后台服务器提供负载均衡、安全、流量控制、身份认证...
  • 电脑网关是什么意思?

    千次阅读 2021-06-29 02:05:52
    很多朋友多次问到什么是网关、dns、子网掩码,它有什么作用,确实,我们平时在网络中总是在不断的提到网关,却很少真正的去了解它。例:一、什么是网关一、什么是网关网关(Gateway)又称网间连接器、协议转换器。网关...
  • 微服务之服务网关(GateWay)

    千次阅读 2020-09-13 16:12:00
    服务网关概述什么是网关?为什么需要网关?Zuul 实现网关(已经被淘汰,但是还有人用)路由访问映射规则GateWay实现网关 概述 什么是网关?为什么需要网关? 什么是网关: 网关就是架设在前端浏览器和后端微服务之间的一层...
  • 服务网关配置:Zuul

    千次阅读 多人点赞 2021-02-01 23:31:28
    目录第一章 Zuul介绍1.1、什么是Zuul1.2、为啥用Zuul第二章 Zuul路由功能2.1、项目准备与启动2.2、工程搭建与测试2.3、配置自定义路由2.4、禁止默认的路由2.5...Zuul其他功能4.1、负载均衡超时4.2、服务降级熔断4.3、网
  • 正如上面所讲,在网上辨别一台电脑的方法是利用 IP地址,但是 IP用数字表示,没有特殊的意义,很不好记,因此,我们一般会为网上的电脑取一个有某种含义又容易记忆的名字,这个名字我们就叫它域名(Domain Name)。...
  • 局域网网关

    2021-01-17 19:14:33
    一、网关作为了一个广播域的中心出口;生成树的根网桥也是一棵树的中心,也是流量的集合点; 若将两者分配不同的设备将导致网络通讯资源浪费,故强烈建议两者在同一台设备上; 若使用基于vlan或基于分组的STP协议来...
  • 在我眼中,所谓物联网智能网关,至少应该有如下几个特色:一,对下可以和主流传感器进行对接,可以相对容易的获取传感器数据;...其实从某种意义上说,物联网网关不仅仅是一个产品,而已经成为一个平台最
  • Zuul定义: Zuul 是Netflix开源的一个API Gateway ...Zuul 在云平台上提供动态路由,监控,弹性,安全等边缘服务的框架。Zuul 相当于是设备和 Netflix 流应用的 Web 网站后端所有请求的前门入口,并且也要注册入Eureka。
  • 很多时候,网络上传输的数据是加密过的,此时窃听者无法得到数据的准确意义。但如果他知道这些数据的作用,就可以在不知道数据内容的情况下通过再次发送这些数据达到愚弄接收端的目的。例如,有的系统会将鉴别信息...
  • 单体架构(或称分层架构)分布式应用微服务架构API Gateway的出现:*代理和网关的区别2)API网关架构2.1 API网关服务定位面向 WebApp:MobileApp:面向合作伙伴的 OpenAPI:企业内部可扩展 API:面向 IOT 设备:2.2 ...
  • 解读开源Hango网关的云原生设计与实践,本文先从云原生溯源,解读云原生API网关选型特点;再进一步解读网易数帆开源Hango云原生API网关设计及大规模落地实践。云原生溯源什么是云原生C...
  • 1. 屏蔽内部实现 ...比如把好多个网关架设到一台服务器上.因为某讯的平台,就是每台机器收带宽费,而不是一起收多少带宽流量费. 5. 路由.可以控制客户端消息到内网的走向,分发到不同服务器上面去.
  • 网关api Gateway的重要性不言而喻,网关负责统一接收所有请求,然后根据不同的规则进行转发到不同的服务。使用网关能够统一的管理请求日志、进行权限控制、过滤等,这样就能避免在每个单体应用中做重复的工作。这一...
  • 微服务网关

    万次阅读 多人点赞 2019-05-31 15:31:17
    一、前言 随着微服务的兴起,基于其业务耦合性低、负载能力强、服务边界清晰等优点,大家纷纷使用微服务架构...本文阐述微服务的API网关的一些主要功能,并例举了几种常用的网关,最后结合spring cloud微服务框架...
  • 为创建支持多设备、高性能、安全的网络,以提供低成本、综合性的通信服务,采用理论分析和实验的方法,构建一个典型的集有线、无线网络于一体的统一通信实验平台,给出语音接入网关的设计方案.语音网关以SIP协议为基础,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 48,746
精华内容 19,498
关键字:

网关服务的意义