Spring Cloud应用- Eureka原理、搭建

news2024/11/29 6:26:52

初期对Spring Cloud的学习以应用搭建为主,所以内容不会太枯燥。

一直以来,自以为Spring全家桶的学习中,Spring framework是基础中的基础,部分内容也还是必须要读源码去理解底层原理,SpringMVC、SpringBoot,甚至Mybatis等等,都是如此。但是对于Spring Cloud来说,就从应用入手,以系统搭建为主。以此作为目标的话,Spring Cloud比其他几个部分来讲就会简单很多。

Spring Cloud的几大组件依次学习,先从Eureka入手。Eureka是netflix的服务治理组件,提供服务注册和服务发现、实现注册中心服务。

Eureka包含server端和client端。

Eureka server:服务端,也就是注册中心,每一个Eureka客户端需要向服务端注册,注册成功后服务端持有客户端列表,客户端定时发送心跳至服务端、汇报健康状态,超时未发送心跳服务的客户端将从注册中心的客户端列表中清除。

Eureka client:使用端、客户端,包括服务提供者server provider和服务消费者server consumer,不论服务提供者还是服务消费者,都要向Eureka服务端进行注册并定时发送心跳。服务消费者向服务端获取一份服务提供者的列表、在需要服务提供者服务的之后,向服务提供者发起服务请求并获取服务。

与Spring Boot版本的兼容

Spring Cloud基于SpringBoot搭建,在搭建Spring Cloud项目的时候需要注意Spring Cloud和SpringBoot之间的版本兼容关系,两者之间版本能兼容的情况下,搭建Spring Cloud项目其实并不复杂。否则如果版本不兼容,会出现各种莫名其妙的错误。

在这里插入图片描述

具体的版本对应关系请参考Spring官网:https://spring.io/projects/spring-cloud。

项目结构

我们用一个例子来学习Spring Cloud的Eureka组件,例子项目包含一个父项目、一个Eureka注册中心(Eureka server)Module、一个orderService(Eureka client,service consumer)module、一个userService(Eureka client,service provider)。

其中Eureka注册中心作为Eureka的服务端,所有的Eureka client都要向注册中心进行注册。

orderService模块模拟订单模块,作为微服务,是Eureka的客户端,启动后需要向注册中心进行注册。

userService模拟用户模块,作为微服务,是Eureka的客户端,启动后需要向注册中心进行注册。

orderService需要通过访问userService获取用户信息,这种情况下,orderService就是服务消费者,userSerivce是服务提供者,作为Eureka的客户端,两者都会从注册中心获取到Eureka客户端的信息,因此可以非常方便的访问到彼此:orderService当然能访问到userService提供的服务。

本案例的目的是搭建Spring Cloud的Eureka环境,不做具体的业务实现,也没必要进行数据库的访问、没必要做接口访问的鉴权…等等,所有相关业务细节均忽略。

好的,开始搭建环境。

父项目

创建SpringBoot工程,pom文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<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>
    <packaging>pom</packaging>
    <modules>
        <module>eureka-service</module>
        <module>userService</module>
        <module>orderservice</module>
    </modules>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.6.5</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>springCloud</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springCloud</name>
    <description>springCloud</description>
    <properties>
        <java.version>17</java.version>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <!--SpringCloud 版本号2021.0.8-->
        <spring.cloud.version>2021.0.8</spring.cloud.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <!--spring cloud依赖-->
            <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>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

父工程不需要有代码,所以,删除掉src目录。

注意选用的SpringBoot版本号为2.6.5,对应的Spring Cloud的版本号为2021.0.8,需要注意对照官网查询两者的兼容性。

注册中心模块

创建eureka注册中心模块,命名为eureka-service,pom文件中引入spring-web与eureka-service组件:

<?xml version="1.0" encoding="UTF-8"?>
<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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>springCloud</artifactId>
        <groupId>com.example</groupId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>eureka-service</artifactId>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
    </properties>

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

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

</project>

在resource下创建application.yml配置文件:

# eureka server
server:
  port: 10086

# eureka server
eureka:
  instance:
    hostname: localhost  # eureka服务名
  client:
    registerWithEureka: false #是否向注册中心注册自己
    fetchRegistry: false # 是否向注册中心获取注册信息
    serviceUrl: #
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
  server:
    enableSelfPreservation: false # 自我保护

设置服务名称为localhost,端口号为10086,设置注册中心的访问地址为http://localhost:10086/eureka/

其实可以发现Eureka注册中心服务其实就是一个web服务,由tomcat提供服务。

创建启动类:

package com;

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

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

启动类增加注解@EnableEurekaServer,表明当前服务是Eureka的注册中心。

运行启动类,服务正常启动后,浏览器输入http://localhost:10086访问Eureka服务:
在这里插入图片描述
可以看到服务已经正常启动,不过当前尚未有任何客户端注册。

userservice

创建userserice模块,pom文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>springCloud</artifactId>
        <groupId>com.example</groupId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>userService</artifactId>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
         <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
    </dependencies>


</project>

引入spring-cloud-starter-netflix-eureka-client以及spring-boot-starter-web即可。

在resource下创建application.yml文件:

spring:
  application:
    name: userservice  # eureka服务名称
eureka:
  client:
    service-url: # eureka注册中心路径
      defaultZone: http://127.0.0.1:10086/eureka/
server:
  port: 8080

指定当前应用的name,并配置eureka注册中心路径。并指定当前服务的端口号8080。

启动类加入@EnableEurekaClient注解,表明当前应用是eureka client:

package com;

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

@SpringBootApplication
@EnableEurekaClient
public class UserServiceApplication {
    public static void main(String[] args) {
        SpringApplication.run(UserServiceApplication.class);
    }
}

然后创建一个User类,简单一点,只包含一个属性name即可:

package com.example.entity;

import com.fasterxml.jackson.annotation.JsonCreator;
import lombok.Data;

@Data

public class User {
    private String name;
}

创建一个UserController,提供一个/user/getUser的访问,为了能够在测试的时候反馈具体是哪一个userservice提供了服务,log打印一句话,创建一个User对象返回即可。

package com.example.controller;

import com.example.entity.User;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/user")
@Slf4j
public class UserController {
    @GetMapping("/getUser")
    public User getUser(){
        log.info("userController's getuser comming......");
        User user=new User();
        user.setName("zhangsan");
        return user;
    }
}
orderservice

创建orderservice模块,pom文件与userservice模块大致相同:

<?xml version="1.0" encoding="UTF-8"?>
<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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>springCloud</artifactId>
        <groupId>com.example</groupId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>orderservice</artifactId>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>com.example</groupId>
            <artifactId>userService</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
    </dependencies>

</project>

application.yml文件,指定端口号9090:

spring:
  application:
    name: orderservice
eureka:
  client:
    service-url: # eureka ?????
      defaultZone: http://127.0.0.1:10086/eureka/
server:
  port: 9090

创建一个OrderController类,提供/order/getOrder接口,该接口调用OrderService的getOrder()方法:

package com.example.controller;

import com.example.service.OrderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/order")
public class OrderController {
    @Autowired
    OrderService orderService;
    @GetMapping("/getOrder")
    public String getOrder(){
        System.out.println("Come here to get Order....===");
        return orderService.getOrder();
    }

}

创建一个OrderService类,增加@Service注解加入Spring容器:

package com.example.service;

import com.example.entity.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
@Service
public class OrderService {
    @Autowired
    private RestTemplate restTemplate;
    public String getOrder(){
        //通过userService获取user信息
        String url="http://userservice/user/getUser";
        System.out.println("url"+url);
        User user=restTemplate.getForObject(url,User.class);
        System.out.println(user);
        return user.getName();
    }
}

OrderService类注入RestTemplate 对象,getOrder方法通过RestTemplate 对象调用userservice的/user/getuser接口获取User对象。之后返回获取到的user对象的name。

一切都是为了测试验证Eureka功能,所以不管是userService还是orderService,功能都非常简单。

orderservice还剩最后一步:启动类。

package com;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

@SpringBootApplication
@EnableEurekaClient
public class OrderServiceApplication {
    public static void main(String[] args) {
        SpringApplication.run(OrderServiceApplication.class);
    }

    @Bean
    @LoadBalanced
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }

}

增加@EnableEurekaClient注解(不过发现不加这个注解也不影响功能实现,等待后续解析源码学习底层原理的时候再研究这个注解的具体作用)。

启动类中通过@Bean的方式增加RestTemplate 对象的注入(注入到Spring IoC容器中),并且增加@LoadBanance注解,表明通过RestTemplate 对象调用userservice服务的时候需要实现负载均衡功能。

OK,所有的代码准备工作已完成。

测试

第一步,为了测试验证orderservice调用userservice的时候的负载均衡功能,需要启动多个userservice。

idea提供了这个能力,只不过需要在configuration中通过虚拟机参数指定服务端口:
在这里插入图片描述
我们一共配置了3个userservice。

orderService无所谓,其实有一个就够了。

我们顺序启动几个服务:

  1. eureka注册中心服务eureka-service(其实上面我们已经启动过了)。
  2. userservice服务userservice
  3. userservice服务userservice1
  4. userservice服务userservice2
  5. orderservice服务ordersercice

服务启动之后,在idea的service监控窗口可以看到各服务的启动端口、以及状态:
在这里插入图片描述

通过浏览器看一下eureka的工作状态:
在这里插入图片描述
可以看到当前注册到Eureka注册中心的共有4个服务,一个orderservice,3个userservice。

好了,可以开始测试了。

通过浏览器访问orderservice的getorder方法:
在这里插入图片描述
可以正常访问到orderservice服务的接口/order/getorder,并且,orderservice通过restTemplate、以及Eureka客户端可以正常访问到微服务userservice的/user/getuser接口!

说明Eureka注册中心的注册功能、已经Eureka客户端向注册中心拉取服务列表、访问其服务列表中的服务等功能已经可以正常工作了。

通过浏览器反复刷新localhost:9090/order/getOrder接口,多次访问,之后在idea的运行窗口观察userservice的log:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
发现8080端口的、8081端口的、以及8082端口的userservice服务会被轮番调用,说明loadbalance功能也已经可以正常工作了。

至于负载均衡策略,留待以后研究吧。

当然我们可以shutdown掉一个userservice,可以发现前端访问/order/getorder接口不受影响,也简单说明了通过Spring Cloud微服务功能可以提高系统服务能力、增强可靠性和可访问能力。

但是,需要补充一下,down掉一个userservice之后,前端访问/order/getorder接口偶然会出现失败的情况,说明一个问题:userservice服务down掉之后,并没有立即反馈给Eureka注册中心(因为有心跳周期的问题),之后,同步给Eureka注册中心之后,orderservice的本地服务列表也应该是需要时间来更新的,所以userservice服务down掉一段时间之后,前端访问才能正常。

let’s say it’s a day!

上一篇 SpringBoot 自动配置@EnableAutoConfiguration

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

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

相关文章

基于PESdk和EasyModbus实现录波控制逻辑和数据传输

文章目录 0. 概要1. 录波功能简介1.1 功能框架1.2 录波控制逻辑1.3 手动录波数据传输流程1.4 故障录波传输流程 2 C语言应用程序接口&#xff08;API&#xff09;2.1 EasyModbus接口2.2 PESdk 3 录波功能的实现3.1 功能码定义3.1.1 公共功能码3.1.2 用户自定义功能码3.1.3 保留…

维修服务预约小程序的效果如何

生活服务中维修项目绝对是需求量很高的&#xff0c;如常见的保洁、管道疏通、数码维修、安装、便民服务等&#xff0c;可以说每天都有生意&#xff0c;而对相关维修店企业来说&#xff0c;如何获得更多生意很重要。 接下来让我们看看通过【雨科】平台制作维修服务预约小程序能…

XX棋牌架设指南

一、环境要求&#xff1a; 1.服务器要求&#xff1a;WINDOWS2008或更高版本。 2.数据库要求&#xff1a;MS SQL SERVER 2008 R2或更高版本。 3.服务器需要安装IIS。 二、游戏部署步骤&#xff1a; 1.解压文件至服务器数据盘&#xff0c;此处以D盘为例进行说明。 2. 目录说…

树结构及其算法-用链表来实现二叉树

目录 树结构及其算法-用链表来实现二叉树 C代码 树结构及其算法-用链表来实现二叉树 以链表实现二叉树就是使用链表来存储二叉树&#xff0c;也就是运用动态分配内存和指针的方式来建立二叉树。 使用链表来表示二叉树的好处是节点的增加与删除操作相当容易&#xff0c;缺点…

MATLAB野外观测站生态气象数据处理分析实践应用

1.基于MATLAB语言 2.以实践案例为主&#xff0c;提供所有代码 3.原理与操作结合 4.布置作业&#xff0c;答疑与拓展 示意图&#xff1a; 以野外观测站高频时序生态气象数据为例&#xff0c;基于MATLAB开展上机操作&#xff1a; 1.不同生态气象要素文件的数据读写与批处理实现 …

Ubuntu18.04系统镜像制作

安装使用systemback # 添加源 sudo add-apt-repository --remove ppa:nemh/systemback sudo add-apt-repository "deb http://ppa.launchpad.net/nemh/systemback/ubuntu xenial main"# 下载 sudo apt update sudo apt install systemback打开systemback,点击创建li…

加州大学提出 PromptAgent 帮忙我们高效的使用 ChatGPT

本心、输入输出、结果 文章目录 加州大学提出 PromptAgent 帮忙我们高效的使用 ChatGPT前言加州大学团队提出了可以自动优化 Prompt 的框架 —— PromptAgentPromptAgent 原理论文 实例介绍PromptAgent 框架设计PromptAgent 的策略优化过过程PromptAgent 的结果是否具备普适性弘…

[Docker]四.Docker部署nodejs项目,部署Mysql,部署Redis,部署Mongodb

一.部署nodejs项目,映射端口,挂载数据卷 可以到https://hub.docker.com/去搜索node镜像,然后下载,也可以直接通过docker pull node下载镜像,然后用这个node镜像启动容器node,这样系统就集成了node服务了,在这里挂载www/node目录到容器中,并指定端口映射,运行nodejs程序,安装npm…

【Tricks】PC端微信输入时,文本出现右对齐情况怎么恢复

应该是摁到某个快捷键&#xff0c;于是光标就变成如下图所示的样子&#xff1a; 如果再输入字符&#xff0c;则字符就会变成下图所示的样子&#xff08;对齐输入框右侧&#xff09;&#xff1a; 解决办法&#xff1a;ctrl J 解决办法&#xff1a;ctrl J 解决办法&#xff1…

transformers-AutoClass

https://huggingface.co/docs/transformers/main/en/autoclass_tutorialhttps://huggingface.co/docs/transformers/main/en/autoclass_tutorialAutoClass可以自动推断和加载给定checkpoint的正确架构。 对于文本&#xff0c;使用Tokenizer将文本转换为token序列&#xff0c;创…

MTSC2023|深圳大会,你关心的技术话题都在这里

MTSC中国互联网测试开发大会 (Make Tester Super Cool&#xff0c; 简称MTSC&#xff09; 是由国内知名的测试技术社区TesterHome发起的软件测试行业技术会议&#xff0c;大会以“软件质量保障体系和测试研发技术交流”为主要目的&#xff0c;旨在为行业搭建一个深入探讨和交流…

【Linux】Nginx安装使用负载均衡及动静分离(前后端项目部署),前端项目打包

一、Nginx导言 1、引言 Nginx 是一款高性能的 Web 服务器和反向代理服务器&#xff0c;也可以充当负载均衡器、HTTP 缓存和安全防护设备。它的特点是内存占用小、稳定性高、并发性强、易于扩展&#xff0c;因此在互联网领域得到了广泛的使用。 总结出以下三点: 负载均衡&#x…

作物模型--土壤数据制备过程

作物模型–土壤数据制备过程 首先打开FAO网站 下载下面这两个 Arcgis打开.bil文件 .mdb文件在access中转成.xls格式 Arcgis中对.bil文件定义投影

进口跨境商城源码的技术要点和优化策略

随着全球电子商务的快速发展&#xff0c;进口跨境商城已成为一种新型的商业模式。为了满足消费者日益增长的需求&#xff0c;提高商城的运营效率和用户体验&#xff0c;对进口跨境商城源码进行技术优化显得尤为重要。本文将探讨进口跨境商城源码的技术要点和优化策略。 一、背景…

Prometheus+Node_exporter+Grafana实现监控主机

PrometheusNode_exporterGrafana实现监控主机 如果没有安装相关的配置&#xff0c;首先要进行安装配置&#xff0c;环境是基于Linux&#xff0c;虚拟机的相关环境配置在文末给出&#xff0c;现在先讲解PrometheusNode_exporterGrafana的安装和使用。 一.Prometheus安装 虽然…

后端设计PG liberty的作用和增量式生成

Liberty&#xff08;俗称LIB和DB&#xff09;&#xff0c;是后端设计中重要的库逻辑描述文件&#xff0c;这里边包含了除过physical&#xff08;当然也有一点点涉及&#xff09;以外所有的信息&#xff0c;对整个后端设计实现有非常大的作用。借此机会&#xff0c;一起LIB做一个…

半导体精密划片机在行业中适合切割哪些材料?

在高端精密切割划片领域中&#xff0c;半导体材料需要根据其特性和用途进行选择。划片机适用于多种材料&#xff0c;包括硅片、石英、氧化铝、氧化铁、砷化镓、铌酸锂、蓝宝石和玻璃等。这些材料在半导体行业被广泛使用&#xff0c;包括在集成电路、半导体芯片、QFN、发光二极管…

【R统计】各式各样的插补法解决数据缺失的问题!

&#x1f482; 个人信息&#xff1a;酷在前行&#x1f44d; 版权: 博文由【酷在前行】原创、需要转载请联系博主&#x1f440; 如果博文对您有帮助&#xff0c;欢迎点赞、关注、收藏 订阅专栏&#x1f516; 本文收录于【R统计】&#xff0c;该专栏主要介绍R语言实现统计分析的…

创新方案|2023如何用5种新形式重塑疫后实体门店体验

在电商盛行的当下&#xff0c;线上购物已成为新零售的重要组成部分&#xff0c;实体零售业正处于两难境地。一方面&#xff0c;实体零售是绝对有必要的&#xff1a;美国约 85% 的销售额来自实体商店。 另一方面&#xff0c;尽管增长放缓&#xff0c;但电商收入占销售总额的比例…

【蓝桥杯 第十届省赛Java B组】真题训练(A - H)H待更新

目录 A、组队 - 看图一眼出答案 B、不同子串 - 字符串模拟 set去重 C、数列求值 - 模拟取余 D、数的分解 - 三重暴力 E、迷宫 - bfs 判断路径 F、特别数的和 - 弱智模拟 G、外卖店优先级 - map 暴力&#xff08;90%通过率&#xff09; H、人物相关性分析 - A、组队 -…