【运维笔记】kafka跨域通信代理

这篇具有很好参考价值的文章主要介绍了【运维笔记】kafka跨域通信代理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在项目部署过程中遇到kafka需要走代理跨域通信的情景,搭建了一套环境模拟实验,以此记录。

场景描述

两套kafka集群KafkaS和KafkaC分别位于两个不互通的网络域,跨域互访需要经过nginx代理机,现需要确认nginx、kafka的配置。

模拟思路

利用docker在一台虚拟机上创建两个网络不互通的kafka集群,同时在宿主机上部署nginx。

模拟环境说明

基础环境

1、宿主机:Ubuntu 22.10
2、工具:docker、docker-compose

kafka版本

1、kafka镜像/zookeeper镜像:wurstmeister/zookeeper、wurstmeister/kafka
2、实验时版本:zookeeper

环境部署

基础软件安装

安装docker、docker-compose、nginx

sudo apt install docker.io docker-compose nginx -y

编写kafka的docker-compose.yml文件

1、网络配置

networks:
  kafka_server_net:
    ipam:
      config:
        - subnet: 172.33.0.0/16
  kafka_client_net:
    ipam:
      config:
        - subnet: 172.34.0.0/16

2、zookeeper配置

  zookeeperS:
    image: wurstmeister/zookeeper
    container_name: zookeeperS
    restart: always
    networks:
      kafka_server_net:
        ipv4_address: 172.33.0.10

zookeeperC的配置类似。

3、kafka配置

  kafkaS1:
    image: wurstmeister/kafka
    depends_on: [ zookeeperS ]
    container_name: kafkaS1
    environment:
      HOSTNAME: kafkaS1
      KAFKA_BROKER_ID: 0
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafkaS1:9092
      KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092
      KAFKA_ZOOKEEPER_CONNECT: zookeeperS:2181/kafka
    # extra_hosts可以把地址映射添加到hosts文件里,后面有用。其中,统一集群的kafka映射为容器的IP地址,不同集群的kafka映射为宿主机地址,72.130是宿主机IP。
    extra_hosts:
      kafkaS1: 172.33.0.11
      kafkaS2: 172.33.0.12
      kafkaS3: 172.33.0.13
      kafkaC1: 192.168.72.128
      kafkaC2: 192.168.72.128
      kafkaC3: 192.168.72.128
    networks:
      kafka_server_net:
        ipv4_address: 172.33.0.11
        

kafkaC的配置类似

4、完整的docker-compose文件

version: '3.8'

services:
# kafkaS && zookeeperS
  zookeeperS:
    image: wurstmeister/zookeeper
    container_name: zookeeperS
    restart: always
    networks:
      kafka_server_net:
        ipv4_address: 172.33.0.10

  kafkaS1:
    image: wurstmeister/kafka
    depends_on: [ zookeeperS ]
    container_name: kafkaS1
    environment:
      HOSTNAME: kafkaS1
      KAFKA_BROKER_ID: 10
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafkaS1:9092
      KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092
      KAFKA_ZOOKEEPER_CONNECT: zookeeperS:2181/kafka
    networks:
      kafka_server_net:
        ipv4_address: 172.33.0.11
    extra_hosts:
      kafkaS1: 172.33.0.11
      kafkaS2: 172.33.0.12
      kafkaS3: 172.33.0.13
      kafkaC1: 192.168.72.128
      kafkaC2: 192.168.72.128
      kafkaC3: 192.168.72.128

  kafkaS2:
    image: wurstmeister/kafka
    depends_on: [ zookeeperS ]
    container_name: kafkaS2
    environment:
      HOSTNAME: kafkaS2
      KAFKA_BROKER_ID: 11
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafkaS2:9092
      KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092
      KAFKA_ZOOKEEPER_CONNECT: zookeeperS:2181/kafka
    networks:
      kafka_server_net:
        ipv4_address: 172.33.0.12
    extra_hosts:
      kafkaS1: 172.33.0.11
      kafkaS2: 172.33.0.12
      kafkaS3: 172.33.0.13
      kafkaC1: 192.168.72.128
      kafkaC2: 192.168.72.128
      kafkaC3: 192.168.72.128

  kafkaS3:
    image: wurstmeister/kafka
    depends_on: [ zookeeperS ]
    container_name: kafkaS3
    environment:
      HOSTNAME: kafkaS3
      KAFKA_BROKER_ID: 12
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafkaS3:9092
      KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092
      KAFKA_ZOOKEEPER_CONNECT: zookeeperS:2181/kafka
    networks:
      kafka_server_net:
        ipv4_address: 172.33.0.13
    extra_hosts:
      kafkaS1: 172.33.0.11
      kafkaS2: 172.33.0.12
      kafkaS3: 172.33.0.13
      kafkaC1: 192.168.72.128
      kafkaC2: 192.168.72.128
      kafkaC3: 192.168.72.128

# kafkaC && zookeeperC

  zookeeperC:
    image: wurstmeister/zookeeper
    container_name: zookeeperC
    restart: always
    networks:
      kafka_client_net:
        ipv4_address: 172.34.0.10

  kafkaC1:
    image: wurstmeister/kafka
    depends_on: [ zookeeperC ]
    container_name: kafkaC1
    environment:
      HOSTNAME: kafkaC1
      KAFKA_BROKER_ID: 20
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafkaC1:9092
      KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092
      KAFKA_ZOOKEEPER_CONNECT: zookeeperC:2181/kafka
    networks:
      kafka_client_net:
        ipv4_address: 172.34.0.11
    extra_hosts:
      kafkaS1: 192.168.72.128
      kafkaS2: 192.168.72.128
      kafkaS3: 192.168.72.128
      kafkaC1: 172.34.0.11
      kafkaC2: 172.34.0.12
      kafkaC3: 172.34.0.13

  kafkaC2:
    image: wurstmeister/kafka
    depends_on: [ zookeeperC ]
    container_name: kafkaC2
    environment:
      HOSTNAME: kafkaC2
      KAFKA_BROKER_ID: 21
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafkaC2:9092
      KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092
      KAFKA_ZOOKEEPER_CONNECT: zookeeperC:2181/kafka
    networks:
      kafka_client_net:
        ipv4_address: 172.34.0.12
    extra_hosts:
      kafkaS1: 192.168.72.128
      kafkaS2: 192.168.72.128
      kafkaS3: 192.168.72.128
      kafkaC1: 172.34.0.11
      kafkaC2: 172.34.0.12
      kafkaC3: 172.34.0.13

  kafkaC3:
    image: wurstmeister/kafka
    depends_on: [ zookeeperC ]
    container_name: kafkaC3
    environment:
      HOSTNAME: kafkaC3
      KAFKA_BROKER_ID: 22
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafkaC3:9092
      KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092
      KAFKA_ZOOKEEPER_CONNECT: zookeeperC:2181/kafka
    networks:
      kafka_client_net:
        ipv4_address: 172.34.0.13
    extra_hosts:
      kafkaS1: 192.168.72.128
      kafkaS2: 192.168.72.128
      kafkaS3: 192.168.72.128
      kafkaC1: 172.34.0.11
      kafkaC2: 172.34.0.12
      kafkaC3: 172.34.0.13

# networks
networks:
  kafka_server_net:
    ipam:
      config:
        - subnet: 172.33.0.0/16
  kafka_client_net:
    ipam:
      config:
        - subnet: 172.34.0.0/16

环境验证

docker-compose up -d启动所有容器后,开始验证环境是否符合要求。
1、网络连通性验证
本场景应当kafkaS和kafkaC集群间不能互访,内部三个节点可以互访;宿主机和两个集群可以互访。
1-1、kafka集群内部互访
先进入容器内:

docker -exec -it kafkaS1 bash

kafka容器没有telnet、ping等工具测试网络,但我们可以用nc:

nc -vz kafkaS2 9092
nc -vz zookeeperS 2181

【运维笔记】kafka跨域通信代理

以上测试应该会回显succeed

1-2、kafka集群间验证

nc -vz kafkaC1 9092

【运维笔记】kafka跨域通信代理

测试结果是refused,是否与我们预期不一样?别慌,这是因为kafkaC1被映射为宿主机的地址,因此是正常的,要测试kafka集群间连通性,应该直接用ip测试,这次结果就是超时了。

nc -vz 172.34.0.11 9092

【运维笔记】kafka跨域通信代理

1-3、代理(宿主机)与kafka的连通性验证
上一部分已经验证过,也可以在宿主机上Telnet端口,正常情况是通的。

2、kafka可用性验证
2-1、分别在两个kafka集群测试统一集群内kafka能否成功收发消息。

# 进入kafka测试脚本所在目录
cd /opt/kafka/bin/
# 创建主题
kafka-topics.sh --create --zookeeper zookeeperS:2181/kafka --replication-factor 1 --partitions 2 --topic testtopic
# 模拟生产消息
kafka-console-producer.sh --topic=testtopic --broker-list kafkaS1:9092,kafkaS2:9092,kafkaS3:9092
# 随便输入内容进行测试
# 进入另一个kafka容器,模拟消费
kafka-console-consumer.sh --bootstrap-server kafka01:9092,kafka02:9092,kafka03:9092 --from-beginning --topic testtopic

消费的窗口能看到生产的消息,则验证通过。【运维笔记】kafka跨域通信代理
至此,模拟环境搭建完成,下面记录如何实现跨域通信。

解决方案

Kafka通信机制

kafka通过二次交互建立会话:服务端在第一次交互时会返回一个地址供客户端建立会话,这个交互机制可以防止中间人攻击,但对走代理的场景来说,配置就比较麻烦了。
一个kafka服务端会提供给多个客户端访问(含不经代理的访问),配置为返回代理地址不太合适,

解决思路

kafka返回相同值给客户端,客户端却需要识别成各不相同、自己能连接的地址,这个问题很自然地就能想到用hosts解决。
docker-compose配置里已经给kafka节点都加上了extra_hosts,并根据连通性做好主机名和IP的映射。

代理配置

映射加上之后,只需要再把nginx代理配好就能成功互访了。
这里我用四层代理进行转发。
在nginx.conf文件里新建stream块,和http同级。
【运维笔记】kafka跨域通信代理
在nginx配置目录下新建kafkaproxy.conf,具体如下:

# 新建配置文件
sudo nano /etc/nginx/conf.d/stream/kafkaproxy.conf

配置内容:

upstream KAFKA_SERVER
{
server 172.33.0.11:9092;
server 172.33.0.12:9092;
server 172.33.0.13:9092;
}
server {
listen *:9092;
proxy_pass KAFKA_SERVER;
proxy_connect_timeout 2s;
proxy_timeout 1m;
}

# 配置完毕后重载配置
sudo nginx -s reload

验证是否满足要求

1、模拟发送消息
进入kafkaS任意节点,模拟发送消息

kafka-console-producer.sh --topic=testtopic --broker-list kafkaS1:9092,kafkaS2:9092,kafkaS3:9092

2、模拟接收消息

kafka-console-consumer.sh --bootstrap-server kafkaS1:9092,kafkaS2:9092,kafkaS3:9092 --from-beginning --topic testtopic

能相互通信
【运维笔记】kafka跨域通信代理
因为–from-beginning参数没去掉,所以有一些之前产生的消息。
但此时仍然是有问题的,通过代理访问kafka服务端的时候,有时会消费不到数据。这是负载均衡的问题,如果要避免,还是得配置多监听。文章来源地址https://www.toymoban.com/news/detail-465315.html

到了这里,关于【运维笔记】kafka跨域通信代理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 前端通信(渲染、http、缓存、异步、跨域)自用笔记

    目录 请求头,响应头 HTTP版本、状态码 web安全 浏览器缓存、本地存储 SSR/CSR:HTML拼接?网页源码?SEO/交互性 解析url  合成 URL-本地缓存/拦截请求-DNS解析IP/端口号(域名缓存) TCP-HTTP请求 同步 js标签跨域、url 异步 web-worker(创建分线程):适用于计算密集型任务 index.js为加

    2024年02月11日
    浏览(28)
  • 前端通信(解析url、异步、跨域、http、缓存、安全)自用笔记

    目录 请求头,响应头 HTTP版本、状态码 web安全 浏览器缓存、本地存储 SSR/CSR:HTML拼接?网页源码?SEO/交互性 解析url  合成 URL-本地缓存/拦截请求-DNS解析IP/端口号(域名缓存) TCP-HTTP请求 同步 js标签跨域、url 异步 web-worker(创建分线程):适用于计算密集型任务 index.js为加

    2024年01月24日
    浏览(35)
  • 宝塔部署项目&跨域

    导读:一般我们开发完前端项目后需要部署项目到线上服务器访问,这里是记录部署的一个过程。部署项目有多种方式:1.通过Nginx进行部署。2.通过Java进行部署(存放在static目录下)。3.通过PHP创建的的静态文件夹访问等等。 注意:如果你启动的服务有自定义端口,你需要在

    2024年02月06日
    浏览(40)
  • vue项目使用vite设置proxy代理,vite.config.js配置,解决本地跨域问题

    非同源请求,也就是协议(protocol)、端口(port)、主机(host)其中一项不相同的时候,这时候就会产生跨域 vite的proxy代理和vue-cli的proxy大致相同,需要在vite.config.js文件中配置(打包配置也在此) 代理配置在server中,可以上vite官网服务器选项查看server.proxy代码示例:开发服务器选

    2024年01月21日
    浏览(52)
  • 宝塔面板部署前后端分离项目(解决跨域问题)

    1.打包前后端项目 注意的点 前后端的联调要改成前后端线上的地址 然后数据库相关的要改成 线上的数据库 放开自己的防火墙 不要忘记了 宝塔面板和阿里云服务器(腾讯云服务器)都要打开 前端 改自己请求的地址 一定要改 打包 打开packaeg.json之后点build 打包之后会生成一

    2024年02月08日
    浏览(36)
  • vue 项目/备案网页/ip网页打包成 apk 安装到平板/手机(含vue项目跨域代理打包成apk后无法访问接口的解决方案)

    https://www.dcloud.io/hbuilderx.html 打开 HBuilder X,新建项目 此处项目名以 ‘test’ 为例 若 vue 项目中含跨域代理,如 vue.config.js 则在打包成 apk 后会无法访问接口,因为app无跨域限制,不能使用跨域代理,需使用访问接口的绝对路径,如:原接口 “/myAPI/dmis/login” 需改为 “http://

    2024年02月03日
    浏览(35)
  • 网络安全 Day27-运维安全项目-堡垒机部署

    堡垒机:用于在用户登录网站之前设备或服务,使用堡垒机内部用户所有操作将被记录下来,用于日后做审计,安全审计。 堡垒机 说明 开源堡垒机 teleport(简单那使用),jumpserver(用户较多)…… 云产品 堡垒机(不需要搭建,只需要花钱) 硬件产品 绿盟、奇安信、360 重

    2024年02月13日
    浏览(37)
  • 前端项目部署上线nginx反向代理

    参考 https://www.cnblogs.com/wangjingguan/articles/12817442.html 项目部署—需要服务器+域名 ● 部署(手动/自动化)到服务器—打包/构建(发版)、上线 下载模块包 yarn add webpack-dev-serve -D 在package.json自定义webpack开发服务器启动命令serve 启动当前工程里的webpack开发服务器 yarn serve 服务器配置

    2024年02月09日
    浏览(37)
  • 项目部署后,前端vue代理失效问题解决

    title:工作日记,前段后分离项目,在部署时遇到的问题,Vue项目打包成dist文件之后放在服务器上,通过运行java-jar包,在application.yml中引入静态资源的方式访问前端。如下图所示: 问题1 :前端页面是可以访问到了,但是后端访问不到,在本地中运行就可以。 首先前端我在

    2024年02月03日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包