Skip to content

Commit 6515dd2

Browse files
authored
Merge pull request #589 from didi/master
合并主分支
2 parents 1335414 + 028d891 commit 6515dd2

File tree

134 files changed

+40024
-1684
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

134 files changed

+40024
-1684
lines changed

Releases_Notes.md

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,59 @@
11

2+
3+
## v3.0.0-beta.2
4+
5+
**文档**
6+
- 新增登录系统对接文档
7+
- 优化前端工程打包构建部分文档说明
8+
- FAQ补充KnowStreaming连接特定JMX IP的说明
9+
10+
11+
**Bug修复**
12+
- 修复logi_security_oplog表字段过短,导致删除Topic等操作无法记录的问题
13+
- 修复ES查询时,抛java.lang.NumberFormatException: For input string: "{"value":0,"relation":"eq"}" 问题
14+
- 修复LogStartOffset和LogEndOffset指标单位错误问题
15+
- 修复进行副本变更时,旧副本数为NULL的问题
16+
- 修复集群Group列表,在第二页搜索时,搜索时返回的分页信息错误问题
17+
- 修复重置Offset时,返回的错误信息提示不一致的问题
18+
- 修复集群查看,系统查看,LoadRebalance等页面权限点缺失问题
19+
- 修复查询不存在的Topic时,错误信息提示不明显的问题
20+
- 修复Windows用户打包前端工程报错的问题
21+
- package-lock.json锁定前端依赖版本号,修复因依赖自动升级导致打包失败等问题
22+
- 系统管理子应用,补充后端返回的Code码拦截,解决后端接口返回报错不展示的问题
23+
- 修复用户登出后,依旧可以访问系统的问题
24+
- 修复巡检任务配置时,数值显示错误的问题
25+
- 修复Broker/Topic Overview 图表和图表详情问题
26+
- 修复Job扩缩副本任务明细数据错误的问题
27+
- 修复重置Offset时,分区ID,Offset数值无限制问题
28+
- 修复扩缩/迁移副本时,无法选中Kafka系统Topic的问题
29+
- 修复Topic的Config页面,编辑表单时不能正确回显当前值的问题
30+
- 修复Broker Card返回数据后依旧展示加载态的问题
31+
32+
33+
34+
**体验优化**
35+
- 缩短新增集群后,集群信息加载的耗时
36+
- 集群Broker列表,增加Controller角色信息
37+
- 优化默认密码为admin/admin
38+
- 副本变更任务结束后,增加进行优先副本选举的操作
39+
- Task模块任务分为Metrics、Common、Metadata三类任务,每类任务配备独立线程池,减少对Job模块的线程池,以及不同类任务之间的相互影响
40+
- 删除代码中存在的多余无用文件
41+
- 自动新增ES索引模版及近7天索引,减少用户搭建时需要做的事项
42+
- 优化前端工程打包流程
43+
- 优化登录页文案,页面左侧栏内容,单集群详情样式,Topic列表趋势图等
44+
- 首次进入Broker/Topic图表详情时,进行预缓存数据从而优化体验
45+
- 优化Topic详情Partition Tab的展示
46+
- 多集群列表页增加编辑功能
47+
- 优化副本变更时,迁移时间支持分钟级别粒度
48+
- logi-security版本升级至2.10.13
49+
- logi-elasticsearch-client版本升级至1.0.24
50+
51+
52+
**能力提升**
53+
- 支持Ldap登录认证
54+
55+
---
56+
257
## v3.0.0-beta.1
358

459
**文档**
@@ -35,6 +90,7 @@
3590
- 增加周期任务,用于主动创建缺少的ES模版及索引的能力,减少额外的脚本操作
3691
- 增加JMX连接的Broker地址可选择的能力
3792

93+
---
3894

3995
## v3.0.0-beta.0
4096

Lines changed: 199 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,199 @@
1+
2+
3+
![Logo](https://user-images.githubusercontent.com/71620349/185368586-aed82d30-1534-453d-86ff-ecfa9d0f35bd.png)
4+
5+
## 登录系统对接
6+
7+
[KnowStreaming](https://github.com/didi/KnowStreaming)(以下简称KS) 除了实现基于本地MySQL的用户登录认证方式外,还已经实现了基于Ldap的登录认证。
8+
9+
但是,登录认证系统并非仅此两种。因此,为了具有更好的拓展性,KS具有自定义登陆认证逻辑,快速对接已有系统的特性。
10+
11+
在KS中,我们将登陆认证相关的一些文件放在[km-extends](https://github.com/didi/KnowStreaming/tree/master/km-extends)模块下的[km-account](https://github.com/didi/KnowStreaming/tree/master/km-extends/km-account)模块里。
12+
13+
本文将介绍KS如何快速对接自有的用户登录认证系统。
14+
15+
### 对接步骤
16+
17+
- 创建一个登陆认证类,实现[LogiCommon](https://github.com/didi/LogiCommon)的LoginExtend接口;
18+
-[application.yml](https://github.com/didi/KnowStreaming/blob/master/km-rest/src/main/resources/application.yml)中的spring.logi-security.login-extend-bean-name字段改为登陆认证类的bean名称;
19+
20+
```Java
21+
//LoginExtend 接口
22+
public interface LoginExtend {
23+
24+
/**
25+
* 验证登录信息,同时记住登录状态
26+
*/
27+
UserBriefVO verifyLogin(AccountLoginDTO var1, HttpServletRequest var2, HttpServletResponse var3) throws LogiSecurityException;
28+
29+
/**
30+
* 登出接口,清楚登录状态
31+
*/
32+
Result<Boolean> logout(HttpServletRequest var1, HttpServletResponse var2);
33+
34+
/**
35+
* 检查是否已经登录
36+
*/
37+
boolean interceptorCheck(HttpServletRequest var1, HttpServletResponse var2, String var3, List<String> var4) throws IOException;
38+
39+
}
40+
41+
```
42+
43+
44+
45+
### 对接例子
46+
47+
我们以Ldap对接为例,说明KS如何对接登录认证系统。
48+
49+
+ 编写[LdapLoginServiceImpl](https://github.com/didi/KnowStreaming/blob/master/km-extends/km-account/src/main/java/com/xiaojukeji/know/streaming/km/account/login/ldap/LdapLoginServiceImpl.java)类,实现LoginExtend接口。
50+
+ 设置[application.yml](https://github.com/didi/KnowStreaming/blob/master/km-rest/src/main/resources/application.yml)中的spring.logi-security.login-extend-bean-name=ksLdapLoginService。
51+
52+
完成上述两步即可实现KS对接Ldap认证登陆。
53+
54+
```Java
55+
@Service("ksLdapLoginService")
56+
public class LdapLoginServiceImpl implements LoginExtend {
57+
58+
59+
@Override
60+
public UserBriefVO verifyLogin(AccountLoginDTO loginDTO,
61+
HttpServletRequest request,
62+
HttpServletResponse response) throws LogiSecurityException {
63+
String decodePasswd = AESUtils.decrypt(loginDTO.getPw());
64+
65+
// 去LDAP验证账密
66+
LdapPrincipal ldapAttrsInfo = ldapAuthentication.authenticate(loginDTO.getUserName(), decodePasswd);
67+
if (ldapAttrsInfo == null) {
68+
// 用户不存在,正常来说上如果有问题,上一步会直接抛出异常
69+
throw new LogiSecurityException(ResultCode.USER_NOT_EXISTS);
70+
}
71+
72+
// 进行业务相关操作
73+
74+
// 记录登录状态,Ldap因为无法记录登录状态,因此有KnowStreaming进行记录
75+
initLoginContext(request, response, loginDTO.getUserName(), user.getId());
76+
return CopyBeanUtil.copy(user, UserBriefVO.class);
77+
}
78+
79+
@Override
80+
public Result<Boolean> logout(HttpServletRequest request, HttpServletResponse response) {
81+
82+
//清理cookie和session
83+
84+
return Result.buildSucc(Boolean.TRUE);
85+
}
86+
87+
@Override
88+
public boolean interceptorCheck(HttpServletRequest request, HttpServletResponse response, String requestMappingValue, List<String> whiteMappingValues) throws IOException {
89+
90+
// 检查是否已经登录
91+
String userName = HttpRequestUtil.getOperator(request);
92+
if (StringUtils.isEmpty(userName)) {
93+
// 未登录,则进行登出
94+
logout(request, response);
95+
return Boolean.FALSE;
96+
}
97+
98+
return Boolean.TRUE;
99+
}
100+
}
101+
102+
```
103+
104+
105+
106+
### 实现原理
107+
108+
因为登陆和登出整体实现逻辑是一致的,所以我们以登陆逻辑为例进行介绍。
109+
110+
+ 登陆原理
111+
112+
登陆走的是[LogiCommon](https://github.com/didi/LogiCommon)自带的LoginController。
113+
114+
```java
115+
@RestController
116+
public class LoginController {
117+
118+
119+
//登陆接口
120+
@PostMapping({"/login"})
121+
public Result<UserBriefVO> login(HttpServletRequest request, HttpServletResponse response, @RequestBody AccountLoginDTO loginDTO) {
122+
try {
123+
//登陆认证
124+
UserBriefVO userBriefVO = this.loginService.verifyLogin(loginDTO, request, response);
125+
return Result.success(userBriefVO);
126+
127+
} catch (LogiSecurityException var5) {
128+
return Result.fail(var5);
129+
}
130+
}
131+
132+
}
133+
```
134+
135+
而登陆操作是调用LoginServiceImpl类来实现,但是具体由哪个登陆认证类来执行登陆操作却由loginExtendBeanTool来指定。
136+
137+
```java
138+
//LoginServiceImpl类
139+
@Service
140+
public class LoginServiceImpl implements LoginService {
141+
142+
//实现登陆操作,但是具体哪个登陆类由loginExtendBeanTool来管理
143+
public UserBriefVO verifyLogin(AccountLoginDTO loginDTO, HttpServletRequest request, HttpServletResponse response) throws LogiSecurityException {
144+
145+
return this.loginExtendBeanTool.getLoginExtendImpl().verifyLogin(loginDTO, request, response);
146+
}
147+
148+
149+
}
150+
```
151+
152+
而loginExtendBeanTool类会优先去查找用户指定的登陆认证类,如果失败则调用默认的登陆认证函数。
153+
154+
```java
155+
//LoginExtendBeanTool类
156+
@Component("logiSecurityLoginExtendBeanTool")
157+
public class LoginExtendBeanTool {
158+
159+
public LoginExtend getLoginExtendImpl() {
160+
LoginExtend loginExtend;
161+
//先调用用户指定登陆类,如果失败则调用系统默认登陆认证
162+
try {
163+
//调用的类由spring.logi-security.login-extend-bean-name指定
164+
loginExtend = this.getCustomLoginExtendImplBean();
165+
} catch (UnsupportedOperationException var3) {
166+
loginExtend = this.getDefaultLoginExtendImplBean();
167+
}
168+
169+
return loginExtend;
170+
}
171+
}
172+
```
173+
174+
+ 认证原理
175+
176+
认证的实现则比较简单,向Spring中注册我们的拦截器PermissionInterceptor。
177+
178+
拦截器会调用LoginServiceImpl类的拦截方法,LoginServiceImpl后续处理逻辑就和前面登陆是一致的。
179+
180+
```java
181+
public class PermissionInterceptor implements HandlerInterceptor {
182+
183+
184+
/**
185+
* 拦截预处理
186+
* @return boolean false:拦截, 不向下执行, true:放行
187+
*/
188+
@Override
189+
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
190+
191+
//免登录相关校验,如果验证通过,提前返回
192+
193+
//走拦截函数,进行普通用户验证
194+
return loginService.interceptorCheck(request, response, classRequestMappingValue, whiteMappingValues);
195+
}
196+
197+
}
198+
```
199+

docs/dev_guide/解决连接JMX失败.md

Lines changed: 43 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,14 @@
11

2-
![Logo](https://user-images.githubusercontent.com/71620349/185368586-aed82d30-1534-453d-86ff-ecfa9d0f35bd.png)
32

3+
![Logo](https://user-images.githubusercontent.com/71620349/185368586-aed82d30-1534-453d-86ff-ecfa9d0f35bd.png)
44

55
## JMX-连接失败问题解决
66

7-
- [JMX-连接失败问题解决](#jmx-连接失败问题解决)
8-
- [1、问题&说明](#1问题说明)
9-
- [2、解决方法](#2解决方法)
10-
- [3、解决方法 —— 认证的JMX](#3解决方法--认证的jmx)
11-
12-
集群正常接入Logi-KafkaManager之后,即可以看到集群的Broker列表,此时如果查看不了Topic的实时流量,或者是Broker的实时流量信息时,那么大概率就是JMX连接的问题了。
7+
集群正常接入`KnowStreaming`之后,即可以看到集群的Broker列表,此时如果查看不了Topic的实时流量,或者是Broker的实时流量信息时,那么大概率就是`JMX`连接的问题了。
138

149
下面我们按照步骤来一步一步的检查。
1510

16-
### 1、问题&说明
11+
### 1、问题说明
1712

1813
**类型一:JMX配置未开启**
1914

@@ -43,6 +38,26 @@ java.rmi.ConnectException: Connection refused to host: 192.168.0.1; nested excep
4338
java.rmi.ConnectException: Connection refused to host: 127.0.0.1;; nested exception is:
4439
```
4540

41+
**类型三:连接特定IP**
42+
43+
Broker 配置了内外网,而JMX在配置时,可能配置了内网IP或者外网IP,此时 `KnowStreaming` 需要连接到特定网络的IP才可以进行访问。
44+
45+
比如:
46+
47+
Broker在ZK的存储结构如下所示,我们期望连接到 `endpoints` 中标记为 `INTERNAL` 的地址,但是 `KnowStreaming` 却连接了 `EXTERNAL` 的地址,此时可以看 `4、解决方法 —— JMX连接特定网络` 进行解决。
48+
49+
```json
50+
{
51+
"listener_security_protocol_map": {"EXTERNAL":"SASL_PLAINTEXT","INTERNAL":"SASL_PLAINTEXT"},
52+
"endpoints": ["EXTERNAL://192.168.0.1:7092","INTERNAL://192.168.0.2:7093"],
53+
"jmx_port": 8099,
54+
"host": "192.168.0.1",
55+
"timestamp": "1627289710439",
56+
"port": -1,
57+
"version": 4
58+
}
59+
```
60+
4661
### 2、解决方法
4762

4863
这里仅介绍一下比较通用的解决方式,如若有更好的方式,欢迎大家指导告知一下。
@@ -76,26 +91,36 @@ fi
7691

7792
如果您是直接看的这个部分,建议先看一下上一节:`2、解决方法`以确保`JMX`的配置没有问题了。
7893

79-
在JMX的配置等都没有问题的情况下,如果是因为认证的原因导致连接不了的,此时可以使用下面介绍的方法进行解决。
94+
`JMX`的配置等都没有问题的情况下,如果是因为认证的原因导致连接不了的,可以在集群接入界面配置你的`JMX`认证信息。
95+
96+
<img src='http://img-ys011.didistatic.com/static/dc2img/do1_EUU352qMEX1Jdp7pxizp' width=350>
97+
8098

81-
**当前这块后端刚刚开发完成,可能还不够完善,有问题随时沟通。**
8299

83-
`Logi-KafkaManager 2.2.0+`之后的版本后端已经支持`JMX`认证方式的连接,但是还没有界面,此时我们可以往`cluster`表的`jmx_properties`字段写入`JMX`的认证信息。
100+
### 4、解决方法 —— JMX连接特定网络
84101

85-
这个数据是`json`格式的字符串,例子如下所示:
102+
可以手动往`ks_km_physical_cluster`表的`jmx_properties`字段增加一个`useWhichEndpoint`字段,从而控制 `KnowStreaming` 连接到特定的JMX IP及PORT。
86103

104+
`jmx_properties`格式:
87105
```json
88106
{
89-
"maxConn": 10, # KM对单台Broker的最大JMX连接数
90-
"username": "xxxxx", # 用户名
91-
"password": "xxxx", # 密码
107+
"maxConn": 100, # KM对单台Broker的最大JMX连接数
108+
"username": "xxxxx", # 用户名,可以不填写
109+
"password": "xxxx", # 密码,可以不填写
92110
"openSSL": true, # 开启SSL, true表示开启ssl, false表示关闭
111+
"useWhichEndpoint": "EXTERNAL" #指定要连接的网络名称,填写EXTERNAL就是连接endpoints里面的EXTERNAL地址
93112
}
94113
```
95114

96115
&nbsp;
97116

98-
SQL的例子
117+
SQL例子
99118
```sql
100-
UPDATE cluster SET jmx_properties='{ "maxConn": 10, "username": "xxxxx", "password": "xxxx", "openSSL": false }' where id={xxx};
101-
```
119+
UPDATE ks_km_physical_cluster SET jmx_properties='{ "maxConn": 10, "username": "xxxxx", "password": "xxxx", "openSSL": false , "useWhichEndpoint": "xxx"}' where id={xxx};
120+
```
121+
122+
注意:
123+
124+
+ 目前此功能只支持采用 `ZK` 做分布式协调的kafka集群。
125+
126+

0 commit comments

Comments
 (0)