Spring Cloud Alibaba,分布式服务调用(四)(下)

简介: Spring Cloud Alibaba,分布式服务调用(四)

5.2.2 定义 Dubbo 服务接口

Dubbo 服务接口是服务提供方与消费方的远程通讯契约,通常由普通的 Java 接口(interface)来声明,如EchoService接口:

package com.alibaba.cloud;
public interface EchoService {
    String echo(String message);
}

该接口非常简单,仅有一个方法,接下来将 dubbo-sample-api 部署到本地 Maven 仓库。

5.2.3 部署 artifact - dubbo-sample-api

利用 Maven 命令, 将 dubbo-sample-api 部署到本地 Maven 仓库:

% mvn clean install
...
[INFO] BUILD SUCCESS

注:如果读者所使用机器的 JDK 版本过高的话,可能会出现错误提示:“不再支持源选项 5。请使用 7 或更高版本”。本例推荐选择 JDK 8 编译。

本地部署成功后,该 artifact 能被 Dubbo 服务提供者应用 dubbo-provider-sample 依赖。

5.2.4 依赖 artifact - dubbo-sample-api

将 artifact dubbo-sample-api 依赖信息添加到应用 dubbo-provider-sample 中的 pom.xml:

        <!-- Dubbo 服务 artifact -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>dubbo-sample-api</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>

依赖增加之后,下一步实现 Dubbo 服务 -EchoService?

5.2.5 实现 Dubbo 服务

在 应用 dubbo-provider-sample 中的 com.alibaba.cloud.dubboprovidersample 包下创建实现类:

public class SimpleEchoService implements EchoService {
    @Override
    public String echo(String s) {
        return "[ECHO] " + s;
    }
}

其中,@org.apache.dubbo.config.annotation.Service?是 Dubbo 服务注解,仅声明该 Java 服务(本地)实现为 Dubbo 服务。因此,下一步需要将其配置 Dubbo 服务(远程)。

5.2.6 配置 Dubbo 服务提供方

在暴露 Dubbo 服务方面,推荐开发人员外部化配置的方式,即指定 Java 服务实现类的扫描基准包。

Dubbo Spring Cloud 继承了 Dubbo Spring Boot 的外部化配置特性,也可以通过标注@DubboComponentScan来实现基准包扫描。

同时,Dubbo 远程服务需要暴露网络端口,并设定通讯协议,完整的 bootstrap.yaml 配置如下所示:

dubbo:
  scan:
    # dubbo 服务扫描基准包
    base-packages: org.springframework.cloud.alibaba.dubbo.bootstrap
  protocol:
    # dubbo 协议
    name: dubbo
    # dubbo 协议端口( -1 表示自增端口,从 20880 开始)
    port: -1
spring:
  cloud:
    nacos:
      # Nacos 服务发现与注册配置
      discovery:
        server-addr: 127.0.0.1:8848

以上 YAML 内容,上半部分为 Dubbo 的配置:

-dubbo.scan.base-packages: 指定 Dubbo 服务实现类的扫描基准包

-dubbo.protocol: Dubbo 服务暴露的协议配置,其中子属性name为协议名称,port为协议端口( -1 表示自增端口,从 20880 开始)

下半部分则是 Spring Cloud 相关配置:

-spring.application.name: Spring 应用名称,用于 Spring Cloud 服务注册和发现。

该值在 Dubbo Spring Cloud 加持下被视作dubbo.application.name,因此,无需再显示地配置dubbo.application.name

-spring.cloud.nacos.discovery: Nacos 服务发现与注册配置,其中子属性 server-addr 指定 Nacos 服务器主机和端口

完成以上步骤后,还需编写一个 Dubbo Spring Cloud 引导类。

5.2.7 引导 Dubbo Spring Cloud 服务提供方应用

Dubbo Spring Cloud 引导类与普通 Spring Cloud 应用并无差别,如下所示:

@EnableDiscoveryClient
@SpringBootApplication
public class DubboProviderSampleApplication {
    public static void main(String[] args) {
        SpringApplication.run(DubboProviderSampleApplication.class);
    }
}

在引导DubboProviderSampleApplication? 之前,请提前启动 Nacos 服务器。当DubboProviderSampleApplication? 启动后,将应用dubbo-provider-sample将出现在 Nacos 控制台界面:

image.png当 Dubbo 服务提供方启动后,下一步实现一个 Dubbo 服务消费方。

5.3 使用 Dubbo Spring Cloud 实现 Dubbo 服务消费方

由于 Java 服务仅为?EchoService、服务提供方应用 dubbo-provider-sample?以及 Nacos 服务器均已准备完毕。由于应用创建的步骤类似,构建消费方应用 dubbo-consumer-sample 的操作不再重复。

5.3.1 依赖 artifact - dubbo-sample-api

与服务提供方 Maven 工程类,需添加 artifact dubbo-sample-api 依赖,完整的组件 Maven 依赖:

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-dubbo</artifactId>
        </dependency>
        <!-- Dubbo 服务 artifact -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>dubbo-sample-api</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>

5.3.2 配置 Dubbo 服务消费方

Dubbo 服务消费方配置与服务提供方类似,当前应用 dubbo-consumer-sample 属于纯服务消费方,因此,所需的 boostrap.yaml 文件配置更精简:

dubbo:
  cloud:
    subscribed-services: dubbo-provider-sample
spring:
  cloud:
    nacos:
      # Nacos 服务发现与注册配置
      discovery:
        server-addr: 127.0.0.1:8848

对比应用 dubbo-provider-sample,除应用名称?spring.application.name?存在差异外,dubbo-consumer-sample 新增了属性?dubbo.cloud.subscribed-services?的设置。并且该值为服务提供方应用 “dubbo-provider-sample”。

dubbo.cloud.subscribed-services?: 用于服务消费方订阅服务提供方的应用名称的列表,若需订阅多应用,使用 “,” 分割。不推荐使用默认值为 “*“,它将订阅所有应用。

当应用使用属性dubbo.cloud.subscribed-services默认值时,日志中将会输出一行警告:

Current application will subscribe all services(size:x) in registry, a lot of memory and CPU cycles may be used, thus it’s strongly recommend you using the externalized property ‘dubbo.cloud.subscribed-services’ to specify the services

由于当前应用属于 Web 应用,它会默认地使用 8080 作为 Web 服务端口,如果 dubbo-provider-sample 和 dubbo-consumer-sample 在本地同步部署的话, 两者 Web 端口会出现冲突,需调整 dubbo-consumer-sample application.properties 中的?server.port?和management.server.port??:

# 应用服务 WEB 访问端口
server.port=9090
# Actuator Web 访问端口
management.server.port=9091

5.3.3 引导 Dubbo Spring Cloud 服务消费方应用

为了减少实现步骤,编辑引导类DubboConsumerSampleApplication?将 Dubbo 服务消费以及引导功能合二为一:

@EnableDiscoveryClient
@EnableAutoConfiguration
@RestController
public class DubboConsumerSampleApplication {
    @Reference
    private EchoService echoService;
    @GetMapping("/echo")
    public String echo(String message) {
        return echoService.echo(message);
    }
    public static void main(String[] args) {
        SpringApplication.run(DubboConsumerSampleApplication.class);
    }
}

运行该引导类,通过curl?命令访问 REST 资源/echo?:

% curl "http://127.0.0.1:9090/echo?message=Hello,World"
[ECHO] Hello,World

不难发现,Dubbo 服务提供方应用 dubbo-provider-sample 的EchoService?计算结果返回到 dubbo-consumer-sample 中的 REST 资源/echo。同时,在 dubbo-provider-sample 应用日志出现了以下内容:

[DUBBO] The connection of /x.x.x.x:64051 -> /x.x.x.x:20881 is established., dubbo version: 2.7.6, current host: x.x.x.x

说明 Dubbo 服务消费端应用 dubbo-consumer-sample(端口:64051) 向服务提供方应用 dubbo-provider-sample 建立连接(端口:20881)。

目录
相关文章
|
7月前
|
人工智能 Java Nacos
基于 Spring AI Alibaba + Nacos 的分布式 Multi-Agent 构建指南
本文将针对 Spring AI Alibaba + Nacos 的分布式多智能体构建方案展开介绍,同时结合 Demo 说明快速开发方法与实际效果。
4958 94
|
7月前
|
人工智能 运维 Java
Spring AI Alibaba Admin 开源!以数据为中心的 Agent 开发平台
Spring AI Alibaba Admin 正式发布!一站式实现 Prompt 管理、动态热更新、评测集构建、自动化评估与全链路可观测,助力企业高效构建可信赖的 AI Agent 应用。开源共建,现已上线!
7489 109
|
9月前
|
监控 Java API
Spring Boot 3.2 结合 Spring Cloud 微服务架构实操指南 现代分布式应用系统构建实战教程
Spring Boot 3.2 + Spring Cloud 2023.0 微服务架构实践摘要 本文基于Spring Boot 3.2.5和Spring Cloud 2023.0.1最新稳定版本,演示现代微服务架构的构建过程。主要内容包括: 技术栈选择:采用Spring Cloud Netflix Eureka 4.1.0作为服务注册中心,Resilience4j 2.1.0替代Hystrix实现熔断机制,配合OpenFeign和Gateway等组件。 核心实操步骤: 搭建Eureka注册中心服务 构建商品
1332 3
|
8月前
|
人工智能 Java 机器人
基于Spring AI Alibaba + Spring Boot + Ollama搭建本地AI对话机器人API
Spring AI Alibaba集成Ollama,基于Java构建本地大模型应用,支持流式对话、knife4j接口可视化,实现高隐私、免API密钥的离线AI服务。
6713 2
基于Spring AI Alibaba + Spring Boot + Ollama搭建本地AI对话机器人API
|
7月前
|
负载均衡 Java API
《深入理解Spring》Spring Cloud 构建分布式系统的微服务全家桶
Spring Cloud为微服务架构提供一站式解决方案,涵盖服务注册、配置管理、负载均衡、熔断限流等核心功能,助力开发者构建高可用、易扩展的分布式系统,并持续向云原生演进。
|
7月前
|
人工智能 监控 Java
Spring AI Alibaba实践|后台定时Agent
基于Spring AI Alibaba框架,可构建自主运行的AI Agent,突破传统Chat模式限制,支持定时任务、事件响应与人工协同,实现数据采集、分析到决策的自动化闭环,提升企业智能化效率。
Spring AI Alibaba实践|后台定时Agent
|
9月前
|
人工智能 Java 开发者
邀您参与 “直通乌镇” Spring AI Alibaba 开源竞技挑战赛!
邀您参与 “直通乌镇” Spring AI Alibaba 开源竞技挑战赛!
|
10月前
|
人工智能 数据可视化 Java
性能提升 10 倍, DIFY 模式迁移至 Spring AI Alibaba 模式 零改造实现
将 Dify 应用迁移至 Spring AI Alibaba,可兼顾可视化开发效率与代码工程灵活性,显著提升系统性能与扩展能力,适用于复杂 AI 业务场景。
1324 0