当前位置: 首页 > news >正文

分布式项目 09.服务器之间的通信和三个工具类

在这里插入图片描述
项目的结构:1.通过Nginx首先把访问首页的请求发送到前端web服务器,2.web服务器会根据请求的url中的一些细节,来把相关的请求发送到相关的服务器中,3.相关的服务器会处理业务,并且返回结果到web服务器中,最后在web服务器中去显示。

步骤:
01.在Nginx中配置首页的web服务器:(因为域名之前在hosts文件中已经配置过了,所以这次就没有配置hosts文件)
首页的配置服务器如下:

#配置前台管理服务器
server {
listen 80;
server_name www.jt.com;
location / {
#实现http请求的转发
proxy_pass http://localhost:8092;
}
}

02.在总项目jt中去再次声明一个新的子系统web服务器,专门用来处理web请求,并进行相关的分类转发。
第一步:先创建一个新的maven module
在这里插入图片描述
第二步:
写出相关项目的名称 web
打包方式是war,因为有静态资源需要管理。
在这里插入图片描述
在这里插入图片描述
第三步:在新创建的web项目中添加相关依赖:

添加总项目的common依赖,可以使用common中的工具包

<dependencies>
<dependency>
<groupId>com.jt</groupId>
<artifactId>jt-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>

插件:

<build>
<plugins>
<!--跳过测试类打包 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>

02.配置伪静态html页面:
以京东为例,京东的主页面有很多的html文件。但是这样子的html文件都是伪静态的html,本质上不是html文件,是开发人员为了好看做的修饰。

伪静态是相对真实静态来讲的,通常我们为了增强搜索引擎的友好面,都将文章内容生成静态页
面,但是有时为了实时的显示一些信息,或者还想运用动态脚本解决一些问题,不能用静态的方式来展示网站内容。这就损失了对搜索引擎的友好面。怎么样在两者之间找个中间方法呢,这就产生了伪静态技术。伪静态技术是指展示出来的是以html一类的静态页面形式,但其实是用ASP一类的动态脚本来处理的。
总结: 以html结尾展现的动态页面。
配置一个专门的类,用来修饰伪静态html文件。

@Configuration
public class MvcConfigurer implements WebMvcConfigurer{
//开启匹配后缀型配置 后缀任意.
@Override
public void configurePathMatch(PathMatchConfigurer configurer) {
configurer.setUseSuffixPatternMatch(true);
}
}

03.使用httpclient来实现服务器与服务器之间的通信

HTTP 协议是现在 Internet 上使用得最多、最重要的协议,越来越多的 Java 应用程序需要直接通过HTTP 协议来访问网络资源。虽然在 JDK 的 java net包中已经提供了访问 HTTP 协议的基本功能,但是
对于大部分应用程序来说,JDK 库本身提供的功能还不够丰富和灵活。HttpClient 是 Apache JakartaCommon 下的子项目,用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。HttpClient 已经应用在很多的项目中,比如 Apache Jakarta 上很著名的另外两个开源项目 Cactus 和 HTMLUnit 都使用了 HttpClient。现在HttpClient最新版本为HttpClient 4.5.6(2015-09-11)。

以下列出的是 HttpClient 提供的主要的功能,要知道更多详细的功能可以参见 HttpClient 的主页。
(1)实现了所有 HTTP 的方法(GET,POST,PUT,Delete 等)
(2)支持自动转向
(3)支持 HTTPS 协议
(4)支持代理服务器等

第一步:导入依赖jar包

<!--添加httpClient jar包 -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
</dependency

第二步:测试入门案例

@Test
public void doGet() throws ClientProtocolException, IOException {
HttpClient httpClient = HttpClients.createDefault();
String url = "http://www.baidu.com";
HttpGet get = new HttpGet(url);
HttpResponse response = httpClient.execute(get);
if(200 == response.getStatusLine().getStatusCode()) {
System.out.println("请求正确!!!!!!");
// HttpEntity封装返回值信息
HttpEntity entity = response.getEntity();
//将entity中携带的信息转化为字符串
String result = EntityUtils.toString(entity,"utf-8");
System.out.println(result);
}else {
System.out.println("请求异常!!!!!");
}
}

第三步:封装需要使用到的对象,三个工具类
HttpClientService:封装服务器之间通信的方法,get,post,其中就包括返回结果的状态state

package com.jt.util;import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;import org.apache.http.NameValuePair;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;@Service
public class HttpClientService {@Autowiredprivate CloseableHttpClient httpClient;@Autowiredprivate RequestConfig requestConfig;public String doGet(String url,Map<String,String> params,String charset){String result = null;//1.判断字符集编码是否为空 如果为空则给定默认值utf-8if(StringUtils.isEmpty(charset)){charset = "UTF-8";}//2.判断用户是否需要传递参数if(params != null){try {URIBuilder uriBuilder = new URIBuilder(url);for (Map.Entry<String,String> entry : params.entrySet()) {uriBuilder.addParameter(entry.getKey(), entry.getValue());}//url?id=1&name=tomurl = uriBuilder.build().toString();} catch (Exception e) {e.printStackTrace();}}//3.定义参数提交对象HttpGet get = new HttpGet(url);//4.为请求设定超时时间get.setConfig(requestConfig);//5.通过httpClient发送请求try {CloseableHttpResponse response = httpClient.execute(get);if(response.getStatusLine().getStatusCode() == 200){//表示程序调用成功result = EntityUtils.toString(response.getEntity(),charset);}else{System.out.println("调用异常:状态信息:"+response.getStatusLine().getStatusCode());throw new RuntimeException();}} catch (Exception e) {e.printStackTrace();}return result;}public String doGet(String url){return doGet(url, null, null);}public String doGet(String url,Map<String,String> params){return doGet(url, params, null);}public String doGet(String url,String charset){return doGet(url, null, charset);}//实现httpClient POST提交public String doPost(String url,Map<String,String> params,String charset){String result = null;//1.定义请求类型HttpPost post = new HttpPost(url);post.setConfig(requestConfig);  	//定义超时时间//2.判断字符集是否为nullif(StringUtils.isEmpty(charset)){charset = "UTF-8";}//3.判断用户是否传递参数if(params !=null){//3.2准备List集合信息List<NameValuePair> parameters = new ArrayList<>();//3.3将数据封装到List集合中for (Map.Entry<String,String> entry : params.entrySet()) {parameters.add(new BasicNameValuePair(entry.getKey(), entry.getValue()));}//3.1模拟表单提交try {UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(parameters,charset); //采用u8编码//3.4将实体对象封装到请求对象中post.setEntity(formEntity);} catch (UnsupportedEncodingException e) {e.printStackTrace();}}//4.发送请求try {CloseableHttpResponse response = httpClient.execute(post);//4.1判断返回值状态if(response.getStatusLine().getStatusCode() == 200) {//4.2表示请求成功result = EntityUtils.toString(response.getEntity(),charset);}else{System.out.println("获取状态码信息:"+response.getStatusLine().getStatusCode());throw new RuntimeException();}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}return result;}public String doPost(String url){return doPost(url, null, null);}public String doPost(String url,Map<String,String> params){return doPost(url, params, null);}public String doPost(String url,String charset){return doPost(url, null, charset);}
}

HttpClientConfig ,这里获取到上文提到案例中的CloseableHttpClient 对象,使用注解@Bean来将对象的管理权限交给spring容器进行管理。

package com.jt.config;import org.apache.http.client.config.RequestConfig;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;@Configuration
@PropertySource(value="classpath:/properties/httpClient.properties")
public class HttpClientConfig {@Value("${http.maxTotal}")private Integer maxTotal;						//最大连接数@Value("${http.defaultMaxPerRoute}")private Integer defaultMaxPerRoute;				//最大并发链接数@Value("${http.connectTimeout}")private Integer connectTimeout;					//创建链接的最大时间@Value("${http.connectionRequestTimeout}") private Integer connectionRequestTimeout;		//链接获取超时时间@Value("${http.socketTimeout}")private Integer socketTimeout;			  		//数据传输最长时间@Value("${http.staleConnectionCheckEnabled}")private boolean staleConnectionCheckEnabled; 	//提交时检查链接是否可用//定义httpClient链接池@Bean(name="httpClientConnectionManager")public PoolingHttpClientConnectionManager getPoolingHttpClientConnectionManager() {PoolingHttpClientConnectionManager manager = new PoolingHttpClientConnectionManager();manager.setMaxTotal(maxTotal);  //设定最大链接数manager.setDefaultMaxPerRoute(defaultMaxPerRoute);  //设定并发链接数return manager;}//定义HttpClient/*** 实例化连接池,设置连接池管理器。* 这里需要以参数形式注入上面实例化的连接池管理器@Qualifier 指定bean标签进行注入*/@Bean(name = "httpClientBuilder")public HttpClientBuilder getHttpClientBuilder(@Qualifier("httpClientConnectionManager")PoolingHttpClientConnectionManager httpClientConnectionManager){//HttpClientBuilder中的构造方法被protected修饰,所以这里不能直接使用new来实例化一个HttpClientBuilder,可以使用HttpClientBuilder提供的静态方法create()来获取HttpClientBuilder对象HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();httpClientBuilder.setConnectionManager(httpClientConnectionManager);return httpClientBuilder;}/*** 	注入连接池,用于获取httpClient* @param httpClientBuilder* @return*/@Beanpublic CloseableHttpClient getCloseableHttpClient(@Qualifier("httpClientBuilder") HttpClientBuilder httpClientBuilder){return httpClientBuilder.build();}/*** Builder是RequestConfig的一个内部类* 通过RequestConfig的custom方法来获取到一个Builder对象* 设置builder的连接信息* @return*/@Bean(name = "builder")public RequestConfig.Builder getBuilder(){RequestConfig.Builder builder = RequestConfig.custom();return builder.setConnectTimeout(connectTimeout).setConnectionRequestTimeout(connectionRequestTimeout).setSocketTimeout(socketTimeout).setStaleConnectionCheckEnabled(staleConnectionCheckEnabled);}/*** 使用builder构建一个RequestConfig对象* @param builder* @return*/@Beanpublic RequestConfig getRequestConfig(@Qualifier("builder") RequestConfig.Builder builder){return builder.build();}
}

HttpClientClose

package com.jt.config;import javax.annotation.PreDestroy;import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.apache.http.pool.PoolStats;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;@Component	//交给spring容器管理
public class HttpClientClose extends Thread{@Autowiredprivate PoolingHttpClientConnectionManager manage;private volatile boolean shutdown;	//开关 volatitle表示多线程可变数据,一个线程修改,其他线程立即修改public HttpClientClose() {///System.out.println("执行构造方法,实例化对象");//线程开启启动this.start();}@Overridepublic void run() {try {//如果服务没有关闭,执行线程while(!shutdown) {synchronized (this) {wait(5000);			//等待5秒//System.out.println("线程开始执行,关闭超时链接");//关闭超时的链接PoolStats stats = manage.getTotalStats();int av = stats.getAvailable();	//获取可用的线程数量int pend = stats.getPending();	//获取阻塞的线程数量int lea = stats.getLeased();    //获取当前正在使用的链接数量int max = stats.getMax();//System.out.println("max/"+max+":	av/"+av+":  pend/"+pend+":   lea/"+lea);manage.closeExpiredConnections();}}} catch (Exception e) {e.printStackTrace();throw new RuntimeException();}super.run();}//关闭清理无效连接的线程@PreDestroy	//容器关闭时执行该方法.public void shutdown() {shutdown = true;synchronized (this) {//System.out.println("关闭全部链接!!");notifyAll(); //全部从等待中唤醒.执行关闭操作;}}
}

利用HttpClient实现远程商品及商品详情查询
案例运行时候的示意图:www.jt.com 是访问前端web服务器的url,由Nginx完成代理,manage.jt.com是后端处理数据的服务器。在这里插入图片描述
第一步:在web服务器中,写一个controller类,处理发送过来的前端http请求。
这里是item界面的http请求。

@Controller //如果需要跳转页面.则使用Controller注解
@RequestMapping("/items")
public class ItemController {
@Autowired
private ItemService itemService;
/**
* 请求:http://www.jt.com/items/56237
* 请求分析: 通过jt-web服务器 访问后台商品信息,其中562379表示商品的ID号
* 根据商品id号,之后查询后台数据库,获取商品信息之后进行数据的页面展现
* 参数接收: 需要动态的接收url中的参数 利用restFul风格实现数据的动态获取
*页面展现数据要求:
* <h1>${item.title}</h1>
<strong>${item.sellPoint}</strong>
需要查询后台数据之后.将数据保存到域中,之后利用el表达式完成数据的动态取值.
*/
@RequestMapping("/{itemId}")
public String findItemById(@PathVariable Long itemId,Model model) {
//1.根据商品id查询数据库
Item item = itemService.findItemById(itemId);
//2.将item对象保存到域中
model.addAttribute("item", item);
//查询数据之后跳转页面;
return "item";
}
}

第二步:在web服务器中,写相关的接口service

public interface ItemService {
Item findItemById(Long itemId);
}

第三步:在web服务器中,写service的实现类,这里需要使用到httpclient

@Service
public class ItemServiceImpl implements ItemService {
@Autowired
private HttpClientService httpClientService;
/*
* 业务分析:
* 就是根据接收到的商品的id然后查询商品的数据,封装在Item对象
* 如何查询呢?
* jt-web是前台系统,不能直接连接数据库,如何查询数据呢?
* 查询方式:由前台系统jt-web发起请求去调用具体的后台系统jt-manage去查询商品数据
*/
@Override
@CacheFind//使用到了自定义的缓存注解
public Item findItemById(Long itemId) {
String url="http://manage.jt.com/web/item/findItemById/"+itemId;
String itemJSON=httpClientService.doGet(url);
//将json转换成java对象
return ObjectMapperUtil.toObject(itemJSON, Item.class);
}
}

第四步:
manage.jt.com来接受web服务器的service接口实现类中使用的httpclient的httpclientservice的get方法。
写一个controller类,转过来的也是url

@RestController
@RequestMapping("/web/item")
public class WebItemController {
@Autowired
private ItemService itemService;
/**
* 从前台向后台发起请求:
* http://manage.jt.com:80/web/item/findItemById/562379
* http://manage.jt.com:80是根目录,不用在requestmapping中写出来。因为现在就在manage.jt.com服务器中。
* 
*/
@RequestMapping("/findItemById/{itemId}")
public Item findItemById(@PathVariable Long itemId) {
return itemService.findItemById(itemId);
}
}

再去写接口的中方法和方法在接口实现类中的重写:

public interface ItemService {
Item findItemById(Long itemId);
}
@Override
public Item findItemById(Long itemId) {
return itemMapper.selectById(itemId);//利用MP实现查询
}

在这里插入图片描述
在这里插入图片描述
查询商品详情信息数据
第一步:业务分析
说明:如果需要展现商品详情信息,则需要将商品详情信息添加到域中,之后动态获取数据信息.
在item.jsp:

<div class="detail-content">
${itemDesc.itemDesc }
</div>

第二步:编辑jt-web项目的ItemController

@RequestMapping("/{itemId}")
public String findItemById(@PathVariable Long itemId,Model model) {
//1.根据商品id查询数据库
Item item = itemService.findItemById(itemId);
//2.将item对象保存到域中
model.addAttribute("item", item);
//3.查询商品详情信息
ItemDesc itemDesc = itemService.findItemDescById(itemId);
model.addAttribute("itemDesc", itemDesc);
//查询数据之后跳转页面;
return "item";
}

第三步:编辑jt-web项目的下的ItemService接口

public interface ItemService {
Item findItemById(Long itemId);
ItemDesc findItemDescById(Long itemId);
}

第四步:编辑jt-web的ItemServiceImpl实现类

@Override
public ItemDesc findItemDescById(Long itemId) {
String url = "http://manage.jt.com/web/item/findItemDescById/"+itemId;
String itemDescJSON = httpClientService.doGet(url);
return ObjectMapperUtil.toObject(itemDescJSON, ItemDesc.class);
}

第五步:编辑jt-manage项目下的WebItemController

/**
* 根据商品Id号动态查询商品详情信息
* http://manage.jt.com/web/item/findItemDescById/562379
*/
@RequestMapping("/findItemDescById/{itemId}")
public ItemDesc findItemDescById(@PathVariable Long itemId) {
return itemService.findItemDescById(itemId);
}

在这里插入图片描述

相关文章:

分布式项目 09.服务器之间的通信和三个工具类

项目的结构&#xff1a;1.通过Nginx首先把访问首页的请求发送到前端web服务器&#xff0c;2.web服务器会根据请求的url中的一些细节&#xff0c;来把相关的请求发送到相关的服务器中&#xff0c;3.相关的服务器会处理业务&#xff0c;并且返回结果到web服务器中&#xff0c;最后…...

C# 基本语法

C# 基本语法 C# 是一种面向对象的编程语言。在面向对象的程序设计方法中&#xff0c;程序由各种相互交互的对象组成。相同种类的对象通常具有相同的类型&#xff0c;或者说&#xff0c;是在相同的 class 中。 例如&#xff0c;以 Rectangle&#xff08;矩形&#xff09;对象为…...

做网络爬虫需要掌握哪些技术?

网络爬虫是指通过代码自动化地访问网页并收集数据的程序&#xff0c;要开发一个成功的爬虫&#xff0c;需要掌握以下技术&#xff1a; 1. HTTP 协议&#xff1a;了解 HTTP 请求和响应的基本内容&#xff0c;以及如何使用 HTTP 请求头和响应头来优化爬虫性能。 2. HTML/CSS/Ja…...

工作利器:三种简单方法将PPT转换成PDF

PDF是一种常用的文件格式&#xff0c;适合数据传输和阅读。在工作中&#xff0c;有时我们需要将PPT文件转换为PDF格式以方便使用。下面是几种将PPT转换为PDF的方法&#xff0c;其中方法二将修改为使用记灵在线工具进行转换。 方法一&#xff1a;直接将文件导出为PPT 一般来说…...

《设计模式》状态模式

《设计模式》状态模式 定义&#xff1a; 状态模式也称为状态机模式&#xff0c;允许对象在内部状态发生改变时改变它的行为&#xff0c;对象看起来好像修改了它的类。属于行为型模式。 状态模式的角色组成&#xff1a; State(抽象状态类)&#xff1a;定义一个接口用来封装与…...

2023年好用的设计图制作软件推荐

说到设计图制作软件&#xff0c;设计师当然最关注核心设计功能&#xff0c;包括预加载模板、图像数据库、界面和基本编辑功能。此外&#xff0c;还要考虑设计图制作软件是否可以协同工作。 1.即时设计 即时设计是一款「专业UI设计工具」&#xff0c;不受平台限制&#xff0c;…...

JavaNote_1.0.2_Spring

Spring框架定义 Spring Framework&#xff1a; Spring 最初的项目&#xff0c;包括六大模块&#xff1a;DAO、ORM、AOP、JEE、WEB、CORE。控制反转和面向切面编程是它的核心功能。 Spring Boot&#xff1a; 一套全新的基础框架&#xff0c;用来快速搭建Spring应用&#xff0c;…...

微服务多模块:Springboot+Security+Redis+Gateway+OpenFeign+Nacos+JWT (附源码)仅需一招,520彻底拿捏你

可能有些人会觉得这篇似曾相识&#xff0c;没错&#xff0c;这篇是由原文章进行二次开发的。 前阵子有些事情&#xff0c;但最近看到评论区说原文章最后实现的是单模块的验证&#xff0c;由于过去太久也懒得验证&#xff0c;所以重新写了一个完整的可以跑得动的一个。 OK&#…...

HNU数据结构与算法分析-作业4-图结构

1. (简答题) 【应用题】11.3 &#xff08;a&#xff09;画出所示图的相邻矩阵表示 &#xff08;b&#xff09;画出所示图的邻接表表示 &#xff08;c&#xff09;如果每一个指针需要4字节&#xff0c;每一项顶点的标号占用2字节&#xff0c;每一条边的权需要2字节&#xff0…...

AMPL IDE语法整理

文章目录 1、参数\集合和变量定义2、目标和约束的书写3、求解命令4、AMPL调用不同求解器的Options目录未完待续~ \qquad 最近再搞一些模型&#xff0c;需要用到AMPL中不同的求解器进行验证求解&#xff0c;故建立本博客&#xff0c;用于随时整理AMPL的相关语法和命令&#xff0…...

从0-1搭建支持gb28181协议搭建流媒体平台

系列文章目录 文章目录 系列文章目录前言一、搭建流程二、运行播放直播流效果: ![在这里插入图片描述](https://img-blog.csdnimg.cn/62b558f0213044f292be69da8cc29730.png)总结前言 一个基于C++开发的国标GB28181流媒体信令服务器。 采用SipServer+ZLMediaKit。可以搭建一个…...

数据结构与算法之栈: Leetcode 682. 棒球比赛 (Typescript版)

棒球比赛 https://leetcode.cn/problems/baseball-game/ 描述 你现在是一场采用特殊赛制棒球比赛的记录员。这场比赛由若干回合组成&#xff0c;过去几回合的得分可能会影响以后几回合的得分。 比赛开始时&#xff0c;记录是空白的。你会得到一个记录操作的字符串列表 ops&a…...

E-office Server_v9.0 漏洞分析

漏洞简介 泛微e-office是一款标准化的协同OA办公软件&#xff0c;实行通用化产品设计&#xff0c;充分贴合企业管理需求&#xff0c;本着简洁易用、高效智能的原则&#xff0c;为企业快速打造移动化、无纸化、数字化的办公平台。由于泛微 E-Office 未能正确处理上传模块中输入…...

MySQL数据库,JDBC连接数据库操作流程详细介绍

前言&#xff1a; 在学完 MySQL 和 Java 后&#xff0c;我们通常会尝试使用 Java编译器 连接 MySQL数据库&#xff0c;从而达到使用编译器来操作数据库的效果。连接的这个过程会用 JDBC 相关知识&#xff0c;因此我把 JDBC 包的下载及导入流程&#xff0c;以及 JDBC 的使用流程…...

libevent高并发网络编程 - 06_基于libevent的C++线程池实现

文章目录 1 功能简介线程池的初始化线程池执行流程 2 线程池类的设计线程类XThreadXThread.hXThread.cpp 线程池类XThreadPoolXThreadPool.hXThreadPool.cpp 任务基类taskXTask.h 3 自定义任务的例子自定义任务类ServerCMDServerCMD.hServerCMD.cpp 测试程序运行效果 1 功能简介…...

【Java EE 初阶】线程安全及死锁解决方案

目录 1.多线程下线程不安全的问题 1.使用多个线程对Array List集合进行添加操作并打印&#xff0c;查看结果 2.如何在多线程环境下使用线程安全的集合类 CopyOnWriteArrayList 3.多线程环境下使用队列 4.多线程环境下使用哈希表 1.HashTable线程安全 2.Concurrent Hash M…...

C语言函数大全-- _w 开头的函数(5)

C语言函数大全 本篇介绍C语言函数大全-- _w 开头的函数 1. _wspawnl 1.1 函数说明 函数声明函数功能int _wspawnl(int mode, const wchar_t* cmdname, const wchar_t* arglist, ...);启动一个新的进程并运行指定的可执行文件 参数&#xff1a; mode &#xff1a; 启动命令的…...

机械大专生能学会云计算吗,完全零基础的

机械大专生能学会云计算吗&#xff0c;完全零基础的 正常来说&#xff0c;大专及以上学历都能学会云计算&#xff0c;但是会和满足就业需求是两回事哈。如果你想通过学习就业&#xff0c;就需要根据当下相关岗位的普遍技术需求以及其他方面的要求&#xff0c;来针对性的学习和提…...

腾讯云EdgeOne为什么能让客户降本增效?

随着数字化时代的来临&#xff0c;各类线上互动场景不断出现&#xff0c;并成为人们日常工作生活中的一部分。然而&#xff0c;基于互联网提供线上娱乐、线上办公、线上购物等服务的企业&#xff0c;在复杂的全球网络环境下会遇到网络延迟不稳定的情况&#xff0c;海外环境更多…...

基于粒子群算法的微网经济优化调度——附Matalb代码

目录 摘要&#xff1a; 代码主要内容&#xff1a; 研究背景&#xff1a; 微电网模型&#xff1a; 粒子群算法&#xff1a; 运行结果&#xff1a; Matlab代码分享&#xff1a; 摘要&#xff1a; 提出了一种经济与环保相协调的微电网优化调度模型&#xff0c;针对光伏电池…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销&#xff0c;平衡网络负载&#xff0c;延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

线程同步:确保多线程程序的安全与高效!

全文目录&#xff1a; 开篇语前序前言第一部分&#xff1a;线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分&#xff1a;synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分&#xff…...

CentOS下的分布式内存计算Spark环境部署

一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架&#xff0c;相比 MapReduce 具有以下核心优势&#xff1a; 内存计算&#xff1a;数据可常驻内存&#xff0c;迭代计算性能提升 10-100 倍&#xff08;文档段落&#xff1a;3-79…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!

5月28日&#xff0c;中天合创屋面分布式光伏发电项目顺利并网发电&#xff0c;该项目位于内蒙古自治区鄂尔多斯市乌审旗&#xff0c;项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站&#xff0c;总装机容量为9.96MWp。 项目投运后&#xff0c;每年可节约标煤3670…...

Python爬虫(二):爬虫完整流程

爬虫完整流程详解&#xff08;7大核心步骤实战技巧&#xff09; 一、爬虫完整工作流程 以下是爬虫开发的完整流程&#xff0c;我将结合具体技术点和实战经验展开说明&#xff1a; 1. 目标分析与前期准备 网站技术分析&#xff1a; 使用浏览器开发者工具&#xff08;F12&…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面

代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口&#xff08;适配服务端返回 Token&#xff09; export const login async (code, avatar) > {const res await http…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文全面剖析RNN核心原理&#xff0c;深入讲解梯度消失/爆炸问题&#xff0c;并通过LSTM/GRU结构实现解决方案&#xff0c;提供时间序列预测和文本生成…...

Golang——9、反射和文件操作

反射和文件操作 1、反射1.1、reflect.TypeOf()获取任意值的类型对象1.2、reflect.ValueOf()1.3、结构体反射 2、文件操作2.1、os.Open()打开文件2.2、方式一&#xff1a;使用Read()读取文件2.3、方式二&#xff1a;bufio读取文件2.4、方式三&#xff1a;os.ReadFile读取2.5、写…...

【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案

目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后&#xff0c;迭代器会失效&#xff0c;因为顺序迭代器在内存中是连续存储的&#xff0c;元素删除后&#xff0c;后续元素会前移。 但一些场景中&#xff0c;我们又需要在执行删除操作…...

根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的----NTFS源代码分析--重要

根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的 第一部分&#xff1a; 0: kd> g Breakpoint 9 hit Ntfs!ReadIndexBuffer: f7173886 55 push ebp 0: kd> kc # 00 Ntfs!ReadIndexBuffer 01 Ntfs!FindFirstIndexEntry 02 Ntfs!NtfsUpda…...