当前位置: 首页 > 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;针对光伏电池…...

类器官:十五五规划下的“人体替身“革命

3月10日&#xff0c;《中华人民共和国国民经济和社会发展第十五个五年规划纲要&#xff08;草案&#xff09;》正式对外公布并提请全国人大审议。值得关注的是&#xff0c;类器官与器官芯片技术首次被提升至国家战略高度——在"专栏8 前沿科技攻关"的"生命科学与…...

解决AI人像风格不稳定:造相-Z-Image-Turbo亚洲美女LoRA实战体验

解决AI人像风格不稳定&#xff1a;造相-Z-Image-Turbo亚洲美女LoRA实战体验 1. 为什么需要LoRA技术&#xff1f; 在AI图像生成领域&#xff0c;风格一致性一直是困扰开发者和用户的难题。传统模型生成的人像往往存在以下问题&#xff1a; 风格漂移&#xff1a;同一组提示词在…...

Star CCM+ 实战:旋风分离器(cyclone separator)体网格生成与优化策略

1. 旋风分离器网格生成前的准备工作 在开始使用Star CCM生成旋风分离器体网格之前&#xff0c;我们需要做好充分的准备工作。旋风分离器作为一种常见的气固分离设备&#xff0c;其内部流动特性复杂&#xff0c;包含强烈的旋转流场和湍流现象。这就对网格质量提出了更高要求&am…...

开源软件的商业可持续性:爱、热血与面包的难题

在当今软件测试领域&#xff0c;开源工具如Selenium、JMeter和Postman已成为从业者的日常利器&#xff0c;它们以零成本、高灵活性和社区驱动的优势&#xff0c;大幅提升了测试效率和协作水平。然而&#xff0c;这些工具背后隐藏着一个尖锐矛盾&#xff1a;开源项目的维护者往往…...

智能Agent核心组件:基于BERT文本分割的任务指令分解模块

智能Agent核心组件&#xff1a;基于BERT文本分割的任务指令分解模块 你有没有遇到过这种情况&#xff1f;对着一个智能助手说&#xff1a;“帮我查一下明天北京的天气&#xff0c;然后告诉我穿什么衣服合适&#xff0c;再推荐几个室内的活动。” 然后&#xff0c;它要么只回答…...

bootstrap怎么修改折叠面板(Accordion)的边框颜色

Accordion默认边框颜色来自.accordion-item的border-color&#xff0c;继承自Sass变量$border-color或$accordion-border-color&#xff0c;作用于border-top和border-bottom。Accordion 默认边框颜色从哪来bootstrap 的 accordion 边框颜色默认由 .accordion-item 的 border-c…...

Magma智能运维:基于Prometheus的监控告警优化

Magma智能运维&#xff1a;基于Prometheus的监控告警优化 1. 监控系统面临的挑战 现代分布式系统的监控一直是个头疼的问题。随着微服务架构的普及&#xff0c;服务数量呈指数级增长&#xff0c;传统的监控方式已经力不从心。运维团队经常面临这样的困境&#xff1a;明明设置…...

JavaScript中字符串split方法转换为数组的细节.txt

context.WithTimeout没生效是因为未在关键位置检查ctx.Err()或未将ctx传入底层可取消操作&#xff1b;需确保I/O操作&#xff08;如http.NewRequestWithContext&#xff09;显式接收ctx&#xff0c;并在自定义协程中定期select监听ctx.Done()。context.WithTimeout 为什么没生效…...

丹青识画系统C语言基础集成示例:轻量级嵌入式图像处理接口

丹青识画系统C语言基础集成示例&#xff1a;轻量级嵌入式图像处理接口 最近在做一个智能门禁的项目&#xff0c;需要在树莓派这类小设备上跑图像识别。找了一圈&#xff0c;发现很多现成的AI模型库要么太臃肿&#xff0c;要么对C语言支持不友好&#xff0c;部署起来特别麻烦。…...

Cursor 3 Agents Window 实操:IDE 退居二线,Agent 编排成了主角

Cursor 3 Agents Window 实操&#xff1a;IDE 退居二线&#xff0c;Agent 编排成了主角 4月2日&#xff0c;Cursor 发布了 3.0 版本&#xff08;代号 Glass&#xff09;。这次更新的核心变化只有一句话&#xff1a;编辑器不再是默认界面&#xff0c;Agents Window 是。 不是加了…...