Giter Site home page Giter Site logo

xxd763795151 / kafka-console-ui Goto Github PK

View Code? Open in Web Editor NEW
517.0 11.0 84.0 7.42 MB

一款快捷易用的轻量级kafka可视化管理平台

License: MIT License

Shell 0.22% Java 35.11% Scala 15.13% JavaScript 2.45% HTML 0.08% Vue 46.95% Batchfile 0.06%

kafka-console-ui's Introduction

kafka可视化管理平台

一款轻量级的kafka可视化管理平台,安装配置快捷、简单易用。
为了开发的省事,没有国际化支持,页面只支持中文展示。
用过rocketmq-console(rocketmq-dashboard)吧,对,前端展示风格跟那个有点类似。

页面预览

如果github能查看图片的话,可以点击查看菜单页面,查看每个页面的样子

集群迁移支持说明

当前主分支及日后版本不再提供消息同步、集群迁移的解决方案,如有需要,查看:集群迁移说明

ACL说明

最新代码运行即可看到acl菜单,将权限管理和认证的用户管理(SASL_SCRAM)进行了分离。分离之后,支持只开启SASL_SCRAM认证的时候(未开启鉴权),用户变更操作。或者使用其它认证机制下的权限管理操作(可视化的权限管理),但是可视化的认证用户管理目前只支持Scram。

v1.0.6版本之前,如果kafka集群启用了ACL,但是控制台没看到Acl菜单,可以查看:Acl配置启用说明

功能支持

  • 多集群支持
  • 集群信息
  • Topic管理
  • 消费组管理
  • 消息管理
  • ACL
  • 客户端限流
  • 运维

功能明细看这个脑图: 功能特性

安装包下载

点击下载(v1.0.10版本):kafka-console-ui.zip

如果安装包下载的比较慢,可以查看下面的源码打包说明,把代码下载下来,本地快速打包.

github下载慢也可以试试从gitee下载,点击下载gitee来源kafka-console-ui.zip

快速使用

Windows

  1. 解压缩zip安装包
  2. 进入bin目录(必须在bin目录下),双击执行start.bat启动
  3. 停止:直接关闭启动的命令行窗口即可

Linux或Mac OS

# 解压缩
unzip kafka-console-ui.zip
# 进入解压缩后的目录
cd kafka-console-ui
# 启动
sh bin/start.sh
# 停止
sh bin/shutdown.sh

访问地址

启动完成,访问:http://127.0.0.1:7766

配置集群

第一次启动,打开浏览器后,因为还没有配置kafka集群信息,所以页面右上角可能会有错误信息,比如:No Cluster Info或者是没有集群信息,请先切换集群之类的提示。

集群配置如下:

  1. 点击页面上方导航栏的 [运维] 菜单
  2. 点击集群管理下的 [集群切换] 按钮
  3. 在弹框里点击 [新增集群]
  4. 然后输入kafka集群地址和一个名称(随便起个名字)
  5. 点击提交便增加成功了
  6. 增加成功可以看到会话框已经有这个集群信息,然后点击右侧的 [切换] 按钮,便切换该集群为当前集群

后续如果再增加其它集群,就可以按上面这个流程,如果想切换到哪个集群,点击切换按钮,便会切换到对应的集群,页面的右上角会显示当前是使用的哪个集群,如果不确定,可以刷新下页面。

在新增集群的时候,除了集群地址还可以输入集群的其它属性配置,比如请求超时,ACL配置等。如果开启了ACL,切换到该集群的时候,导航栏上便会出现ACL菜单,支持进行相关操作(目前是基于SASL_SCRAM认证授权管理支持的最完善,其它的我也没验证过,虽然是我开发的,但是我也没具体全部验证这一块功能,授权部分应该是通用的)

kafka版本

  • 当前使用的kafka 3.2.0

监控

仅提供运维管理功能,监控、告警需要配合其它组件,如有需要,建议请查看:https://blog.csdn.net/x763795151/article/details/119705372

源码打包

如果想通过源码打包,查看:源码打包说明

本地开发

如果需要本地开发,开发环境配置查看:本地开发

登录认证和权限

1.0.7版本及之前,主分支不支持登录认证,感谢@dongyinuo 同学开发了一版支持登录认证,及相关的按钮权限(主要有两个角色:管理员和普通开发人员)。
在分支:feature/dongyinuo/20220501/devops 上。
如果有需要使用管理台登录认证的,可以切换到这个分支上进行打包,打包方式看 源码打包 说明。
默认登录账户:admin/kafka-console-ui521

目前最新版本主分支已增加登录认证、用户、角色等权限配置,如需开启登录认证,修改配置文件config/application.yml: auth.enable=true(默认 false),如下:

# 权限认证设置,设置为true,需要先登录才能访问
auth:
  enable: true
  # 登录用户token的过期时间,单位:小时
  expire-hours: 24

默认有两个登录用户:super-admin/123456,admin/123456,登录成功后在个人设置修改密码。super-admin和admin的唯一区别是super-admin可以增加删除用户,admin不能。如果觉得不合适,请在用户菜单下删除相关用户或角色自行创建合适的角色或用户。 注意:不开启登录认证,页面不显示用户菜单,正常现象。

DockerCompose部署

感谢@wdkang123 同学分享的部署方式,如果有需要请查看DockerCompose部署方式

感谢支持

感谢jetbrains的开源支持,如果有朋友愿意一起维护,很欢迎提pr.

jetbrains

jetbrains官方地址: https://www.jetbrains.com/

联系方式

  • 微信群

抱歉,后面就不再提供新的联系方式加群了。

在很早之前,有个兄弟提了个建议,可以拉个群,大家可以一起交流,所以成立了一个群,当时我以为没有多少朋友愿意加入。

可是后来确实有不少朋友进群了,这让我很惶恐,其实这个平台我自己并不觉得有太多技术深度,却有一些朋友愿意来捧场,这个让我觉得很惭愧,所以现在考虑了下,如果真有使用问题,可以留个issue。

另外,我自己也确实挺忙,对于这个项目的需求处理不够及时,实在是时间和精力上有限,所以有朋友希望新增的一些能力,拖了这么久我也没有下文,实在是抱歉。

对于一些不太耗时的功能,我还是可以积极处理的。

另外有些功能,是想要放到后面再加的,所以迟迟没有动手。

kafka-console-ui's People

Contributors

comdotwww avatar dongyinuo avatar wdkang123 avatar xxd763795151 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

kafka-console-ui's Issues

无topic写权限却发送成功

使用消息发送,其实用户无topic写权限却提示发送成功 实则没有发送成功 应该把权限问题报出来

Kafka认证模式进行acl用户管理时报错

配置Kafka认证模式之后在ACL管理页面新增用户报错:
org.apache.kafka.common.errors.UnsupportedVersionException:
The broker does not support DESCRIBE_USER_SCRAM_CREDENTIALS

消费者重置点位时报错

kafka版本:3.7.1
kafka-console-ui版本:1.0.9

消费组-消费详情 点击时间戳和重置点时报错
java.util.concurrent.ExecutionException: org.apache.kafka.common.errors.UnknownMemberIdException: Failed altering consumer group offsets for the following partitions: [test-0]
at java.util.concurrent.CompletableFuture.get(CompletableFuture.java:2272)
at org.apache.kafka.common.internals.KafkaFutureImpl.get(KafkaFutureImpl.java:180)
at kafka.console.ConsumerConsole.$anonfun$resetPartitionToTargetOffset$1(ConsumerConsole.scala:171)
at kafka.console.ConsumerConsole$$Lambda$1055/1785149167.apply(Unknown Source)
at kafka.console.KafkaConsole.withAdminClient(KafkaConsole.scala:35)
at kafka.console.KafkaConsole.withAdminClientAndCatchError(KafkaConsole.scala:45)
at kafka.console.ConsumerConsole.resetPartitionToTargetOffset(ConsumerConsole.scala:173)
at com.xuxd.kafka.console.service.impl.ConsumerServiceImpl.resetPartitionToTargetOffset(ConsumerServiceImpl.java:159)
at com.xuxd.kafka.console.controller.ConsumerController.restOffset(ConsumerController.java:102)
at com.xuxd.kafka.console.controller.ConsumerController$$FastClassBySpringCGLIB$$4c4135cd.invoke()
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:793)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763)
at org.springframework.aop.framework.adapter.MethodBeforeAdviceInterceptor.invoke(MethodBeforeAdviceInterceptor.java:58)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:175)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763)
at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89)
at com.xuxd.kafka.console.aspect.ControllerLogAspect.around(ControllerLogAspect.java:61)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:634)
at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:624)
at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:72)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:175)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763)
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:708)
at com.xuxd.kafka.console.controller.ConsumerController$$EnhancerBySpringCGLIB$$d11cfcb4.restOffset()
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1072)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:965)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:681)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:764)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at com.xuxd.kafka.console.filter.ContextSetFilter.doFilter(ContextSetFilter.java:78)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at com.xuxd.kafka.console.filter.AuthFilter.doFilter(AuthFilter.java:39)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:197)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:357)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:382)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:893)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1726)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)
at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:745)

如何连接阿里云的kafka?属性中该如何进行配置?

request.timeout.ms=10000
security.protocol=SASL_SSL
sasl.mechanism=PLAIN
ssl.endpoint.identification.algorithm=''
sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required\n
username="" \n
password="";

我的属性配置中是这样的,我需要配置关闭ssl证书验证,但是并没有生效?
ssl.endpoint.identification.algorithm=''属性的配置不会起作用吗?

更新配置时会使用更新前的缓存

我把配置从A更新到B的Kafka地址,但是重启后仍然发现是Kafka A的相关topic信息,在删除data目录下的文件后再进行重启后恢复成当前配置正常的topic等信息,是否是缓存导致?

项目中jar包存在高危漏洞Spring Framework 身份认证绕过漏洞(CVE-2023-20860)

漏洞披露时间:2023-03-22
漏洞描述:
Spring Security 是一套为基于Spring的应用程序提供说明性安全保护的安全框架。在受影响版本中,当Spring Security使用mvcRequestMatcher配置了**作为前缀的pattern时,其与Spring MVC的匹配逻辑存在差异,可能导致鉴权绕过。通过官方通告已知该漏洞影响Spring Framework 6.0.0 到 6.0.6版本及Spring Framework 5.3.0 到 5.3.25版本,5.3 之前的版本不受该漏洞影响。

建议提升如下jar包版本,已修复漏洞
jar包具体路径:
kafka-console-ui/lib/kafka-console-ui.jar/BOOT-INF/lib/spring-webmvc-5.3.9.jar:5.3.9
修复方案:
厂商已经发布安全修复版本修复该漏洞,参考链接:https://spring.io/security/cve-2023-20860
(1) Spring Framework 5.3.X 系列用户建议升级Spring Framework到5.3.26及以上安全版本修复该漏洞
(2) Spring Framework 6.0.X 系列用户建议升级Spring Framework到6.0.7及以上安全版本修复该漏洞

如何修改context-path

我有注意到配置文件有寫不要修改context-path. 因為端口問題,需要修改context-path. 但是直接修改後無法訪問. 請問有什麼辦法可以修改context-path?

如何用ACL進行模糊授權?

我有注意到在使用ACL的時候, 授權是填寫topic完整名稱的. 如果需要進行模糊授權比如某個用戶有寫入aa開頭的topic的權限,這樣的授權目前支持嗎?

使用SASL_PLAINTEXT认证,注意

按照如下格式即可(直接修改用户名和密码后, 手动补充一个 \ 复制粘贴到集群属性):

企业微信截图_16457738736848

security.protocol=SASL_PLAINTEXT
sasl.mechanism=PLAIN
sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required\n这里后面补充一个 \
username="user"\n这里后面补充一个\
password="password";

实时消费 topic

您好!
很久之前 star 了项目,最近有时间体验了下功能,感觉非常棒!
有一个小问题,现在是否有选择 topic 然后启动一个消费者实时消费功能(就像在控制台那样)?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.