Spring Cloud Kubernetes Demo
Mr.Lee 2024-05-18 18:29:23 Kubernetes
之前项目中的服务发现和服务配置用的Nacos, 现在需求是去掉Nacos, 换成 Kubernetes
背景交代清楚了, 说下利用Kubernetes
来实现服务发现和服务配置, 两大功能的策略...
- Kubernetes 给每个 service 提供了稳定的网络标识, 我们可以用来做为 转发标识
- 利用 ConfigMap 来实现服务配置的功能
并且兼顾了开发环境与
Kubernetes
环境
# Pom.xml 根据环境, 区分环境变量
<properties>
<demo-gateway.port>28080</demo-gateway.port>
<demo-consumer.port>28081</demo-consumer.port>
<demo-provider.port>28082</demo-provider.port>
</properties>
<profiles>
<profile>
<id>dev</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<config.file.path>~/development/workspace/idea/spring-cloud-kubernetes-demo/config</config.file.path>
<service-demo-gateway>http://127.0.0.1:${demo-gateway.port}</service-demo-gateway>
<service-demo-consumer>http://127.0.0.1:${demo-consumer.port}</service-demo-consumer>
<service-demo-provider>http://127.0.0.1:${demo-provider.port}</service-demo-provider>
</properties>
</profile>
<profile>
<id>kubernetes</id>
<activation>
<activeByDefault>false</activeByDefault>
</activation>
<properties>
<config.file.path>/opt/app/config</config.file.path>
<!-- Kubernetes native service discovery -->
<service-demo-gateway>http://demo-gateway-service:${demo-provider.port}</service-demo-gateway>
<service-demo-consumer>http://demo-consumer-service:${demo-consumer.port}</service-demo-consumer>
<service-demo-provider>http://demo-provider-service:${demo-provider.port}</service-demo-provider>
</properties>
</profile>
</profiles>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
demo-gateway-service
,demo-consumer-service
,demo-provider-service
这些稳定网络标识, 后面再说怎么创建的, 先说是怎么用的吧
用到网络标识的地方, 有两处:
- gateway: 路由转发
- openfeign: 远程调用
gateway 配置
# 后面考虑写到公共包里去
demo:
service:
demo-gateway: @service-demo-gateway@
demo-consumer: @service-demo-consumer@
demo-provider: @service-demo-provider@
spring:
application:
name: demo-gateway
cloud:
gateway:
discovery:
locator:
enabled: true
url-expression: uri # uri 转发
routes:
- id: demo-consumer
uri: ${demo.service.demo-consumer} # 转发到咱们配置好的URL上(稳定的唯一标识or本地地址)
predicates:
- Path=/api/v1/consumer/**
filters:
- StripPrefix=3
- id: demo-provider
uri: ${demo.service.demo-provider}
predicates:
- Path=/api/v1/provider/**
filters:
- StripPrefix=3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
openfeign client
package com.striveonger.demo.remote;
import com.striveonger.demo.RemoteHelloService;
import org.springframework.cloud.openfeign.FeignClient;
/**
* @author Mr.Lee
* @description:
* @date 2024-05-13 18:43
*/
@FeignClient(name = "demo-provider", url = "${demo.service.demo-provider}") // 这也是引用了之前配置的稳定的网络标识
public interface RemoteHelloServiceClient extends RemoteHelloService {
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# demo-gateway.yaml
---
apiVersion: "apps/v1"
kind: "Deployment"
metadata:
namespace: "demo"
name: "demo-gateway-deployment"
labels:
app: "demo-gateway"
version: "1.0.0"
spec:
replicas: 1 # 设置副本数
selector:
matchLabels: # 定义deploy匹配pod规则
app: "demo-gateway"
template: # 定义pod模版的元数据
metadata:
namespace: "demo"
name: "demo-gateway-pod"
labels:
app: "demo-gateway" # 用于deploy匹配
spec: # 定义容器
containers:
- name: "demo-gateway"
image: "demo-service:1.0.0"
resources: # 定义系统资源
limits:
cpu: "2"
memory: "512M"
requests:
cpu: "2"
memory: "512M"
ports:
- containerPort: 28080
protocol: "TCP"
env: # 定义环境变量
- name: "APP_NAME"
value: "demo-gateway"
volumeMounts: # 关联到的 ConfigMap, 中key做为文件名, value, 做为文件的内容, 挂载到指定目录
- name: "demo-config" # 关联下面 volumes 中定义的ConfigMap名称
mountPath: "/opt/app/config" # 关联到的 ConfigMap, 在Pod中的挂载目录
volumes:
- name: "demo-config" # 定义挂在的ConfigMap的名称
configMap:
name: "demo-config" # 关联 ConfigMap 的名称
restartPolicy: "Always" # 重启策略
---
apiVersion: "v1"
kind: "Service"
metadata:
namespace: "demo"
name: "demo-gateway-service" # 设置服务名(稳定的网络标识)
labels:
app: "demo-gateway"
spec:
ports:
- protocol: "TCP"
port: 28080
targetPort: 28080
selector:
app: "demo-gateway" # 用于 service 匹配 pod
type: "ClusterIP"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
demo-consumer-service
,demo-provider-service
的配置大差不差.....
容器内查看配置文件
导入配置文件
server:
port: @demo-provider.port@
spring:
application:
name: demo-provider
main:
allow-bean-definition-overriding: true
config:
import: # 导入配置文件
- file://@config.file.path@/demo-commons.yaml
- file://@config.file.path@/demo-provider.yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13