Dubbo SpringBoot应用创建和K8S部署

推荐阅读:Dubbo 快速入门-CSDN博客

创建基于Spring Boot的微服务应用

以下文档将引导您从头创建一个基于 Spring Boot 的 Dubbo 应用,并为应用配置 Triple 通信协议、服务发现等微服务基础能力。

快速创建应用

以下是我们为您提前准备好的示例项目,可通过如下命令快速下载示例源码。在实际开发中,您也可以访问 start.dubbo.apache.org 快速创建一个全新的 Dubbo 应用模板。

curl -O -# https://dubbo-demo.oss-cn-hangzhou.aliyuncs.com/quickstart/dubbo-quickstart.zip
unzip dubbo-quickstart
cd dubbo-quickstart
提示

本项目源码在 Dubbo Github 示例仓库中维护 https://github.com/apache/dubbo-samples

本地启动应用

接下来,让我们尝试在本地启动应用。运行以下命令启动应用:

chmod a+x ./mvnw
./mvnw clean install -DskipTests
./mvnw compile -pl quickstart-service exec:java -Dexec.mainClass="org.apache.dubbo.samples.quickstart.QuickStartApplication"
注意
  • 运行示例要求 JDK 17+ 版本。
  • 由于配置文件中启用了注册中心,您需要首先在本地启动 Nacos 注册中心 server。或者参考下一篇 Kubernetes 部署方式。

在应用启动成功后,本地进程使用 Triple 协议在指定端口发布了服务。同时可以看到消费端持续对提供端发起调用调用:

Started QuickStartApplication in 4.38 seconds (process running for 4.629)
Receive result ======> Hello world

可直接使用 cURL 测试服务是否已经正常运行:

curl \
    --header "Content-Type: application/json" \
    --data '["Dubbo"]' \
    http://localhost:50051/org.apache.dubbo.samples.quickstart.dubbo.api.DemoService/sayHello/

除了使用命令行之外,我们还可以在 IDE 中启动项目,调整示例或进行本地 debug。

源码解析

将以上准备好的示例项目导入最喜欢的 IDE 开发工具(以 IntelliJ IDEA 为例),项目结构如下:

Maven 依赖

打开 pom.xml,可以看到示例项目中 Dubbo 相关核心依赖如下:

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.apache.dubbo</groupId>
                <artifactId>dubbo-bom</artifactId>
                <version>3.3.0</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-nacos-spring-boot-starter</artifactId>
        </dependency>
    </dependencies>

其中,dubbo-spring-boot-starterdubbo-nacos-spring-boot-starter 分别为我们引入了 Dubbo 内核框架与 Nacos 客户端相关的依赖组件,更多内容可以查看 Dubbo 支持的 Spring Boot Starter 清单 。

服务定义

以下是基于 Java Interface 的标准 Dubbo 服务定义。

public interface DemoService {
    String sayHello(String name);
}

在 DemoService 中,定义了 sayHello 这个方法。后续服务端发布的服务,消费端订阅的服务都是围绕着 DemoService 接口展开的。

服务实现

定义了服务接口之后,可以在服务端这一侧定义对应的业务逻辑实现。

@DubboService
public class DemoServiceImpl implements DemoService {
    @Override
    public String sayHello(String name) {
        return "Hello " + name;
    }
}

DemoServiceImpl 类中添加了 @DubboService 注解,通过这个配置可以基于 Spring Boot 去发布 Dubbo 服务。

发起服务调用

示例应用中有一个 consumer 包,用于模拟发起对 provider 服务的远程调用。

@Component
public class Consumer implements CommandLineRunner {
    @DubboReference
    private DemoService demoService;

    @Override
    public void run(String... args) throws Exception {
        String result = demoService.sayHello("world");
        System.out.println("Receive result ======> " + result);
    }
}

在 Task 类中,通过@DubboReference 从 Dubbo 获取了一个 RPC 订阅代理,这个 demoService 代理可以像本地调用一样直接调用: demoService.sayHello("world")

提示

通常远程调用是跨进程的,示例项目为了方便开发,直接内置了一个 @DubboReference 调用。如果您想学习如何开发一个独立的 Consumer(客户端)进程,以便发起对 Dubbo 服务的远程调用,我们有一个 包含独立 consumer、provider 模块的示例项目 可供参考。

应用入口与配置文件

由于我们创建的是一个 Spring Boot 应用,Dubbo 相关配置信息都存放在 application.yml 配置文件中。基于以下配置,Dubbo 进程将在 50051 端口监听 triple 协议请求,同时,实例的 ip:port 信息将会被注册到 Nacos server。

# application.yml
dubbo:
  registry:
    address: nacos://${nacos.address:127.0.0.1}:8848?username=nacos&password=nacos
	# This will enable application-level service discovery only (the recommended service discovery method for Dubbo3).
	# For users upgrading from Dubbo2.x, please set the value to 'all' for smooth migration.
    register-mode: instance
  protocol:
    name: tri
    port: 50051
  application:
    name: QuickStartApplication
    logger: slf4j

以下是整个应用的启动入口,@EnableDubbo 注解用来加载和启动 Dubbo 相关组件。

@SpringBootApplication
@EnableDubbo
public class QuickStartApplication {
    public static void main(String[] args) {
        SpringApplication.run(QuickStartApplication.class, args);
    }
}

发布服务定义到远端仓库

应用开发完成后,我们需要将服务定义(在此示例中是 DemoService 接口定义)发布到外部公开的或组织内部的 maven 仓库,以便调用这些服务的应用能够加载并使用这些服务定义。

如之前我们看到的,示例项目包含 api、service 两个模块,切换项目到 api 目录,以下命令即可完成发布动作:mvn clean deploy

快速部署Dubbo应用

在上面,我们学习了如何开发基于 Spring Boot 的 Dubbo 应用。接下来,我们将学习部署这个 Dubbo 应用。

本文将以 Kubernetes 集群作为基础环境来讲解 Dubbo 应用的部署,部署架构如下图所示:

注意

在实际使用中可能会选择不同的部署环境与架构,如使用服务网格(Service Mesh)、虚拟机等多种部署模式,请参考 部署文档 了解更多详细内容。

部署应用

我们为您提前准备好了示例项目的镜像与部署文件,您可以使用如下命令将示例快速部署到 Kubernetes 集群(请确保在示例源码根目录执行如下命令):

kubectl apply -f ./Kubernetes-manifests.yaml

以上命令将自动部署如下资源:

  • dubbo-system 命名空间
    • Nacos Deployment
    • Nacos Service
  • dubbo-quickstart 命名空间
    • Quickstart Deployment
    • Quickstart Service

运行以下命令,确认资源已经部署成功:

kubectl get services -n dubbo-system
kubectl get services -n dubbo-quickstart

访问应用

部署成功后,可以通过以下方式检查应用状态。

  • 请根据情况选择:
  • 本地 Kubernetes 集群
  • 阿里云 ACK 集群

执行以下命令进行本地端口映射:

kubectl port-forward <pod-name> 50051:50051 -n dubbo-quickstart

通过 curl 访问服务:

curl \
	--header "Content-Type: application/json" \
	--data '["Dubbo"]' \
	http://localhost:50051/org.apache.dubbo.samples.quickstart.dubbo.api.DemoService/sayHello/

附录

如果你有修改示例源码并需要重新打包 docker 镜像,请在示例根目录运行如下命令,随后将镜像推送到远端镜像仓库并修改 kubernetes-manifests.yaml 中的镜像地址后重新部署。

docker build -f ./Dockerfile --build-arg APP_FILE=quickstart-service-0.0.1-SNAPSHOT.jar -t demo:latest .

本示例 Kubernetes 部署资源文件也可在 Github 访问:https://raw.githubusercontent.com/apache/dubbo-samples/master/11-quickstart/Kubernetes-manifests.yaml

# Namespace
apiVersion: v1
kind: Namespace
metadata:
  name: dubbo-quickstart
---
apiVersion: v1
kind: Namespace
metadata:
  name: dubbo-system
---

# Nacos
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nacos
  namespace: dubbo-system
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nacos
  template:
    metadata:
      labels:
        app: nacos
    spec:
      containers:
        - name: consumer
          image: nacos-registry.cn-hangzhou.cr.aliyuncs.com/nacos/nacos-server:v2.1.2
          imagePullPolicy: Always
          resources:
            requests:
              memory: "2Gi"
              cpu: "500m"
          ports:
            - containerPort: 8848
              name: client
            - containerPort: 9848
              name: client-rpc
          env:
            - name: NACOS_SERVER_PORT
              value: "8848"
            - name: NACOS_APPLICATION_PORT
              value: "8848"
            - name: PREFER_HOST_MODE
              value: "hostname"
            - name: MODE
              value: "standalone"
            - name: NACOS_AUTH_ENABLE
              value: "true"
---
apiVersion: v1
kind: Service
metadata:
  name: nacos
  namespace: dubbo-system
spec:
  type: ClusterIP
  sessionAffinity: None
  selector:
    app: nacos
  ports:
    - port: 8848
      name: server
      targetPort: 8848
    - port: 9848
      name: client-rpc
      targetPort: 9848
---

apiVersion: apps/v1
kind: Deployment
metadata:
  name: quickstart
  namespace: dubbo-quickstart
spec:
  replicas: 1
  selector:
    matchLabels:
      app: quickstart
  template:
    metadata:
      labels:
        app: quickstart
    spec:
      containers:
        - name: quickstart
          image: sca-registry.cn-hangzhou.cr.aliyuncs.com/dubbo/dubbo-quickstart:1.0
          imagePullPolicy: Always
          ports:
            - name: dubbo
              containerPort: 50051
              protocol: TCP
            - name: dubbo-qos
              containerPort: 22222
              protocol: TCP
          env:
            - name: JAVA_TOOL_OPTIONS
              value: "-Dnacos.address=nacos.dubbo-system.svc"
---

apiVersion: v1
kind: Service
metadata:
  name: quickstart
  namespace: dubbo-quickstart
spec:
  selector:
    app: quickstart
  ports:
    - name: tcp
      port: 50051
      targetPort: 50051
    - name: http
      port: 22222
      targetPort: 22222
---

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值