目录
3. 通过spring cloud alibaba搭建微服务
第一步: 修改nacos配置文件(application.properties),建议使用IDEA打开配置文件
4.3.4 在第二步创建的命名空间下,新增seataServer.properties配置文件
第三步:在方法上添加注解@GlobalTransactional
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
未完待续。。。。。。