springcloud 基础

news2024/10/7 5:21:04

SprinbCloud微服务简介

架构发展历史

SpringBoot由baiPivotal团队在2013年开始研发、2014年4月发布第一个du版本的全新开源的轻量级框架。

它基zhi于Spring4.0设计,不dao仅继承了Spring框架原有的优秀特性,而且还通过简化配置来进一步简化了Spring应用的整个搭建和开发过程。另外SpringBoot通过集成大量的框架使得依赖包的版本冲突,以及引用的不稳定性等问题得到了很好的解决

在2014 年底, Spring 团队推出 Spring Cloud, 目标使其成为Java 领域微服务架构落地的标准

微服务架构概述

应用架构的发展

软件架构有三种架构类型,分别是业务架构、应用架构、技术架构。它们之间的关系是业务架构决定应用架构,技术 架构支撑应用架构。架构的发展历程是从单体架构、分布式架构、SOA 架构再到微服务架构。

单体应用架构

单体架构在Java领域,就是一个war包,包含了所有的应用功能。按照mvc结构,是从controller到service到dao。

单体架构的优点:
  1. 易千开发:开发人员使用当前开发工具在短时间内就可以开发出单体应用。
  2. 易于测试:因为不需要依赖其他接口,测试可以节约很多时间。
  3. 易于部署:你只需要将目录部署在运行环境中即可。
单体架构的缺点:
  1. 灵活度不够:如果程序有任何修改,修改的不只是一个点,而是自上而下地去修改,
    测试时必须等到整个程序部署完后才能看出效果。在开发过程可能需要等待其他开发
    人员开发完成后才能完成部署,降低了团队的灵活性。
  2. 降低系统的性能:原本可以直接访问数据库但是现在多了一层。即使只包含一个功能 点,也需要在各个层写上代码。
  3. 系统启动慢:一个进程包含了所有业务逻辑,涉及的启动模块过多,导致系统的启动
    时间延长。
  4. 系统扩展性比较差:增加新东西的时候不能针对单个点增加,要全局性地增加。牵一 发而动全身
分布式架构

按照业务垂直切分,每个应用都是单体架构,通过API 互相调用

面向服务的SOA架构

SOA 是不同业务建立不同的服务,服务之间的数据交互粗粒度可以通过服务接口分级,这样松散耦合提高服务的可重用性,也让业务逻辑变得可组合,并且每个服务可以根据使用情况做出合理的分布式部署,从而 让服务变得规范,高性能,高可用

SOA 架构中有两个主要角色: 服务提供者 ( Pro vider ) 和服务消费者 ( Consumer )。阿里开源的 Dubbo 是 SOA 的典型实现。

SOA 架构的优点:
  1. 把模块拆分,使用接口通信,降低模块之间的耦合度。
  2. 把项目拆分成若干个子项目,不同的团队负责不同的子项目。
  3. 增加功能时只需要增加一个子项目,调用其他系统的接口即可。
  4. 可以灵活地进行分布式部署。
SOA 架构的缺点:

系统之间的交互需要使用远程通信, 接口开发增加工作量

微服务架构

微服务是一种架构风格, 对于一个大型复杂的业务系统,它的业务功能可以拆分为多个相互独立的微服务,各个微服务之间是松耦合的, 通过各种远程协议进行同步/异步通信,各微服务均可以被独立部署、扩/缩容以及升/降级

基于SpringCloud 的 微服务解决方案

Spring Cloud 的技术选型是中立的, 因此可以随需更换搭配使用

服务发现:Eureka Consul etcd、阿里 Nacos
共用组件:服务间调用组件Feign、负载均衡组件 Ribbon、熔断器 Hytrix
网关:性能低: Zuul; 性能高: Spring Cloud Gateway 自研网关中间件
配置中心:Spring Cloud Config、携程阿波罗、阿里 Nacos
全链路监控:zikpin 、Pinpoint 、Skywalking

基于Dubbo 实现微服务解决方案

什么是Sp ring Cloud

Spring Cloud 也是一个中间件,Spring 官方开发维护, 基千 Spring Boot 开发, 提供一套完整的微服务解决方案。包括服务注册与发现、配置中心、全链路监控、API 网关、熔断器等选型中立的开源组件, 可以随需扩展和替换组装.

SpringCloud回顾一下哈

SpringCloud都有哪些组件

1.服务的注册和发现 eureka
2.服务的负载和调用 ribbon\restTemplate LoadBlance Fengin
3.服务熔断和降级 hystris
4.服务网关 Zuul and GatetWay
5.服务分布式配置 手动刷新 自动刷新 读取本地配置文件
6.SpringCloudAlibaba

springcloud 回顾 (二)

1)eureka 单机环境、
2)eureka集群环境
3)消费端调用 单一的服务端 ribbon+restTemplate
4)消费端调用 集群的服务端 ribbon+restTemplate +loadbance + 通过服务名调用 ;在集群环境中,服务端save接口需要新增注解@RequestBoday
5)eureka 自我保护机制是什么 ?默认是开启自我保护机制的,验证自我保护机制
6)修改ribbon负载均衡规则 ,他有哪些负载均衡规则,负载均衡的实现原理是什么?
7)服务发现,discoveryclient,获取注册到eureka上的服务信息
8)restTemplate getForObject/postForObject getForEntity/postForEntity
9) 服务注册到eureka上显示服务名称和ip信息
10)使用zookeeper作为注册中心,将服务端注册到zookeeper,消费端从zookeeper中获取服务信息调用服务端接口。

使用到的注解:
@SpringBootApplication
@EnableEurekaClient
@EnableEurekaServer
@RibbonClient(value = “CLOUD-PAYMENT-SERVICE”,configuration = {MyRibbonConfig.class})
@Configuration
@LoadBlance
@Bean
@RestController
@Slf4j
@Resource
@Autowrite
@RequestBody
@Value
@PostMapping
@GetMapping
@Service
@Mapper

Spring Cloud Eureka

服务发现及注册中心 在微服务时代为什么会出现?

在微服务时代, 底层运维方式发生了巨大的变化 , 随着Docker 的流行, 业务服务不再部署在固定的虚拟机上, 其 ip 地址也不再固定, 这个时候前面的解决方案就显得捉襟见肘了。针对合格问题,不同的思考方式提出了不同的解决方案,这里列举几个。

方案一: 以 Nginx 为例, 在没有引入服务注册中心的时候, 那就是手工或是通过脚本的方式, 在部署的时候去更新 Nginx 的配置文件, 然后 reload。抑或是使用 ngx_http_dyups_module 通过 rest api 来在运行时直接更新upstream 而不需要 reload。

方案二:将服务注册中心作为一个标配的分布式服务组件,网关等都从服务注册中心获取 相关服务的实例信息 , 实现动态路由。比如 consul-template+ Nginx 的方案, 通过 consul 监听服务实例变化, 然后更新 Nginx 的配置文件, 通过 reload 实现服务列表更新。又拍云的slardar 也是这个思路, 不过不是通过 reload 的方式来, 而是通过在运行时通过 consul 获取服务列表来实现动态 upstream 的路由。

由此可见,随着服务架构模式以及底层运维方式的变化,服务注册中心逐步在分布式系统 架构中占据了一个重要的地位

Eureka简介

Eureka 是 Netflix 公司开源的一款服务发现组件, 该组件提供的服务发现可以 为负载均衡、failover 等提供支持 。Eureka 包括 Eureka Server 及Eureka Client。Eureka
Server 提供 REST 服务, 而 Eureka Client 则是使用 Java 编写的客户端, 用千简化与 Eureka
Server 的交互。

Eureka Server 端采用的是P2P 的复制模式, 但是它不保证复制操作一定能成功, 因此它提供的是一个最终一致性的服务实例视图; Client 端在Server 端的注册信息有一个带期限的租约, 一旦 Serv er 端在指定期间没有收到Client 端发送的心跳, 则 Server 端会认为 Client 端注册的服务是不健康的, 定时任务会将其从注册表中删除。

Consul 与 Eureka 不同, Consul 采用
Raft 算法, 可以提供强一致性的保证 , Consul 的 agent 相当千 Netflix Ribbon+ Netflix Eureka。

Client, 而且对应用来说相对透明, 同时相对千Eur eka 这种集中式的心跳检测机制, Consul 的
agent 可以参与到基于 gossip 协议的健康检查,分 散了 Serv er 端的心跳检测压力。除此之外,
Consul 为多数据中心提供了开箱即用的原生支持等。

那么基于什么考虑因素可以选择Eureka 呢, 主要有如下几点:
  1. 如果团队是Ja va 语言体系的, 则偏好Java 语言开发的, 技术体系上比较统一, 出问题也好排查修复,对组件的掌控力较强,方便扩展维护。

  2. 当然除此之外 , 更主要的是 Eureka 是 Netfli x 开源套件的一部分 , 跟 zu ul , ri bbon 等
    整合的比较好。

Spring Cloud Eureka 案例代码

根项目 springclouddemo pom.xml
<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>
  <groupId>springclouddemo</groupId>
  <artifactId>chapter2-1</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>pom</packaging>
  <modules>
  	<module>chapter2-1-eureka-server</module>
  	<module>chapter2-1-eureka-client</module>
  </modules>
  
  <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.3.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <spring-cloud.version>Finchley.RELEASE</spring-cloud.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <repositories>
        <repository>
            <id>spring-snapshots</id>
            <name>Spring Snapshots</name>
            <url>https://repo.spring.io/snapshot</url>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
        </repository>
        <repository>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <url>https://repo.spring.io/milestone</url>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
        </repository>
    </repositories>

    <pluginRepositories>
        <pluginRepository>
            <id>spring-snapshots</id>
            <name>Spring Snapshots</name>
            <url>https://repo.spring.io/snapshot</url>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
        </pluginRepository>
        <pluginRepository>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <url>https://repo.spring.io/milestone</url>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
        </pluginRepository>
    </pluginRepositories>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
  
</project>
Client
chapter2-1-eureka-client pom.xml
<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>
    <groupId>springclouddemo</groupId>
    <artifactId>chapter2-1</artifactId>
    <version>0.0.1-SNAPSHOT</version>
  </parent>
  <artifactId>chapter2-1-eureka-client</artifactId>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
		<java.version>1.8</java.version>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>
  
</project>
chapter2-1-eureka-client application.yml
spring:
  profiles:
    active: demo
chapter2-1-eureka-client application-demo.yml.yml
server:
  port: 8081

spring:
  application:
    name: demo-client1

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/
chapter2-1-eureka-client 启动类ChapterEurekaClientApplication
package cn.springcloud.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@SpringBootApplication
@EnableDiscoveryClient
public class ChapterEurekaClientApplication {
	public static void main(String[] args) {
		SpringApplication.run(ChapterEurekaClientApplication.class,args);
	}
}

Server
chapter2-1-eureka-server pom.xml
<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>
    <groupId>springclouddemo</groupId>
    <artifactId>chapter2-1</artifactId>
    <version>0.0.1-SNAPSHOT</version>
  </parent>
  <artifactId>chapter2-1-eureka-server</artifactId>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
		<java.version>1.8</java.version>
		<spring-cloud.version>Finchley.RELEASE</spring-cloud.version>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>
</project>
chapter2-1-eureka-server application.yml
spring:
  profiles:
    active: standalone #激活哪个配置文件 
  jackson:
    date-format: yyyy-mm-dd HH:mm:ss  #设置时间格式
    serialization:
      FAIL_ON_EMPTY_BEANS: false  # 忽略无法转换的对象
eureka:
  server:
    use-read-only-response-cache: false  #是否使用只读的response-cache 默认true
    response-cache-auto-expiration-in-seconds: 10 #设置readWriteCacheMap的expireAfterWrite参数,指定写入多长时间后过期 默认 180s
management:  
  endpoints:
    web:
      exposure:
        include: '*'     # 公开所有的监控端点
chapter2-1-eureka-server application-standalone.yml
server:
  port: 8761   #server 存在的端口号

eureka:
  instance:
    hostname: localhost  # eureka server 存活的ip
  client:
    registerWithEureka: false # 表示是否将自己注册到Eureka Server,默认为true。由于当前这个应用就是Eureka Server,故而设为false
    fetchRegistry: false  #表示是否从Eureka Server获取注册信息,默认为true。因为这是一个单点的Eureka Server,不需要同步其他的Eureka Server节点的数据,故而设为false
    serviceUrl:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/    #设置与Eureka Server交互的地址,查询服务和注册服务都需要依赖这个地址
  server:
      waitTimeInMsWhenSyncEmpty: 0  #当从其他节点同步实例信息为空时等待的时间   默认 5 * 60 * 1000
      enableSelfPreservation: false #是否开启自我保护  默认 true
chapter2-1-eureka-server 启动类ChapterEurekaServerApplication
package cn.springcloud.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@SpringBootApplication
@EnableEurekaServer
public class ChapterEurekaServerApplication {
	public static void main(String[] args) {
		SpringApplication.run(ChapterEurekaServerApplication.class,args);
	}
}

在这里插入图片描述

eureka-server

https

eureka-admin

metadata 路由实例

结合ribbon,实现灰度发布或者不宕机升级

SpringCloud ribbon负载均衡规则继承关系

在这里插入图片描述

springcloud-feign

springcloud开发微服务的时候,各个微服务之间的通信都是以http接口的形式对外提供服务,因此在服务消费者调用服务提供者时,底层还是使用的是http-client的方式访问。
可以使用一下方式:
1.URLConnection
2.Apache HttpClient
3.RestTemplate

Feign的特新

  1. 基于注解方式
  2. 支持http编码器和解码器
  3. 支持http请求的压缩
  4. 支持hystrix和他的fallback
  5. 支持ribbon的负载均衡

feignClient 注解中的fallback = XXXX.class

  1. 验证结果:在FeignClient 中使用的 fallback = XXX.class 这种方式,仅仅能在服务端宕机时起作用,如果客户端中 出现异常,则依旧不会降级 。

SpringCloud Sleuth分布式请求链路追踪

  1. 配置Java环境,下载zipkin-server-2.12.2-exec.jar,java -jar 启动该jar包
    在地址栏访问 http://localhost:9411/zipkin/
  2. 在服务提供者和服务消费者对应的工程的pom中添加
  <dependency>
     <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-zipkin</artifactId>
  </dependency>
  1. 在服务提供者和消费者对应的yml中新增如下篇日志
spring:
	……
  zipkin:
    base-url: http://localhost:9411
  sleuth:
    sampler:
    probability: 1

在这里插入图片描述
在这里插入图片描述

SpringCloudAlibaba 学习笔记


学习地址:

Spring Cloud Alibaba Reference Documentation

seata: http://seata.io/zh-cn/

http://seata.io/zh-cn/docs/overview/what-is-seata.html

sentinel:https://github.com/alibaba/Sentinel

nacos: https://github.com/alibaba/nacos/releases/tag/1.3.0

nacos
服务提供者 2

消费者 1

http://localhost:9001/payment/nacos/1

http://localhost:83/consumer/payment/nacos/1

nacos 既支持Ap 也支持CP

可以通过命令进行切换

配置中心

多项目

多环境

namespace+group+dataid

namespace集群环境

group:

nacos 集群配置 + 持久化配置

linux版本

sentinel
gitbub地址:https://github.com/alibaba/Sentinel

–异常 DegradeException

–sentinel的熔断机制是没有半开的这种状态的,要么死要么活

–先通断后降级

1.默认是懒加载机制,执行一次才能访问,下载jar包,8080端口,查看前台服务

2.初始化工程,簇点链路、流控模式

3.流控规则

基本介绍

流控模式

直接(默认)

直接快速失败 QPS(进入到程序之前) 线程数(进入到程序之后)

在快速访问失败之后,是否有用户自定义的失败提示呢

不一定都是blocked by sentinel (flow limiting ) ????

Blocked by Sentinel (flow limiting)

关联

B惹事情,A挂了

链路

多个请求访问同一个微服务

流控效果

快速失败

预热 冷启动的方式 warm up

一下子启动10万的请求,直接打死微服务

阈值

冷加载因子coldfoctoe 默认是3

:阈值/冷加载因子 才会达到阈

— 秒杀系统

排队等待

匀速排队 — 漏桶算法???

4.降级规则 也叫降级策略

RT

平均相应时长 妙级 + 时间窗口期(QPS>=5) 同时满足 触发该规则

RT最大4900 可以通过命令设置 -Dcsp.sentinel.max.rt=XXXX

异常比例

设置的范围是【0到1】之间

分钟级

QPS>=5 + 异常比例数>阈值 触发降级

时间窗口期 过了之后 关闭降级

异常数

当资源1分钟之内的异常数达到阈值后进行熔断

分钟级

异常数达到阈值就会触发降级

时间窗口期??? 过了之后 关闭降级

5.热点key限流

https://github.com/alibaba/Sentinel/wiki/%E7%83%AD%E7%82%B9%E5%8F%82%E6%95%B0%E9%99%90%E6%B5%81

仅仅支持QPS模式

@SentinelResource 兜底方法

@GetMapping(“/test”)

@SentinelResource(value = “myMethod”,blockHandler = “m2”)

public Result doSomething(@RequestParam(“uid”)String uid ,Required = false ,

@RequestParam(“type”)int type,Required = false)

{

// some logic here…

}

//兜底方法

public Result m2(String uid, int type ,BlockException exception) {

}

—如果没有兜底方法,则显示错误页面

配置索引为0,检测的是请求方法中的第一个参数

路径显示

XXXXXX/test?uid=1111 效果Ok

XXXXXX/test?type=000 效果not ok --因为没有做配置索引

参数例外项:

参数支持:8中基本类型和String类型

在高级选项中做设置

在这种情况下出现异常时,则不做做处理

@SentinelResource:主管配置出错,运行出错则需要走异常处理

6.系统规则

LOAD

RT

线程数

入口QPS

CPU使用率

7.@SentinelResource

按照资源名称限流+后续处理

按照url地址限流+后续处理

兜底方法存在的问题

系统默认的,没有体现出业务要求

代码狗和,不直观

每个业务方法都有一个兜底方法,代码膨胀

全局统一的处理方法没有体现

客户自定义限流处理逻辑

更多注解属性说明

8.服务熔断功能

sentinel整合ribbon+openfeign+fallback

ribbon

启动nacos、sentinel

提供者9003/9004

建module

pom

yml

主启动类

业务类

测试地址

消费者84

配置config类,引入resttemplate

@SentinelResource(value = “myMethod”,blockHandler = “m2”,fallback = “m2”,exceptionsToIngore = {})

openfeign

加pom

yml中增加fengin对sentinel的支持

fengin:

sentinel:

enable:true

主启动了增加openfengin注解支持

新增接口,@FenginClient(value = “”,fallback = XXX.class)

新增fallbackServiceImpl实现类,即XXX

熔断框架比较

9.规则持久化

配置到nacos中

在sentinel中配置的流控规则,重新启动sentinel后,规则就没有了

pom

增加sentinel-datasource-nacos

yml

增加nacos 数据源配置

seata spribgcloudAlibaba分布式事务框架
1.分布式事务的问题

2.seata介绍

http://seata.io/zh-cn/docs/overview/terminology.html

全局事务ID

三个组件:

TC - 事务协调者

维护全局和分支事务的状态,驱动全局事务提交或回滚。

TM - 事务管理器

定义全局事务的范围:开始全局事务、提交或回滚全局事务。

RM - 资源管理器

管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。

处理过程

1.TM向TC申请开启一个全局事务.全局事务创建成功并生成一个全局唯一XID

2.XID在微服务调用链路的上下文中传播

3.RM向TC注册分支事务,将其纳入XID对应全局事务管理

4.TM向TC发起针对XID的全局提交或者回滚决议

5.TC调度XID下管辖的全局分支事务完成提交或者回滚请求

3.seata-server安装 相当于一个分布式事务服务器

官网地址

下载版本

修改seataconf中的file.conf中的配置

备份原来的文件

主要修改:自定义事务组名称+事务日志存储模式+数据库连接信息

file.conf

service模块

:自定义事务组名称

store模块

:事务日志存储模式 为DB

在mysql数据库中创建数据库

在创建好的数据库中插入数据(seata 自带的sql)

修改register.conf配置文件

调整seata的注册地址为nacos,配置nacos的地址信息

启动nacos 端口号8848

启动seata

4.订单/库存/业务账户数据库准备

启动nacos、seata两个服务

三个微服务 订单 库存 账户

下订单-扣库存-减余额-该订单状态

创建三个数据库seata_order订单、seata_storage库存、seata_account账户

在三个数据库中创建对应的业务表

按照上述三个库创建对应的回滚日志表:在srata conf有一个叫 db_undo_log.sql

5.订单/库存/业务账户微服务准备

Order_mudule

创建module stata-order-service2001

pom

yml

file.conf

register.conf

domain(传输实体、表实体)

DAO实现

Service接口和实现

Controller

config配置

主启动类

Storge_mudule

Account_mudule

6.test

—树逻辑


高可用、低延迟、高QPS

分布式事务ID

为什么UUID会导致入库性能变差?

1.无需,无法预测他的生成顺序,不能通过递增有序的数字

2.注解,ID作为主键在特定的环境中会存在一些问题

3.索引,B+树索引分裂

数据库自增主键

单机:

集群分布式:

基于redis生成全局唯一ID

increase increaseby

除了设置步长以外,还需要关注过期时间

配置麻烦XXXX

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/870963.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

QIIME 2教程. 11元数据Metadata(2023.5)

QIIME 2用户文档. 11元数据 Metadata in QIIME 2 https://docs.qiime2.org/2023.5/tutorials/metadata/ 注&#xff1a;此实例需要一些基础知识&#xff0c;要求完成本系列文章前两篇内容&#xff1a;《1简介和安装Introduction&Install》和4《人体各部位微生物组分析Movin…

【硬件突击 电路】

文章目录 1. 电阻&#xff08;Resistor&#xff09;&#xff1a;2. 电容&#xff08;Capacitor&#xff09;&#xff1a;3. 电感&#xff1a;4、 RC、RL、RLC电路结构及工作原理基尔霍夫定律基尔霍夫电流定律&#xff08;KCL&#xff09;基尔霍夫电压定律&#xff08;KVL&#…

【舌尖优省PLUS】美团、饿了么外卖免费领红包,尽情享受美食与省钱!

家人们&#xff01;我昨天刚开发完并上线了一个超棒的外卖免费领红包的小程序&#xff0c;它叫做【舌尖优省PLUS】&#xff01;如果你喜欢美食&#xff0c;还想省下一些钱&#xff0c;那这个小程序绝对不能错过&#xff01; 在【舌尖优省PLUS】上&#xff0c;你可以通过简单的…

react 生命周期方法

组件的生命周期 每个组件都包含 “生命周期方法”&#xff0c;你可以重写这些方法&#xff0c;以便于在运行过程中特定的阶段执行这些方法。你可以使用此生命周期图谱作为速查表。在下述列表中&#xff0c;常用的生命周期方法会被加粗。其余生命周期函数的使用则相对罕见。 挂…

第4章:决策树

停止 当前分支样本均为同一类时&#xff0c;变成该类的叶子节点。当前分支类型不同&#xff0c;但是已经没有可以用来分裂的属性时&#xff0c;变成类别样本更多的那个类别的叶子节点。当前分支为空时&#xff0c;变成父节点类别最多的类的叶子节点。 ID3 C4.5 Cart 过拟合 缺…

springcloud3 sleuth实现链路状态监控

一 slueth的介绍 1.1 slueth的作用 在微服务框架中&#xff0c;一个由客户端发起的请求在后端系统中会经过多个不同的服务节点调用来协同产生最后的请求结果&#xff0c;每一个阶段请求都会形成一条复杂的分布式调用链路&#xff0c;链路中任何一环出现高延时或者错误都会引起…

通讯协议038——全网独有的OPC HDA知识一之聚合(七)最小值

本文简单介绍OPC HDA规范的基本概念&#xff0c;更多通信资源请登录网信智汇(wangxinzhihui.com)。 本节旨在详细说明HDA聚合的要求和性能。其目的是使HDA聚合标准化&#xff0c;以便HDA客户端能够可靠地预测聚合计算的结果并理解其含义。如果用户需要聚合中的自定义功能&…

MySQL环境安装

文章目录 MySQL环境安装1. 卸载1.1 卸载不要的环境1.2 检查卸载系统安装包 2. 安装2.1 获取mysql官方yum源2.2 安装mysql的yum源2.3 安装mysql服务 3. 登录(1)(2)(3) 4. 配置my.cnf MySQL环境安装 说明&#xff1a; 安装与卸载中&#xff0c;用户全部切换成为root&#xff0c…

基于YOLOv8+PyQt5开发的行人过马路危险行为检测告警系统(附数据集和源码下载)

系列文章目录 文章目录 系列文章目录前言欢迎来到我的博客&#xff01;我很高兴能与大家分享关于基于YOLOv8的行人过马路危险行为检测告警系统的内容。 一、系统特点1. 采用最新最优秀的目标检测算法YOLOv82. 系统分别基于PyQt5开发了两种GUI图形界面&#xff0c;供大家学习使用…

ruoyi-vue-pro yudao 项目bpm模块启用及相关SQL脚本

目前ruoyi-vue-pro 项目虽然开源&#xff0c;但是bpm模块被屏蔽了&#xff0c;查看文档却要收费 199元&#xff08;知识星球&#xff09;&#xff0c;价格有点太高了吧。 分享下如何启用 bpm 模块&#xff0c;顺便贴上sql相关脚本。 一、启用模块 修改根目录 pom.xml 启用模…

Day 29 C++ STL- 函数对象(Function Object)(仿函数)

文章目录 函数对象概念概念本质 函数对象使用特点示例 谓词——返回bool类型的仿函数谓词概念一元谓词——operator()参数只有一个的谓词二元谓词——operator()参数只有俩个的谓词 内建函数对象&#xff08;Builtin Function Objects&#xff09;内建函数对象概念注意算术仿函…

Flowable-边界事件-补偿边界事件

目录 定义图形标记XML内容使用示例演示demo 定义 补偿边界事件可以为所依附的节点附加补偿处理器&#xff0c;通过关联连接到补偿处理器&#xff08;compensation handler&#xff09;。补偿边界事件会在流程活动完成后根据情况&#xff08;事务取消或者补偿中间事件触发&…

WAVE SUMMIT2023六大分会场同步开启,飞桨+文心大模型加速区域产业智能化!

由深度学习技术及应用国家工程研究中心主办、百度飞桨和文心大模型承办的WAVE SUMMIT深度学习开发者大会2023将于8月16日重磅来袭&#xff01;届时上海、广州、深圳、成都、南昌和宁波六大分会场将同步开启&#xff01; 分会汇聚区域产业大咖、科研机构专家、知名学者和技术大牛…

股票量化分析工具QTYX使用攻略——盘口异动实时监测(更新2.6.8)

QTYX简介‍‍‍ 股票量化交易系统QTYX是一个即可以用于学习&#xff0c;也可以用于实战炒股分析的系统。 分享QTYX系统目的是提供给大家一个搭建量化系统的模版&#xff0c;最终帮助大家搭建属于自己的系统。因此我们提供源码&#xff0c;可以根据自己的风格二次开发。 关于QTY…

研究机构:PayPal稳定币PYUSD有望成为「数字资产」的重要用例

作者&#xff1a;Greg Cipolaro&#xff0c;NYDIG 全球研究主管 编译&#xff1a;WEEX 唯客 本文主要探讨两个话题&#xff1a;1. 过去两周&#xff0c;Crypto ETF 的申请数量激增&#xff0c;它们的审核流程是怎样的&#xff1f;2. 金融科技巨头 PayPal 已推出自己的稳定币 PY…

零代码编程:用ChatGPT对Excel文件批量重命名

文件夹下面有几百个Excel文件&#xff0c;希望去掉开头的“【企查查】专利-”&#xff0c;去掉结尾的电话&#xff0c;然后在后面统一加上“发明专利列表”这几个字。 可以在ChatGPT中这样输入提示词&#xff1a; 你是一个Python编程专家&#xff0c;要完成一个文件标题重命名…

UnrealEngine - 网络同步之连接篇

1 连接过程 - 握手 传统的 C/S 架构下&#xff0c;Client 和 Server 通常会建立一条抽象的 Connection&#xff0c;用来进行两端的通信。 UE 的官方文档中提供了 Client 连接到 Server 的示例 &#xff0c;简单来说分为如下几步&#xff1a; 打包构建好 Client 和 Server 进程…

windows server 2016 搭建使用 svn 服务器教程

参考教程&#xff1a; https://zhuanlan.zhihu.com/p/428552058 https://blog.csdn.net/weixin_33897722/article/details/85602029 配置环境 windows server 2016 远程服务器公网 ip 安装 SVN 服务端 下载 svn 服务端安装包&#xff1a;https://www.visualsvn.com/download…

如何加密7z压缩包?忘记密码怎么办?

7z压缩包如何设置加密&#xff1f;加密的7z压缩包又如何解密呢&#xff1f;分享7-zip加密、解密教程。 7-zip加密 右键文件选择7-zip打开压缩软件进行压缩或者在打开7-zip软件找到需要压缩的文件&#xff0c;点击添加&#xff0c;开始压缩文件 在压缩文件设置界面&#xff0…

【Bert101】变压器模型背后的复杂数学【03/4】

一、说明 在上一篇文章中&#xff0c;我们详细介绍了变压器模型的编码器块的工作原理。如果您还没有读过那篇文章&#xff0c;我建议您在开始这篇文章之前先阅读它&#xff0c;因为本文中介绍了其中涵盖的概念。您可以前往&#xff1a; 【Bert101】变压器模型背后的复杂数学【…