4D实验八:Dubbo微服务 + 注册中心

📋 Dubbo 微服务架构完整部署

一、架构概览

复制代码
┌─────────────────────────────────────────────────────────────┐
│                    Kubernetes 集群 (myserver namespace)      │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  ┌──────────────┐     注册/订阅     ┌──────────────┐       │
│  │   Provider   │ ◄──────────────► │   ZooKeeper  │       │
│  │  (服务提供者) │                  │  (注册中心)   │       │
│  └──────────────┘                  └──────────────┘       │
│         │                                  ▲               │
│         │ 调用                             │ 读取           │
│         ▼                                  │               │
│  ┌──────────────┐                  ┌──────────────┐       │
│  │   Consumer   │                  │  Dubbo Admin │       │
│  │  (服务消费者) │                  │  (管理控制台) │       │
│  └──────────────┘                  └──────────────┘       │
│                                                             │
└─────────────────────────────────────────────────────────────┘

二、环境信息

|----------------|--------|------------------|
| 组件 | 版本 | 说明 |
| Kubernetes | v1.33+ | 容器编排平台 |
| ZooKeeper | 3.4.14 | 注册中心 |
| Dubbo Admin | 2.8.4 | 管理控制台 |
| Dubbo Provider | 2.1.5 | 服务提供者 |
| Dubbo Consumer | 2.1.5 | 服务消费者 |
| Tomcat | 8.5.43 | Dubbo Admin 运行容器 |

三、部署步骤详解

1. ZooKeeper 注册中心部署
复制代码
# 查看 ZooKeeper 状态
kubectl get pod -n myserver | grep zookeeper
kubectl get svc -n myserver | grep zookeeper

关键配置

  • Service 名称:zookeeper (ClusterIP: 10.100.23.56)
  • Headless Service:zookeeper-headless
  • 端口:2181
2. Dubbo Admin 部署

2.1 Dockerfile 关键配置

复制代码
FROM tomcat-base:v8.5.43
ADD server.xml /apps/tomcat/conf/server.xml
ADD dubboadmin.war /data/tomcat/webapps/
RUN cd /data/tomcat/webapps && unzip dubboadmin.war && rm -rf dubboadmin.war
EXPOSE 8080 8443

2.2 修改 ZooKeeper 配置

复制代码
# /data/tomcat/webapps/dubboadmin/WEB-INF/dubbo.properties
dubbo.registry.address=zookeeper://zookeeper.myserver.svc.cluster.local:2181
dubbo.admin.registry.address=zookeeper://zookeeper.myserver.svc.cluster.local:2181
dubbo.admin.config-center=zookeeper://zookeeper.myserver.svc.cluster.local:2181
dubbo.admin.metadata-report.address=zookeeper://zookeeper.myserver.svc.cluster.local:2181
dubbo.admin.root.password=root
dubbo.admin.guest.password=guest

2.3 构建镜像

复制代码
cd /opt/k8s-data/dockerfile/web/myserver/dubbo/dubboadmin
./build-command.sh v1.0

2.4 K8s 部署文件

复制代码
# 1.dubboadmin-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myserver-dubboadmin-deployment
  namespace: myserver
spec:
  replicas: 1
  selector:
    matchLabels:
      app: myserver-dubboadmin
  template:
    metadata:
      labels:
        app: myserver-dubboadmin
    spec:
      containers:
      - name: myserver-dubboadmin-container
        image: harbor.myarchitect.online/myserver/dubboadmin:v1.0
        ports:
        - containerPort: 8080

# 2.dubboadmin-service.yaml
kind: Service
apiVersion: v1
metadata:
  name: myserver-dubboadmin-service
  namespace: myserver
spec:
  type: NodePort
  ports:
  - name: http
    port: 80
    targetPort: 8080
    nodePort: 30066
  selector:
    app: myserver-dubboadmin
3. Provider 服务提供者部署

3.1 修改配置文件

复制代码
# dubbo.properties
dubbo.container=log4j,spring
dubbo.application.name=demo-provider
dubbo.registry.address=zookeeper://10.100.23.56:2181
dubbo.protocol.name=dubbo
dubbo.protocol.port=20880

3.2 构建镜像

复制代码
cd /opt/k8s-data/dockerfile/web/myserver/dubbo/provider
./build-command.sh v2

3.3 K8s 部署文件

复制代码
# 1.provider-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myserver-provider-deployment
  namespace: myserver
spec:
  replicas: 1
  selector:
    matchLabels:
      app: myserver-provider
  template:
    metadata:
      labels:
        app: myserver-provider
    spec:
      containers:
      - name: myserver-provider-container
        image: harbor.myarchitect.online/myserver/dubbo-demo-provider:v2
        ports:
        - containerPort: 20880
4. Consumer 服务消费者部署
复制代码
# 1.consumer-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myserver-consumer-deployment
  namespace: myserver
spec:
  replicas: 1
  selector:
    matchLabels:
      app: myserver-consumer
  template:
    metadata:
      labels:
        app: myserver-consumer
    spec:
      containers:
      - name: myserver-consumer-container
        image: harbor.myarchitect.online/myserver/dubbo-demo-consumer:v1

四、问题排查与解决

问题1:Dubbo Admin 404 错误

现象 :访问 http://IP:30066/dubboadmin 返回 404

排查步骤

复制代码
# 1. 查看 Pod 状态
kubectl get pod -n myserver | grep dubboadmin

# 2. 查看日志
kubectl logs -n myserver <pod-name>

# 3. 进入容器检查
kubectl exec -it -n myserver <pod-name> -- bash
curl http://localhost:8080/dubboadmin

# 4. 查看 Tomcat 日志
kubectl exec -it -n myserver <pod-name> -- cat /apps/tomcat/logs/catalina.out

根本原因:Tomcat 的 server.xml 中 8080 端口被注释

解决方案

复制代码
<!-- 取消注释 -->
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
问题2:Provider 无法注册到 ZooKeeper

现象 :ZooKeeper 中 /dubbo 路径为空

排查步骤

复制代码
# 1. 查看 Provider 日志
kubectl logs -n myserver <provider-pod> | grep -i error

# 2. 查看配置文件
kubectl exec -it -n myserver <provider-pod> -- cat /apps/dubbo/provider/conf/dubbo.properties

# 3. 查看实际存在的 Service
kubectl get svc -n myserver | grep zookeeper

# 4. 查看 ZooKeeper 注册内容
kubectl exec -it -n myserver zookeeper-0 -- zkCli.sh ls /dubbo

错误日志

复制代码
java.net.UnknownHostException: zookeeper1.myserver.svc.cluster.local

根本原因:配置中使用了不存在的 ZooKeeper 地址

解决方案:改为正确的地址

复制代码
# 错误配置
dubbo.registry.address=zookeeper://zookeeper1.myserver.svc.cluster.local:2181

# 正确配置
dubbo.registry.address=zookeeper://zookeeper.myserver.svc.cluster.local:2181
# 或
dubbo.registry.address=zookeeper://10.100.23.56:2181

五、验证命令

复制代码
# 1. 检查所有 Pod 状态
kubectl get pod -n myserver

# 2. 检查服务注册
kubectl exec -it -n myserver zookeeper-0 -- zkCli.sh ls /dubbo
# 预期输出:[com.alibaba.dubbo.demo.DemoService]

# 3. 验证 Dubbo Admin
curl http://192.168.44.111:30066/dubboadmin
# 或在浏览器打开

# 4. 查看 Provider 日志
kubectl logs -n myserver $(kubectl get pod -n myserver -l app=myserver-provider -o jsonpath='{.items[0].metadata.name}')

# 5. 查看 Consumer 日志
kubectl logs -n myserver $(kubectl get pod -n myserver -l app=myserver-consumer -o jsonpath='{.items[0].metadata.name}')

六、最终成功状态

|-------------|-----------|---------------------------------------------------------------------------------------------------------------------------|
| 组件 | 状态 | 访问方式 |
| ZooKeeper | ✅ Running | zookeeper:2181 |
| Provider | ✅ Running | 已注册到 ZooKeeper |
| Consumer | ✅ Running | 可调用 Provider |
| Dubbo Admin | ✅ Running | http://192.168.44.111:30066/dubboadmin |

七、关键经验总结

  1. 地址配置 :始终使用 kubectl get svc 确认实际存在的 Service 名称
  2. 日志排查kubectl logscatalina.out 是定位问题的关键
  3. 配置持久化:Pod 内的修改不持久,必须重新构建镜像
  4. 端口映射:注意区分 containerPort、targetPort、nodePort
  5. DNS 解析 :K8s 内部使用 service.namespace.svc.cluster.local 格式

八、访问信息

复制代码
Dubbo Admin 登录页面:http://192.168.44.111:30066/dubboadmin
用户名:root
密码:root

注册服务:com.alibaba.dubbo.demo.DemoService
Provider 端口:20880
Consumer 调用:sayHello 方法

部署完成! 🎉

相关推荐
军军君012 小时前
数字孪生监控大屏实战模板:商圈大数据监控
前端·javascript·vue.js·typescript·前端框架·echarts·three
Devin~Y2 小时前
互联网大厂Java面试:Spring Boot/Redis/Kafka/K8s 可观测 + RAG(向量检索/Agent)三轮追问实录
java·spring boot·redis·kafka·kubernetes·spring mvc·webflux
方安乐2 小时前
try catch vs 异步捕获
前端·javascript·vue.js
chenbin___2 小时前
鸿蒙RN position: ‘absolute‘ 和 zIndex 的兼容性问题(转自千问)
前端·javascript·react native·harmonyos
晴天丨2 小时前
Vue 3项目架构设计:从2200行单文件到24个组件
前端·vue.js
blanks20202 小时前
为 Zed 编辑器 添加 flutter dart snippets
前端·flutter
慧一居士2 小时前
Vue中的 h 作用和使用方法介绍
前端·vue.js
晴天丨2 小时前
Element Plus 组件库实战技巧与踩坑记录
前端·vue.js
胡志辉2 小时前
m3u8 视频怎么下载?为什么 B 站只给你一个 blob:把 HLS、DASH、MSE 这条前端链路讲透
前端