Skip to content

Commit 3a2aa61

Browse files
committed
feat(dist/gateway): add kong note
1 parent fa0435e commit 3a2aa61

File tree

6 files changed

+200
-11
lines changed

6 files changed

+200
-11
lines changed

common/json/jackson.md

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -478,9 +478,41 @@ public void testHello() throws IOException {
478478
- Java 在编译时会在字节码里指令集之外的地方保留「部分」泛型信息
479479
- **泛型接口**``**方法**定义上的所有泛型、`成员变量声明处`的泛型「都会」被保留类型信息,「其它地方」的泛型信息都会被擦除
480480
- solution
481+
481482
- 利用成员变量保留泛型
482483
- TypeReference<T>
483484

485+
```java
486+
// it's failed: T will be HashLinkMap!!!
487+
<T> T requestShopperTrak(String startTime, DetailEnum d) {} // TypeReference
488+
StoreTrafficDTO dto = requestShopperTrak(startTime, DetailEnum.STORE)
489+
490+
// it's ok!!
491+
<T> T requestShopperTrak(String startTime, DetailEnum d, Class<T> clazz) {} // Class
492+
StoreTrafficDTO dto = requestShopperTrak(startTime, DetailEnum.STORE, StoreTrafficDTO.class)
493+
```
494+
495+
- sample
496+
497+
```java
498+
public class JsonResponse<T> {
499+
private T result;
500+
}
501+
public class User {
502+
private Long id;
503+
private String firstName;
504+
private String lastName;
505+
}
506+
507+
// {"result":{"id":1,"firstName":"John","lastName":"Lewis"}}
508+
509+
TypeReference<JsonResponse<User>> typeRef = new TypeReference<JsonResponse<User>>() {};
510+
JsonResponse<User> jsonResponse = objectMapper.readValue(json, typeRef);
511+
512+
JavaType javaType = objectMapper.getTypeFactory().constructParametricType(JsonResponse.class, User.class);
513+
JsonResponse<User> jsonResponse = objectMapper.readValue(json, javaType);
514+
```
515+
484516
4. tree
485517
- 序列化
486518
1. valueToTree(Object)

dist/gateway/kong/0.install.md

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
## install
2+
3+
1. compose
4+
5+
```yml
6+
version: '3.1'
7+
services:
8+
kong_pgsql:
9+
image: postgres:9.5
10+
container_name: kong_pgsql
11+
restart: always
12+
environment:
13+
POSTGRES_USER: postgres
14+
POSTGRES_PASSWORD: Yu1252068782
15+
POSTGRES_DB: kong
16+
volumes:
17+
- kong_pgsql_volume:/var/lib/postgresql/data
18+
ports:
19+
- 5431:5432
20+
21+
kong:
22+
image: kong:2.6.0
23+
restart: always
24+
environment:
25+
KONG_DATABASE: postgres
26+
KONG_PG_HOST: kong_pgsql
27+
KONG_PG_DATABASE: kong
28+
KONG_PG_USER: postgres
29+
KONG_PG_PASSWORD: Yu1252068782
30+
KONG_PROXY_LISTEN: 0.0.0.0:8000, 0.0.0.0:8443 ssl
31+
KONG_ADMIN_LISTEN: 0.0.0.0:8001, 0.0.0.0:8444 ssl
32+
KONG_ADMIN_ACCESS_LOG: /dev/stdout
33+
KONG_PROXY_ERROR_LOG: /dev/stderr
34+
KONG_ADMIN_ERROR_LOG: /dev/stderr
35+
#KONG_STREAM_LISTEN: 0.0.0.0:6379
36+
depends_on:
37+
- kong_pgsql
38+
links:
39+
- kong_pgsql
40+
healthcheck:
41+
#test: ["CMD", "curl", "-f", "http://kong:8001"]
42+
test: ['CMD', 'kong', 'health']
43+
interval: 5s
44+
timeout: 2s
45+
retries: 15
46+
volumes:
47+
- kong_volume:/usr/local/share/lua/5.1/kong/templatesa
48+
ports:
49+
- '8001:8001'
50+
- '8000:8000'
51+
- '8443:8443'
52+
- 8444:8444
53+
#- 6379:6379 # tcp forward
54+
extra_hosts:
55+
- 'host.docker.internal:172.17.0.1'
56+
57+
konga:
58+
image: pantsel/konga:0.14.9
59+
restart: always
60+
environment:
61+
DB_ADAPTER: postgres
62+
DB_HOST: kong_pgsql
63+
DB_DATABASE: konga
64+
DB_USER: postgres
65+
DB_PASSWORD: Yu1252068782
66+
NODE_ENV: development
67+
depends_on:
68+
- kong
69+
- kong_pgsql
70+
ports:
71+
- 1337:1337
72+
73+
volumes:
74+
kong_pgsql_volume:
75+
kong_volume:
76+
```

dist/gateway/kong/3.upstream.md

Lines changed: 74 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,23 +9,92 @@
99
- 健康检查: 主动检查 || 被动检查, 将流量转发至其它健康的 target
1010
- 熔断: 根据健康检查的状态, 对客户端请求进行熔断, 防止后端级联服务雪崩
1111

12-
## 负载均衡: [hash 一致性算法](https://mp.weixin.qq.com/s/76R-JD5zWzixrBQb6WYjXQ)
12+
## 负载均衡
1313

14-
1. 轮询、加权轮询、随机选择
14+
1. 常见的路由策略
15+
16+
- 轮询
17+
- 加权轮询
18+
- 随机选择
19+
- 一致性 hash: none(则使用轮询)/consumer/ip/header/cookie
20+
- *当前*最少连接
21+
- *总计*最少次数
22+
- \_
23+
- 最不经常使用(lru)
24+
- 最近最久未使用(lfu)
25+
- 故障转移
26+
- 忙碌转移
27+
- 第一个
28+
- 最后一个
29+
30+
2. [hash 一致性算法](https://mp.weixin.qq.com/s/76R-JD5zWzixrBQb6WYjXQ)
1531

1632
### DNS 负载均衡
1733

34+
1. 核心(本质): 域名解析, 将域名解析为 A || srv || 线路类型(同一域名在不同线路下解析到不能 IP 服务)
35+
2. A 记录
36+
- 一个 A 记录映射到一个或多个 IP 地址+权重
37+
- 解析到某条记录的比例为: 该条记录权重 ÷ 该线路所有记录权重之和
38+
3. srv: `优先级 权重 端口 主机名`
39+
- 一个 srv 记录映射到一个或多个 IP 地址
40+
- `5 0 5269 xx.google.com.`
41+
4. DNS 优先级
42+
43+
```mermaid
44+
graph LR
45+
A(先前解析的最后一个成功类型) --> B(SRV记录)
46+
B(SRV记录) --> C(A记录)
47+
C(A记录) --> D(CNAME记录)
48+
```
49+
1850
### 环形均衡器: Ring-balancer
1951

52+
1. 核心: 由 Kong(配置 upstream 和 target) 充当服务注册中心, 通过槽位和权重在 target 间负载
53+
2. **每个 upstream 都有自己的环形均衡器**和多个 target(通过一个 HTTP 请求被添加/删除节点)
54+
- 一个环形均衡器有一个最大的预定义槽位数, 根据 target 权重分配槽位: `权重最好是倍数关系(方便均衡器性能)`
55+
- 在均衡器中, 从 1 到 slots **随机**地分布在环上
56+
- 当插槽数量发生变化时需要重建均衡器
57+
3. rb 可以再单节点和集群种使用: 所有节点都要建立完全相同的环形均衡器, 以确保它们都能正常工作
58+
- 轮询算法时没有区别
59+
- hash 时则一定要使用 Ip 而不是域名
60+
2061
## 健康检查
2162

22-
1. 主动检查
23-
2. 被动检查
63+
1. 主动检查: 定期请求 target 中的特定 HTTP 或 HTTPS 端点, 并根据其响应确定 target 的健康状况
64+
65+
- 主动健康检查目前只支持 HTTP/HTTPS, 且时间间隔设置为 0 则表示禁用检查
66+
- pros: 主动健康检查可以在 target 恢复健康时, 自动重新启用环形均衡器中的 target + 可以恢复被动检查导致的不健康
67+
- cons: 主动健康检查会对 target 产生额外的流量 + 且需要指定端点
68+
69+
2. 被动检查: 断路器, 分析代理的流量并根据其响应确定 target 的健康状况(且无法自动恢复健康)
70+
71+
- nginx 会监测代理的请求并根据响应状态决定是否转发流量到改服务
72+
- nginx 的上游服务的响应状态在短时间内累计一定的失败次数时, 会将其标记该服务器异常: 然后就不会转发流量给该服务器
73+
- nginx 每隔一段时间还是会转发少量的一些请求给该后端服务器来探测它的返回状态: 以便识别该服务器是否恢复正常
74+
75+
3. **主动检查&被动检查 最佳实践: 可以启用被动健康检查, 仅根据其流量监测目标的健康状况, 只在目标不健康时使用主动健康检查, 以便自动重新启用它**
76+
4. 健康检查仅对活动目标进行操作, 不会修改 Kong 数据库中 target 的活动状态
77+
5. 不健康的目标不会从负载均衡器中删除, 因此在使用 hash 算法时不会对均衡器布局产生任何影响(它们只会被跳过)
78+
6. upstream 也有健康概念: upstream 的健康状况取决于其 target 的状态
79+
- healthchecks.threshold=55: 权重的百分比
80+
- ups 进入不健康的状态, upstream 将只返回错误: target 恢复时, 环形均衡器的健康状态将自动更新
81+
82+
## target: host+port+weight
2483

25-
## target
84+
1. 当不活跃的条目比活跃的条目多 10 倍时, target 将被自动清理: 此时 rb 会重建(代价比较大)
85+
2. 健康检查器会根绝健康检查更新一系列的内部计数器
86+
- 如果连接失败, 则增加 target 的 TCP 失败计数器并清除成功计数器
87+
- 如返回健康的状态码, 则增加 target 的成功计数器并清除其所有其他计数器
88+
- 如返回不健康的状态码, 则增加 target 的 HTTP 失败计数器并清除成功计数器
89+
- 如果超时, 它将增加 target 的超时计数器并清除成功计数器
90+
3. 健康的定义
91+
- 健康信息不会在集群中同步, 每个 Kong 节点分别确定其目标的健康状况
92+
- 不健康: 任何 TCP 失败、HTTP 失败或超时计数器达到其配置的阈值, target 都不可用时会返回 503
93+
- 健康: 成功计数器达到其配置的阈值
2694

2795
---
2896

2997
## reference
3098

3199
1. https://www.jianshu.com/p/b44400618c69
100+
2. https://github.com/Alice52/diagrams/blob/master/diagrams/lb/nginx/conf/03.upstream.svg

dist/gateway/kong/readme.md

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,14 @@
44

55
![avatar](/static/image/dist/gateway/kong-flow.png)
66

7+
1. ecology: `kong gateway Server + Apache Cassandra/PostgreSQL + Kong Manager/Konga`
8+
9+
- Kong Admin API: kong 内容配置(restful api)
10+
- Kong Manager/Konga
11+
- Kong Dev Portal: 二次开发/管理 API 版本
12+
- Kong Vitals: Gateway 节点的健康性能指标, 是 Kong Manager 用户界面的一部分
13+
- Kong Gateway plugins
14+
715
## deploy
816

917
## config: `Route >> Service >> Upstream >> Target`
@@ -13,7 +21,7 @@
1321
3. upstream: 上游服务, 实现负载
1422
4. target: upstream 负载下的每个节点(物理服务 | ip + port 的抽象)
1523
5. consumer: 代表用户或应用(核心原则是可以为其添加插件)
16-
6. plugin
24+
6. plugins
1725

1826
## plugins 开发
1927

@@ -26,6 +34,10 @@
2634
## reference
2735

2836
1. https://zhuanlan.zhihu.com/p/577842078
29-
2. https://github.com/micro-services-roadmap/roadmap/issues/5
30-
3. https://blog.csdn.net/lgxzzz/article/details/121683302
31-
4. https://cloud.tencent.com/developer/article/2301049
37+
2. https://www.jianshu.com/p/b44400618c69
38+
3. https://github.com/micro-services-roadmap/roadmap/issues/5
39+
4. https://blog.csdn.net/lgxzzz/article/details/121683302
40+
5. https://cloud.tencent.com/developer/article/2301049
41+
6. https://mp.weixin.qq.com/s/O2N2ucFLn3vF67RK_aP0UA
42+
7. https://blog.csdn.net/zz18435842675/article/details/122449579
43+
8. [kong logstash](https://blog.csdn.net/why_still_confused/article/details/89244200)

job

0 commit comments

Comments
 (0)