首页 > 其他分享 >socket io 微服务 k8s 解决方案

socket io 微服务 k8s 解决方案

时间:2024-02-28 09:58:52浏览次数:16  
标签:set http socket server header proxy io k8s

spingboot+socketio

  • 依赖对于socketio-client 2.x版本
<dependency>
    <groupId>com.corundumstudio.socketio</groupId>
    <artifactId>netty-socketio</artifactId>
    <version>1.7.19</version>
</dependency>
  • 注册Nacos
@Component
@RequiredArgsConstructor
@Slf4j
public class ServerRunner implements CommandLineRunner, ApplicationListener<ContextClosedEvent> {
    private SocketIOServer server;

    private final InetUtils inetUtils;

    private final NacosServiceManager nacosServiceManager;

    @Value("${socket-io-port:9000}")
    private int port;

    @Bean
    public SocketIOServer server() throws FileNotFoundException {
        Configuration config = new Configuration();
        int threadNum = Runtime.getRuntime().availableProcessors() * 2;
        config.setPort(port);
        config.setOrigin("*");
        config.setBossThreads(threadNum);
        config.setWorkerThreads(threadNum);
        config.setMaxFramePayloadLength(1024 * 1024);
        config.setMaxHttpContentLength(1024 * 1024);
        server = new SocketIOServer(config);
        return server;
    }

    @Bean
    public SpringAnnotationScanner springAnnotationScanner(SocketIOServer server) {
        return new SpringAnnotationScanner(server);
    }

    @Override
    public void run(String... args) {
        server.start();
        log.info("启动 SocketIO Server 成功。。。。");
        this.registerWithNacos();
    }

    @Override
    public void onApplicationEvent(@NotNull ContextClosedEvent event) {
        if (server != null) {
            server.stop();
        }
    }

    private void registerWithNacos() {
        try {
            NamingService naming = nacosServiceManager.getNamingService();
            // 注册到nacos
            String ip = inetUtils.findFirstNonLoopbackHostInfo().getIpAddress();
            Instance instance = new Instance();
            instance.setIp(ip);
            instance.setPort(port);
            instance.setServiceName("socket-io-service");
            instance.setWeight(1.0);
            Map<String, String> map = new HashMap<>();
            // 注册来源标识 默认Nacos
            // map.put("preserved.register.source", "SPRING_CLOUD");
            instance.setMetadata(map);
            naming.registerInstance("socket-io-server", instance);
            log.info("注册SocketIO到nacos成功");
        } catch (NacosException e) {
            throw new RuntimeException("注册SocketIO到nacos失败", e);
        }
    }
}
  • Gateway网关配置
spring:
  cloud:
    gateway:
      routes:
        - id: socket_io_route
          uri: lb://socket-io-server
          predicates:
            - Path=/socket.io/**

K8S Ingress

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  namespace: xxx
  name: xxx-server
  annotations:
    # 文件上传限制
    nginx.ingress.kubernetes.io/proxy-body-size: "200M"
    # 代理发送超时
    nginx.ingress.kubernetes.io/proxy-send-timeout: "3600"
    # 代理读取超时
    nginx.ingress.kubernetes.io/proxy-read-timeout: "3600"
    # 代理连接超时
    nginx.ingress.kubernetes.io/proxy-connect-timeout: "3600"
    # 基于客户端出口ip哈希
    nginx.ingress.kubernetes.io/upstream-hash-by: "$http_x_forwarded_for"
spec:
  ingressClassName: nginx
  rules:
    - host: www.xxx.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: xxx-server
                port:
                  number: 9000

vue项目nginx代理

server {
    listen       80;
    gzip on;
    gzip_min_length 1k;
    gzip_comp_level 9;
    gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
    gzip_vary on;
    gzip_disable "MSIE [1-6]\.";
    server_name  localhost;
    client_max_body_size 200m;
    location / {
        add_header Cache-Control "no-cache, no-store";
        root   /usr/share/nginx/html;
        index  index.html index.htm;
        try_files $uri $uri/ /index.html =404;
    }

    location /prod-api/{
        proxy_set_header Host $http_host;
        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_pass http://server/;
        proxy_read_timeout 10m;
        client_body_timeout 10m;
    }
    location /socket.io/ {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;

        proxy_pass http://server;

        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   html;
    }
}

外部跳板nginx代理

upstream k8singress {
	ip_hash;
	server 192.168.33.11:31499;
	server 192.168.33.12:31499;
}
server {
	listen 80;
	server_name www.xxx.com;
	location / {
		proxy_pass http://k8singress/;
		proxy_redirect off;
		proxy_set_header X-Real-IP $remote_addr;
		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
		proxy_set_header Host $http_host;
		proxy_set_header X-NginX-Proxy true;
		proxy_http_version 1.1;
		proxy_set_header Upgrade $http_upgrade;
		proxy_set_header Connection "upgrade";
	}
}

标签:set,http,socket,server,header,proxy,io,k8s
From: https://www.cnblogs.com/ranger-dev/p/18039030

相关文章

  • 在K8S中,Pod优雅终止过程是什么?
    在Kubernetes(K8s)中,Pod的优雅终止过程是一个有序的过程,旨在确保Pod中运行的应用程序能够平滑关闭,释放资源,并尽可能减少因突然关闭带来的数据丢失和服务中断。以下是Pod优雅终止的一般步骤:删除Pod请求用户或控制器发出删除Pod的请求,比如通过kubectldeletepod<pod-name>......
  • 在K8S中,helm是什么?如何使用?
    在Kubernetes(K8s)中,Helm是一个用于简化Kubernetes应用程序部署和管理的包管理工具。它采用了声明式配置和模板化的概念,使得Kubernetes资源的打包、安装、升级、回滚等操作变得更加方便和高效。Helm主要由两个核心组件构成:HelmCLI(命令行接口):提供了一系列命令,让用户能够在本......
  • 在K8S中,etcd数据库中数据如何更改?
    在Kubernetes(K8s)中,etcd中的数据更改主要发生在以下几个场景中:创建、更新和删除Kubernetes资源对象:当用户在Kubernetes中创建(POST)、更新(PUT)或删除(DELETE)一个资源对象(如Pod、Service、Deployment等)时,KubernetesAPI服务器会将这些更改转换为对etcd的相应操作。API服务器会将更改......
  • 在K8S中,etcd是什么类型数据库?
    在Kubernetes(K8s)中,etcd是一个高度可靠、分布式的键值存储数据库,用于存储集群的共享配置和服务发现信息。etcd在Kubernetes架构中扮演着核心组件的角色,是集群状态数据的关键存储后端。1.etcd的类型:键值存储(Key-ValueStore):etcd最基本的功能是作为键值存储,它允许用户存储和......
  • 在K8S中,etcdctl如何使用?
    在Kubernetes(K8s)中,etcdctl是用于直接与etcd集群交互的命令行工具,主要用于管理和调试etcd存储中的键值对数据。etcd是K8s集群的核心组件之一,它作为一个高可用的分布式键值存储系统,用于保存集群的所有重要配置数据。以下是如何在Kubernetes环境中使用etcdctl的基本......
  • 【专题】2023年中国智能家居(AIoH)发展白皮书报告PDF合集分享(附原数据表)
    全文链接:https://tecdat.cn/?p=33358原文出处:拓端数据部落公众号智能家居行业目前已经基本实现了家用物联网的建设。为了满足用户个性化和弹性化的需求,智能家居3.0阶段着重于将云计算、边缘计算和人工智能等支持技术深化应用于智能家居产品中。阅读原文,获取专题报告合集全文,解锁......
  • k8s架构解析
    Kubernetes(K8s)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。Kubernetes由多个组件组成,每个组件都扮演着不同的角色。以下是Kubernetes中一些主要组件的详细说明:kube-apiserver:API服务器是Kubernetes集群的中心,提供了资源操作的唯一入口。它负责接收......
  • STL-priority_queue模拟实现
    #include<deque>//测试用#include<vector>//测试用#include"9Date.h"//测试用#include<iostream>usingstd::cout;usingstd::endl;usingstd::cin;namespacetest{template<classT>structless{booloperator()(constT&......
  • [ARC140F] ABS Permutation (Count ver.) 题解
    洛谷题面传送门AT题面传送门发现不太好直接求,考虑将\(P\)映射到\(P^{-1}\)上,这样题目中的条件就变成了\(|P_i-P_{i+M}|=1\)。因此我们可以对模\(M\)的每个剩余系做\(M=1\)的情况,然后最后快速幂合并。考虑\(M=1\)的情况怎么做。记\(f_i\)表示\(K=i\)的方案数,......
  • [ARC087F] Squirrel Migration 题解
    洛谷题面AT题面如果两条路径不存在交点,则两条路径各选一个端点交换后两路径相交,答案不会变劣。考虑所有路径两两相交的情况,因为图是一棵树,所以这些路径会交于一点。以这个点为根,那么最大的子树大小一定不超过\(\fracn2\),所以这个点是树的重心,每条路径的端点一定在两个不......