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

spring boot升级spring cloud注意事项

武飞扬头像
彩虹海。
帮助1

项目升级,从springboot转成springcloud,记录一些过程中遇到的问题和坑。

一、确定版本和组件选型

版本不兼容会造成很多问题,所以需要根据项目使用的Spring Boot Version确定相关版本。
此处使用的是Spring Boot Version: 2.3.5.RELEASE,参考官网推荐以及支持的稳定版本最终确定各版本如下:
Spring Boot Version: 2.3.5.RELEASE
Spring Cloud Version: Hoxton.SR9
Spring Cloud Alibaba Version:2.2.6.RELEASE

组件选型如下:
1、服务注册与发现:Nacos 1.4.2
2、配置中心:Nacos 1.4.2
3、网关:Spring Cloud Gateway 2.2.6 RELEASE
4、服务调用和负载均衡:OpenFeign 2.2.6 RELEASE
5、服务降级:Sentinel 1.8.1

如何确定版本?

Git版本说明网址:(组件版本以及依赖关系)
学新通

Spring Cloud Version: Hoxton.SR9 官方文档
学新通

ps:如果页面上没有展示你要找的版本,可以把后缀版本换成你要找的。
Spring Cloud 官网地址
spring-cloud-alibaba项目git网址

如何确定组件选型?

根据项目需求,确定相关组件的选择,主要从以下几点入手:
1、兼容性问题(选择合适自身项目的组件,不一定是越新越好)
2、官方仍升级与维护、社区活跃度(便于后续问题的查找与解决)
3、性能与特殊需求(如有要求可针对性选择)
具体可以先了解一下各个组件的功能与差异、侧重点等,可以参考如下文章 :
spring cloud 组件使用
Spring Cloud笔记(2) 组件的搭配和选择

二、父工程

原涉及业务逻辑相关(需要拆分代码的)暂时可以先不做,Spring Cloud下有多个微服务,首先需要新建maven父工程,无需包含src文件等,保留pom文件,主要用来聚合各个子模块。原业务逻辑整体作为一个微服务子模块,后续可以根据需要拆分成各个子模块,例如:定时任务模块、数据库实体类模块、公共方法工具类模块、业务区分模块(根据需要:例 用户模块、商品模块等),登录授权模块、网关模块、注册中心、配置中心等。父工程中只保留pom文件即可,此处注意dependencyManagement和dependencies标签的区别,dependencyManagement并没有真正引入依赖,只是在父工程中做了声明,真正引入需要各个子项目显式声明引入。

具体区别可参考此文章 dependencyManagement与dependencies的区别

以下各个微服务搭建具体流程可以自行搜索更为详细的资料,本文简单做流程记录,我是参考b站视频搭建初步各组件demo,后续再慢慢完善各个细节。

三、nacos作为注册中心与配置中心

单机版

1、下载nacos服务端并解压
此处选择版本为1.4.2,nacos 1.4.2 网址
选择其他版本可自行查找下载,nacos git 网址
windows环境下下载nacos-server-1.4.2.zip文件

2、解压后运行startup.cmd。
使用windows控制台启动,命令(standalone代表着单机模式运行,非集群模式):
startup.cmd -m standalone
或者修改脚本文件startup.cmd的启动模式为单机模式:
//set MODE=”standalone”
不修改默认是集群模式 set MODE=”cluster”

3、服务启动后访问:http://localhost:8848/nacos 用户名和密码都是nacos

持久化到数据库

1、在开始搭建集群之前,需要先将Nacos的默认数据库derby切换成mysql。
首先启动本机mysql,创建nacos_config数据库,并在nacos_config数据库下执行conf目录下的nacos-mysql.sql脚本(完成数据库创建及表创建)

2、进入conf目录下,打开application.properties,修改如下参数:

spring.datasource.platform=mysql
 
db.num=1
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=123456

注:数据库端口及账号密码换成自己的

集群版

1、脚本文件startup.cmd的启动模式为集群模式:set MODE=”cluster” (默认即是集群模式)

2、开启持久化到数据库。

3、将 cluster.conf.example文件重命名为 cluster.conf,打开文件并将集群中所有节点的ip:port写入。

4、集群占用内存较大,在一台电脑启动集群模式建议修改默认内存配置。否则可能再启动多个时会因为内存不足启动失败。参数含义:
-Xms: 设定程序启动时占用内存大小
-Xmx: 设定程序运行期间最大可占用的内存大小
-Xmn:新生代大小

5、复制nacos文件三份,分别修改application.properties 各自绑定端口,或者启动时添加端口参数

6、配置nginx实现负载均衡,修改nginx/conf 路径下的 nginx.conf 文件

7、先启动 nginx,再依次启动3333、4444、5555的 nacos 节点(此处3333、4444、5555 是不同的nacos端口)
服务启动后访问:127.0.0.1:1111/nacos 用户名和密码都是nacos,查看集群管理结点列表(此处1111 是nginx配置的对外端口)

注意事项:
1、配置文件必须是bootstrap.properties或者bootstrap.yml,如果配置application.properties或者application.yml会导致加载不到配置。
2、@RefreshScope实现自动刷新,此注解主要用来让这个类下的配置内容支持动态刷新,也就是当我们的应用启动之后,修改了Nacos中的配置内容之后,这里也会马上生效。
3、nacos配置中心文件命名规则:server-name profile 文件格式 ,例如:nacos-config-client-dev.yaml ,注意yaml不要写成yml。

四、gateway网关

网关这块主要注意路径匹配规则配置,还有注意跨域相关配置,否则搭建完有可能会报不允许跨域访问的错误。以下仅供参考

import org.springframework.web.cors.CorsConfigurationSource; //导入依赖的package包/类
private CorsConfigurationSource corsConfiguration() {
    	CorsConfigurationSource source= new UrlBasedCorsConfigurationSource();
    	CorsConfiguration corsConfiguration = new CorsConfiguration();
        corsConfiguration.addAllowedOrigin("*");//同源配置,*表示任何请求都视为同源,若需指定ip和端口可修改例 "localhost:8080",以","分隔
        corsConfiguration.addAllowedHeader("*");//允许哪些header,本初使用token,可将*替换成token
        corsConfiguration.addAllowedMethod("*");//允许的请求方法,例如GET、POST
        corsConfiguration.setMaxAge(3600L);
        corsConfiguration.setAllowCredentials(true);
        ((UrlBasedCorsConfigurationSource) source).registerCorsConfiguration("/**", corsConfiguration);
        return source;
}

升级此处还涉及到了SpringCloud Gateway Spring Security 整合,需要注意的是Spring Cloud Gateway中使用的是Spring-Webflux,所以不能用Spring MVC的那套安全配置。
Reactor与传统MVC配置对应如图:
学新通
更为具体的实践可参考这篇文章 SpringCloud Gateway Spring Security

五、sentinel熔断限流

1、Dashboard的部署,下载 sentinel 服务端jar包,此处使用版本1.8.1。
下载地址:sentinel 1.8.1
具体使用可参考:Sentinel项目git网址 中文文档

2、启动
前提:java8环境ok、8080端口不能被占用(默认8080端口,可以指定端口启动)
进入下载好的目录,打开cmd,输入命令

java -jar -Dserver.port=7080 sentinel-dashboard-1.8.1.jar

启动Sentinel成功后,登录localhost:7080 进入登录页面,默认账号密码都是sentinel。
注意:Sentinel采用懒加载模式,访问路径一次后,才能在控制台上看到结果。

3、持久化配置,此处使用的是结合 nacos 持久化到数据库。需要引入依赖,添加配置。

4、添加Nacos业务规则配置,文件名称即为对应的服务应用名称。
例限流json配置:

[
    {
         "resource": "/byUrl",
         "limitApp": "default",
         "grade":   1,
         "count":   1,
         "strategy": 0,
         "controlBehavior": 0,
         "clusterMode": false    
    }
]

resource:资源名称
limitApp:来源应用
grade:阈值类型,0代表线程数,1代表QPS
count:单击阈值
strategy:流控模式,0代表直接,1代表关联,2代表链路
controlBehavior:流控效果,0代表快速失败,1代表Warm Up,2代表排队等待
clusterMode:是否集群

例降级json配置:

[
    {
         "resource": "/byUrl",
         "grade":   2,
         "count":   2,
         "minRequestAmount": 3,
         "timeWindow": 3,
         "statIntervalMs": 6000    
    }
]

图片来自官方文档:
学新通
注意配置降级的时候,需要改变配置文件中的rule-type,否则对不上不会生效。
学新通
学新通

六、引入openfeign实现远程调用

1、get请求
非restful风格,每个入参都要添加注解@RequestParam(“userid”)
restful风格,每个入参都要添加注解@PathVariable(“userid”)

FeignClient接口的方法上必须使用注解,如果FeignClient传递的参数名与服务提供方的Controller方法的参数名不一样, 需要在服务提供方, 使用@RequestParam进行映射
2、post请求
@RequestParam(“id”)
@RequestBody User user

要求: FeignClient接口的方法的javaBean参数, 添加@RequestBody, 要求服务的提供方的方法上也要加@RequestBody注解
注意: 一个方法上只能有一个@RequestBody注解, 但是可以有多个@RequestParam注解

如果找不到方法调用,仔细检查路径是否一致。

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

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