当前位置: 首页 > news >正文

微服务篇-C 深入理解第一代微服务(SpringCloud)_VI 深入理解Zuul服务网关

原创作者:田超凡(程序员田宝宝)

版权所有,引用请注明原作者,严禁复制转载

Part 1 理论部分

1 网关类别有哪些?

常见的网关类别有三种:开放API(Open API)网关、微服务网关、API服务管理平台。

1 开放API(Open API)网关:

在开放API(Open API)中,客户需要将自身的数据、能力等作为开放平台对外开放,通常会以REST的方式对外提供,比如阿里云的开放平台、腾讯的QQ开放平台、微信开放平台等等,Open API开放平台必然会涉及到用户的应用接入、API权限管理、调用次数管理等,所以必然会有一个统一的入口来进行管理,这正是开放API(Open API)网关可以发挥作用的时候。

2 微服务网关:

微服务的概念最早是在2012年提出的,在SpringCloud的大力推广下,微服务在2014年后才逐渐得到了大力发展,在微服务架构中,有一个组件必不可少,那就是微服务网关,微服务网关实现了负载均衡、缓存、路由、访问控制、服务代理、监控、日志等功能,API网关在微服务架构中正是以微服务网关的身份存在。

3 API服务管理平台:

上述的微服务架构对一些企业来说可能存在实施上的困难,因为企业有很多遗留系统,如果要将这些遗留系统全部抽取改造成微服务架构的话,会导致改动量大大增加,且需要部署的服务器数量也会增多,这对企业来说成本太高,但是不同的系统之间存在大量的API服务相互调用,所以需要对系统间的服务调用进行管理,可以清晰地看到各系统之间的调用关系,对系统间的调用行为进行监控,API网关可以解决这些问题,如果没有大规模地实施微服务架构,那么对企业来说微服务网关就是企业的API服务管理平台。

2 网关作用是什么?

网关的作用是可以实现负载均衡、路由转发、日志、权限控制、监控等功能。

3 网关和拦截器、过滤器的区别是什么?

网关是拦截所有服务器的请求进行控制

拦截器是拦截某单个服务器的请求进行控制

过滤器是拦截某单个服务器的请求进行过滤,只放行符合过滤条件的请求。

4 如何设计微服务网关?

设计微服务网关包括开放API接口和内网API接口。

开放API接口:

对于Open API使用的API网关来说,一般合作伙伴要以应用的形式接入到Open API开放平台,然后需要到Open API开放平台申请应用,因此在Open API网关之外,需要有一个面向合作伙伴的使用平台,这就要求Open API网关需要提供API给这个用户平台进行访问。

当然如果是在简单的场景下,可能不需要提供一个面向合作伙伴的门户,只需要让公司的运营人员直接添加合作伙伴应用的应用ID/密钥等,这种情况下也就不需要合作伙伴门户子系统。

内网API接口:

对于内网的API网关来说,起到的作用上可以认为是微服务网关,也可以认为是内网的API服务管理平台,当企业将所有的应用都使用微服务架构管理起来的时候,API网关就起到了微服务网关的作用,当企业只是将系统和系统之间的调用使用REST API的方式进行访问时,使用API网关对调用进行管理,API网关就起到了API服务管理平台的作用。

对于公司内部公网应用(如APP、公司网站),如果管理的比较细致,在架构上可以使用单独的API网关来处理这部分内部公网应用,如果想要使用比较简单的方式实现,可以使用面向合作伙伴的API网关,如果使用独立的API网关,有以下几种好处:

1 面向合作伙伴和面向公司主体业务的优先级不一样,不同的API网关可以实现业务影响的隔离。

2 内网API使用的管理流程和面向合作伙伴的管理流程可能不一样。

3 内网API在功能扩展等方面的需求量一般会大于Open API在功能扩展等方面的需求量。

基于以上的分析,如果公司有能力,还是建议分开使用合作伙伴Open API网关和内部公网应用网关。

5 Nginx和Zuul的区别是什么?

Nginx是采用服务器负载均衡进行转发

Zuul依赖于Ribbon和Eureka实现本地负载均衡转发,

Zuul默认已经整合并开启了Ribbon实现的客户端负载均衡的功能,

Nginx功能比Zuul功能更加强大,能够整合其他的语言比如Lua脚本实现强大的功能,同时Nginx还可以更好地抗高并发,Zuul网关适用于一般请求过滤和拦截等。

6 动态网关实现思路是什么?

传统方式是将路由规则配置到配置文件中,如果路由规则发生了改变,需要重启服务器,可以整合SpringCloud Config分布式配置中心,实现动态路由规则网关。

Part 2 实践部分

Zuul网关

zuul是spring cloud的一个推荐组件:https://github.com/Netflix/zuul

使用Zuul实现反向代理
环境搭建
Maven依赖信息

<parent>

           <groupId>org.springframework.boot</groupId>

           <artifactId>spring-boot-starter-parent</artifactId>

           <version>2.0.1.RELEASE</version>

     </parent>

     <!-- 管理依赖 -->

     <dependencyManagement>

           <dependencies>

                <dependency>

                     <groupId>org.springframework.cloud</groupId>

                     <artifactId>spring-cloud-dependencies</artifactId>

                     <version>Finchley.M7</version>

                     <type>pom</type>

                     <scope>import</scope>

                </dependency>

           </dependencies>

     </dependencyManagement>

     <dependencies>

           <dependency>

                <groupId>org.springframework.cloud</groupId>

                <artifactId>spring-cloud-starter-netflix-zuul</artifactId>

           </dependency>

           <!-- SpringBoot整合eureka客户端 -->

           <dependency>

                <groupId>org.springframework.cloud</groupId>

                <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>

           </dependency>

     </dependencies>

     <!-- 注意: 这里必须要添加, 否者各种依赖有问题 -->

     <repositories>

           <repository>

                <id>spring-milestones</id>

                <name>Spring Milestones</name>

                <url>https://repo.spring.io/libs-milestone</url>

                <snapshots>

                     <enabled>false</enabled>

                </snapshots>

           </repository>

     </repositories>

application.yml

###注册 中心

eureka:

  client:

    serviceUrl:

      defaultZone: http://localhost:8100/eureka/

server:

  port: 80

###网关名称

spring:

  application:

    name: service-zuul

### 配置网关反向代理   

zuul:

  routes:

    api-a:

     ### 以 /api-member/访问转发到用户服务

      path: /api-member/**

      serviceId: app-ittcf-member

    api-b:

        ### 以 /api-order/访问转发到订单服务

      path: /api-order/**

      serviceId: app-ittcf-order

使用Zuul整合Ribbon

Zuul 默认开启了 Ribbon本地负载均衡功能。

使用Zuul过滤器

案例:使用过滤器验证客户端是否有登陆。

@Component

public class TokenFilter extends ZuulFilter {

    public Object run() throws ZuulException {

        // 获取上下文

        RequestContext currentContext = RequestContext.getCurrentContext();

        HttpServletRequest request = currentContext.getRequest();

        String userToken = request.getParameter("userToken");

        if (StringUtils.isEmpty(userToken)) {

             currentContext.setSendZuulResponse(false);

             currentContext.setResponseStatusCode(401);

             currentContext.setResponseBody("userToken is null");

             return null;

        }

        // 否则正常执行业务逻辑.....

        return null;

    }

    // 判断过滤器是否生效

    public boolean shouldFilter() {

        return true;

    }

    // 过滤器的执行顺序。当请求在一个阶段的时候存在多个多个过滤器时,需要根据该方法的返回值依次执行

    public int filterOrder() {

        return 0;

    }

    // 过滤器类型 pre 表示在 请求之前进行拦截

    public String filterType() {

        return "pre";

    }

}

动态网关

传统方式将路由规则配置在配置文件中,如果路由规则发生了改变,需要重启服务器。这时候我们可以整合SpringCloud Config分布式配置中心,实现动态路由规则。

在git上创建一个文件service-zuul-dev.yml

### 配置网关反向代理   

zuul:

  routes:

    api-a:

     ### 以 /api-member/访问转发到用户服务

      path: /api-member/**

      serviceId: app-ittcf-member

    api-b:

        ### 以 /api-order/访问转发到订单服务

      path: /api-order/**

      serviceId: app-ittcf-order

Maven依赖信息

新增监控中心依赖信息

<!-- actuator监控中心 -->

           <dependency>

                <groupId>org.springframework.boot</groupId>

                <artifactId>spring-boot-starter-actuator</artifactId>

           </dependency>

           <!-- springcloud config 2.0 -->

           <dependency>

                <groupId>org.springframework.cloud</groupId>

                <artifactId>spring-cloud-config-client</artifactId>

           </dependency>

application.yml

###服务注册地址

eureka:

  client:

    serviceUrl:

      defaultZone: http://localhost:8100/eureka/

###api网关端口号     

server:

  port: 80

###网关名称 

spring:

  application:

    name: service-zuul

  cloud:

    config:

    ####读取后缀

      profile: dev

      ####读取config-server注册地址

      discovery:

        service-id: config-server

        enabled: true   

###默认服务读取eureka注册服务列表 默认间隔30秒

###开启所有监控中心接口

management:

  endpoints:

    web:

      exposure:

        include: "*"

项目启动

// zuul配置能够使用config实现实时更新

      @RefreshScope

      @ConfigurationProperties("zuul")

      public ZuulProperties zuulProperties() {

            return new ZuulProperties();

      }

手动刷新接口

http://127.0.0.1/actuator/refresh

Zuul网关集群

Zuul网关集群使用Nginx反向代理即可,保证每台网关配置数据相同。

nginx.conf配置参考:

 upstream  backServer{

          server 127.0.0.1:81;

          server 127.0.0.1:82;

      }

    server {

        listen       80;

        server_name  wg.ittcf.com;

       location / {

                ### 指定上游服务器负载均衡服务器

                proxy_pass http://backServer/;

            index  index.html index.htm;

        }

    }

本文部分素材转载自蚂蚁课堂

相关文章:

微服务篇-C 深入理解第一代微服务(SpringCloud)_VI 深入理解Zuul服务网关

原创作者&#xff1a;田超凡&#xff08;程序员田宝宝&#xff09; 版权所有&#xff0c;引用请注明原作者&#xff0c;严禁复制转载 Part 1 理论部分 1 网关类别有哪些&#xff1f; 常见的网关类别有三种&#xff1a;开放API&#xff08;Open API&#xff09;网关、微服务…...

web CSS笔记1

CSS(Cascading Style Sheets) 美化样式 CSS通常称为CSS样式表或层叠样式表&#xff08;级联样式表&#xff09;&#xff0c;主要用于设置HTML页面中的文本内容&#xff08;字体、大小、对齐方式等&#xff09;、图片的外形&#xff08;宽高、边框样式、边距等&#xff09;以及…...

js算法记录

> 更多请前往 https://www.passerma.com/article/86 滑动窗口 1 给定一个矩阵&#xff0c;包含N*M个整数&#xff0c;和一个包含K个整数的数组。现在要求在这个矩阵中找一个宽度最小的子矩阵&#xff0c;要求子矩阵包含数组中所有的整数 function minSubmatrixWidth(mat…...

球面数据的几何深度学习--球形 CNN

目录 一、说明二、球形 CNN概述三、球面数据的对称性四、标准&#xff08;平面&#xff09;CNN的局限性五、卷积并发症六、球面卷积七、球面卷积是不够的 一、说明 球面数据的几何深度学习–球形 CNN。通过对物理世界的平移对称性进行编码&#xff0c;卷积神经网络 &#xff0…...

MySQL学习笔记------SQL(1)

关系型数据库&#xff08;RDBMS&#xff09; 建立在关系模型基础上&#xff0c;由多张相互连接的二维表组成的数据库 特点&#xff1a;使用表储存数据&#xff0c;格式统一&#xff0c;便于维护 使用SQL语言操作&#xff0c;标准统一&#xff0c;使用方便 SQL通用语法 SQL…...

PMP能提前查成绩?还能改分数?别太离谱!

震惊&#xff01;3月10日PMP考试才结束没多久&#xff0c;昨天就有学员收到了查分邮件&#xff0c;寄信人自称自己是内部人员&#xff0c;可以提前查询到成绩并直接修改成绩。 这也太离谱了吧&#xff01;在此&#xff0c;小赛想说&#xff0c;PMP考试是一个公正、严格的考试体…...

【保姆级讲解服务器硬件的基础知识】

服务器硬件基础知识 1. 前言2. 中央处理器&#xff08;CPU&#xff09;3. 内存&#xff08;RAM&#xff09;4. 存储设备5. 主板6. 电源供应单元&#xff08;PSU&#xff09;7. 冷却系统8. 网络连接9. 扩展插槽和端口10. 管理功能 &#x1f308;&#x1f308;&#x1f308;&…...

并查集---力扣547省份的数量

假设&#xff1a;有一群小混混打架&#xff0c;小弟们可能互相不认识&#xff0c;如果要确定他们是一伙的&#xff0c;就需要确定他们的组长是不是一个&#xff0c;但是每个组长的领导可能又不一样&#xff0c;所以要找到最大的那个领导&#xff0c;才能确定是一伙的。 我们先…...

stm32启动文件里面的__main和主函数main()

一、__main和main()之间的关系 先来对stm32启动过程简单学习 启动文件里面的Reset_Handler&#xff1a; 调用过程&#xff1a; stm32在启动后先进入重启中断函数Reset_Handler&#xff0c;其中会先后调用SystemInit和__main函数&#xff0c; __main函数属于c库函数&…...

曲线生成 | 图解Reeds-Shepp曲线生成原理(附ROS C++/Python/Matlab仿真)

目录 0 专栏介绍1 什么是Reeds-Shepp曲线&#xff1f;2 Reeds-Shepp曲线的运动模式3 Reeds-Shepp曲线算法原理3.1 坐标变换3.2 时间翻转(time-flip)3.3 反射变换(reflect)3.4 后向变换(backwards) 4 仿真实现4.1 ROS C实现4.2 Python实现4.3 Matlab实现 0 专栏介绍 &#x1f5…...

深入探讨iOS开发:从创建第一个iOS程序到纯代码实现全面解析

iOS开发作为移动应用开发的重要领域之一&#xff0c;对于开发人员具有重要意义。本文将深入探讨iOS开发的各个方面&#xff0c;从创建第一个iOS程序到纯代码实现iOS开发&#xff0c;带领读者全面了解iOS应用程序的开发流程和技术要点。 &#x1f4f1; 第一个iOS程序 在创建第…...

Python学习之-正则表达式

目录 前言&#xff1a;1.re.serach1.1例子&#xff1a; 2.re.match2.1示例1&#xff1a;2.2 示例2&#xff1a; 3.re.findall3.1 示例 4.re.fullmatch4.1 示例1&#xff1a;4.2 示例2: 5.re.split5.1 示例1:5.2 示例2&#xff1a;5.3 示例3&#xff1a; 6.re.sub6.1 示例&#…...

Godot.NET C# 工程化开发(1):通用Nuget 导入+ 模板文件导出,包含随机数生成,日志管理,数据库连接等功能

文章目录 前言Github项目地址&#xff0c;包含模板文件后期思考补充项目设置编写失误环境visual studio 配置详细的配置看我这篇文章 Nuget 推荐NewtonSoft 成功Bogus 成功Github文档地址随机生成构造器生成构造器接口(推荐) 文件夹设置Nlog 成功&#xff01;Nlog.configNlogHe…...

数据仓库——雪花模式以及层次递归

层次结构 钻取 向下钻取&#xff1a;对某些代表事实的报表中添加维度细节 向上钻取&#xff1a;从某些代表事实的报表中去除维度细节 属性层次 提供了一种自然方法&#xff0c;用于顺序地在不断深入的层次上组织事实。许多维度可以被理解为包含连续主从关系的属性层次。此类…...

Transformer的前世今生 day09(Transformer的框架概述)

前情提要 编码器-解码器结构 如果将一个模型分为两块&#xff1a;编码器和解码器那么编码器-解码器结构为&#xff1a;编码器负责处理输入&#xff0c;解码器负责生成输出流程&#xff1a;我们先将输入送入编码器层&#xff0c;得到一个中间状态state&#xff0c;并送入解码器…...

Qt 压缩/解压文件

前面讲了很多Qt的文件操作&#xff0c;文件操作自然就包括压缩与解压缩文件了&#xff0c;正好最近项目里要用到压缩以及解压缩文件&#xff0c;所以就研究了一下Qt如何压缩与解压缩文件。 QZipReader/QZipWriter QZipReader 和 QZipWriter 类提供了用于读取和写入 ZIP 格式文…...

【leetcode刷题之路】面试经典150题(8)——位运算+数学+一维动态规划+多维动态规划

文章目录 20 位运算20.1 【位运算】二进制求和20.2 【位运算】颠倒二进制位20.3 【位运算】位1的个数20.4 【位运算】只出现一次的数字20.5 【哈希表】【位运算】只出现一次的数字 II20.6 【位运算】数字范围按位与 21 数学21.1 【双指针】回文数21.2 【数学】加一21.3 【数学】…...

JetBrains全家桶激活,分享 WebStorm 2024 激活的方案

大家好&#xff0c;欢迎来到金榜探云手&#xff01; WebStorm公司简介 JetBrains 是一家专注于开发工具的软件公司&#xff0c;总部位于捷克。他们以提供强大的集成开发环境&#xff08;IDE&#xff09;而闻名&#xff0c;如 IntelliJ IDEA、PyCharm、和 WebStorm等。这些工具…...

Sublime 彻底解决中文乱码

1. 按ctrl&#xff0c;打开Console&#xff0c;输入如下代码&#xff1a; import urllib.request,os; pf Package Control.sublime-package; ipp sublime.installed_packages_path(); urllib.request.install_opener( urllib.request.build_opener( urllib.request.ProxyHand…...

复旦大学EMBA校友出席两会建言献策助力中国发展

阳春三月&#xff0c;备受瞩目的全国两会如期召开。期间&#xff0c;复旦大学EMBA多位校友作为第十四届全国人民代表大会代表、第十四届全国政协委员与全国各地代表共商国是。      无论是作为大型央企负责人&#xff0c;还是作为科创企业的中坚力量&#xff0c;复旦大学EM…...

virtualbox导入vdi

新建虚拟机 点击新建 输入新建属性 配置cpu和内存 虚拟硬盘 这里选择已有的vdi文件 摘要 这里点击完成 虚拟机添加成功 点击启动&#xff0c;启动虚拟机 注意 这个时候的ip&#xff0c;还是以前镜像的ip&#xff0c;如果两个镜像一起启动&#xff0c;则需要修 改ip地…...

【信号处理】基于DGGAN的单通道脑电信号增强和情绪检测(tensorflow)

关于 情绪检测&#xff0c;是脑科学研究中的一个常见和热门的方向。在进行情绪检测的分类中&#xff0c;真实数据不足&#xff0c;经常导致情绪检测模型的性能不佳。因此&#xff0c;对数据进行增强&#xff0c;成为了一个提升下游任务的重要的手段。本项目通过DCGAN模型实现脑…...

使用 Docker Compose 部署 Spring Boot 应用

使用 Docker Compose 部署 Spring Boot 应用 第一步&#xff1a;创建 Spring Boot 应用的 Dockerfile 在您的 Spring Boot 项目根目录中创建一个 Dockerfile。 编辑 Dockerfile&#xff0c;添加以下内容&#xff1a; # 基础镜像使用 OpenJDK FROM openjdk:11-jdk-slim# 维护者…...

nginx 正向代理 https

问题背景 因为网络环境受限&#xff0c;应用服务器无法直接访问外网&#xff0c;需要前置机上中转一下&#xff0c;这种情况可在应用服务器修改/etc/hosts文件指向前置机&#xff0c;在前置机上的nginx设置四层代理&#xff0c;从而出站。 方案 根据How to Use NGINX as an …...

vue3从其他页面跳转页面头部组件菜单el-menu菜单高亮

主要代码 import { ref, onMounted, watch } from vue; const activeIndex ref("/"); const route useRoute();onMounted(() > {updateActiveMenu(); });watch(() > route.path, updateActiveMenu);function updateActiveMenu() {// 根据路由更新activeMenu…...

python 条件循环语句

python 条件循环语句 一、条件控制语句1. Python3 条件控制2. if 语句3. if 嵌套4. match...case5. 注意&#xff1a; 二、循环控制语句1. Python3 循环语句2. while 循环3. 无限循环4. while 循环使用 else 语句5. 简单语句组6. for 语句7. for...else8. break 和 continue 语…...

CIM搭建实现发送消息的效果

目录 背景过程1、下载代码2、进行配置3、直接启动项目4、打开管理界面5、启动web客户端实例项目6、发送消息 项目使用总结 背景 公司项目有许多需要发送即时消息的场景&#xff0c;之前一直采用的是传统的websocket连接&#xff0c;它会存在掉线严重&#xff0c;不可重连&…...

C++第十三弹---内存管理(下)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】 目录 1、operator new与operator delete函数 1.1、operator new与operator delete函数 2、new和delete的实现原理 2.1、内置类型 2.2、自定义类型 …...

Python爬虫学习完整版

一、什么是爬虫 网络爬虫&#xff0c;是一种按照一定规则&#xff0c;自动抓取互联网信息的程序或者脚本。由于互联网数据的多样性和资源的有限性&#xff0c;根据用户需求定向抓取相关网页并分析也成为如今主流的爬取策略。 1 爬虫可以做什么 你可以爬取网络上的的图片&#…...

JavaScript中的继承方式详解

Question JavaScript实现继承的方式&#xff1f; 包含原型链继承、构造函数继承、组合继承、原型式继承、寄生式继承、寄生组合式继承和ES6 类继承 JavaScript实现继承的方式 在JavaScript中&#xff0c;实现继承的方式多种多样&#xff0c;每种方式都有其优势和适用场景。以下…...