Spring Cloud微服务体系

本文涉及的产品
注册配置 MSE Nacos/ZooKeeper,118元/月
云原生网关 MSE Higress,422元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: 在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
  1. 本篇实战所使用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个路由方式任选一种即可

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

       详情见:资料/application-a.yml
      
       注1:gateway默认路由规则
            http://gateway_host:gateway_port/大写的serviceId/**
                
    2. [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判断是访问的是静态资源,还是动态资源的
      
    3. [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 配置

<groupId>io.projectreactor</groupId>
<artifactId>reactor-test</artifactId>
<version>3.1.4.RELEASE</version>
<scope>test</scope>

附录二: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
后启动好网关,再启动服务,可以发现网关可以正常的转发到已注册的服务上。

原文地址:https://github.com/alibaba/nacos/issues/2302

附录十:spring注解实现初始化方法(转)
常用的设定方式有以下三种:
通过实现 InitializingBean/DisposableBean 接口来定制初始化之后/销毁之前的操作方法;
通过 元素的 init-method/destroy-method属性指定初始化之后 /销毁之前调用的操作方法;
在指定方法上加上@PostConstruct 或@PreDestroy注解来制定该方法是在初始化之后还是销毁之前调用。

相关文章
|
14天前
|
消息中间件 Java 开发者
【颠覆想象】Spring Boot重构未来:解耦与隔离,打造坚不可摧的微服务帝国!
【8月更文挑战第29天】本文通过构建电子商务平台的具体案例,深入探讨了如何利用 Spring Boot 实现服务间的解耦与隔离。文章详细介绍了依赖注入、模块化设计及异步通信等关键技术,并提供了具体代码示例。通过依赖注入,对象间耦合得以降低;模块化设计使各功能域独立,降低系统复杂度;异步通信则利用消息队列提升系统吞吐量与响应速度。这些方法不仅优化了系统架构,还加快了开发进程。
36 0
|
13天前
|
Java UED Sentinel
微服务守护神:Spring Cloud Sentinel,让你的系统在流量洪峰中稳如磐石!
【8月更文挑战第29天】Spring Cloud Sentinel结合了阿里巴巴Sentinel的流控、降级、熔断和热点规则等特性,为微服务架构下的应用提供了一套完整的流量控制解决方案。它能够有效应对突发流量,保护服务稳定性,避免雪崩效应,确保系统在高并发下健康运行。通过简单的配置和注解即可实现高效流量控制,适用于高并发场景、依赖服务不稳定及资源保护等多种情况,显著提升系统健壮性和用户体验。
41 1
|
13天前
|
Cloud Native Java Nacos
微服务时代的新宠儿!Spring Cloud Nacos实战指南,带你玩转服务发现与配置管理,拥抱云原生潮流!
【8月更文挑战第29天】Spring Cloud Nacos作为微服务架构中的新兴之星,凭借其轻量、高效的特点,迅速成为服务发现、配置管理和治理的首选方案。Nacos(命名和配置服务)由阿里巴巴开源,为云原生应用提供了动态服务发现及配置管理等功能,简化了服务间的调用与依赖管理。本文将指导你通过五个步骤在Spring Boot项目中集成Nacos,实现服务注册、发现及配置动态管理,从而轻松搭建出高效的微服务环境。
76 0
|
13天前
|
Dubbo Java 应用服务中间件
💥Spring Cloud Dubbo火爆来袭!微服务通信的终极利器,你知道它有多强大吗?🔥
【8月更文挑战第29天】随着信息技术的发展,微服务架构成为企业应用开发的主流模式,而高效的微服务通信至关重要。Spring Cloud Dubbo通过整合Dubbo与Spring Cloud的优势,提供高性能RPC通信及丰富的生态支持,包括服务注册与发现、负载均衡和容错机制等,简化了服务调用管理并支持多种通信协议,提升了系统的可伸缩性和稳定性,成为微服务通信领域的优选方案。开发者仅需关注业务逻辑,而无需过多关心底层通信细节,使得Spring Cloud Dubbo在未来微服务开发中将更加受到青睐。
30 0
|
3天前
|
前端开发 Java UED
"揭秘!如何以戏剧性姿态,利用SpringCloud铸就无懈可击的异常处理铁壁,让你的微服务架构稳如泰山,震撼业界!"
【9月更文挑战第8天】随着微服务架构的普及,Spring Cloud作为一套完整的微服务解决方案被广泛应用。在微服务架构中,服务间调用频繁且复杂,异常处理成为保障系统稳定性和用户体验的关键。传统的异常处理方式导致代码冗余,降低系统可维护性和一致性。因此,基于Spring Cloud封装统一的异常处理机制至关重要。这样不仅可以减少代码冗余、提升一致性,还增强了系统的可维护性,并通过统一的错误响应格式优化了用户体验。具体实现包括定义全局异常处理器、自定义业务异常以及在服务中抛出这些异常。这种方式体现了微服务架构中的“服务治理”和“契约先行”原则,有助于构建健壮、可扩展的系统。
18 2
|
6天前
|
缓存 Java 应用服务中间件
随着微服务架构的兴起,Spring Boot凭借其快速开发和易部署的特点,成为构建RESTful API的首选框架
【9月更文挑战第6天】随着微服务架构的兴起,Spring Boot凭借其快速开发和易部署的特点,成为构建RESTful API的首选框架。Nginx作为高性能的HTTP反向代理服务器,常用于前端负载均衡,提升应用的可用性和响应速度。本文详细介绍如何通过合理配置实现Spring Boot与Nginx的高效协同工作,包括负载均衡策略、静态资源缓存、数据压缩传输及Spring Boot内部优化(如线程池配置、缓存策略等)。通过这些方法,开发者可以显著提升系统的整体性能,打造高性能、高可用的Web应用。
27 2
|
6天前
|
Cloud Native 安全 Java
Micronaut对决Spring Boot:谁是微服务领域的王者?揭秘两者优劣,选对框架至关重要!
【9月更文挑战第5天】近年来,微服务架构备受关注,Micronaut和Spring Boot成为热门选择。Micronaut由OCI开发,基于注解的依赖注入,内置多种特性,轻量级且启动迅速;Spring Boot则简化了Spring应用开发,拥有丰富的生态支持。选择框架需考虑项目需求、团队经验、性能要求及社区支持等因素。希望本文能帮助您选择合适的微服务框架,助力您的软件开发项目取得成功!
35 2
|
24天前
|
Java 微服务 Spring
SpringBoot+Vue+Spring Cloud Alibaba 实现大型电商系统【分布式微服务实现】
文章介绍了如何利用Spring Cloud Alibaba快速构建大型电商系统的分布式微服务,包括服务限流降级等主要功能的实现,并通过注解和配置简化了Spring Cloud应用的接入和搭建过程。
SpringBoot+Vue+Spring Cloud Alibaba 实现大型电商系统【分布式微服务实现】
|
11天前
|
Java 微服务 Spring
驾驭复杂性:Spring Cloud在微服务构建中的决胜法则
【8月更文挑战第31天】Spring Cloud是在Spring Framework基础上打造的微服务解决方案,提供服务发现、配置管理、消息路由等功能,适用于构建复杂的微服务架构。本文介绍如何利用Spring Cloud搭建微服务,包括Eureka服务发现、Config Server配置管理和Zuul API网关等组件的配置与使用。通过Spring Cloud,可实现快速开发、自动化配置,并提升系统的伸缩性和容错性,尽管仍需面对分布式事务等挑战,但其强大的社区支持有助于解决问题。
23 0
|
13天前
|
消息中间件 Java RocketMQ
微服务架构师的福音:深度解析Spring Cloud RocketMQ,打造高可靠消息驱动系统的不二之选!
【8月更文挑战第29天】Spring Cloud RocketMQ结合了Spring Cloud生态与RocketMQ消息中间件的优势,简化了RocketMQ在微服务中的集成,使开发者能更专注业务逻辑。通过配置依赖和连接信息,可轻松搭建消息生产和消费流程,支持消息过滤、转换及分布式事务等功能,确保微服务间解耦的同时,提升了系统的稳定性和效率。掌握其应用,有助于构建复杂分布式系统。
31 0