SpringcloudAlibaba+Nacos+Sentinel+Seata

SpringCloudAlibaba + Nacos + Sentinel + seata + MyBatis

文档:
https://github.com/alibaba/spring-cloud-alibaba/blob/master/README-zh.md
https://nacos.io/zh-cn/docs/what-is-nacos.html
https://github.com/alibaba/Sentinel/wiki/%E4%BB%8B%E7%BB%8D
https://seata.io/zh-cn/docs/user/quickstart.html
参考
https://blog.csdn.net/qq_37495786/article/details/103488402

1、spring cloud服务搭建

新建maven工程,工程结构如图
在这里插入图片描述
工程使用generator生成代码,使用相对简单
sql

CREATE DATABASE  IF NOT EXISTS `sca_order`  DEFAULT CHARACTER SET utf8;
USE `sca_order`;
DROP TABLE IF EXISTS `order_record`;
CREATE TABLE `order_record` (
  `id` varchar(32) NOT NULL COMMENT 'ID',
  `business_no` varchar(50) NOT NULL COMMENT '编码',
  `commodity_id` varchar(32) NOT NULL COMMENT '商品ID',
  `user_id` varchar(32) NOT NULL COMMENT '用户ID',
  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='订单表';
CREATE DATABASE IF NOT EXISTS `sca_common`  DEFAULT CHARACTER SET utf8;
USE `sca_common`;
DROP TABLE IF EXISTS `common_user`;
CREATE TABLE `common_user` (
  `id` varchar(32) NOT NULL COMMENT 'ID',
  `name` varchar(50) NOT NULL COMMENT '名称',
  `phone` varchar(20) NOT NULL COMMENT '电话',
  `age` int(3) NOT NULL COMMENT '年龄',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户表';
CREATE DATABASE IF NOT EXISTS `sca_inventory`  DEFAULT CHARACTER SET utf8 ;
USE `sca_inventory`;
DROP TABLE IF EXISTS `phone_inventory`;
CREATE TABLE `phone_inventory` (
  `id` varchar(32) NOT NULL COMMENT 'ID',
  `name` varchar(50) NOT NULL COMMENT '名称',
  `price` decimal(8,2) NOT NULL DEFAULT '0.00' COMMENT '价格',
  `total` int(6) NOT NULL DEFAULT '0' COMMENT '库存',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='库存表';

2、引入cloud Alibaba

pom中添加如下配置

<packaging>pom</packaging>

<parent>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-parent</artifactId>
   <version>2.1.11.RELEASE</version>
</parent>

<properties>
   <!-- 基本属性 -->
   <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
   <maven.compiler.source>1.8</maven.compiler.source>
   <maven.compiler.target>1.8</maven.compiler.target>
   <java.version>1.8</java.version>
   <!-- 版本属性 -->
   <spring-cloud-alibaba.version>2.1.0.RELEASE</spring-cloud-alibaba.version>
   <spring-cloud.version>Greenwich.RELEASE</spring-cloud.version>
   <spring-boot.version>2.1.7.RELEASE</spring-boot.version>
   <spring-platform.version>Cairo-SR8</spring-platform.version>
</properties>

<dependencyManagement>
   <dependencies>
      <!-- spring-cloud-alibaba 总依赖 -->
      <dependency>
         <groupId>com.alibaba.cloud</groupId>
         <artifactId>spring-cloud-alibaba-dependencies</artifactId>
         <version>${spring-cloud-alibaba.version}</version>
         <type>pom</type>
         <scope>import</scope>
      </dependency>
      <!--支持Spring Boot 2.1.X-->
      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-dependencies</artifactId>
         <version>${spring-boot.version}</version>
         <type>pom</type>
         <scope>import</scope>
      </dependency>
      <!--Greenwich.RELEASE-->
      <dependency>
         <groupId>org.springframework.cloud</groupId>
         <artifactId>spring-cloud-dependencies</artifactId>
         <version>${spring-cloud.version}</version>
         <type>pom</type>
         <scope>import</scope>
      </dependency>
      <!--
      Spring IO Platform,简单的可以认为是一个依赖维护平台,该平台将相关依赖汇聚到一起,针对每个依赖,都提供了一个版本号
      完整的依赖列表 https://docs.spring.io/platform/docs/current/reference/html/appendix-dependency-versions.html
       -->
      <dependency>
         <groupId>io.spring.platform</groupId>
         <artifactId>platform-bom</artifactId>
         <version>${spring-platform.version}</version>
         <type>pom</type>
         <scope>import</scope>
      </dependency>
   </dependencies>
</dependencyManagement>

3、Nacos注册中心

本地虚拟机上运行nacos,首先保证虚拟机上有64位jdk1.8或以上版本
下载的是linux版本nacos-server-1.4.0.tar.gz上传到虚拟机
解压后进入bin目录,执行命令sh startup.sh -m standalone
在这里插入图片描述
正常来说这个启动不会有问题。查看日志看启动是否成功日志在nacos/logs/start.out
访问页面查看
http://192.168.1.223:8848/nacos/index.html 用户名密码都是nacos。
代码配置:
pom文件中加入nacos依赖

<!-- nacos discovery -->
<dependency>
   <groupId>com.alibaba.cloud</groupId>
   <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

application.yml文件中加入

spring:
  application:
    name: sca-common
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.1.223:8848

重启服务,查看nacos
在这里插入图片描述
注册成功。其他服务注册一样使用。

4、feign调用

pom文件中加入依赖

<!--openfeign-->
<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

再需要调用其他服务的工程中加入依赖,不需要调用其他服务的可以不加。
写法很简单

@FeignClient(value = "sca-common") //sca-common就是对应服务的注册到nacos的名称
public interface CommonClients {
   
   @RequestMapping(value = "/CommonUser/getUserInfoByUserId.do") //value中的url路径就是正常的调用路径
   public String getUserInfoByUserId(@RequestParam("userId") String userId);
}

下面是sca-common中的接口

@RestController
@RequestMapping(value = "/CommonUser")
public class CommonUserController {
   @RequestMapping(value = "/getUserInfoByUserId.do")
   public String getUserInfoByUserId(@RequestParam("userId") String userId){
      return "success";
   }
}

如果,调用的服务不是很重要,对于业务来说即使报错也不能影响正常业务使用,那么FeignClient需要加上fallback

@FeignClient(value = "sca-common",fallback = CommonClientsFallback.class) 
public interface CommonClients {
   
   @RequestMapping(value = "/CommonUser/getUserInfoByUserId.do")
   public String getUserInfoByUserId(@RequestParam("userId") String userId);
}

CommonClientsFallback就是写CommonClients这个接口的实现类,如下:

@Component(value = "commonClientsFallback")
public class CommonClientsFallback implements CommonClients {
   private Logger logger = LoggerFactory.getLogger(this.getClass());
   @Override
   public String getUserInfoByUserId(String userId) {
      logger.error("查用户异常了");
      return "error";
   }
}

在实现类里面需要对异常做出相应的处理。比如,订单中的积分系统出问题,那么订单不能受到影响,所以就需要将积分的一些信息存在未处理的表中或者其他位置,使用定时任务或者其他手段将积分加上就可以了。
当然,加上fallback后发现其实并没有生效,在application.yml中加入配置

feign:
  hystrix:
    enabled: true  #feign调用时如果配置了fallback就会生效

5、Sentinel高可用服务

Sentinel的整体搭建和初步使用比较简单
下载地址:https://github.com/alibaba/Sentinel/releases/tag/1.8.1
下载jar包,所以使用Java -jar就可以运行,我在本地演示
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
其实也是一个spring boot项目。
浏览器输入:http://localhost:8080/#/login
用户名密码都是sentinel
在这里插入图片描述
项目的application中加入sentinel的相关配置

spring:
  application:
    name: sca-order
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.1.223:8848
    sentinel:
      enabled: true
      transport:
        dashboard: 127.0.0.1:8080  #这个时自己启动sentinel时给的端口号,默认时8080
        port: 8719  #固定

启动项目,调用任意接口
在这里插入图片描述
每个请求可以做流控和降级,根据自己需要进行配置,具体配置方法可以参照文档或者百度他人做法。

6、Seata分布式事务

这个部分是我搭建耗时最长的部分,我先说明我使用的seata服务版本是0.9.0,目前最小的是1.4.1
下载地址https://github.com/seata/seata
我最先使用的是1.4.1,各种问题,后来用1.2的也是,退回到0.9.0
windows上没有成功过,直接开始Linux搭建过程

6.1下载seata-server-0.9.0.tar.gz上传到linux,解压命令tar -zxvf seata-server-0.9.0.tar.gz

cd seata/conf 可以看到两个db开头的sql文件,在数据库新建一个seata的schema,将db_store.sql中的表建立到seata中,建好后如图
在这里插入图片描述

6.2将db_undo_log.sql中的表插入所有业务数据库中,如图

在这里插入图片描述

6.3编辑nacos-config.txt

重点编辑三个位置
在这里插入图片描述
我的项目有三个服务,sca-common,sca-order,sca-inventory,我这里将vgroup_mapping和vgroupMapping都配置了一次,是因为我之前在使用1.4和1.2的时候需要,0.9的版本应该只需要vgroup_mapping
在这里插入图片描述
store.mode配置db,可以根据自己的需要配置file
在这里插入图片描述
数据库链接

6.4执行nacos-config.sh将nacos-config.txt配置注册到nacos配置列表

在这里插入图片描述
在这里插入图片描述
出现please start seata-server后打开浏览器查看nacos
在这里插入图片描述
如图表示配置成功。

6.5配置registry.conf

registry {
  # file 、nacos 、eureka、redis、zk、consul、etcd3、sofa
  type = "nacos"

  nacos {
    serverAddr = "localhost"
    application = "seata-server"
    namespace = ""
    cluster = "default"
  }
}

config {
  # file、nacos 、apollo、zk、consul、etcd3
  type = "nacos"

  nacos {
    serverAddr = "localhost"
    namespace = ""
    group = "SEATA_GROUP"
  }
}

我都是用的nacos,如果需要使用其他方式可以根据自己的需要修改。

6.6启动seata

进入bin目录,执行如下命令
在这里插入图片描述
-p 端口号
-h 发布地址,默认本机locahost,但是我在使用中出现过使用localhost和127.0.0.1时代码启动报找不到服务的错误,所以我启动时直接使用的IP
-m 方式
在这里插入图片描述
出现Server started后打开浏览器nacos
在这里插入图片描述启动成功

6.7添加pom

<dependency>
   <groupId>com.alibaba.cloud</groupId>
   <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
   <!--<exclusions>
      <exclusion>
         <groupId>io.seata</groupId>
         <artifactId>seata-all</artifactId>
      </exclusion>
   </exclusions>-->
</dependency>

<!--<dependency>
   <groupId>io.seata</groupId>
   <artifactId>seata-all</artifactId>
   <version>1.4.0</version>
</dependency>-->

我注释的部分就是之前使用的,后来发现用默认的就行,我的boot版本2.1.11.RELEASE

6.8配置application

spring:
  application:
    name: sca-order
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.1.223:8848
    sentinel:
      enabled: true
      transport:
        dashboard: 127.0.0.1:8080  #这个时自己启动sentinel时给的端口号,默认时8080
        port: 8719  #固定
    alibaba:
      seata:
        tx-service-group: sca-order-group

注意 tx-service-group: sca-order-group 中的sca-order-group是与nacos-config.txt中对应的

6.9resources目录下添加registry.conf文件

registry {
  # file 、nacos 、eureka、redis、zk、consul、etcd3、sofa
  type = "nacos"
  loadBalance = "RandomLoadBalance"
  loadBalanceVirtualNodes = 10

  nacos {
    #application = "seata-local-server"
    serverAddr = "192.168.1.223:8848"
    group = "SEATA_GROUP"
    namespace = "public"
    cluster = "default"
    #username = ""
    #password = ""
  }
}

config {
  # file、nacos 、apollo、zk、consul、etcd3
  type = "nacos"

  nacos {
    serverAddr = "192.168.1.223:8848"
    namespace = "public"
    group = "SEATA_GROUP"
    username = ""
    password = ""
  }
  file {
    name = "file.conf"
  }
}

6.10重新配置数据源(这一步只是看见别人用了我照抄的,是否必须步骤暂时不清楚)

@Configuration
public class DataSourceProxyConfig {
   @Bean
   @ConfigurationProperties(prefix = "spring.datasource")
   public DruidDataSource druidDataSource() {
      return new DruidDataSource();
   }
   /**
    * 必须配置数据源代理
    */
   @Primary
   @Bean
   public DataSourceProxy dataSource(DruidDataSource druidDataSource) {
      return new DataSourceProxy(druidDataSource);
   }
}

如此配置后需要在boot启动class中加上@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class}),否则启动会报错

6.11在业务代码的发起服务上加上分布式事务注解@GlobalTransactional

6.12启动所有服务,验证

在这里插入图片描述
正常启动
在这里插入图片描述
调用服务
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
库存减正常。异常可以自己测试,不过需要将fallback去掉,并在调用服务里面模拟一个错误。我代码中注释的部分有,已经测试过。

7代码地址

代码地址

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值