springboot3.x入门系列【5】支持unix sock 套接字服务

news2024/9/25 9:38:08

目录

一、简介

二、springBoot3.x 套接字的支持

1. 环境要求

2.  springboot内置tomcat

2.1 支持unix 设置 unixDomainSocketPath

2.2 windows 下unix服务测试

3. springboot外置tomcat 

3.1 tomcat  配置unix socket 套接字

3.2 启动tomcat 服务

3.3 nginx 支持unix 转发

3.4 unix 接口测试

3.5 nginx 路由接口测试

4. unix socket  服务器抓包

4.1 Socat抓包

4.2 tcp 抓包

4.3 查看特定套接字服务

4.4 查看套接字关联所有信息


一、简介

Unix套接字(Unix Sockets),也称为本地套接字,是一种特殊的网络套接字,用于运行在同一台主机上的进程之间的通信。以下是Unix套接字的一些优缺点

优点:

  1. 性能高效

    • Unix套接字避免了内核与用户空间之间的数据复制开销,因为它们运行在同一个操作系统中,这可以提高通信性能。
  2. 速度快

    • 由于避免了网络协议栈的开销,Unix套接字通常比网络套接字(如TCP/IP套接字)具有更快的通信速度。
  3. 简单性

    • Unix套接字的API与传统的套接字API相似,易于理解和使用。
  4. 文件系统集成

    • Unix套接字在文件系统中表现为文件,可以使用标准文件操作进行访问,这使得它们易于管理和访问。
  5. 安全性

    • Unix套接字可以使用文件权限进行保护,只有具有适当权限的用户才能访问套接字。
  6. 支持多种通信协议

    • 支持多种协议,如流式套接字(SOCK_STREAM)和数据报套接字(SOCK_DGRAM)。
  7. 无网络配置需求

    • 因为它们不依赖于网络协议栈,所以不需要IP地址、端口号等网络配置。

缺点:

  1. 仅限于本地主机

    • Unix套接字不能用于跨网络或跨主机的通信。
  2. 平台依赖性

    • Unix套接字主要在类Unix系统上使用,Windows平台的支持有限。
  3. 可能的文件系统限制

    • 由于Unix套接字在文件系统中表示,它们可能受到文件系统大小和权限的限制。
  4. 安全性限制

    • 虽然可以使用文件权限进行保护,但Unix套接字的安全性不如基于网络的套接字,后者可以使用更复杂的安全机制。
  5. 调试和监控难度

    • 由于Unix套接字的通信在系统内部进行,可能难以使用传统的网络监控工具进行调试和监控。
  6. 生命周期管理

    • 如果使用不当,Unix套接字可能会遗留在文件系统中,需要适当的清理策略来避免资源泄露。
  7. 不支持广播或多播

    • Unix套接字不支持广播或多播通信,这限制了它们在某些场景下的应用。

二、springBoot3.x 套接字的支持

1. 环境要求

1.1  unix socket 套接字支持需要jdk16 及上才可以支持;

2.  springboot内置tomcat

2.1 支持unix 设置 unixDomainSocketPath
package com.chopin.uninx.uninx.config;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;
import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;
import org.springframework.stereotype.Component;

import java.io.File;
import java.io.IOException;
import java.time.Duration;

/**
 * @class MyTomcatWebServerFactoryCustomizer
 * @description
 * @copyright Copyright: 2024-2030
 * @creator chopin
 * @create-time 2024/6/21 15:26
 **/
@Slf4j
@Component
public class MyTomcatWebServerFactoryCustomizer implements WebServerFactoryCustomizer<TomcatServletWebServerFactory> {

    private static final String DEFAULT_SOCKET_PATH = "D:" + File.separator + "http.sock";

    /**
     *
     */
    @Override
    public void customize(TomcatServletWebServerFactory factory) {
        log.info("MyTomcatWebServerFactoryCustomizer  init");
        factory.addConnectorCustomizers(connector -> {

            String path = "";
            String os = System.getProperty("os.name").toLowerCase();
            if (os.contains("win")) {
                log.info("Running on Windows");
                path = DEFAULT_SOCKET_PATH;
            } else if (os.contains("nux")) {
                log.info("Running on linux");
                path = "/opt/http.sock";
            } else {
                log.info("OS not recognized");
                return;
            }
            File file = new File(path);
            if (file.exists()) {
                log.info("file :{} delete", path);
                file.delete();
            }
            connector.setProperty("unixDomainSocketPath", path);
        });
    }
}

服务启动的时候会自动生成sock文件

注!  springboot启动时需要进行检测该文件是否存在,如果存在需要进行删除,不然会提示服务占用

2.2 windows 下unix服务测试

3. springboot外置tomcat 

3.1 tomcat  配置unix socket 套接字

1. 进入tomcat  配置文件

2.配置 unix socket

3) 配置jdk环境

vim setclasspath.sh

4) 配置jvm

vim catalina.sh

3.2 启动tomcat 服务

sh startup.sh  && tail -f ../logs/catalina.out

启动打印套接字地址

注!当服务器存在套接字服务文件时会启动失败

3.3 nginx 支持unix 转发

1) 配置upstream unix

upstream unix {
    server unix:/opt/cms.sock;
  }

2) 接口路由

注!(selinux 必须处于关闭状态,不然进行unix转发会提示无权限)

location ^~/sUpms/ {
                client_max_body_size 30m;
            proxy_set_header Host $host:$server_port;
            proxy_set_header X-Forwarded-Host $server_name;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header REMOTE-HOST $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header HTTP_X_FORWARDED_FOR $remote_addr;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            rewrite ^/sUpms/(.*)$ /sUpms/$1 break;
            proxy_pass http://unix; #负载均衡配置

        }
3.4 unix 接口测试
curl --silent -XPOST --unix-socket /opt/cms.sock  -H 'Content-Type: application/json' http://localhost/sUpms/v1/common/getPublicKey
 3.5 nginx 路由接口测试

4. unix socket  服务器抓包

 4.1 Socat抓包

sudo mv /opt/cms.sock   /opt/cms.sock.original

sudo socat -t100 -x -v UNIX-LISTEN:/opt/cms.sock,mode=777,reuseaddr,fork UNIX-CONNECT:/opt/cms.sock.original

4.2 tcp 抓包

1)重命名原来的 socket 文件

sudo mv /opt/cms.sock   /opt/cms.sock.original

2) 创建中间的 tcp socket 并拷贝流量

sudo socat TCP-LISTEN:18089,reuseaddr,fork UNIX-CONNECT:/opt/cms.sock.original &

3)创建原来的 socket 文件并拷贝流量

 sudo socat UNIX-LISTEN:/opt/cms.sock,fork TCP-CONNECT:127.0.0.1:18089 &

4) 使用 tcpdump 在中间的 tcp socket 上抓包

存储为文件

tcpdump -i any -s0 -nn -vv -A -w unix.cap tcp port  18090

实时

tcpdump -i any -s0 -nn -vv -A tcp port  18090

4.3 查看特定套接字服务

启用了sockt 或者tcp抓包会导致命令无效

使用 lsof -U | grep http.sock 

 4.4 查看套接字关联所有信息

 lsof  | grep http.sock

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

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

相关文章

python中传递任意数量的实参

有时候&#xff0c;你预先不知道函数需要接受多少个实参&#xff0c;好在Python允许函数从调用语句中收集任意数量的实参。 一个*是元组&#xff0c;两个是字典。

交换机自动化巡检(H3C)

目的:通过python实现全自动化交换机巡检&#xff08;每周五下午五点进行自动化巡检&#xff09; 1、环境&#xff1a; 系统&#xff1a;windows10 工具&#xff1a;python-3.11.2&#xff08;自行安装&#xff09; 工具&#xff1a;PyCharm Community Edition 2022.3.3&…

Vue使用v-model收集各种表单数据、过滤器

目录 1. 使用v-model收集各种表单数据2. 日期格式化3. 过滤器 1. 使用v-model收集各种表单数据 若<input type“text”/>&#xff0c;则v-model收集的是value值&#xff0c;用户输入的就是value值若<input type“radio”/>&#xff0c;则v-model收集的是value值&a…

【Linux系列】du命令详解

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

【线程池】

什么是线程池&#xff1f; 线程池是一个可以复用线程的技术。简单来说&#xff0c;线程池是一种基于池化技术的思想来管理线程的技术&#xff0c;旨在减少线程的创建和销毁次数&#xff0c;提高系统的响应速度和吞吐量。它预先创建了一定数量的线程&#xff0c;并将这些线程放…

MySQL高可用性实践指南

一 、Mysql 在服务器中的部署方法 1、安装依赖性 yum install libtirpc-devel-0.2.4-0.16.el7.x86_64.rpm -y yum install ncurses-devel.x86_64 -y yum install gcc-c -y yum install openssl-devel -y yum install cmake -y 2、下载并解压源码包 tar zxf mysql-boost-5.7…

十年热爱,小鹏汽车开启AI新篇章

“每一台小鹏汽车&#xff0c;都是同级别智能的天花板。”在8月27日的小鹏10年热爱之夜暨小鹏MONA M03上市发布会上&#xff0c;小鹏汽车董事长、CEO何小鹏不无自豪地表示。 对于小鹏汽车来说&#xff0c;此次发布会有着非凡的意义&#xff0c;因为它不仅是对小鹏汽车过去十年辉…

前端用js发送邮箱 前端发送邮箱

前端发送邮箱 安装包依赖邮箱授权码demo eg:picture页面发送内容有效接受效果 code参考别人写的code 说明 安装包依赖 yarn add nodemailernodemailer官网 邮箱授权码 邮箱授权码: 邮箱授权码需要开通&#xff0c;以QQ邮箱为例&#xff0c;其它大同小异 demo eg: picture…

ROCm Code Object Tooling

ROCm&#xff08;Radeon Open Compute&#xff09;提供了一系列的工具&#xff0c;用于检查和提取编译器生成的代码对象&#xff0c;包括可执行文件、目标文件和共享对象库。 一、roc-obj roc-obj 是 ROCm&#xff08;Radeon Open Compute&#xff09;提供的一个高层级工具&a…

【软件文档】需求规格说明书编制模板

1 范围 1.1 系统概述 1.2 文档概述 1.3 术语及缩略语 2 引用文档 3 需求 3.1 要求的状态和方式 3.2 系统能力需求 3.3 系统外部接口需求 3.3.1 管理接口 3.3.2 业务接口 3.4 系统内部接口需求 3.5 系统内部数据需求 3.6 适应性需求 3.7 安全性需求 3.8 保密性需求 3.9 环境需求…

数据结构(邓俊辉)学习笔记】串 14——BM_GS算法:构造gs表

以下&#xff0c;就来简要地介绍 gs 表的具体构造算法。算法为了便于理解其原理&#xff0c;这里将整个算法划分为若干的层次&#xff0c;并逐层递进、逐层细化。 我们首先需要引入 MS 子串与 ss 表的概念。实际上&#xff0c;相对于模式串中的任何一个字符 P[j] &#xff0c…

RP2040 C SDK开发串口的使用

RP2040 C SDK开发串口的使用 &#x1f4cd;环境搭建部署篇《RP2040 VSCode C/C开发环境快速部署》&#x1f516;RP2040 有硬件串口资源有2个。&#x1f33f;参考RP2040 C SDK Hardware APIS&#xff1a;https://www.raspberrypi.com/documentation/pico-sdk/hardware.html#grou…

安卓APK重签名并查看MD5值-2024最新版

重签名 命令行运行&#xff1a; apksigner sign --ks your_keystore.jks --out output.apk input.apk在这个命令中&#xff1a; –ks 或 --keystore 参数后面是你的keystore文件路径。 your_keystore.jks 是你的keystore文件。 –out 参数后面是输出的签名后的APK文件名。 out…

发布npm包到GitLab教程

之前在研究如何搭建UI组件库&#xff08;内部使用&#xff09;&#xff0c;其中重要的一步就是发布npm包到GitLab。中间踩了很多坑&#xff0c;在这里记录一下整个流程方便大家快速上手。不足之处欢迎指出&#x1f64f; 1. 获取Token 在gitlab中打开access tokens申请页面&am…

鲲鹏服务器之ARM探知

什么叫arm架构 ARM架构过去称作进阶精简指令集机器&#xff08;Advanced RISC Machine&#xff0c;更早称作&#xff1a;Acorn RISC Machine&#xff09;&#xff0c;是一个32位精简指令集&#xff08;RISC&#xff09;处理器架构&#xff0c;其广泛地使用在许多嵌入式系统设计…

CSS系列之详解overflow(四)

一、什么是溢出 CSS 的 overflow 属性用于控制元素内容溢出时的表现方式。当元素的内容超出其指定的尺寸范围时&#xff0c;就会出现溢出现象。比如&#xff0c;一个元素的高度设置是 80px&#xff0c;但内容高度不只是 80px&#xff0c;内容此时就叫做溢出了。 那需要注意的…

【QT学习】1-2 Liunx环境下QT5.12.9软件安装1——VMware17.0.0虚拟机安装

注意&#xff1a;如果电脑已经安装低版本的VMware&#xff0c;千万不要卸载&#xff0c;直接覆盖安装&#xff0c;更新到新的安装版本 1.点击.exe文件&#xff0c;右键以管理员身份运行&#xff0c;点击下一步&#xff0c;下一步 2.选择软件安装位置后&#xff0c;点击下一步。…

Datawhale X 李宏毅苹果书 AI夏令营(深度学习进阶)task3

批量归一化 其实归一化简单一点理解就类似于我们学过的数学中的每个数值减去平均值除以标准差。 神经网络中的批量归一化&#xff08;Batch Normalization&#xff0c;BN&#xff09;就是其中一个“把山铲平”的想法。不要小看优化这个问题&#xff0c;有时候就算误差表面是凸…

面试基本内容

1.类加载器 类加载器加载过程: 加载:&#xff08;将字节码文件加载到运行时数据区的方法区中/元空间&#xff09; 链接:&#xff08;验证:检查字节码文件是否合法—>准备:静态类变量赋值为默认值&#xff0c;不会实例变量分配初始化—>解析:将常量池引用&#xff0c;转化…

Java | Leetcode Java题解之第382题链表随机节点

题目&#xff1a; 题解&#xff1a; class Solution {ListNode head;Random random;public Solution(ListNode head) {this.head head;random new Random();}public int getRandom() {int i 1, ans 0;for (ListNode node head; node ! null; node node.next) {if (rando…