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

本贴最后更新于 1631 天前,其中的信息可能已经渤澥桑田

概述

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

官方推荐版本如下:
image.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,将数据库相关配置注释放开,并修改成自己的数据库配置
    image.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"

其他模块大家自行修改。

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
image.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 就升级完成了,请大家自行测试
    image.png

sentinel 1.7

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

image.png

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

在新版本中已经没有这个问题了,所以我们可以在网关限流配置文件中将前缀删除。删除后的配置如下:
image.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

image.png

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

SpringCloud Gateway

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

通过对源码文件 org.springframework.cloud.gateway.filter.NettyRoutingFilter 的调试,发现新版本的 SpringCloud Gateway 在做转发时还保留我们配置的前缀。
image.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 升级完成,升级过程中会遇到各种各样的问题,面对问题的时候大家不要急躁,多通过代码调试定位问题,定位到问题后我相信利用好搜索引擎是可以解决的。

  • Spring

    Spring 是一个开源框架,是于 2003 年兴起的一个轻量级的 Java 开发框架,由 Rod Johnson 在其著作《Expert One-On-One J2EE Development and Design》中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 JavaEE 应用程序开发提供集成的框架。

    944 引用 • 1459 回帖 • 18 关注
  • 架构

    我们平时所说的“架构”主要是指软件架构,这是有关软件整体结构与组件的抽象描述,用于指导软件系统各个方面的设计。另外还有“业务架构”、“网络架构”、“硬件架构”等细分领域。

    142 引用 • 442 回帖
  • 微服务

    微服务架构是一种架构模式,它提倡将单一应用划分成一组小的服务。服务之间互相协调,互相配合,为用户提供最终价值。每个服务运行在独立的进程中。服务于服务之间才用轻量级的通信机制互相沟通。每个服务都围绕着具体业务构建,能够被独立的部署。

    96 引用 • 155 回帖 • 1 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...