赞
踩
更新时间:2023年4月
本文使用 apache-dubbo 官方提供的代码,简单完成一个在 k8s 上,以 zookeeper 为注册中心的微服务部署示例
参考
dubbo 官方网站:Apache Dubbo
dubbo 示例的 github 地址:apache/dubbo-samples: samples for Apache Dubbo (github.com)
dubbo 文档(本文主要参考部分):3 - Dubbo x Spring Boot 开发微服务应用 | Apache Dubbo
构建 dubbo 简单应用的镜像
创建 Dockerfile
采用多阶段镜像构建,并使用 target
区分二阶段的不同镜像
# 一阶段镜像 builder,下载 dubbo 的官方示例,并使用 maven 构建 FROM maven:3.9.1 as builder WORKDIR / RUN git clone https://github.com/apache/dubbo-samples.git RUN cd dubbo-samples/1-basic/dubbo-samples-spring-boot && \ mvn clean install # 使用 image target 区分不同的二阶段镜像 # dubbo-consumer 镜像,拷贝一阶段 maven 构建生成的 dubbo-samples-spring-boot-consumer-1.0-SNAPSHOT.jar FROM registry.cn-hangzhou.aliyuncs.com/kmust/openjdk:17.0.2-jre-slim-buster as consumer MAINTAINER nemo "sky.nemo@outlook.com" ENV TZ=Asia/Shanghai WORKDIR /dubbo/consumer COPY --from=builder /dubbo-samples/1-basic/dubbo-samples-spring-boot/dubbo-samples-spring-boot-consumer/target/dubbo-samples-spring-boot-consumer-1.0-SNAPSHOT.jar /dubbo/consumer ENTRYPOINT ["java","-jar","/dubbo/consumer/dubbo-samples-spring-boot-consumer-1.0-SNAPSHOT.jar"] # dubbo-interface 镜像,未使用,可以忽略 FROM registry.cn-hangzhou.aliyuncs.com/kmust/openjdk:17.0.2-jre-slim-buster as interface MAINTAINER nemo "sky.nemo@outlook.com" ENV TZ=Asia/Shanghai WORKDIR /dubbo/interface COPY --from=builder /dubbo-samples/1-basic/dubbo-samples-spring-boot/dubbo-samples-spring-boot-interface/target/dubbo-samples-spring-boot-interface-1.0-SNAPSHOT.jar /dubbo/interface ENTRYPOINT ["java","-jar","/dubbo/interface/dubbo-samples-spring-boot-interface-1.0-SNAPSHOT.jar"] # dubbo-provider 镜像,拷贝一阶段 maven 构建生成的 dubbo-samples-spring-boot-provider-1.0-SNAPSHOT.jar FROM registry.cn-hangzhou.aliyuncs.com/kmust/openjdk:17.0.2-jre-slim-buster as provider MAINTAINER nemo "sky.nemo@outlook.com" ENV TZ=Asia/Shanghai WORKDIR /dubbo/provider COPY --from=builder /dubbo-samples/1-basic/dubbo-samples-spring-boot/dubbo-samples-spring-boot-provider/target/dubbo-samples-spring-boot-provider-1.0-SNAPSHOT.jar /dubbo/provider ENTRYPOINT ["java","-jar","/dubbo/provider/dubbo-samples-spring-boot-provider-1.0-SNAPSHOT.jar"]
构建镜像
$ docker build --target provider -t registry.cn-hangzhou.aliyuncs.com/kmust/dubbo-provider:1.0 .
$ docker build --target consumer -t registry.cn-hangzhou.aliyuncs.com/kmust/dubbo-consumer:1.0 .
$ docker build --target interface -t registry.cn-hangzhou.aliyuncs.com/kmust/dubbo-interface:1.0 .
# 上传镜像,略
$ vim ns-dubbo.yaml
---
apiVersion: v1
kind: Namespace
metadata:
name: dubbo
应用声明
$ kubectl apply -f ns-dubbo.yaml
provider 配置
主要配置了 zookeeper 的地址
$ vim application-config/provider-application.yaml
---
zookeeper:
address: zk-cs.zk
dubbo:
application:
name: dubbo-springboot-demo-provider
protocol:
name: dubbo
port: -1
registry:
address: zookeeper://${zookeeper.address:127.0.0.1}:2181
consumer 配置
$ vim application-config/consumer-application.yaml
---
zookeeper:
address: zk-cs.zk
dubbo:
application:
name: dubbo-springboot-demo-consumer
protocol:
name: dubbo
port: -1
registry:
address: zookeeper://${zookeeper.address:127.0.0.1}:2181
# 根据应用配置创建 configmap
$ kubectl create configmap application-config --from-file=./application-config --namespace dubbo
provider 的 Deployment
$ vim deploy-dubbo-provider.yaml --- apiVersion: apps/v1 kind: Deployment metadata: name: dubbo-provider namespace: dubbo labels: app.kubernetes.io/name: dubbo-provider spec: replicas: 1 selector: matchLabels: app.kubernetes.io/name: dubbo-provider template: metadata: labels: app.kubernetes.io/name: dubbo-provider spec: # 业务容器 restartPolicy: Always containers: - name: dubbo-provider image: registry.cn-hangzhou.aliyuncs.com/kmust/dubbo-provider:1.0 imagePullPolicy: IfNotPresent # 挂载卷 volumeMounts: - name: provider-config mountPath: "/dubbo/provider/config/application.yaml" # 使用 subPath,防止覆盖其他的文件 subPath: "application.yaml" # 声明卷 volumes: # 声明 configmap 挂载 - name: provider-config configMap: name: application-config # 重命名为 application.yaml items: - key: "provider-application.yaml" path: "application.yaml"
应用声明
$ kubectl apply -f deploy-dubbo-provider.yaml
检查日志
$ kubectl get pods -n dubbo
NAME READY STATUS RESTARTS AGE
dubbo-provider-7645b5fdb4-9wnwp 1/1 Running 0 8s
# 日志出现 Current Spring Boot Application is await... 即表示正常启动 provider
$ kubectl logs -f dubbo-provider-7645b5fdb4-9wnwp -n dubbo
......
2023-04-23 23:08:46.204 INFO 1 --- [ main] o.a.d.s.d.provider.ProviderApplication : Started ProviderApplication in 5.359 seconds (JVM running for 6.301)
2023-04-23 23:08:46.212 INFO 1 --- [pool-1-thread-1] .b.c.e.AwaitingNonWebApplicationListener : [Dubbo] Current Spring Boot Application is await...
consumer 的 Deployment
$ vim deploy-dubbo-consumer.yaml --- apiVersion: apps/v1 kind: Deployment metadata: name: dubbo-consumer namespace: dubbo labels: app.kubernetes.io/name: dubbo-consumer spec: replicas: 1 selector: matchLabels: app.kubernetes.io/name: dubbo-consumer template: metadata: labels: app.kubernetes.io/name: dubbo-consumer spec: # 业务容器 restartPolicy: Always containers: - name: dubbo-provider image: registry.cn-hangzhou.aliyuncs.com/kmust/dubbo-consumer:1.0 imagePullPolicy: IfNotPresent # 挂载卷 volumeMounts: - name: consumer-config mountPath: "/dubbo/consumer/config/application.yaml" # 使用 subPath,防止覆盖其他的文件 subPath: "application.yaml" # 声明卷 volumes: # 声明 configmap 挂载 - name: consumer-config configMap: name: application-config # 重命名为 application.yaml items: - key: "consumer-application.yaml" path: "application.yaml"
应用声明
$ kubectl apply -f deploy-dubbo-consumer.yaml
查看日志
$ kubectl get pods -n dubbo
NAME READY STATUS RESTARTS AGE
dubbo-consumer-56985f8c9d-b7r5d 1/1 Running 0 13s
dubbo-provider-7645b5fdb4-9wnwp 1/1 Running 0 2m25s
# consumer 接收到 provider 的 hello world 消息,每秒一次
$ kubectl logs -f dubbo-consumer-56985f8c9d-b7r5d -n dubbo
...
2023-04-23 23:11:10.837 INFO 1 --- [pool-1-thread-1] .b.c.e.AwaitingNonWebApplicationListener : [Dubbo] Current Spring Boot Application is await...
Sun Apr 23 23:11:11 CST 2023 Receive result ======> Hello world
Sun Apr 23 23:11:12 CST 2023 Receive result ======> Hello world
Sun Apr 23 23:11:13 CST 2023 Receive result ======> Hello world
zookeeper 检查 dubbo 应用的注册情况
# 进入 zookeeper
$ kubectl exec -it zk-0 -n zk -- bash
# 连接 zookeeper
root@zk-0:/apache-zookeeper-3.7.1-bin# zkCli.sh -server 127.0.0.1
# 查询 provider 信息
[zk: 127.0.0.1(CONNECTED) 9] ls /services/dubbo-springboot-demo-provider
[172.20.119.245:20880]
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。