Spring Boot 微服务上容器平台的最佳实践 - 5

2022-04-21 14:01:34 浏览数 (1)

前言

今天开始第四篇, 主要介绍下 如何将配置外部化。

这次没有用到SpringConfig Server, 而是使用OpenShiftConfigMap作为参数外部化的方案.

参数外部化

Presentation 服务在其应用程序属性中将Hystrix配置为线程池大小为20。在航班搜索操作之后,通过搜索presentation pod的日志来确认这一点,并验证batch size是相同的。

代码语言:javascript复制
$ oc logs presentation-1-k2xlz | grep batch
... c.r.r.o.b.l.p.s.API_GatewayController    : Will price a batch of 20 
tickets
... c.r.r.o.b.l.p.s.API_GatewayController    : Will price a batch of 13 
tickets
... c.r.r.o.b.l.p.s.API_GatewayController    : Will price a batch of 20 
tickets
... c.r.r.o.b.l.p.s.API_GatewayController    : Will price a batch of 13 
tickets
... c.r.r.o.b.l.p.s.API_GatewayController    : Will price a batch of 20 
tickets
... c.r.r.o.b.l.p.s.API_GatewayController    : Will price a batch of 13 
tickets

△ 当前batch size最大为20

创建一个新application.yml文件. vi application.yml

输入以下内容:

代码语言:javascript复制
hystrix:
  threadpool:
    SalesThreads:
      coreSize: 30
      maxQueueSize: 300
      queueSizeRejectionThreshold: 300    

通过oc 创建configmap:

代码语言:javascript复制
$ oc create configmap presentation --from-file=application.yml
configmap "presentation" created

编辑presentationdeployment config并将这个ConfigMap挂载为卷, 路径为:/deployment/config,它将自动成为Spring启动应用程序classpath的一部分. $ oc edit dc presentation

添加具有任意名称的新卷,例如config-volume, 来引用前面创建的configmap。volume定义是template spec的一个子规范。接下来,在容器下面创建一个volume mount来引用这个卷,并指定应该挂载它的位置。最后的结果如下所示. (volumeMounts -> dnsPolicy之前)

代码语言:javascript复制
...
        resources: {}
        securityContext:
          privileged: false
        terminationMessagePath: /dev/termination-log
        volumeMounts:
        - name: config-volume
          mountPath: /deployments/config
      volumes:
        - name: config-volume
          configMap:
            name: presentation
      dnsPolicy: ClusterFirst
      restartPolicy: Always
...

一旦修改并保存了deployment config,OpenShift将部署包含覆盖属性的服务的新版本。这个更改是持久的,将来使用这个新版本的部署配置创建的pod也将挂载这个yaml文件。

列出pod,并注意一个新的pod正在创建来反映部署配置(即挂载的文件)中的更改:

代码语言:javascript复制
$ oc get pods
NAME                       READY     STATUS      RESTARTS   AGE
airports-1-72kng           1/1       Running     0          18m
flights-1-4xkfv            1/1       Running     0          15m
presentation-1-k2xlz       1/1       Running     0          10m
presentation-2-deploy      0/1       ContainerCreating   0          3s
sales-1-fqxjd              1/1       Running     0          7m
salesv2-1-s1wq0            1/1       Running     0          5m
zipkin-1-k0dv6             1/1       Running     0          1h
zipkin-mysql-1-g44s7       1/1       Running     0          1h
zuul-1-2jkj0               1/1       Running     0          1m

等待,直到pod的第二个版本已经启动, 处于running状态。第一个版本将被终止,随后被删除.

代码语言:javascript复制
$ oc get pods
NAME                       READY     STATUS      RESTARTS   AGE
...
presentation-2-pxx85       1/1       Running     0          5m
...

一旦发生这种情况,使用浏览器进行一次或多次航班搜索。然后通过搜索新的表示pod的日志来验证更新后的线程池大小,并验证batch size:

代码语言:javascript复制
$ oc logs presentation-2-pxx85 | grep batch
... c.r.r.o.b.l.p.s.API_GatewayController    : Will price a batch of 30 
tickets
... c.r.r.o.b.l.p.s.API_GatewayController    : Will price a batch of 3 
tickets
... c.r.r.o.b.l.p.s.API_GatewayController    : Will price a batch of 30 
tickets
... c.r.r.o.b.l.p.s.API_GatewayController    : Will price a batch of 3 
tickets
... c.r.r.o.b.l.p.s.API_GatewayController    : Will price a batch of 30 
tickets
... c.r.r.o.b.l.p.s.API_GatewayController    : Will price a batch of 3 
tickets
... c.r.r.o.b.l.p.s.API_GatewayController    : Will price a batch of 30 
tickets
... c.r.r.o.b.l.p.s.API_GatewayController    : Will price a batch of 3 
tickets

△ 注意,使用挂载的覆盖属性时,定价将以30个并发批次进行,而不是现在的20个。

小结

通过K8S的configmap的概念, 我们可以将配置参数外部化. 然后外部化的参数可以通过2种方式挂载到运行时中:

  1. 环境变量 ENV
  2. Volume 挂载到指定路径.

还是比较灵活的.

0 人点赞