Spring Cloud -- 4 服务网关

9_分布式配置中心 9_分布式配置中心SpringCloudConfig 概述 面临的问题 微服务意味着要将单体应用中的业务拆分成一个个子服务,每个服务的粒度相对较小,因此系统中会出现大量的服务,由于每个服务都需要必要的配置信息才能运行,所以一套集中式,动态的配置管理设施是必不可少的。 SpringCloud提供了ConfigServer来解决这个问题,原来四个微服务,需要配置四个application.yml,但需要四十个微服务,那么就需要配置40份配置文件,我们需要做的就是一处配置,到处生效。 所以这个时候就需要一个统一的 阅读详情

我们使用Spring Cloud Netflix中的Eureka实现了服务注册中心以及服务注册与发现;而服务间通过Ribbon或Feign实现服务的消费以及均衡负载;通过Spring Cloud Config实现了应用多环境的外部化配置以及版本管理。为了使得服务集群更为健壮,使用Hystrix的融断机制来避免在微服务架构中个别服务出现异常时引起的故障蔓延。

在该架构中,我们的服务集群包含:内部服务Service A和Service B,他们都会注册与订阅服务至Eureka Server,而Open Service是一个对外的服务,通过均衡负载公开至服务调用方。本文我们把焦点聚集在对外服务这块,这样的实现是否合理,或者是否有更好的实现方式呢?

先来说说这样架构需要做的一些事儿以及存在的不足:

  • 首先,破坏了服务无状态特点。为了保证对外服务的安全性,我们需要实现对服务访问的权限控制,而开放服务的权限控制机制将会贯穿并污染整个开放服务的业务逻辑,这会带来的最直接问题是,破坏了服务集群中REST API无状态的特点。从具体开发和测试的角度来说,在工作中除了要考虑实际的业务逻辑之外,还需要额外可续对接口访问的控制处理。
  • 其次,无法直接复用既有接口。当我们需要对一个即有的集群内访问接口,实现外部服务访问时,我们不得不通过在原有接口上增加校验逻辑,或增加一个代理调用来实现权限控制,无法直接复用原有的接口。

面对类似上面的问题,我们要如何解决呢?下面进入本文的正题:服务网关!

为了解决上面这些问题,我们需要将权限控制这样的东西从我们的服务单元中抽离出去,而最适合这些逻辑的地方就是处于对外访问最前端的地方,我们需要一个更强大一些的均衡负载器,它就是本文将来介绍的:服务网关。

服务网关是微服务架构中一个不可或缺的部分。通过服务网关统一向外系统提供REST API的过程中,除了具备服务路由、均衡负载功能之外,它还具备了权限控制等功能。Spring Cloud Netflix中的Zuul就担任了这样的一个角色,为微服务架构提供了前门保护的作用,同时将权限控制这些较重的非业务逻辑内容迁移到服务路由层面,使得服务集群主体能够具备更高的可复用性和可测试性。

准备工作:我们先启动注册中心,然后注册两个服务,一个Service A和Service B,这时候打开注册中心http://localhost:1111/

我们会看到:


然后开始写我们的服务网关:

新建一个springBoot项目,pom.xml:

<?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.sun</groupId>
<artifactId>api-gateway</artifactId>
<version>1.0.0</version>
<packaging>jar</packaging>


<name>api-gateway</name>
<description>Spring Cloud project</description>


<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.3.5.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>


<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.version>1.8</java.version>
</properties>


<dependencies>


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


</dependencies>


<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Brixton.RELEASE</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,

并且把我们的服务过滤器加载进来,后期我们要用过滤器来拦截进行业务操作。


application.properties:

配置文件中除了基本的配置外,需要将我们的服务注册到注册中心去发现其他服务,这样我们就可以我们就可以实现对serviceId的映射,如果是通过指定serviceId的方式,eureka依赖是必须要的。我们也可以用url的方式去映射,但这样不够透明友好。


该配置定义的规则是:当我们访问http://localhost:5555/api-a/add?a=1&b=2的时候,Zuul会将该请求路由到:http://localhost:2222/add?a=1&b=2上。当我们访问http://localhost:5555/api-b/add?a=1&b=2的时候,Zuul会将该请求路由到:http://localhost:3333/add?a=1&b=2上。

服务过滤器:

过滤器只需要继承ZuulFilter实现其四个抽象函数就可以对所有请求进行拦截和过滤,书写业务逻辑。

如下我们拦截检查请求中是否有accesstoken,若有就进行路由,若没有就拒绝访问,返回401错误。

package com.didispace.filter;


import javax.servlet.http.HttpServletRequest;


import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;


public class AccessFilter extends ZuulFilter
{
    
    private static Logger log = LoggerFactory.getLogger(AccessFilter.class);
    
    /***
     * filterType:返回一个字符串代表过滤器的类型,在zuul中定义了四种不同生命周期的过滤器类型,具体如下:
     * pre:可以在请求被路由之前调用
     * routing:在路由请求时候被调用
     * post:在routing和error过滤器之后被调用
     * error:处理请求时发生错误时被调用
     */
    @Override
    public String filterType()

    {
        return "pre";
    }
    
    //通过int值来定义过滤器的执行顺序
    @Override
    public int filterOrder()

    {
        return 0;
    }
    
    //返回一个boolean类型来判断该过滤器是否要执行,所以通过此函数可实现过滤器的开关.true为开false为关。
    @Override
    public boolean shouldFilter()

    {
        return true;
    }
    
    /***
     * 过滤器的具体逻辑。需要注意,这里我们通过ctx.setSendZuulResponse(false)令zuul过滤该请求,
     * 不对其进行路由,然后通过ctx.setResponseStatusCode(401)设置了其返回的错误码,当然我们也可以
     * 进一步优化我们的返回,比如,通过ctx.setResponseBody(body)对返回body内容进行编辑等。
     */
    
    @Override
    public Object run()

    {
        RequestContext ctx = RequestContext.getCurrentContext();
        HttpServletRequest request = ctx.getRequest();
        
        log.info(String.format("%s request to %s", request.getMethod(), request.getRequestURL().toString()));
        
        Object accessToken = request.getParameter("accessToken");
        if (accessToken == null)
        {
            log.warn("access token is empty");
            ctx.setSendZuulResponse(false);
            ctx.setResponseStatusCode(401);
            log.info("省缺accessToken已拦截");
            return null;
        }
        log.info("access token ok");
        return null;
    }
    
}

启动服务后我们访问

http://localhost:5555/api-a/add?a=1&b=2:返回401错误;

访问http://localhost:5555/api-a/add?a=1&b=2&accessToken=token:正确路由到server-A,并返回计算内容

还有很多其他的过滤类型就不一一展开了。

filterType生命周期介绍:


Springcloud核心组件:



参考自:码云程序猿DD。感谢他的分享!

服务网关Zuul基于Apollo动态路由 Apollo概述 Apollo(阿波罗)是携程框架部门研发的开源配置管理中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性。 Apollo支持4个维度管理Key-Value格式的配置: application (应用) environment (环境) cluster (集群) namespace (命名空间) Apollo相比于Spring Cloud Config优势 Spring Cloud Config的精妙之处在于它的配置存储于Gi 阅读详情

相关推荐

Spring Cloud服务网关

版本信息 Spring Cloud : Hoxton.SR1 Spring Boot : 2.2.2.RELEASE Zookeeper : 3.5.6 (注册中心使用) 服务网关特性 服务网关是干什么用的? 认证 安全(授权) 动态路由 基于RestTemplate自定义服务网关 服务端演示提供服务 1.添加pom依赖 <dependency> <groupId>org.springframework.boot</groupId> &l.

csdnteach的博客 920

SpringCloud-4.服务网关(GateWay)

自定义全局GlobalFilter的作用:全局日志记录、统一网关鉴权... ...需要自定义过滤器类,实现,Ordered接口@Component{@Override//获取请求参数//名字为空就设置错误响应码然后返回System.out.println("****用户名为null,无法登录");//设置响应码//返回}//名字不为空就继续执行}@Override{return 0;}}

萌萌虎的博客 559

Spring Cloud【Resilience4j(重试机制、异常比例熔断降级、信号量隔离实现、线程池隔离实现、限流 ) 】(五)

Spring Cloud【Resilience4j(重试机制、异常比例熔断降级、信号量隔离实现、线程池隔离实现、限流 ) 】(五)

748

SpringCloud-4_Eureka服务注册与发现

eureka发现服务与注册,server端与client端的配置。以及自我保护模式的开关

stein的博客 412

【云原生】Spring Cloud Alibaba 之 Gateway 服务网关实战开发

Spring Cloud Alibaba Gateway 新一代服务网关 实战开发!

wanghuichen的博客 1万+

Android TV开发:RecyclerView焦点控制实践与优化

在Android TV应用开发中,焦点控制是提升用户体验的关键技术。不同于移动端触摸交互,TV端通过遥控器方向键导航,需要精确的焦点管理机制。RecyclerView作为动态列表的核心组件,其焦点控制涉及视图复用、导航逻辑和视觉反馈等核心技术点。通过合理配置focusable属性、自定义焦点查找算法以及优化动画性能,开发者可以解决TV端常见的焦点跳转异常、视觉反馈延迟等问题。特别是在视频点播、智能家居控制等场景中,良好的焦点控制能显著提升操作效率。本文结合网格布局焦点环绕、分页加载焦点保持等实战案例,深入解

weixin_34195142的博客 469

Sentinel

官方文档:https://sentinelguard.io/zh-cn/docs/quick-start.html Sentinel是什么? 随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 是面向分布式服务架构的流量控制组件,主要以流量为切入点,从流量控制、熔断降级、系统自适应保护等多个维度来帮助您保障微服务的稳定性。 丰富的应用场景: Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流

知易行难 531

深入解析组合逻辑环(combinational loop)的成因与解决方案

本文深入解析了数字电路设计中组合逻辑环(combinational loop)的成因与危害。通过边沿检测和中断轮询(round_robin)仲裁器等实例,揭示了代码如何意外形成环路,并对比了插入触发器、重构逻辑以及状态机思维三种核心解决方案,帮助硬件工程师从根本上避免这一常见设计陷阱,确保电路稳定可靠。

weixin_28278377的博客 313

SpringCloud-4-基础组件(stream,config+bus,apollo)

应用要直接与消息中间件进行信息交互的时候,由于各消息中间件构建的初衷不同,它们的实现细节上会有较大的差异性,这使得我们实现的消息交互逻辑就会非常笨重,因为对具体的中间件实现细节有太重的依赖,当中间件有较大的变动升级、或是更换中间件的时候,我们就需要付出非常大的代价来实施。如常见的RabbitMQ。到这里消息分区配置就完成了,我们可以再次启动这两个应用,同时消费者启动多个,但需要注意的是要为消费者指定不同的实例索引号,这样当同一个消息被发给消费组时,我们可以发现只有一个消费实例在接收和处理这些相同的消息。..

m0_60875109的博客 1319

解决鸿蒙/荣耀设备GMS应用调试中的“Play保护机制认证”报错

本文详细解析了在鸿蒙或荣耀设备上调试GMS应用时,遇到“Play保护机制认证”报错的根本原因与解决方案。核心在于获取设备的GMS Device ID,并通过Google官方渠道完成临时注册,从而绕过认证限制。文章提供了无需Root和ADB查询两种具体方法,并分享了授权后的故障排查与实战经验,帮助开发者高效解决问题。

weixin_29288313的博客 298

CAPL实战:从零构建HEX文件解析器,赋能UDS刷写

本文详细介绍了如何使用CAPL从零构建HEX文件解析器,以支持UDS刷写操作。通过解析HEX文件格式、设计状态机、优化数据结构与算法,实现高效准确的固件数据处理,并提供了与UDS刷写流程对接的工程化实践建议。

weixin_28726391的博客 443

4.服务网关之Spring Cloud Gateway

大家都知道在微服务结构中,一个系统会被拆分为很多个微服务。那么作为客户端要如何去调用,这么多的微服务呢?如果没有网关的存在,我们只能在客户端记录每个微服务的地址,然后分别去调用。客户端多次请求不同的微服务,增加客户端代码或配置编写的复杂性认证复杂,每个服务都需要独立认证。存在跨域请求,在一定场景下处理相对复杂。上面的这些问题可以借助API网关来解决。​ 所谓的API网关,就是指系统的统一入口。

qq_50477101的博客 196

Numpy快速入门(np)!看这一篇就够了

Numpy快速入门(np)!看这一篇就够了

weixin_74009895的博客 2679

Spring Cloud Alibaba + Grails4 学习路线七:服务网关(Spring Cloud Gateway)

未更新 系列文章链接: Spring Cloud Alibaba + Grails4 学习路线六:分布式事务(Seata)整合 Nacos Spring Cloud Alibaba + Grails4 学习路线五:分布式事务(Seata) Spring Cloud Alibaba + Grails4 学习路线四:限流熔断 Spring Cloud Alibaba + Grails4...

斗战圣佛91的博客 358

Python+QMT量化交易实战:从零搭建你的第一个极速策略(附完整代码)

本文提供了一份详细的Python+QMT量化交易实战指南,手把手教你从零搭建一个可回测、可实盘的极速策略。内容涵盖环境配置、QMT核心机制解析、双均线策略的完整代码实现、回测优化方法以及实盘部署要点,帮助量化交易新手快速入门并掌握核心开发流程。

b9c0d的博客 1012

【大数据技术干货】(还不懂数仓,数据中心?看这一篇就够了!)在实际的开发生产中,让你了解企业级数据中心整体架构(DB+ETL+ODS+DW+DM)的各个层次的过程详解,数据联系及功能区分

一 企业级数据中心架构 数据仓库的整体架构,各个系统的元数据通过ETL同步到操作性数据仓库ODS中,对ODS数据进行面向主题域建模形成DW(数据仓库),DM是针对某一个业务领域建立模型,具体用户(决策层)查看DM生成的报表。 二 DB 三 ETL(Extract-Transform-Load) ETL是将业务系统的数据经过抽取、清洗转换之后加载到数据仓库的过程,目的是将企业中的分散、零乱、标准不统一的数据整合到一起,为企业的决策提供分析依据。 ETL是BI项目重要的一个环节。 通常情况下,在BI项目中ET

liuchunhang的博客 1288

没想到,看《复联4》也能理解Spring Cloud

“《复仇者联盟4》将于4月24号上映,漫威迷们是不是迫不及待了?我虽然不是漫威迷,没有看过相关漫画,但是电影确实一步都不落。不过我在想一个问题:假如《复联4》是一个微服务,那...

u010889990的专栏 1135

Flink实战案例(十三):Flink DataStream 八大分区策略与自定义分区器

声明:本系列博客是根据SGG的视频整理而成,非常适合大家入门学习。 《2021年最新版大数据面试题全面开启更新》 分区策略决定了一条数据如何发送给下游。Flink中默认提供了八大分区策略(也叫分区器)。 本文基于Flink 1.9.0总结Flink DataStream中的八大分区策略以及手动实现一个自定义分区器。 八大分区策略继承关系图 ChannelSelector: 接口,决定将记录写入哪个Channel。有3个方法: void setup(int numberOfChannels):

微信搜:import_bigdata,大数据领域硬核原创作者 1124

(四)Spring Cloud Finchley.SR4 整合Spring Cloud Gateway网关组件

版权声明:本文为博主原创文章,版权归烟台华东数据科技有限公司与博主本人共同所有。烟台华东数据科技有限公司及其下属机构毋须博主授权即可在任意用途下转载、使用! 前言 其实很多项目都是使用的zuul来做网关,我们公司由于历史原因,一直没有使用网关,这一次由于一些业务调整和框架升级,决定在Spring Cloud环境中加入网关模块,后续基于网关可以实现统一日志、统一转发、对外暴露唯一IP地...

白菜的专栏 1497

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Spring Cloud Gateway MVC 基于 Spring Boot 3.4 以 WAR 包形式部署于外部 Tomcat 实战

本文基于 Spring Boot 3.4 版本,详细介绍了使用开发项目,并以 WAR 包形式部署到外部 Tomcat 服务器的全过程。Spring Boot 3.4 带来了性能优化、安全性增强等诸多新特性,结合 Spring Cloud Gateway 和 MVC 模式,能够帮助开发者构建出高效、灵活的微服务网关。通过这种部署方式,企业可以更好地管理应用资源,适应复杂多变的业务场景。在实际项目开发中,开发者可以根据具体需求进一步扩展路由规则,丰富控制器逻辑,充分发挥 Spring 生态的强大功能。

心猿意码 1663

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

golang 大型项目实战_Go资源分享—150页的Spring Cloud Alibaba实战文档和4大Go语言项目实战视频...

目前微服务架构仍是软件架构中最新的热门话题,虽然Golang是一门新的语言,但Golang的性能比python和java高出不少。既能承受程序使用运行的服务构建的繁重负载,又容易与GitHub集成,管理非集中的代码包,此外,它语法稳定,简单的同时又易于阅读和理解,使它成为开发微服务应用的绝佳选择。Spring Cloud for Alibaba,它是由一些阿里巴巴的开源组件和云产品组成的。这个项目...

weixin_36277054的博客 756

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

【6.服务网关Zuul】

服务网关Zuul的简介

qq_32828749的博客 470

zuul网关_SpringCloud学习笔记——旧服务网关Zuul服务限流

服务限流服务网关的一个重要功能即服务限流。在Zuul中虽然可以通过前置类型过滤器对有效请求和无效请求(参数有效性,合法性)进行校验,将无效请求隔离在服务网关之外(返回错误提示信息、异常信息)。但有的时候某一个时间点内突发有效请求量很大,超过了系统可承受的范围,此时可以依靠服务限流算法,限制该时间点内通过的请求数,保证系统可用,避免出现服务雪崩效应。此时可以通过Spring Cloud提供...

weixin_39757893的博客 236

spring cloud解决方案核心技术选择

spring cloud解决方案核心技术选择 服务注册中心 Alibaba Nacos 服务调用 LoadBalancer 服务调用2 OpenFeign 服务降级 Hystix / resilicence4j / Alibaba sentienl 服务网关 gateway 服务配置 Alibaba Nacos 服务总线 Alibaba Nacos ...

云鹰小憩 390

Spring Cloud Gateway 服务网关的部署与使用详细介绍

网关作为系统的唯一流量入口,封装内部系统的架构,所有请求都先经过网关,由网关将请求路由到合适的微服务,所以,使用网关的好处在于:(1)简化客户端的工作。网关将微服务封装起来后,客户端只需同网关交互,而不必调用各个不同服务;(2)降低函数间的耦合度。 一旦服务接口修改,只需修改网关的路由策略,不必修改每个调用该函数的客户端,从而减少了程序间的耦合性(3)解放开发人员把精力专注于业务逻辑的实现。由网关统一实现服务路由(灰度与ABTest)、负载均衡、访问控制、流控熔断降级等非业务相关功能

张维鹏的博客 9万+
上一篇: Spring Cloud -- 3 分布式配置中心
下一篇: Spring Cloud -- 5 消息总线
JavaMrSun
博客等级 码龄9年 27粉丝 64原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值