(MAC)搭建Spring Cloud Alibaba微服务项目:整合Nacos+GateWay+Sentinel+Seata+RocketMq

目录

1.微服务思想介绍:

2.优点和缺点

2.1 微服务优点:

2.2 微服务缺点:

3. 通过spring cloud alibaba搭建微服务

4.准备环境

4.1 注册中心Nacos

4.1.1 下载

4.1.2 安装

第一步: 修改nacos配置文件(application.properties),建议使用IDEA打开配置文件

第二步:修改启动文件(startup.cmd)

第三步:启动Nacos

4.1.3 在代码中集成nacos

4.2 网关Gateway

4.3 分布式事务Seata

4.3.1 下载

4.3.2 在nacos客户端新增命名空间

4.3.3 修改配置

4.3.4 在第二步创建的命名空间下,新增seataServer.properties配置文件

4.3.5 代码中集成seate

第一步:引入依赖

第二步:修改配置

第三步:在方法上添加注解@GlobalTransactional

4.4 限流熔断降级Sentinal


1.微服务思想介绍:

1.微服务是架构风格,代表一种通过将应用程序拆分成小型,独立的功能模块(服务)的开发方式

2.每个模块(服务)实现独立的业务功能不限语言,不限技术,服务之间通过轻量级的通信机制进行交互

3.微服务的核心思想:解耦应用程序,提升灵活性和维护性

2.优点和缺点

2.1 微服务优点:

  • 模块独立解耦
  • 独立部署,快速迭代
  • 灵活技术栈
  • 高扩展性
  • 容错性好

2.2 微服务缺点:

分布式系统复杂性(服务器成本,开发人员成本,运维成本增加)

Spring Cloud Alibaba架构落地:服务治理

  • 这么多小的服务,如何管理?(服务治理 注册中心【服务注册 发现 剔除】)nacos
  • 这么多小服务,他们之间如何通讯?   feign
  • 这么多小服务,客户端如何访问他们? 网关 gateway
  • 这么多小服务,一旦出现问题了,应该如何自处理? 容错 sentinel
  • 这么多小服务,如何保证同一组事物的一致性?seate

3. 通过spring cloud alibaba搭建微服务

1.技术架构图

4.准备环境

4.1 注册中心Nacos

4.1.1 下载

下载地址:https://nacos.io/download/release-history/?spm=5238cd80.2ef5001f.0.0.3f613b7c0Mo2QG

ps:我自己本地下载的版本是2.3.2

4.1.2 安装

ps:下载完成,可选择将该文件包移动到您平时使用的安装文件的地方,可根据自己习惯来,我本地电脑,我一般将安装文件移动到文件夹:/usr/local/ 

第一步: 修改nacos配置文件(application.properties),建议使用IDEA打开配置文件

1.将nacos持久化磁盘的数据库脚本在本地运行,文件脚本所在位置如下图所示

 2.将数据库配置的注释去掉,如下图所示,讲数据库名称改成您本地电脑创建的数据库名称,讲用户名和密码修改成自己本机用户名和密码

第二步:修改启动文件(startup.cmd)

将集群的模式改成单机的模式:standalone(单机模式);  cluster (集群模式)

第三步:启动Nacos

在终端输入命令:sh startup.sh -m standalone

ps:在输入命令之前,需要cd到nacos服务的bin目录下,或者您可以直接在nacos的bin目录下打开终端

启动之后,可以通过http://localhost:8848/nacos访问客户端,能访问说明启动成功

ps:8848是nacos的默认端口,您可以修改配置文件中的端口号

关于客户端的介绍,可以参考文档:Nacos安装与使用讲解-CSDN博客

如果您想停用nacos,在终端输入命令:sh shutdown.sh

4.1.3 在代码中集成nacos

1.pom文件中需要引用的依赖

 <!--是一个用于管理Spring Cloud相关组件版本的依赖管理POM-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>2024.0.1</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!--是一个用于管理Spring Cloud Alibaba相关组件版本的依赖管理POM-->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2023.0.3.1</version>
                <type>pom</type>
            </dependency>
            <!--nacos服务注册和发现-->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
                <version>2023.0.3.2</version>
            </dependency>

2.修改配置文件

server:
  port: 8080
spring:
  application:
    name: order-server
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        group: DEFAULT_GROUP #服务分组,如果两个服务之间要通信,必须配置在相同的分组下,否则会报异常:Load balancer does not contain an instance for the service stock-server
        #namespace: a2135af0-1552-49e3-81d5-d93f1f408fd5 #namespace如果不配置,默认public

3.在启动类加上@EnableDiscoveryClient注解

ps:该注解可以加,也可以不加,但是为了规范,建议加上

4.启动服务服务之后,在服务列表看到您的服务,即注册成功

5.远程调用服务

ps:在消费端集成Spring Cloud LoadBalancer,引用如下依赖,比如订单服务调用库存服务,那么订单服务就是消费端 

     <!--官网提供的一个开源的、简单易用的客户端负载均衡器-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-loadbalancer</artifactId>
                <version>4.2.1</version>
            </dependency>

第一种:采用restTemplate调用

需要在启动类加上以下代码:

    @Autowired
    //RestTemplateBuilder
    private RestTemplateBuilder builder;
    // 使用RestTemplateBuilder来实例化RestTemplate对象,spring默认已经注入了RestTemplateBuilder实例
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return builder.build();
    }

调用代码:

    @PostMapping("/addOrder")
    public String addOrder(@RequestBody OrderBo order) {
        System.out.println("下单成功");
        //扣减库存
        StockRequest stock = new StockRequest();
        stock.setPid(order.getPid());
        stock.setNum(order.getNum());
        String msg = restTemplate.postForObject("http://stock-server/stock/reduct", stock, String.class);
        return "下单成功" + msg;
    }

第二种方式:通过openFeign

需要引入的依赖

    <!--来简化远程调用的代码-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-openfeign</artifactId>
                <version>4.2.1</version>
            </dependency>
    @Autowired
    StockFeignService stockFeignService;

    @PostMapping("/add")
    //@Transactional//申明事物
    @GlobalTransactional
    public String add(@RequestBody OrderBo order) throws Exception {
        System.out.println("下单成功");
        //下单
        String orderId = orderService.insert(order);
        System.out.println("生成的临时的订单号是:" + orderId);
        //扣减库存
        StockRequest stock = new StockRequest();
        stock.setPid(order.getPid());
        stock.setNum(order.getNum());
        int msg = stockFeignService.reduce(stock);
        //int a=1/0;

        if (msg > 0) {
            return "下单成功,订单号" + orderId;
        }
        return "下单失败,数据已回滚,生成的临时的订单号是:" + orderId;
    }

    @FeignClient(name="stock-server",path = "/stock")
    public interface StockFeignService {
        @PostMapping("/reduce")
        int reduce(StockRequest stock) throws Exception;
    }

4.2 网关Gateway

4.3 分布式事务Seata

4.3.1 下载

ps:我自己本地下载的版本是2.2.0

4.3.2 在nacos客户端新增命名空间

4.3.3 修改配置

#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

server:
  port: 9091

spring:
  application:
    name: seata-server

logging:
  config: classpath:logback-spring.xml
  file:
    path: ${log.home:${user.home}/logs/seata}

console:
  user:
    username: seata
    password: seata
seata:
  jdbc:
    useGeneratedKeys: true
  # 配置中心
  config:
    type: nacos # 指定使用 nacos 作为配置中心
    nacos:
      server-addr: 127.0.0.1:8848
      namespace:  a2135af0-1552-49e3-81d5-d93f1f408fd5 # 命名空间,如果不写默认使用 Nacos 的 public 命名空间,要么填写第一步创建的命名空间
      group: DEFAULT_GROUP # 我直接用 Nacos 的默认,你也可以自己起一个分组叫做 SEATA_GROUP
      #username: nacos # 如果你的 nacos 没配置账号密码则不需要写这两项
      #password: nacos
      data-id: seataServer.properties # 也就是配置中心 Nacos 上的文件名称,第三步创建的配置文件
  # 注册中心
  registry:
    type: nacos
    nacos:
      application: seata-server # seata tc 服务注册到 nacos的服务名称,可以自定义,需与上面的 spring.application.name属性一致
      server-addr: 127.0.0.1:8848
      group: DEFAULT_GROUP
      namespace: a2135af0-1552-49e3-81d5-d93f1f408fd5
      # cluster:
      #username: nacos
      #password: nacos
  #  server:
  #    service-port: 8091 #If not configured, the default is '${server.port} + 1000'
  security:
    secretKey: # SeataSecretKey0c382ef121d778043159209298fd40bf3850a017 # 这项可要可不要,我这里不要了
    tokenValidityInMilliseconds: 1800000
    ignore:
      urls: /,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.jpeg,/**/*.ico,/api/v1/auth/login,/metadata/v1/**

4.3.4 在第二步创建的命名空间下,新增seataServer.properties配置文件

#事务会话信息存储方式
store.mode=db
#事务锁信息存储方式
store.lock.mode=db
#事务回话信息存储方式
store.session.mode=db

#存储方式为db
store.db.dbType=mysql
store.db.datasource=druid
store.db.driverClassName=com.mysql.cj.jdbc.Driver
# 下方你的数据库名称如果不是 seata 记得修正
store.db.url=jdbc:mysql://127.0.0.1:3306/seata?useUnicode=true&rewriteBatchedStatements=true&useSSL=false
store.db.user=root#改成本地数据库账号
store.db.password=#改成本地数据库密码
store.db.minConn=5
store.db.maxConn=30
store.db.queryLimit=100
store.db.maxWait=5000
# 下面 4 项对应的数据库中几张数据表
store.db.globalTable=global_table
store.db.branchTable=branch_table
store.db.lockTable=lock_table
store.db.distributedLockTable=distributed_lock

4.3.5 代码中集成seate

第一步:引入依赖
<!--分布式事务-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
    <version>2022.0.0.2</version>
</dependency>
第二步:修改配置
seata:
  tx-service-group: order-server-group
  service:
    vgroup-mapping:
      order-server-group: default
    grouplist:
      default: 127.0.0.1:10091
  enabled: true
第三步:在方法上添加注解@GlobalTransactional

4.4 限流熔断降级Sentinal

未完待续。。。。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值