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

目录

一、简介

二、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转发会提示无权限)

查看SELinux模式:

打开终端,输入以下命令来查看SELinux的当前模式:

shell

getenforce

这个命令将返回三种可能的状态之一:

Enforcing:SELinux 处于强制模式,将执行所有安全策略。

Permissive:SELinux 处于宽容模式,将不会执行安全策略,但会记录违规行为。

Disabled:SELinux 被禁用。

sudo setenforce 0

可临时关闭

路由配置

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值