Java学习Day60:微服务总结!(有经处无火,无火处无经)

news2024/12/25 22:13:45

1、技术版本

jdk:17及以上

-如果JDK8

springboot:3.1及其以上

-版本2.x

springFramWork:6.0及其以上

-版本5.x

springCloud:2022.0.5

-版本格林威治或者休斯顿

2、模拟springcloud

父模块指定父pom

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

配置provider的application.yml

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/db2
    username: root
    password: 123456
  application:
    name: providerServer
mybatis:
  type-aliases-package: com.home.pojo
  configuration:
        log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

server:
  port: 8088

provider实现controller层,services层,和Mapper层,pojo

provider的pom

<properties>
    <spring-cloud.version>2022.0.5</spring-cloud.version>
<properties>

spring-boot-starter-web
mysql-connector-j
lombok
mybatis-spring-boot-starter
mybatis-plus-spring-boot3-starter

<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>

consumr层只用实现controller层和pojo

consumer的application.yml

server:
  port: 8080
spring:
  application:
    name: consumer

pom

<properties>
   <spring-cloud.version>2022.0.5</spring-cloud.version>
<properties>

spring-boot-starter-web
lombok


<!--SpringCloud,BOM,依赖清单导入,所有依赖管理的坐标-->
    <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>

consumer调用provider的方法

usersss userssses= restTemplate.getForObject("http://localhost:8088/user/findAll",usersss.class);
return userssses;

访问consumer即可调用provider的方法

思考:

1.硬URL的端口号(端口变化,服务宕机

2.负载均衡无法实现

3.无返回信息

4.优化RestTemplate

5.多服务权限拦截如何实现?怎么保证所有微服务服务的安全性?

6.优化众多微服务的配置文件

3.注册中心eureka

Eureka服务器:

pom

<properties>
        <spring-cloud.version>2022.0.5</spring-cloud.version>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>eureka_server</artifactId>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
    </dependencies>
    <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>

application.yml

#启动服务器端口
server:
  port: 8761
#应用程序名字
spring:
  application:
    name: eurekaServer
#EurekaServer的地址,现在是自己的地址,如果是集群,需要写其它Server的地址。
eureka:
  client:
   fetch-registry: false
   register-with-eureka: false
  service-url:
   defaultZone: http://127.0.0.1:8761/eureka

启动类中标志:@EnableEurekaServer

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

Eureka服务端组件:

在服务提供者provider_service工程中添加Eureka客户端依赖


  <!--eureka客户端starter-->
  <dependencies>
      <dependency>
          <groupId>org.springframework.cloud</groupId>
          <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
      </dependency>
  </dependencies>
  <!--SpringCloud,BOM,依赖清单导入,所有依赖管理的坐标-->
  <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>

在启动类上开启Eureka客户端发现功能@EnableDiscoveryClient

@SpringBootApplication
@EnableDiscoveryClient // 开启Eureka客户端发现功能
public class UserApplication {
    public static void main(String[] args) {
        SpringApplication.run(UserApplication.class,args);
    }
}

注册到注册中心

修改配置文件:spring.application.name指定应用名称,作为服务ID使用

server:
  port: 8088
#配置eureka注册中心的地址
# 注册中心地址
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:8761/eureka
# 租约续约间隔时间,默认30秒
  eureka:
    instance:
      lease-renewal-interval-in-seconds: 30

Eureka客户端组件

在服务消费者consumer_service工程中添加Eureka客户端依赖

<!-- Eureka客户端 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!--SpringCloud所有依赖管理的坐标-->
<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>

注册到注册中心

# 注册中心地址
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:8761/eureka
    registry-fetch-interval-seconds: 30

在启动类开启Eureka客户端@EnableDiscoveryClient

@SpringBootApplication
@EnableDiscoveryClient
public class springBootConsumerStarter {
    public static void main(String[] args) {
        SpringApplication.run(springBootConsumerStarter.class,args);
    }
    @Bean
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
}

配置完成后执行流程

  1. 通过注册中心客户端对象DiscoveryClient,获取Eureka中注册的user-service实例列表

  2. 获取user-service服务实例对象

  3. 从实例对象中获取host地址和端口,拼接请求地址

  4. 使用RestTemplate发送请求

public usersss findAll(){
         //discoveryClient 可以拉取注册中心中服务列表
        //getInstances(服务名),当前服务只有1个,返回值是List集合,获取0索引服务对象
   ServiceInstance instance = discoveryClient.getInstances("PROVIDERSERVER").get(0);
        //instance服务对象的实例。获取服务提供者的IP,端口号
   String host = instance.getHost();
   int port = instance.getPort();
   return restTemplate.getForObject("http://"+host+":"+port+"/user/findAll",usersss.class);
    }
}

4.Nacos

相比于erueka

Nacos消费者配置:
<properties>

     <spring.cloud.alibaba.version>2022.0.0.0</spring.cloud.alibaba.version>

<properties>

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

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


    <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>

            <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>
        </dependencies>
    </dependencyManagement>

配置Nacos注册中心地址

server:
  port: 8080
spring:
  application:
    name: consumerNacos
# 注册中心地址
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
Nacos服务端配置:
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
      <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
      </dependency>


    <!--SpringCloud,BOM,依赖清单导入,所有依赖管理的坐标-->
    <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>


            <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>


        </dependencies>
    </dependencyManagement>

application.yml不变

负载均衡:

在consumer中配置即可

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

在启动类配置

    @LoadBalanced
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
问题:需要编写类似的大量重复代码,格式基本相同,无非参数不一样!

5.OpenFeign

Feign 的英文表意为“假装,伪装,变形”, 是一个http请求调用的轻量级框架,是以Java接口的方式发送Http请求,而不用像Java中通过封装HTTP请求url的方式直接调用。Feign通过处理注解,将请求模板化,当实际调用的时候,传入参数,根据参数再应用到请求上,进而转化成真正的请求,这种请求相对而言比较直观。

Feign被广泛应用在Spring Cloud 的解决方案中,是学习基于Spring Cloud 微服务架构不可或缺的重要组件。

需要导入:

        <!--伪装调用jar-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

启动引导类加@EnableFeignClients注解

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

编写FeignClient接口,使用SpringMVC的注解

@FeignClient("providerUser")
public interface FeignUserService {
    @RequestMapping("feign/eignQueryUserById")
    User feignQueryUserById(@RequestParam("id") Integer id);
}

在Controller中注入Feign接口,直接调用,无需实现类,但是GetMaping的Restful风格必去和调用provider的方法相同且传参方式也相同!!!

访问接口测试!

支持熔断(服务降级)、配置日志级别、请求压缩和响应压缩

6.网关GateWay

所有微服务的统一入口。Spring Cloud Gateway 是 Spring Cloud 的一个全新项目,该项目是基于 Spring 5.0,Spring Boot 2.0 和 Project Reactor 等技术开发的网关,它旨在为微服务架构提供一种简单有效的统一的 API 路由管理方式。

  • Route(路由):这是网关的基本模块。它由一个 ID,一个目标 URI,一组断言和一组过滤器定义。如果断言为真,则路由匹配。

  • Predicate(断言):这是一个 Java 8 的 Predicate。输入类型是一个 ServerWebExchange。我们可以使用它来匹配来自 HTTP 请求的任何内容,例如 headers 或参数。

  • Filter(过滤器):这是org.springframework.cloud.gateway.filter.GatewayFilter的实例,我们可以使用它修改请求和响应。

创建SpringBoot工程gateway_server

  <!--引入网关的jar包,不能引web jar包-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>

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


        <!--负载均衡-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-loadbalancer</artifactId>
        </dependency>

        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt</artifactId>
            <version>0.7.0</version>
        </dependency>
        <dependency>
            <groupId>javax.xml.bind</groupId>
            <artifactId>jaxb-api</artifactId>
            <version>2.3.1</version>
        </dependency>
    </dependencies>


    <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>

            <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>
        </dependencies>
    </dependencyManagement>

application.yml

定义端口号,名称,注册到nacos

这是为当前路由规则指定一个 唯一的标识符

  • lb:// 是 负载均衡(Load Balancer)的前缀,意味着请求将通过负载均衡机制路由到一个注册在 Eureka、Consul 或其他注册中心的服务。
  • consumerOpenFeign 是服务的名称,这个名称需要与注册中心中服务的名称一致。Spring Cloud Gateway 会从服务注册中心获取该服务的实际地址(例如:http://consumerOpenFeign:8080),并且通过负载均衡器将请求转发到该服务。

predicates 用于定义请求的 匹配条件,即哪些请求应该由当前的路由规则来处理。在这个例子中,使用了 Path=/**,表示匹配所有的路径。

过滤器隐藏usertwo,访问时不用书写,避免接口地址暴露

server:
  port: 80
spring:
  application:
    name: gateway
  cloud:
    nacos:
      server-addr: 127.0.0.1:8848
    #配置网关
    gateway:
      routes:
        - id: orderService  #自定义路由的唯一标识符
          uri: lb://consumerOpenFeign  #服务名字,从注册中心通过服务名称来获取接口
          predicates:
            - Path=/**  #拦截浏览器的请求地址
          filters:
            - PrefixPath=/usertwo
自定义全局过滤器【重点】

token:登录成功后,根据登录用户名等(用户ID),生成一个属于这个用户自己的密钥,就称为Token。下次用户访问的时候,带着Token来请求服务器。拿Token值反解析出用户数据来(无论是解析失败,还是根本就没有Token)拦截器不能放行。登录成功的时候,产生一个加密后字符串:Token响应回浏览器的响应头。浏览器再次请求的时候,携带Token来访问服务器,Token会放在浏览器的请求头中。

大部分都是异步请求,axios拦截器

响应的时候,获取响应头中的token值。请求的时候,在请求头中添加token值。

token值存储在浏览器的缓存中,缓存对象 localStorage, setItem存储键值对,getItem传递键获取值

nacos注册和配置中心

nacos单独组件,启动就可以了,默认端口8848

微服务配置nacos注册中心的地址

spring:
  cloud:
    nacos:
      server-addr: 127.0.0.1:8848
sentinel流量防卫兵
        <!--熔断的支持-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-circuitbreaker-resilience4j</artifactId>
        </dependency>
        <!--配置哨兵-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>

配置文件

server:
  port: 8080
spring:
  application:
    name: consumerOpenFeign
  cloud:
    #哨兵
    sentinel:
      transport:
        dashboard: 127.0.0.1:8086
    nacos:
      server-addr: 127.0.0.1:8848
    openfeign:
      #feign熔断支持
      circuitbreaker:
          enabled: true

在方法上定义哨兵

    @GetMapping("/selectusertwo")
    @SentinelResource(value = "selectusertwo",
            fallback ="selectusertwoFallBack",
            blockHandler = "selectusertwoHandler")
    public usersss selectusertwo(@RequestParam("id") Integer id){
        if (id<4){
            throw new RuntimeException("请输入正确ID!");
        }
        return userServicesTwo.selectusertwo(id);
    }

fallback:限流

blockHandler:熔断

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

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

相关文章

登录功能设计(php+mysql)

一 登录功能 1. 创建一个登录页面&#xff08;login.php&#xff09;&#xff0c;包含一个表单&#xff0c;用户输入用户名和密码。 2. 在表单的提交事件中&#xff0c;使用PHP代码处理用户输入的用户名和密码。 3. 首先&#xff0c;连接MySQL数据库。然后&a…

【物联网技术】ESP8266 WIFI模块STA、AP、STA+AP、TCP/UDP透传工作模式介绍与AT指令介绍

前言:本文对ESP8266 WIFI模块STA、AP、STA+AP、TCP/UDP透传工作模式进行介绍;以及AT指令介绍,包括基础AT指令,WIFI功能AT指令、TCP/IP相关AT指令、常用AT指令实例进行介绍。 ESP8266 WIFI模块的接线及固件烧写可参考我的这篇博客:正点原子ATK-ESP8266 WIFI模块接线及固件…

【前端】JavaScript 方法速查大全-函数、正则、格式化、转换、进制、 XSS 转义(四)

&#x1f525; 前言 在现代前端开发中&#xff0c;JavaScript 是不可或缺的语言。无论是处理数据、操作 DOM&#xff0c;还是进行复杂的逻辑运算&#xff0c;掌握 JavaScript 的各种方法都是每位开发者的必修课。本文将为您提供一个全面、系统的 JavaScript 方法参考&#xff…

关于路由笔记

路由 定义&#xff1a; 在计算机网络中&#xff0c;路由是将数据包从源节点传输到目标节点的过程。这个过程涉及到网络中的多个设备&#xff0c;如路由器、交换机等&#xff0c;其中路由器起着关键的决策作用。 工作原理示例&#xff1a; 假设你在一个公司的局域网内&#…

25.停车场管理系统(基于web的Java项目)

目录 1.系统的受众说明 2.相关技术与方法 3.系统分析 3.1 可行性分析 3.1.1 技术可行性 3.1.2 经济可行性 3.1.3 操作可行性 3.2 需求分析 3.2.1 系统功能描述 3.2.2 用例图分析 4. 系统设计 4.1 系统类分析 5. 系统详细设计与实现 5.1 用户登录 5.2 系统信…

【含开题报告+文档+源码】基于SpringBoot+Vue智能居民健康检测系统设计与实现

开题报告 随着社会发展和人民生活水平的提高&#xff0c;人们对健康生活的要求越来越高。而广大居民由于条件限制&#xff0c;存在着健康管理服务不足的问题。本文基于JavaWeb技术&#xff0c;设计并实现了一种居民健康检测系统。首先&#xff0c;本文对该平台的需求进行了分析…

SCNU习题 总结与复习

1. P1:构建最大二叉树 【分治】 重点 构树函数需要注意的点&#xff1b; 前序遍历需要注意&#xff0c;本题的输出有点特点。若一个结点无左子&#xff0c;无右子就不再下去遍历&#xff1b; 其他情况都要下去遍历&#xff1b; 2. P2 寻找多数【分治】 没啥&#xff0c;注意…

ssm060基于SSM的高校共享单车管理系统的设计与实现+vue(论文+源码)_kaic

设计题目&#xff1a;高校共享单车管理系统的设计与实现 摘 要 网络技术和计算机技术发展至今&#xff0c;已经拥有了深厚的理论基础&#xff0c;并在现实中进行了充分运用&#xff0c;尤其是基于计算机运行的软件更是受到各界的关注。加上现在人们已经步入信息时代&#xff0…

【算法】(Python)贪心算法

贪心算法&#xff1a; 又称贪婪算法&#xff0c;greedy algorithm。贪心地追求局部最优解&#xff0c;即每一步当前状态下最优选择。试图通过各局部最优解达到最终全局最优解。但不从整体最优上考虑&#xff0c;不一定全局最优解。步骤&#xff1a;从初始状态拆分成一步一步的…

记一次微信云托管搭建Redis服务

背景 最近在做一个微信小程序&#xff0c;规划服务全部部署在云托管上面&#xff0c;本次使用了对象存储、mysql、java服务、Redis服务&#xff08;pc端用的&#xff09;。 由于对部署Redis不理解&#xff0c;查看了官方文档&#xff0c;首先看到的是这个架构图&#xff0c;看…

基于SSM的校园美食交流系统【附源码】

基于SSM的校园美食交流系统 效果如下&#xff1a; 管理员主页面 用户主页面 美食信息页面 美食资讯页面 修改密码页面 论坛中心页面 研究背景 随着高校信息化建设的不断推进&#xff0c;校园生活日益丰富多样&#xff0c;学生对于美食的需求与探索也愈发旺盛。然而&#xff…

Linux—进程学习-01

目录 Linux—进程学习—11.冯诺依曼体系结构2.操作系统2.1操作系统的概念2.2操作系统的目的2.3如何理解管理2.4计算机软硬件体系的理解2.5系统调用和库函数的概念 3.进程3.1进程是什么3.2管理进程3.2.1描述进程-PCB3.2.2组织进程3.2.3总结 3.3查看进程 4.与进程有关的系统调用 …

【电子通识】白皮书、应用手册、用户指南、快速入门指南一般的定义是什么?

一般大厂家的器件或模块,除了给数据表以外,还提供应用手册、技术说明、白皮书等各种文档资料。 如下图所示为ST25 NFC/RFID标签和读卡器的文件资料:其中就有技术说明、白皮书、应用手册等。 如下所示为TI INA228技术文档相关资料: 也有应用手册、用户指南、技术文章…

python opencv灰度变换

灰度变换 灰度变换和二值化的区别&#xff1a; 灰度变换是调整调整图像的灰度动态范围或图像对比度二值化是将图像的每个像素点调至0或255&#xff0c;只呈现白色或黑色 1.灰度化处理 图片的灰度化&#xff1a;将一个像素点的三个颜色变量相等&#xff0c;RGB&#xff0c;此…

toolkit二次开发学习之程序集(ProAsmcomp)和装配体组件路径对象(ProAsmcomppath)

程序集ProAsmcomp可以理解为装配体组件对象。 对象ProAssembly是ProSolid的一个实例&#xff0c;并共享相同的声明。因此&#xff0c;ProAssembly对象可以作为适用于装配体的任何ProSolid和ProMdl函数的输入。特别是&#xff0c;因为你可以使用函数ProSolidFeatVisit()来遍历特…

WPF中如何简单的使用CommunityToolkit.Mvvm创建一个项目并进行 增删改查

目录 开始前准备的数据库dbblog如下&#xff1a; 第一步&#xff1a;创建项目后下载四个NuGet程序包 第二步&#xff1a;删除原本的MainWindow.XAML文件 并创建如下的目录结构 然后在View文件夹下面创建Login.XAML和Main.XAML 并且在App.XAML中将启动项改为Login.X…

【51蛋骗鸡一共八个灯 按顺序依次12。34。56。78。两个灯同时亮灭的代码】2022-1-19

缘由proteus流水灯-嵌入式-CSDN问答 仿真51单片机流水灯代码-编程语言-CSDN问答 protues仿真单片机控制led流水灯-嵌入式-CSDN问答 #include<reg52.h>//头文件 void main() //主函数 {unsigned char y23;unsigned int ys0;while(1){if(!ys){P0y2;if(!(y2*4))y23…

数据结构:跳表实现(C++)

个人主页 &#xff1a; 个人主页 个人专栏 &#xff1a; 《数据结构》 《C语言》《C》《Linux》《网络》 《redis学习笔记》 文章目录 前言跳表跳表的优化思路skiplist&#xff0c;平衡搜索树&#xff0c;哈希表的对比 实现思路SkiplistNodesearch 搜索add 增加earse 删除 整体…

ssm基于Web的汽车客运订票系统的设计与实现+vue

系统包含&#xff1a;源码论文 所用技术&#xff1a;SpringBootVueSSMMybatisMysql 免费提供给大家参考或者学习&#xff0c;获取源码看文章最下面 需要定制看文章最下面 目 录 目 录 I 摘 要 III ABSTRACT IV 1 绪论 1 1.1 课题背景 1 1.2 研究现状 1 1.3 研究内容…

SSM中maven

一&#xff1a;maven的分模块开发 maven分模块就是在多人操作一个项目时将maven模块导入依赖&#xff0c;注意仓库里面没有资源坐标&#xff0c;需要使用install操作下载。 二&#xff1a;maven的依赖管理 pom文件中直接写的依赖叫做直接依赖&#xff0c;直接依赖中用到的依…