SpringBoot扩展——应用Web Service!
应用Web Service
Web Service是一个SOA(面向服务的编程)架构,这种架构不依赖于语言,不依赖于平台,可以在不同的语言之间相互调用,通过Internet实现基于HTTP的网络应用间的交互调用。Web Service是一个可以远程调用的类,即它可以让项目使用其他资源,如在网页上显示天气、地图、微博上的最新动态等,这些都是调用的其他资源。
Web Service简介
在Web Service体系架构中有3个角色:
服务提供者(Service Provider),也称为服务生产者;
服务请求者(Service Requester),也称为服务消费者;
服务注册中心(Service Register),服务提供者在这里发布服务,
服务请求者在这里查找服务,获取服务的绑定信息。
上述3个角色的请求过程如图6.20所示。
Web Service的3个角色间主要有3个操作:
发布(Publish):服务提供者把服务按照规范格式发布到服务注册中心。
查找(Find):服务请求者根据服务注册中心提供的规范接口发出查找请求,获取绑定服务所需的相关信息。
绑定(Bind):服务请求者根据服务绑定信息配置自己的系统,从而可以调用服务提供者提供的服务。
说明:Web Service是通过SOAP方式在Web上提供软件服务,使用WSDL文件说明提供的软件服务的具体信息,并通过UDDI进行注册。
Web Service的主要适用场景是软件的集成和复用,如气象局(服务端系统)、天气查询网站等,具体如下:
当发布一个服务(对内/对外),不考虑客户端类型和性能时,建议使用Web Service。
如果服务端已经确定使用Web Service,则客户端不能再选择其他框架,必须使用Web Service。
在Java项目开发中,Web Service框架主要包括Axis2和CXF,如果需要多语言的支持,建议选择Axis2。如果想和Spring集成或者其他程序集成,建议使用CXF,它们之间的区别如表6.4所示。
表6.4 Axis2和CXF区别
Spring Web Service简介
Spring Web Service(Spring-WS)是Spring团队开发的一个Java框架,其专注于创建文档驱动的Web服务。Spring Web Service的目的是促进契约优先的SOAP服务开发,通过配置XML文件的方式,创建灵活的Web服务,简化WebService的开发。
Spring Web Service有以下几个功能:
XML映射到对象:可以使用Message Payload和SOAP Action Header中存储的信息或使用XPath Expression将基于XML的请求映射给任何对象。
用于解析XML的多API支持:除了用于解析传入XML请求的标准JAXPAPI(DOM、SAX、StAX)之外,还支持其他库,如JDOM、dom4j、XOM。
用于划分多分组XML的多API支持:Spring Web Service使用其Object/XML Mapping模块支持JAXB 1和2、Castor、XMLBeans、JiBX和XStream库。Object/XML Mapping模块也可以用在非Web服务代码中。
基于Spring的配置:在Spring Web Service应用中可以方便、快速地使用Spring配置进行项目的自定义配置。
使用WS-Security模块:可以签名、加密、解密SOAP消息或对其进行身份验证。
支持Acegi安全性:使用Spring Web Service的WS-Security实现,Acegi配置可用于SOAP服务。
Spring Web Service是由5个模块组成的,各模块的功能如下:
Spring-WS Core:是主要模块,提供WebServiceMessage和SoapMessage等中央接口、服务器端框架、强大的消息调度功能及实现Web服务端点的支持类。它还提供Web Service使用者客户端作为WebServiceTemplate。
Spring-WS支持:为JMS和电子邮件等提供支持。
Spring-WS Security:负责提供与核心Web服务模块集成的WSSecurity实现。此模块允许使用现有的Spring SecurityImplementation进行身份验证和授权。Spring XML:为Spring Web Service提供XML支持类。该模块由Spring-WS框架内部使用。
Spring OXM:提供XML与对象映射的支持类。
这5个组件的关系如图6.21所示。
实战:Spring Web Service服务端发布项目
下面新建一个项目,并通过Spring Web Service服务端(功能提供者)发布。
(1)新建一个Web Service的提供者(provider),在pom.xml中添加Spring Web Service依赖如下:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.10.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId><artifactId>web-services-provider</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>web-services-provider</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web-services</artifactId>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
<version>3.3.5</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http</artifactId>
<version>3.3.5</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId> </plugin>
</plugins>
</build>
(2)新建Web Service的配置类,在其中配置请求地址信息如下:
package com.example.webservicesprovider.config;
import com.example.webservicesprovider.service.DemoService;
import com.example.webservicesprovider.service.impl.DemoServiceImpl;
import org.apache.cxf.Bus;
import org.apache.cxf.bus.spring.SpringBus;
import org.apache.cxf.jaxws.EndpointImpl;
import org.apache.cxf.transport.servlet.CXFServlet;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.xml.ws.Endpoint;
@Configuration
public class CxfConfig {
@Bean
public ServletRegistrationBean<CXFServlet> cxfServlet() {
/**
* ServletRegistrationBean是Servlet注册类,
* 参数1为Servlet对象,参数2为请求到Servlet的地址
*/
return new ServletRegistrationBean<>(new CXFServlet(),
"/demo/*");
}
@Bean(name = Bus.DEFAULT_BUS_ID)
public SpringBus springBus() {
return new SpringBus();
} /**
* 类的注册
* @return
*/
@Bean
public DemoService demoService() {
return new DemoServiceImpl();
}
/**
* 发布多个服务时,创建多个接触点,并使用@Qualifier指定不同的名称
* @return
*/
@Bean
public Endpoint endpoint() {
EndpointImpl endpoint = new EndpointImpl(springBus(),
demoService());
endpoint.publish("/api");
return endpoint;
}
}
(3)新建Web Service提供服务的接口:
package com.example.webservicesprovider.service;
import javax.jws.WebService;
/**
* name: Web Service的名称;
* targetNamespace: 指定名称空间,一般使用接口实现类的包名的反缀
*/
@WebService(name = "DemoService", targetNamespace =
"http://impl.service.
server.example.com")
public interface DemoService { String sayHello(String user);
}
(4)新建接口的实现类,对外提供的功能的实现代码如下:
package com.example.webservicesprovider.service.impl;
import com.example.webservicesprovider.service.DemoService;
import javax.jws.WebService;
import java.time.LocalDateTime;
/**
* serviceName: 对外发布的服务名;
* targetNamespace: 指定名称空间,一般使用接口实现类的包名的反缀;
* endpointInterface: 服务接口的全类名;
*/
@WebService(serviceName = "DemoService"
, targetNamespace = "http://impl.service.server.example.com"
, endpointInterface =
"com.example.webservicesprovider.service.DemoService")
public class DemoServiceImpl implements DemoService {
@Override
public String sayHello(String user) {
return user + ",接收到了请求, 现在的时间是: " +
LocalDateTime.now();
}
}
(5)新建Spring Boot的启动类:
package com.example.webservicesprovider;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class WebServicesProviderApplication {
public static void main(String[] args) {
SpringApplication.run(WebServicesProviderApplication.class,
args);
}
}
(6)在application.properties中设置项目端口为8080:
server.port=8080
实战:Spring Web Service客户端调用项目
完成了服务提供者的创建后,新建一个Spring Web Service的消费者(client),在pomx.xml中添加Spring Web Service依赖如下:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.10.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>web-services-client</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>web-services-client</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties> <dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web-services</artifactId>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
<version>3.3.5</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http</artifactId>
<version>3.3.5</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
(1)在客户端中新建一个测试服务调用的TestController入口,请求
Web Service的提供者对返回的信息进行解析并打印结果。
package com.example.webservicesclient;
import org.apache.cxf.endpoint.Client;
import
org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory;
import org.apache.cxf.transport.http.HTTPConduit;
import org.apache.cxf.transports.http.configuration.HTTPClientPolicy;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.URL;
import java.net.URLConnection;
import java.nio.charset.StandardCharsets;
@RestController
public class TestController {
@GetMapping("/test")
public void test() throws Exception {
//创建动态客户端
JaxWsDynamicClientFactory factory =
JaxWsDynamicClientFactory.newInstance();
//访问自己的服务端
Client client =
factory.createClient("http://localhost:8080/demo/api?wsdl");
// 需要密码时要加上用户名和密码
// client.getOutInterceptors().add(new
ClientLoginInterceptor(USER_NAME,PASS_WORD));
HTTPConduit conduit = (HTTPConduit) client.getConduit(); HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy();
httpClientPolicy.setConnectionTimeout(2000); //连接超时
httpClientPolicy.setAllowChunking(false); //取消块编码
httpClientPolicy.setReceiveTimeout(120000); //响应超时conduit.setClient(httpClientPolicy);
//client.getOutInterceptors().addAll(interceptors); //设置拦截器
try {
Object[] objects;
// 调用方式invoke("方法名",参数1,参数2,参数3....);
objects = client.invoke("sayHello", "cc, i miss you ");
System.out.println("返回数据:" + objects[0]);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 测试第三方的Web Service接口,测试天气
*/
@GetMapping("/testWeather")
public void testWeather() {
String weatherInfo = getWeather("北京");
System.out.println(weatherInfo);
}
/**
* 对服务器端返回的XML进行解析
*
* @param city用户输入的城市名称
* @return字符串用#分割
*/
private static String getWeather(String city) {
Document doc;
DocumentBuilderFactory dbf =
DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
try {
DocumentBuilder db = dbf.newDocumentBuilder();
InputStream is = getSoapInputStream(city); assert is != null;
doc = db.parse(is);
NodeList nl = doc.getElementsByTagName("string");
StringBuffer sb = new StringBuffer();
for (int count = 0; count < nl.getLength(); count++) {
Node n = nl.item(count);
if ("查询结果为
空!".equals(n.getFirstChild().getNodeValue())) {
sb = new StringBuffer(" ");
break;
}
sb.append(n.getFirstChild().getNodeValue()).append("
\n");
}
is.close();
return sb.toString();
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* 从接口文档中获取SOAP的请求头,并替换其中的标志符号为用户输入的城市
* (方法的接口文档:
* http://ws.webxml.com.cn/WebServices/WeatherWebService.asmx?
op=getWeatherbyCityName)
*
* @param city用户输入的城市名称
* @return客户将要发送给服务器的SOAP请求
*/
private static String getSoapRequest(String city) {
String sb = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
"<soap:Envelope
xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" " +
"xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" " +
"xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">" +
"<soap:Body> <getWeatherbyCityName
xmlns=\"http://WebXml.com.cn/\">" +
"<theCityName>" + city +
"</theCityName> </getWeatherbyCityName>" +
"</soap:Body></soap:Envelope>";
return sb;
}
/**
* 通过接口文档的请求头构建SOAP请求,向服务器端发送SOAP请求,并返回流
*
* @param city用户输入的城市名称
* @return服务器端返回的输入流,供客户端读取
* @throws Exception异常
*/
private static InputStream getSoapInputStream(String city) throws
Exception {
try {
String soap = getSoapRequest(city);
// 通过请求的服务地址(即Endpoint)构建URL对象,并使用URL对象开启连接
URL url = new
URL("http://ws.webxml.com.cn/WebServices/WeatherWebService.asmx");
URLConnection conn = url.openConnection();
conn.setUseCaches(false);
conn.setDoInput(true);
conn.setDoOutput(true);
// 为连接设置请求头属性
conn.setRequestProperty("Content-Length",
Integer.toString(soap.length()));
conn.setRequestProperty("Content-Type", "text/xml;
charset=utf-8");
conn.setRequestProperty("SOAPAction",
"http://WebXml.com.cn/getWeatherbyCityName");
// 将请求的XML信息写入连接的输出流
OutputStream os = conn.getOutputStream();
OutputStreamWriter osw = new OutputStreamWriter(os,
StandardCharsets.UTF_8);
osw.write(soap);
osw.flush();
osw.close();
// 获取连接中请求得到的输入流
return conn.getInputStream();
} catch (Exception e) { e.printStackTrace();
return null;
}
}
}
(2)新建Spring Boot启动类:
package com.example.webservicesclient;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class WebServicesClientApplication {
public static void main(String[] args) {
SpringApplication.run(WebServicesClientApplication.class,
args);
}
}
(3)在application.properties中添加当前项目端口为8080:
server.port=8081
(4)启动项目服务端provider和客户端client服务,打开浏览器并且访问网址localhost: 8080/demo/api?wsdl,可以看到服务端提供的WebService的说明,如图6.22所示。
图6.22 服务端提供的Web Service说明详情
(5)访问localhost:8081/test,可以测试Web Service的调用,client完成了provider的功能调用,可以在控制台上看到打印信息,如图6.23所示,表明Web Service调用成功。
图6.23 测试Web Service调用
(6)访问
localhost:8081/testWeather,调用一个公开的Web Service方法可以查询北京市的天气,显示结果如图6.24所示。
图6.24 调用Web Service查询天气
至此完成了Web Service调用的演示。在开发中使用Web Service对外提供接口,能够更好地对外提供数据,实现特定的功能。
相关文章:
SpringBoot扩展——应用Web Service!
应用Web Service Web Service是一个SOA(面向服务的编程)架构,这种架构不依赖于语言,不依赖于平台,可以在不同的语言之间相互调用,通过Internet实现基于HTTP的网络应用间的交互调用。Web Service是一个可以…...
5G核心网周期性注册更新机制:信令流程与字段解析
一、周期性注册更新的技术背景与流程概述 1.1 注册更新的核心目的 在5G网络中,UE通过周期性注册更新维持与核心网的连接状态,主要作用包括: 状态保活:避免AMF因超时而释放UE上下文(T3512定时器超时前需完成更新);位置更新:通知网络UE的当前位置,确保寻呼可达;能力同…...
【LLM学习笔记3】搭建基于chatgpt的问答系统(下)
目录 一、检查结果检查有害内容检查是否符合产品信息 二、搭建一个简单的问答系统三、评估输出1.当存在一个简单的正确答案2.当不存在一个简单的正确答案 一、检查结果 本章将引领你了解如何评估系统生成的输出。在任何场景中,无论是自动化流程还是其他环境&#x…...
算法导论第十九章 并行算法:解锁计算新维度
第十九章 并行算法:解锁计算新维度 “并行计算不是未来,而是现在。” —— David Patterson 在单核性能增长放缓的时代,并行算法成为突破计算极限的关键。本章将带你探索多核处理器、分布式系统和GPU加速的奇妙世界,揭示如何通过协…...
Python 数据分析与可视化 Day 1 - Pandas 数据分析基础入门
🎯 今日目标 理解 Pandas 的作用和核心概念学会创建 Series 和 DataFrame掌握基本数据读取(CSV)与常用查看方法 🧰 1. 什么是 Pandas? Pandas 是基于 NumPy 的强大数据分析库,提供了灵活的表格数据结构 Da…...
【数字人开发】Unity+百度智能云平台实现长短文本个性化语音生成功能
一、创建自己的应用 百度智能云控制台网址:https://console.bce.baidu.com/ 1、创建应用 2、获取APIKey和SecretKey 3、Api调试 调试网址:https://console.bce.baidu.com/support/?timestamp1750317430400#/api?productAI&project%E8%AF%AD%E9%…...
(哈希)128. 最长连续序列
题目 给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。 请你设计并实现时间复杂度为 O(n) 的算法解决此问题。 示例 1: 输入:nums [100,4,200,1,3,2] 输出ÿ…...
MFC中使用CRichEditCtrl控件让文本框中的内容部分加粗
MFC中文本框控件的内容,设置好字体格式后,只能单一的显示,如果相对文本框的内容部分加粗,或者部分加颜色、链接等都无法实现,但MFC中提供了CRichEditCtrl控件,就很方便的实现文本框中部分内容需要特殊处理的…...
Redis 的优势有哪些,它是CP 还是 AP?CAP 理论又是什么?
Redis的核心优势 Redis作为当今最流行的内存数据库之一,具有以下显著优势: 1. 卓越的性能表现 内存存储:数据主要存储在内存中,读写速度极快(10万 QPS)单线程架构:避免多线程竞争,…...
flink的多种部署模式
## 部署模式和运行模式 ### 部署模式 - 本地local - 单机无需分布式资源管理 - 集群 - 独立集群standalone - 需要flink自身的任务管理工具 - jobmanager接收和调度任务 - taskmanager执行 - on其他资源管理工具yarn/k8s …...
SQL分片工具类
SQL分片工具类(SqlShardingUtil)提供数据库查询的智能分片功能,支持数字和字符串两种字段类型的分片策略。对于数字字段,可以指定分片数量均匀划分数值区间;对于字符串字段,则按照ASCII字符范围自动划分。工具类确保分片后的SQL语…...
死锁相关知识
死锁是什么 死锁(Deadlock)是指两个或多个进程(或线程)在执行过程中,因为互相等待对方释放资源,导致永远无法继续执行的状态。 ✅ 死锁的形成条件(必须同时满足以下四个)࿱…...
oscp靶机练习PG Reconstruction
枚举阶段 nmap -A -T4 -p- -Pn -n 192.168.217.103 发现ftp,进行连接枚举 都下载到本地 这里提示我们两点,可以看看pcap文件,还有就是可能有密码遗留还没有删除。 使用下面命令进行过滤筛选流量包,查看与密码相关 http.reque…...
写题。贪心题组
一、 解题思路:主要还是写出val / m,按这个排序,就行了 #include<bits/stdc.h> #define endl "\n" #define ll long long #define pii pair<int,int> using namespace std;struct doro {int m, val;double cmp; } arr…...
UE官方文档学习 TAarry 查询
这个很简单经常用。 二.GetData() . GetData(),像C里拿到数组首地址一样。它不具有越界保护机制,StrArr拥有越界保护机制。这个地址在数组不做改变,如扩容等有用。 void AWXArrayActor::WXFindArray() {TArray<FString> StrArr { &q…...
使用Haproxy搭建Web群集
LVS负载均衡群集 Haproxy介绍http请求负载均衡常用调度算法常见的web群集调度器 示例操作安装httpd(两台网站服务器操作一致)编译安装haproxyhaproxy服务器配置(1)建立haproxy的配置文件(2)修改haproxy.cfg配置文件 测试haproxy的日志(1)修改 haproxy 配…...
Linux 基础命令:`ls`、`cd`、`du` 快速入门
在 Linux 系统中,ls、cd 和 du 是日常操作中最常用的三个命令。掌握它们能大幅提升文件管理效率。 1. ls:查看目录内容 用途:列出当前或指定目录下的文件和子目录。 常用命令: ls -l # 详细列表(权限、大…...
[论文阅读] 人工智能 + 软件工程 | USEagent:迈向统一的AI软件工程师
论文信息 article{applis2025unified,title{Unified Software Engineering agent as AI Software Engineer},author{Applis, Leonhard and Jiang, Nan and Zhang, Yuntong and Tan, Lin and Liang, Shanchao and Roychoudhury, Abhik},journal{arXiv preprint arXiv:2506.1468…...
微信小程序传参过来了,但是数据没有获取到
使用本方法前,已经采用encodeURIComponent把拼接的参数编码之后,拼接在链接上,在接受的页面的onLoad生命周期,接收到参数之后,采用decodeURIComponent进行解码的操作,如果这个也不行,不是说不行…...
微信小程序form表单手机号正则检验pattern失效
好奇怪啊,h5页面校验没问题,在微信小程序模拟器以及真机运行都失效,排查半天,记录一下 PS:身份证号校验也没问题,就手机号校验有问题,奇奇怪怪的 之前的写法(在小程序上不生效&…...
repo 工具
repo 是 Google 为管理多个 Git 仓库而开发的工具,主要用于 Android 开源项目(AOSP)等大型项目。它通过清单文件(manifest.xml)统一管理多个 Git 仓库的依赖关系。以下是核心用法和常见命令: 一、安装 repo…...
Python实例题:基于 TensorFlow 的图像识别与分类系统
目录 Python实例题 题目 问题描述 解题思路 关键代码框架 难点分析 扩展方向 Python实例题 题目 基于 TensorFlow 的图像识别与分类系统 问题描述 开发一个基于 TensorFlow 的图像识别与分类系统,包含以下功能: 图像分类模型:基于…...
Windows 10开始菜单优化方案,如何实现Win7风格开始菜单的还原
今天阿灿给大家安利个好东西 Start10这软件能让Win10的开始菜单变回Win7那种经典样式,用起来特别顺手。不仅能改开始菜单外观,还能调整任务栏布局,想怎么设置都行。 我用它主要就图两点: 1. 找回Win7那种简洁好用的开始菜单 2.…...
Kafka性能压测报告撰写
在大数据生态体系中,Kafka以其卓越的高吞吐、低延迟特性,成为消息队列领域的中流砥柱。然而,随着业务规模不断扩张,数据流量日益激增,Kafka的性能表现直接关乎业务系统的稳定运行与效率提升。通过科学严谨的性能压测&a…...
IP 地理库的使用指南:从基础应用到深度实践
P 地理库的使用指南:从基础应用到深度实践 在数字化时代,IP 地址如同网络世界里的 “门牌号码”,而 IP 地理库则是解读这些号码背后秘密的 “解码器”。它不仅能定位 IP 对应的地理位置,还能挖掘出丰富的网络属性信息。接下来…...
C#的泛型和匿名类型
一、C#的泛型简介 泛型是一种允许你延迟编写类或方法中的数据类型规范,直到你在实际使用时才替换为具体的数据类型【简单的说:泛型就是允许我们编写能够适用于任何数据类型的代码,而无需为每种特定类型重写相同的代码】(T是类型参数ÿ…...
ABP VNext + MongoDB 数据存储:多模型支持与 NoSQL 扩展
🚀 ABP VNext MongoDB 数据存储:多模型支持与 NoSQL 扩展(生产级实践) 目录 🚀 ABP VNext MongoDB 数据存储:多模型支持与 NoSQL 扩展(生产级实践)🎯 引言🧰…...
JETBRAINS IDE 开发环境自定义设置快捷键
Date: 2025-06-18 20:39:52 author: lijianzhan JetBrains简介 让它发生。 用代码。 在JetBrains,代码是我们的激情所在。自成立以来,我们一直致力于打造世界上最强大、最有效的开发工具。 1.JETBRAINS官网,可以在官网下载代码编辑器 2.进入…...
JAVA——泛型
泛型(Generics)是Java语言在JDK 5.0版本中引入的一种强大特性,用于在编译时提供更强的类型检查和类型安全。它允许程序员在定义类、接口和方法时使用类型参数(Type Parameters),从而实现类型参数化。通过泛…...
攻防演练:1.木马后门文件演练
为了防止 Linux 服务器上传木马后门文件,可以编写一个脚本,定期检查系统中的可疑文件、进程和权限。以下是一个示例脚本,用于检查常见的后门文件、异常进程和权限问题。 脚本功能 检查常见后门文件路径。检查异常 SUID/SGID 文件。检查异常进…...
c++ STL---vector使用
本文对STL---中的vector的使用是参考网站 vector - C Reference 的内容,该网站是外文的哦,大家可以尝试打开看看更深刻的理解。本文是抽取其中常使用,然后加上自己的是理解哦。 前言 vector其实是顺序表类模板的封装啊! 数据结构…...
windows标题栏显示奇怪的蓝色,怎么解决
背景 如下,非常奇怪,如果窗口是active状态就是蓝色的,为什么? 如果你遇到上述问题,可以这么解决: 右键点击桌面,选择 “个性化”, 滚动到下面,看到 “标题栏和窗口边…...
Kafka存储设计深度剖析:日志、索引与文件管理的底层奥秘
引言 在分布式消息系统领域,Kafka凭借卓越的性能与高可靠性占据重要地位,而这一切都离不开其精妙的存储设计。从消息的持久化存储到高效检索,从日志分段管理到数据清理策略,Kafka的存储架构设计巧妙,能够支撑海量消息…...
将多个Excel合并到一个Excel中的方法
今天遇到这么一个问题,需要将多个Excel表格中的数据汇总表,合并在一个Excel中,并且显示一致。 因此编写了以下代码来解决这个问题, 1.在Excel中按AltF11,快速调出命令控制台 2.工具栏选择插入——模块——将以下脚本…...
Debian配置Redis主从、哨兵
前言 Redis的下载安装可参考Centos安装配置Redis6.x,Centos和Debian的步骤基本类似,或自行在网上搜索相关资料 注意:远程连接需放开相应端口 主从 搭建一个一主二从的主从模式 处理conf文件 #进入redis所在目录 cd /tools/redis/redis6 …...
OpenSSL引擎 + PKCS11 + SoftHSM2认证
OpenSSL引擎 PKCS11 SoftHSM2 前言:金融级安全的基石 在金融、军工等高安全领域,硬件安全模块(HSM) 是保护加密密钥的黄金标准。本文将深度剖析HSM核心组件libpkcs11.so的工作原理,并手把手教你搭建基于SoftHSM2的…...
flex布局 项目属性
<!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>flex布局 项目属性</title> <link href"css/k.css" rel"stylesheet" /> </head> <bod…...
流水表延迟处理方案设计
**### 流水表延迟处理方案设计 针对你的场景(流水表插入记录,当type4时需要1秒后处理),结合现有技术栈(JDK8、MySQL、定时任务、Redis、RabbitMQ),我推荐以下几种可行方案: 一、方…...
密室出逃消消乐小游戏微信流量主小程序开源
这个密室出逃消消乐小游戏采用了微信小程序的标准目录结构,包含以下核心功能: 游戏界面:6x6 的网格布局,随机生成不同类型的物品 游戏逻辑:交换相邻物品,消除三个或以上相同类型的物品 计分系统:…...
Docker 日志
Docker 日志是排查容器故障、监控运行状态的重要工具。下面从 日志查看命令、详解字段、日志驱动、最佳实践 四个方面给你详细解析。 一、最常用日志命令 1. 查看容器日志(默认 stdout、stderr) docker logs <container_name|container_id>2. 实…...
嵌入Linux快速入门第3篇
01_嵌入式Linux开发环境介绍 在Windows环境下的操作: 02_配置VMware使用双网卡之NAT网卡 虚拟机内部有两个网卡,一个是NAT网卡,另外一个是桥接网卡。NAT网卡用来保证Ubuntu可以上网,桥接网卡用来保证Ubuntu可以和开发板进行数据…...
详解鸿蒙Next仓颉开发语言中的全屏模式
大家好,今天跟大家分享一下仓颉开发语言中的全屏模式。 和ArkTS一样,仓颉的新建项目默认是非全屏模式的,如果你的应用颜色比较丰富,就会发现屏幕上方和底部的留白,这是应用自动避让了屏幕上方摄像头区域和底部的导航条…...
Oracle/MySQL/SqlServer/PostgreSQL等数据库的数据类型映射以及各版本数据类型情况说明
1 引言 近期工作聚焦于跨数据库系统的数据类型兼容性研究,旨在解决多源异构数据迁移、系统集成及版本升级中的类型映射难题。具体任务包括:1)建立主流数据库(如MySQL、Oracle、PostgreSQL、SQL Server等)的数据类型映射…...
新生活的开启:从 Trae AI 离开后的三个月
很久没有写文章了,想借着入职新公司一个月的机会,和大家唠唠嗑。 离职 今年2月份我从字节离职了,结束了四年的经历,当时离开的核心原因是觉得加班时间太长了,平均每天都要工作15,16个小时,周末…...
背包问题概论(01背包,完全背包,多重背包)DP
背包问题概论(01背包,完全背包,多重背包)DP 背包问题一种经典的组合优化问题,主要用于在有限的容量下选择物品以最大化总价值。它分为几种类型: ①:0/1背包问题:每种物品只能选择…...
攻克SQL审核“最后堡垒”!PawSQL首发T-SQL存储过程深度优化引擎
为什么存储过程审核那么难? 存储过程将数据操作逻辑固化在数据库层,一次编译、多次执行,既能大幅提升性能,也能通过权限隔离增强安全。然而,正因其逻辑复杂、分支众多,存储过程内部的 SQL 审核与优化常常成…...
Stable Diffusion 实战-手机壁纸制作 第二篇:优化那些“崩脸”和“马赛克”问题,让图像更加完美!
欢迎回来!在《StableDiffusion实战-手机壁纸制作》系列的第一篇中,我们成功完成了基础操作,制作出了令人炫目的手机壁纸。 今天,我们将进入一个更高阶的领域——优化处理。因为谁不想让生成的艺术品更完美呢?尤其是避免“崩脸”和“马赛克”这种让人抓狂的问题! 创作的路…...
Kafka消费者客户端源码深度解析:从架构到核心流程
在Kafka生态系统中,消费者客户端作为数据消费的入口,其设计与实现直接影响数据处理的效率和可靠性。本文将深入Kafka消费者客户端源码,通过核心组件解析、流程拆解与源码分析,揭示其高性能消费背后的技术奥秘,并辅以架…...
Linux进程间通信:从入门到精通(2)
嘿,小伙伴!今天我们来聊聊Linux系统中一个超级重要的话题——进程间通信(IPC)。看到"进程间通信"这个词,别急着打哈欠,这可是Linux内核中的"社交达人",让进程们能够愉快地交…...
从源码到生产:Apache 2.4.57 自动化安装实战指南(附脚本)
引言:为何选择源码安装 Apache? 在服务器运维场景中,源码编译安装 Apache HTTP Server 是实现精细化配置的重要方式。相比包管理器安装,源码安装可自定义模块组合、适配特定依赖环境,并精确控制版本。本文将通过自动化…...