1 创建项目
1 创建父maven项目,并且加上pom标签,打包方式改为pom
pom
创建子模块
springcloud alibaba的版本说明,springcloud-springcloud alibaba-springboot之间的版本关系
最好是版本一一对应,要不然会出现bug
https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E
springcloud alibaba 的版本,他也会自动管理分布式组件的版本,引入分布式组件的时候就不需要再加版本了
我的pom示例
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!-- 这里的的parent 可以继承自己公司的父级jar包-->
<!-- <parent>-->
<!-- <groupId>org.springframework.boot</groupId>-->
<!-- <artifactId>spring-boot-starter-parent</artifactId>-->
<!-- <version>2.7.7</version>-->
<!-- <relativePath/> <!– lookup parent from repository –>-->
<!-- </parent>-->
<groupId>com.pan.demo</groupId>
<artifactId>spring-cloud-alibaba-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>spring-cloud-alibaba-demo</name>
<description>Demo project for Spring Boot</description>
<packaging>pom</packaging>
<properties>
<java.version>1.8</java.version>
<maven.compiler.source>${java.version}</maven.compiler.source>
<maven.compiler.target>${java.version}</maven.compiler.target>
<spring-boot.version>2.3.12.RELEASE</spring-boot.version>
<spring-cloud.version>Hoxton.SR12</spring-cloud.version>
<alibaba-cloud.version>2.2.8.RELEASE</alibaba-cloud.version>
</properties>
<!-- 这个地方只是用来版本管理的,子项目,引用依赖就不用声明版本号了-->
<!--type pom 和scope import的意思就是maven新版本的特性,必须这样写-->
<dependencyManagement>
<dependencies>
<!-- 强制规定springcloud版本-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- 强制规定springcloud alibaba版本-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- 强制规定springboot的版本-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${alibaba-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<modules>
<module>order</module>
<module>user</module>
</modules>
</project>
2 nacos 注册中心和配置中心
nacos注册中心的核心功能
windows 部署
nacos 的安装包必须与spring alibaba 的版本相对应
如果不翻墙下载的会很慢
1 下载:https://github.com/alibaba/nacos/releases
2 修改bin目录下面的 startup.cmd
把启动方式改成单例模式,数据是放进内存的
set MODE=“standalone”
双击startup.cmd。即可启动
http://localhost:8848/nacos/index.html
1 引入依赖
<!--SpringCloud ailibaba nacos 服务注册与发现模块 -->
<!-- 不需要版本号,因为父pom已经管理了springcolud alibaba的版本-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--naocs Config 配置中心依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
2 把配置文件换成 bootstrap.yml
server:
port: 8081
# port: ${random.int[10000,12000]}
spring:
application:
name: order #nacos 会自动获取项目名的配置文件
main.allow-bean-definition-overriding: true
cloud:
nacos:
discovery:
server-addr: http://127.0.0.1:8848/
namespace: d96db1f3-557b-45ee-8dbc-4ef36ad2d3a0
config:
group: test
file-extension: yml
namespace: ${spring.cloud.nacos.discovery.namespace}
server-addr: ${spring.cloud.nacos.discovery.server-addr}
shared-configs: #一个项目加载多个配置文件,一般都是加载公共配置
- dataId: common.yml
refresh: true
group: test
# - dataId: @parent.artifactId@.${spring.cloud.nacos.config.file-extension}
# group: hare
# refresh: true
# 因为feign调试日志是debug级别输出,springboot默认的日志级别是info,所以feign的debug日志级别就不会输出
# logging.level=debug这样配置是对所有的日志级别进行配置
# 该场景只需要对feign接口进行debug配置,所以是这样配置logging.level.com.pan.demo.order.fegin=debug
logging:
level:
com.pan.demo.order.fegin: debug
3 openfeign 远程调用
1 引入依赖
<!--openfeign 配置-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2 启动类加上注解 @EnableFeignClients
3封装方法
//value 就是服务名字 contextId是区分openfengin的,一个服务可以使用用多个实体类封装
//value 就是服务名字 contextId是区分openfengin的,一个服务可以使用用多个实体类封装
@FeignClient(value = "user", contextId = "contract")
public interface UserApi {
@GetMapping("/test2")
public String test1();
}
4feign日志记录
日志等级有4种,分别是:
NONE【性能最佳,适用于生产】:不记录任何日志(默认值)。
BASIC【适用于生产环境追踪问题】:仅记录请求方法、URL、响应状态代码以及执行时间。
HEADERS:记录BASIC级别的基础上,记录请求和响应的header。
FULL【比较适用于开发及测试环境定位问题】:记录请求和响应的header、body和元数据。
加上配置类
/**
* 全局配置:当使用@Configuration会将配置作用所有的服务提供方
* 局部配置:如果只想针对某一个服务进行配置,就不要加@Configuration
*/
@Configuration
public class FeignConfig {
//feign日志级别
@Bean
public Logger.Level feignLoggerLevel(){
return Logger.Level.BASIC;
}
//设置openfeign 的超时时间
@Bean
public Request.Options options(){
//1 连接时间 2 接口超时时间
return new Request.Options(5000,1000);
}
}
配置文件也改一下日志的输出级别
# 因为feign调试日志是debug级别输出,springboot默认的日志级别是info,所以feign的debug日志级别就不会输出
# logging.level=debug这样配置是对所有的日志级别进行配置
# 该场景只需要对feign接口进行debug配置,所以是这样配置logging.level.com.pan.demo.order.fegin=debug
logging:
level:
com.pan.demo.order.fegin: debug
4 sentinel
服务雪崩
因为服务的提供者挂掉不可用,导致服务调用者的线程无响应,服务调用者线程卡主,线程过多,cpu飙升,导致整条链路都挂掉。最后因为一个点,整个服务挂掉。
解决的方案:
1 设置超时机制:让服务调用者不再等待
2 服务限流
假如一个服务,通过压测得知的qps(每秒的并发访问量) 是500,突然某一时刻的qps达到了800,我们可以限流,将300的请求服务降级,全部拒绝掉
sentinel 控制台下载地址
https://github.com/alibaba/Sentinel/releases
sentinel整合springcloud alibaba
引入依赖
<!--sentinel配置-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
2023.02.01
学习这个对于目前的我性价比不高,先缓一下在学习
5 seatat 学习
1 seata的安装包下载地址
https://github.com/seata/seata/releases
创建seata服务端
seata下载好之后,选择seata 的store模式 config/application.yml
file 单机版使用
db 使用数据库模式 数据库的版本必须是5.7以上的版本
redis 使用redis模式,但是会出现风险,数据会丢失
2 在seata下载安装包 ,打开config选择存储的模式 config/application.yml
store–》mode—》db
3 修改数据库连接
4 创建数据库,创建表
seata 的sql下载
https://seata.io/zh-cn/docs/ops/deploy-guide-beginner.html
选择资源目录server下面的db
选择对应的版本复制sql即可
5 在seata下载安装包 ,打开config文件夹下面的 config/application.yml 选择注册中心
registry–》type 改成nacos,并且修改地址
6 在seata下载安装包 ,script\config-center\config.txt
修改mode。修改数据库地址
– 也可以修改事务分组 service.vgroupMapping.default_tx_group=default
增加容灾机制,高可用
7 点击seata\script\config-center\nacos下面的 nacos-config.sh
将seata的配置发送到本地的nacos,也可以执行-p -h指定端口,和ip
8 启动seata
双击bin/seata-server.bat 启动seata,查看nacos服务列表即可
创建seata客户端
1 加入依赖
<!--MySQL驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.43</version>
</dependency>
<!--mybatis-plus启动器-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.0.5</version>
</dependency>
<!--Mybatis plus 插件-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-extension</artifactId>
<version>3.4.1</version>
</dependency>
<!-- seata -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-seata</artifactId>
</dependency>
2 增加yml配置
seata:
registry: #seata注册方式nacos
type: nacos
nacos:
server-addr: 127.0.0.1:8848
username: nacos
password: nacos
group: SEATA_GROUP # seata在nacos的分组
application: seata-server #seata在nacos的服务名字
config: #seata的配置中心(在nacos配置中心里面有配置文件,服务端和客户端都会使用这个】)
type: nacos
nacos:
server-addr: 127.0.0.1:8848
username: nacos
password: nacos
group: SEATA_GROUP # seata在nacos的分组
3 在启动类加上事务注解,并且接口方法上面加分布式事务注解
@EnableTransactionManagement 事务开关
@GlobalTransactional 分布式事务开关
4 在数据库加上seata的undo表
https://seata.io/zh-cn/docs/ops/deploy-guide-beginner.html
选择资源目录,进入之后
script/client/at/db/
找到下面的 mysql脚本,把每一个使用seata的服务都加上 undo_log表
5 启动代码就可以使用啦
遇到的坑:
seatacan not get cluster name in registry config ‘service.vgroupMapping.default_tx_group’, please make sure registry config correct
这个问题的解决思路
https://seata.io/zh-cn/docs/user/txgroup/transaction-group.html
大体意思就是,seata的服务端有一个配置是集群的名称
将配置导入nacos后,nacos里面也有一个配置:
service.vgroupMapping.default_tx_group = default
这个意思就是 分组default_tx_group用的seata事务分组名字是default