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 logs 和 catalina.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 方法

部署完成! 🎉

相关推荐
FungLeo5 小时前
成为全栈·React 管理后台篇·总复盘:从“接口能调通”到“后台值得使用”
前端·react.js·前端框架·项目复盘·成为全栈
Csvn7 小时前
并发模式:让渲染学会排队、插队和让路
前端
可乐鸡翅yeah_7 小时前
新手梳理:M3U8 线上问题,哪些是前端锅,哪些是后端锅
前端·ios·音视频·实时音视频·m3u8·音视频在线播放
Flynt7 小时前
Linear 用 1000 个 PR 换掉 styled-components,我写了 200 个按钮,把这笔账复现了一遍
前端·css·preact
JavaGuide8 小时前
NVIDIA 又开源了!这次给 AI Agent 加上权限管控
前端·后端
excel8 小时前
prisma 如何处理数据库竞态
前端·数据库·后端
莪_幻尘9 小时前
Skill 体检:30 个 Skill 全凭感觉?体检器先自曝了 8 个“假 0 分
前端·人工智能·llm
风骏时光牛马9 小时前
AI模型综合能力评测:性能、指令遵循与多场景实测对比
前端
Frag0ut9 小时前
Chrome与Chromium内核浏览器在Windows 11上的新特性全景解析
前端·chrome·windows·web安全·chromium·gemini ai·playready drm
hiahiahia12310 小时前
实现完整 Tool Dispatcher
开发语言·前端