• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

SpringCloud服务网关 spring cloud gateway

武飞扬头像
鑫品
帮助1

0. 本篇实战所使用Spring有关版本

SpringCloudGateway 与 Nacos 整合踩坑 (Hoxton.SR1 版本)

原版本:

SpringBoot 版本:2.2.4RELEASE

SpringCloud 版本:Hoxton.SR1

SpringCloudAlibabaCloud 版本:2.1.1RELEASE

出现的问题:

Gateway 启动后,配置 routers,可以进行跳转百度页面,但是无法转发在 Nacos 已经注册的服务,该服务运行正常可以再 Nacos 控制台看到,Gateway 也配置了

但是没有效果,后在 github 查找,说是在 v2.2.1 其中发现问题,主要原因是 springcloud 升级到 H 版本后,更换路由基础组件导致。遇到问题可以暂时将 springboot 版本降为 2.1.x。

现修改后版本如下:

SpringBoot:2.1.12.RELEASE

SpringCloud:Greenwich.SR5

SpringCloudAlibaba:2.1.1.RELEASE

后启动好网关,再启动服务,可以发现网关可以正常的转发到已注册的服务上。

1. 背景介绍

    在Spring Cloud微服务体系下,常用的服务网关有Netflix公司开源的Zuul和Spring Cloud自己开源的Spring Cloud Gateway

    1.1 Netflix公司的zuul

          Spring Cloud集成的Spring Cloud Zuul是Zuul1.x    

          Zuul版本已经迭代至2.x,但是Spring Cloud并未集成

    1.2 Spring Cloud Gateway

          Spring Cloud Gateway 是 Spring Cloud 的一个全新项目,该项目是基于Netty、Reactor以及WEbFlux构建,它旨在为微服务架构提供一种简单有效的统一的 API 路由管理方式。

          Spring Cloud Gateway 作为 Spring Cloud 生态系统中的网关,目标是替代 Netflix Zuul,其不仅提供统一的路由方式,并且基于 Filter 链的方式提供了网关基本的功能,例如:安全、监控、埋点和限流等。

    1.3 题外话:Zuul和Gateway的恩怨情仇

          zuul是netflix开源的一个项目,Spring只是将Zuul集成在了Spring Cloud中。而Spring Cloud Gateway是Spring Cloud的一个子项目。

          还有一个版本的说法是Zuul2的连续跳票和Zuul1的性能并不是很理想,从而催生了Spring Cloud Gateway。

          网上很多地方都说Zuul是阻塞的,Gateway是非阻塞的,这么说是不严谨的,准确的讲Zuul1.x是阻塞的,而在2.x的版本中,Zuul也是基于Netty,也是非阻塞的,如果一定要说性能,其实这个真没多大差距。

   

     最后,本章将基于Spring Cloud Gateway nacos实现服务网关动态路由

2. Spring Cloud Gateway优缺点

    优点

    性能强劲,是Zuul的1.6倍

    功能强大,内置了很多实用的功能,例如转发、监控、限流等

    设计优雅,容易扩展

    缺点

    依赖Netty与WebFlux,不是传统的Servlet编程模型,有一定的学习成本

    不能在Servlet容器下工作,也不能构建成WAR包,即不能将其部署在Tomcat、Jetty等Servlet容器里,只能打成jar包执行

    不支持Spring Boot 1.x,需2.0及更高的版本

3. 快速入门

    1. 启动nacos

    2. 创建子模块gateway-server,

        继承主模块,并添加自己特有的依赖,详情见:资料/gateway-server-pom.xml

    

    ## 在项目开发中,3/4/5这3个路由方式任选一种即可

    3. [Spring Cloud Gateway gateway默认路由规则]实现路由功能

         详情见:资料/application-a.yml

         注1:gateway默认路由规则

              http://gateway_host:gateway_port/大写的serviceId/**

                  

    4. [Spring Cloud Gateway 自定义路由规则]实现路由功能

        详情见:资料/application-b.yml

        1. RouteDefinition中,主要有五个属性:

            id:路由标识(id:标识,具有唯一性,默认为uuid

            predicates:PredicateDefinition 路由断言定义列表

            filters:FilterDefinition 过滤器定义列表,为一个数组

            uri:目标服务地址(uri:地址,请求转发后的地址)

            order:优先级, 越小越优先

        注1:可以关闭上面的默认路由,不然有2个路由配置均可访问系统服务

                 spring.cloud.gateway.discovery.locator.enabled=false

        注2:目前地址:http://localhost:5000/usr/hello

                 以后地址:http://localhost:5000/api/usr/hello  

                 又多了一个前缀/api,前缀/api对象后台微服务没用,主要是给nginx判断是访问的是静态资源,还是动态资源的

        

    5. [Spring Cloud Gateway 自定义路由规则 nacos配置]实现[动态]路由功能

        详情见:资料/application-c.yml

       实现思路

       1. 添加动态路由相关源码

           详情见:src/*.java

         

           BUG(2020-02-16):DynamicRoutingConfig,这个只能解决动态变更的问题。如果路由初始配置已经存在,启动的时候是没有加载这个初始配置的。

                                          必须重新改nacos中的配置项,DynamicRoutingConfig监听到了,才会重新加载,nacos中配置的路由才会生效

           

       2. 路由信息不再配置在配置文件中,将路由信息配置在Nacos的配置中。

           详情见:资料/dynamic-routing.json

           注1:此json中的属性refreshGatewayRoute要修改成true,才能开启动态路由功能(DynamicRoutingConfig中第80行)

           注2:解决无法读取nacos原有配置而要更新后才能读取配置的BUG

                   String json = configService.getConfig(gatewayNacosProperties.getDataId(), gatewayNacosProperties.getGroup(), 5000);

       3. 在服务网关Spring Cloud Gateway中开启监听,监听Nacos配置文件的修改。

       4. Nacos配置文件一旦发生改变,则Spring Cloud Gateway重新刷新自己的路由信息。        

       个人体会:感觉不是太大的项目,使用自定义路由规则足够用了

   

        

4. Gateway跨域访问

    Spring Cloud Gateway还针对跨域访问做了设计,可以使用以下配置解决跨域访问问题:

spring:

  cloud:

    gateway:

      discovery:

      # 跨域

      globalcors:

        corsConfigurations:

          '[/**]':

            allowedHeaders: "*"

            allowedOrigins: "*"

            allowedMethods:

            - GET

              POST

              DELETE

              PUT

              OPTION

附录一:测试在非常重视DevOps的今天,以及一些奉行TDD的团队中,自动化测试是保证代码质量的重要手段。要进行Reactor的测试,首先要确保添加reactor-test依赖。

reactor-test 用 Maven 配置

<dependency>

    <groupId>io.projectreactor</groupId>

    <artifactId>reactor-test</artifactId>

    <version>3.1.4.RELEASE</version>

    <scope>test</scope>

</dependency>

附录二:springboot 监控 Actuator

因为actuator默认只支持端点 /health、/info 所以访问 /env 会出现404页面。

如何配置端点

在application.properties中配置端点,

暴露部分端点

management.endpoints.web.exposure.include=info,health,beans,env

暴露所有端点

management.endpoints.web.exposure.include=*

不暴露beans端点

management.endpoints.web.exposure.exclude=beans

在上述配置中,首先使用 management.endpoints.web.exposure.include 暴露所有的端点,接着使用management.endpoints .web.exposure.exclud 排除 en 端点,这样就能够暴露除 env 外的所有 ctuator

端点了。

附录三:@ConfigurationProperties

附录四:常见问题

1.使用nacos做为注册中心,启动一些微服务向其注册时老是报端口被占用,启动失败。如何解决?启动电脑,个人认为,程序有BUG,服务停止了,但端口未释放

附录五:Java8之Predicate函数(即断言函数)

Predicate:翻译成中文即“断言”

附录六:yaml配置数组写法

texts:

-"mango"

-"apple"

-"banana"

以上yaml配置文件等同于的js写法

var texts=["mango","apple","banana"]

附录七:springboot中jackson的配置

  jackson:

    date-format: yyyy-MM-dd HH:mm:ss

    time-zone: GMT 8

    default-property-inclusion: non_null

附录八:gateway网关中uri配置lb://demo-service是什么意思呢

附录九:SpringCloudGateway 与 Nacos 整合踩坑 (Hoxton.SR1 版本)

使用环境:

SpringBoot 版本:2.2.4RELEASE

SpringCloud 版本:Hoxton.SR1

SpringCloudAlibabaCloud 版本:2.1.1RELEASE

出现的问题:

Gateway 启动后,配置 routers,可以进行跳转百度页面,但是无法转发在 Nacos 已经注册的服务,该服务运行正常可以再 Nacos 控制台看到,Gateway 也配置了

但是没有效果,后在 github 查找,说是在 v2.2.1 其中发现问题,主要原因是 springcloud 升级到 H 版本后,更换路由基础组件导致。遇到问题可以暂时将 springboot 版本降为 2.1.x。

现在修改版本如下:

SpringBoot:2.1.12.RELEASE

SpringCloud:Greenwich.SR5

SpringCloudAlibaba:2.1.1.RELEASE

后启动好网关,再启动服务,可以发现网关可以正常的转发到已注册的服务上。

附录十:spring注解实现初始化方法(转)

常用的设定方式有以下三种:

通过实现 InitializingBean/DisposableBean 接口来定制初始化之后/销毁之前的操作方法;

通过 <bean> 元素的 init-method/destroy-method属性指定初始化之后 /销毁之前调用的操作方法;

在指定方法上加上@PostConstruct 或@PreDestroy注解来制定该方法是在初始化之后还是销毁之前调用。

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhfjajbf
系列文章
更多 icon
同类精品
更多 icon
继续加载