2023-02-27  阅读(36)
原文作者:Java日知录 原文地址:https://javadaily.cn

概述

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

官方推荐版本如下:

202302272300491971.png

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

主版本升级

    <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,将数据库相关配置注释放开,并修改成自己的数据库配置

    202302272300500562.png

seata 1.2

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

  • 在业务系统中创建数据表 undo_log,sql文件从下面地址获取:
    https://github.com/seata/seata/blob/develop/script/client/at/db/mysql.sql
  • 在你的mysql数据库中创建名为seata的库,并初始化,sql文件从下面地址获取:
    https://github.com/seata/seata/blob/develop/script/server/db/mysql.sql
  • seata新版本修改了artifactId,所以我们需要修改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客户端的配置
    原来我们在客户端是使用 registry.conf 作为seata的配置文件,现在需要将配置移到application.yml或配置中心中,具体配置大家可以参考官网文件 https://github.com/seata/seata/blob/develop/script/client/spring/application.yml, 我的配置如下:
    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"

其他模块大家自行修改。

  • 将seata的配置推送到nacos。
    采用db模式,操作步骤请参照官方说明: https://github.com/seata/seata/tree/develop/script/config-center
    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

202302272300510793.png

  • 修改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就升级完成了,请大家自行测试

    202302272300519814.png

sentinel 1.7

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

202302272300533655.png

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

202302272300538636.png

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

202302272300551817.png

auth-service

使用postman去auth-service获取access_token的时候如果出现如下错误
org.springframework.security.core.authority.SimpleGrantedAuthority; local class incompatible: stream classdesc serialVersionUID = 510, local class serialVersionUID = 520

202302272300558458.png

image.png

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

SpringCloud Gateway

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

202302272300579229.png

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

2023022723005867610.png

如上图所示,转发后还带上前缀导致不能找到对应的请求路径,所以出现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 升级完成,升级过程中会遇到各种各样的问题,面对问题的时候大家不要急躁,多通过代码调试定位问题,定位到问题后我相信利用好搜索引擎是可以解决的。


Java 面试宝典是大明哥全力打造的 Java 精品面试题,它是一份靠谱、强大、详细、经典的 Java 后端面试宝典。它不仅仅只是一道道面试题,而是一套完整的 Java 知识体系,一套你 Java 知识点的扫盲贴。

它的内容包括:

  • 大厂真题:Java 面试宝典里面的题目都是最近几年的高频的大厂面试真题。
  • 原创内容:Java 面试宝典内容全部都是大明哥原创,内容全面且通俗易懂,回答部分可以直接作为面试回答内容。
  • 持续更新:一次购买,永久有效。大明哥会持续更新 3+ 年,累计更新 1000+,宝典会不断迭代更新,保证最新、最全面。
  • 覆盖全面:本宝典累计更新 1000+,从 Java 入门到 Java 架构的高频面试题,实现 360° 全覆盖。
  • 不止面试:内容包含面试题解析、内容详解、知识扩展,它不仅仅只是一份面试题,更是一套完整的 Java 知识体系。
  • 宝典详情:https://www.yuque.com/chenssy/sike-java/xvlo920axlp7sf4k
  • 宝典总览:https://www.yuque.com/chenssy/sike-java/yogsehzntzgp4ly1
  • 宝典进展:https://www.yuque.com/chenssy/sike-java/en9ned7loo47z5aw

目前 Java 面试宝典累计更新 400+ 道,总字数 42w+。大明哥还在持续更新中,下图是大明哥在 2024-12 月份的更新情况:

想了解详情的小伙伴,扫描下面二维码加大明哥微信【daming091】咨询

同时,大明哥也整理一套目前市面最常见的热点面试题。微信搜[大明哥聊 Java]或扫描下方二维码关注大明哥的原创公众号[大明哥聊 Java] ,回复【面试题】 即可免费领取。

阅读全文