SpringCloud Alibaba微服务实战十六 - 版本升级

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,高可用系列 2核4GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: SpringCloud Alibaba微服务实战十六 - 版本升级

概述


好久没有更新SpringCloud Alibaba 系列的文章了,今天我们来将版本升级到最新的毕业版本。并且将原来容器化部署的组件seata、nacos、sentinel拉出来单独部署,为我们后面k8s部署作准备。

官方推荐版本如下:

这篇文章主要是讲升级过程中遇到的一些问题并讲述解决的过程与方法,如果要了解详细用法还请翻看之前的文章。


主版本升级

<properties>
...
 <spring-boot.version>2.2.5.RELEASE</spring-boot.version>
 <alibaba-cloud.version>2.2.1.RELEASE</alibaba-cloud.version>
 <springcloud.version>Hoxton.SR3</springcloud.version>
...
</properties>

修改parent模块主pom文件对应的组件版本,修改完成后重新下载jar包。


nacos 1.2

nacos的升级比较容易,按照下面步骤两步即可完成。

  • 初始化nacos数据库nacos-mysql.sql
  • 修改nacos配置文件 application.properties,将数据库相关配置注释放开,并修改成自己的数据库配置

seata 1.2

seata初始化的过程我们之前教程中有过详细说明,但是新老版本之间差异比较大,我们这里再顺带提一下,大家可以按照如下步骤完成。

<dependency>
 <groupId>com.alibaba.cloud</groupId>
 <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
</dependency>

SpringCloud Alibaba 2.2.1 RELEASE  使用的是 SEATA1.1的版本,如果想体验SEATA1.2的特性,可以在此基础上去掉seata的依赖,手动加入1.2版本。

<dependency>
 <groupId>com.alibaba.cloud</groupId>
 <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
 <exclusions>
  <exclusion>
   <artifactId>seata-spring-boot-starter</artifactId>
   <groupId>io.seata</groupId>
  </exclusion>
 </exclusions>
</dependency>
<dependency>
 <groupId>io.seata</groupId>
 <artifactId>seata-spring-boot-starter</artifactId>
 <version>1.2.0</version>
</dependency>
seata:
  enabled: true
  application-id: ${spring.application.name}
  tx-service-group: account_service_group
  enable-auto-data-source-proxy: true
  config:
    type: nacos
    nacos:
      namespace:
      serverAddr: 10.0.23.48:8848
      group: SEATA_GROUP
      userName: "nacos"
      password: "nacos"
  registry:
    type: nacos
    nacos:
      application: seata-server
      server-addr: 10.0.23.48:8848
      namespace:
      userName: "nacos"
      password: "nacos"

其他模块大家自行修改。

service.vgroupMapping.account_service_group=default
service.vgroupMapping.product_service_group=default
service.vgroupMapping.order_service_group=default
store.mode=db
store.db.datasource=druid
store.db.dbType=mysql
store.db.driverClassName=com.mysql.jdbc.Driver
store.db.url=jdbc:mysql://10.0.23.48:3306/seata?useUnicode=true
store.db.user=root
store.db.password=xxxxxx
store.db.minConn=5
store.db.maxConn=30
store.db.globalTable=global_table
store.db.branchTable=branch_table
store.db.queryLimit=100
store.db.lockTable=lock_table
store.db.maxWait=5000

修改完成后在git中执行shell命令 sh nacos-config.sh -h 10.0.23.48 -p 8848 -g SEATA_GROUP -u nacos -w nacos,执行完成后配置文件就被推送到了nacos

  • 修改seata服务端配置 registry.conf, 完成后启动seata服务端
registry {
  type = "nacos"
  nacos {
    application = "seata-server"
    serverAddr = "10.0.23.48:8848"
    namespace = ""
    cluster = "default"
    username = "nacos"
    password = "nacos"
  }
}
config {
  type = "nacos"
  nacos {
    serverAddr = "10.0.23.48:8848"
    namespace = ""
    group = "SEATA_GROUP"
    username = ""
    password = ""
  }
}
  • 经过上面几步配置seata就升级完成了,请大家自行测试

sentinel 1.7

使用sentinel的时候,很多同学都会遇到在sentinel控制台不显示api管理菜单,不能读取nacos限流配置等情况,大家可以在gateway模块启动的时候加上启动参数 -Dcsp.sentinel.app.type=1,重启sentinel控制台即可正常显示。

在之前的文章中曾经提到过老版本的Sentinel在与网关集成时限流不生效的问题,原因是因为sentinel获取到的网关id并不是我们配置的account-service,而是加了 CompositeDiscoveryClient_ 前缀,原文说明如下:

在新版本中已经没有这个问题了,所以我们可以在网关限流配置文件中将前缀删除。删除后的配置如下:

auth-service

使用postman去auth-service获取access_token的时候如果出现如下错误

org.springframework.security.core.authority.SimpleGrantedAuthority; local class incompatible: stream classdesc serialVersionUID = 510, local class serialVersionUID = 520

image.png

出现这个问题的原因是原来数据库已经存储了账号对应的access_token了,但是SpringSecurity不支持跨版本的序列化,解决方法也很简单,只要把你的用户对应的access_token给删除,重新生成即可。

SpringCloud Gateway

使用PostMan做集成测试时发现接口调用一直提示404 Not Found 错误。

通过对源码文件org.springframework.cloud.gateway.filter.NettyRoutingFilter 的调试,发现新版本的SpringCloud Gateway在做转发时还保留我们配置的前缀。

如上图所示,转发后还带上前缀导致不能找到对应的请求路径,所以出现404异常。

要解决这个问题我们需要在转发前删掉这一前缀,刚好SprtingCloud Gateway提供了StripPrefix GatewayFilter filter,可以用来解决这一问题:

The StripPrefix GatewayFilter factory takes one parameter, parts. The parts parameter indicates the number of parts in the path to strip from the request before sending it downstream.

详情请参看:https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.2.RELEASE/reference/html/#the-stripprefix-gatewayfilter-factory

既然知道了异常原因也找到了解决方法,那就很简单了。只需要在网关模块配置映射时加上默认过滤器即可:

spring:
  cloud:
 gateway:
      discovery:
        locator:
          enabled: true
      routes:
      - id: account-service
        uri: lb://account-service
        predicates:
          - Path=/account-service/**
  ...
      # 解决前缀转发问题
      default-filters:
        - StripPrefix=1

经过以上几步我们的SpringCloud alibaba 升级完成,升级过程中会遇到各种各样的问题,面对问题的时候大家不要急躁,多通过代码调试定位问题,定位到问题后我相信利用好搜索引擎是可以解决的。

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
目录
相关文章
|
1月前
|
算法 Java 微服务
【SpringCloud(1)】初识微服务架构:创建一个简单的微服务;java与Spring与微服务;初入RestTemplate
微服务架构是What?? 微服务架构是一种架构模式,它提出将单一应用程序划分为一组小的服务,服务之间互相协调、互相配合,为用户提供最终价值。 每个服务允许在其独立的进程中,服务于服务间采用轻量级的通信机制互相协作(通常是Http协议的RESTful API或RPC协议)。 每个服务都围绕着具体业务进行构建,并且能够被独立的部署到生产环境、类生产环境等。另外应当尽量避免统一的、集中式的服务管理机制,对具体的一个服务而言,应根据上下文,选择合适的语言、工具对其进行构建
435 126
|
1月前
|
负载均衡 算法 Java
【SpringCloud(2)】微服务注册中心:Eureka、Zookeeper;CAP分析;服务注册与服务发现;单机/集群部署Eureka;连接注册中心
1. 什么是服务治理? SpringCloud封装了Netfix开发的Eureka模块来实现服务治理 在传统pc的远程调用框架中,管理每个服务与服务之间依赖关系比较复杂,管理比较复杂,所以需要使用服务治理,管理服务于服务之间依赖关系,可以实现服务调用、负载均衡、容错等,实现服务发现与注册
230 0
|
1月前
|
Cloud Native Serverless API
微服务架构实战指南:从单体应用到云原生的蜕变之路
🌟蒋星熠Jaxonic,代码为舟的星际旅人。深耕微服务架构,擅以DDD拆分服务、构建高可用通信与治理体系。分享从单体到云原生的实战经验,探索技术演进的无限可能。
微服务架构实战指南:从单体应用到云原生的蜕变之路
|
1月前
|
监控 Cloud Native Java
Spring Boot 3.x 微服务架构实战指南
🌟蒋星熠Jaxonic,技术宇宙中的星际旅人。深耕Spring Boot 3.x与微服务架构,探索云原生、性能优化与高可用系统设计。以代码为笔,在二进制星河中谱写极客诗篇。关注我,共赴技术星辰大海!(238字)
Spring Boot 3.x 微服务架构实战指南
|
1月前
|
负载均衡 Java API
《深入理解Spring》Spring Cloud 构建分布式系统的微服务全家桶
Spring Cloud为微服务架构提供一站式解决方案,涵盖服务注册、配置管理、负载均衡、熔断限流等核心功能,助力开发者构建高可用、易扩展的分布式系统,并持续向云原生演进。
|
2月前
|
监控 安全 Java
Spring Cloud 微服务治理技术详解与实践指南
本文档全面介绍 Spring Cloud 微服务治理框架的核心组件、架构设计和实践应用。作为 Spring 生态系统中构建分布式系统的标准工具箱,Spring Cloud 提供了一套完整的微服务解决方案,涵盖服务发现、配置管理、负载均衡、熔断器等关键功能。本文将深入探讨其核心组件的工作原理、集成方式以及在实际项目中的最佳实践,帮助开发者构建高可用、可扩展的分布式系统。
205 1
|
SpringCloudAlibaba API 开发者
新版-SpringCloud+SpringCloud Alibaba
新版-SpringCloud+SpringCloud Alibaba
|
8月前
|
负载均衡 Dubbo Java
Spring Cloud Alibaba与Spring Cloud区别和联系?
Spring Cloud Alibaba与Spring Cloud区别和联系?
|
9月前
|
人工智能 SpringCloudAlibaba 自然语言处理
SpringCloud Alibaba AI整合DeepSeek落地AI项目实战
在现代软件开发领域,微服务架构因其灵活性、可扩展性和模块化特性而受到广泛欢迎。微服务架构通过将大型应用程序拆分为多个小型、独立的服务,每个服务运行在其独立的进程中,服务与服务间通过轻量级通信机制(通常是HTTP API)进行通信。这种架构模式有助于提升系统的可维护性、可扩展性和开发效率。
3009 2
|
11月前
|
SpringCloudAlibaba 负载均衡 Dubbo
【SpringCloud Alibaba系列】Dubbo高级特性篇
本章我们介绍Dubbo的常用高级特性,包括序列化、地址缓存、超时与重试机制、多版本、负载均衡。集群容错、服务降级等。
1653 7
【SpringCloud Alibaba系列】Dubbo高级特性篇
下一篇
oss云网关配置