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 方法

部署完成! 🎉

相关推荐
openKaka_12 分钟前
createRoot 到底创建了什么:FiberRootNode 和 HostRootFiber 的初始化过程
前端·javascript·react.js
习明然1 小时前
UniApp开发体验感受总结
前端·uni-app
刀法如飞2 小时前
Claude Code Skills 推荐:2026年最值得安装的10个AI技能
前端·后端·ai编程
Lee川2 小时前
面试手写 KeepAlive:React 组件缓存的实现原理
前端·react.js·面试
墨染天姬2 小时前
【AI】cursor提示词小技巧
前端·数据库·人工智能
烛阴2 小时前
TEngine 入门系列(一):TEngine 是什么 & 为什么选它
前端·unity3d
转转技术团队3 小时前
WebNN:让 AI 推理在浏览器中“零距离”运行
前端
刀法如飞3 小时前
TypeScript 数组去重的 20 种实现方式,哪一种你还不知道?
前端·javascript·算法
IT_陈寒3 小时前
Vite热更新失效?你可能漏了这个小细节
前端·人工智能·后端
海石3 小时前
面试官:说一下你现在使用的 AI IDE,什么,JoyCode 是什么?
前端·ai编程