本项目演示如何使用 Spring Cloud Alibaba 完成 Dubbo 的RPC调用。

Spring Cloud与Dubbo

  • Spring Cloud是一套完整的微服务架构方案

  • Dubbo是国内目前非常流行的服务治理与RPC实现方案

由于Dubbo在国内有着非常大的用户群体,但是其周边设施与组件相对来说并不那么完善(比如feign,ribbon等等)。很多开发者使用Dubbo,又希望享受Spring Cloud的生态,因此也会有一些Spring Cloud与Dubbo一起使用的案例与方法出现。

Spring Cloud Alibaba的出现,实现了Spring Cloud与Dubbo的完美融合。在之前的教程中,我们已经介绍过使用Spring Cloud Alibaba中的Nacos来作为服务注册中心,并且在此之下可以如传统的Spring Cloud应用一样地使用Ribbon或Feign来实现服务消费。这篇,我们就来继续说说Spring Cloud Alibaba 下额外支持的RPC方案:Dubbo

代码实现

我们通过一个简单的例子,使用Nacos做服务注册中心,利用Dubbo来实现服务提供方与服务消费方。这里省略Nacos的安装与使用,下面就直接进入Dubbo的使用步骤。

定义 Dubbo 服务接口

创建 ali-nacos-dubbo-api 工程

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

public interface HelloService {
String hello(String name);
}

为了确保契约的一致性,推荐的做法是将 Dubbo 服务接口打包在jar包中,如以上接口就存放在 ali-nacos-dubbo-api 之中。 对于服务提供方而言,不仅通过依赖 artifact 的形式引入 Dubbo 服务接口,而且需要将其实现。对应的服务消费端,同样地需要依赖该 artifact, 并以接口调用的方式执行远程方法。接下来进一步讨论怎样实现 Dubbo 服务提供方和消费方。

实现 Dubbo 服务提供方

创建 ali-nacos-dubbo-provider,端口:9001 工程

pom.xml配置

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>cloud-alibaba</artifactId>
<groupId>com.easy</groupId>
<version>1.0.0</version>
</parent> <modelVersion>4.0.0</modelVersion> <artifactId>ali-nacos-dubbo-provider</artifactId> <dependencies> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-actuator</artifactId>
</dependency> <!-- API -->
<dependency>
<groupId>com.easy</groupId>
<artifactId>ali-nacos-dubbo-api</artifactId>
<version>${project.version}</version>
</dependency> <!--dubbo-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-dubbo</artifactId>
</dependency> <!--nacos-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
</dependencies> <build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build> </project>

bootstrap.yaml配置

dubbo:
scan:
# dubbo 服务扫描基准包
base-packages: com.easy.andProvider.service #Dubbo 服务暴露的协议配置,其中子属性 name 为协议名称,port 为协议端口( -1 表示自增端口,从 20880 开始)
protocol:
name: dubbo
port: -1 #Dubbo 服务注册中心配置,其中子属性 address 的值 “spring-cloud://localhost”,说明挂载到 Spring Cloud 注册中心
registry:
address: spring-cloud://localhost spring:
application:
# Dubbo 应用名称
name: ali-nacos-dubbo-provider
main:
allow-bean-definition-overriding: true
cloud:
# Nacos 服务发现与注册配置
nacos:
discovery:
server-addr: 127.0.0.1:8848

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

实现 Dubbo 服务

HelloService 作为暴露的 Dubbo 服务接口,服务提供方 ali-nacos-dubbo-provider 需要将其实现:

package com.easy.andProvider.service;

import com.easy.and.api.service.HelloService;
import org.apache.dubbo.config.annotation.Service; @Service
public class HelloServiceImpl implements HelloService {
@Override
public String hello(String name) {
return "你好 " + name;
}
}

import org.apache.dubbo.config.annotation.Service 是 Dubbo 服务注解,仅声明该 Java 服务实现为 Dubbo 服务

贴上启动类代码:

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

实现 Dubbo 服务消费方

创建 ali-nacos-dubbo-consumer,端口:9103 工程

pom.xml依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>cloud-alibaba</artifactId>
<groupId>com.easy</groupId>
<version>1.0.0</version>
</parent> <modelVersion>4.0.0</modelVersion> <artifactId>ali-nacos-dubbo-consumer</artifactId> <dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-actuator</artifactId>
</dependency> <dependency>
<groupId>com.easy</groupId>
<artifactId>ali-nacos-dubbo-api</artifactId>
<version>${project.version}</version>
</dependency> <dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-dubbo</artifactId>
</dependency> <dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
</dependencies> <build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

yaml配置文件

dubbo:
registry:
address: spring-cloud://localhost
cloud:
subscribed-services: ali-nacos-dubbo-provider spring:
application:
name: ali-nacos-dubbo-consumer
main:
allow-bean-definition-overriding: true
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848

实现 Dubbo 服务消费方

HomeController.java

package com.easy.andConsumer;

import com.easy.and.api.service.HelloService;
import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController; @RestController
@Slf4j
public class HomeController { @Reference
HelloService helloService; @GetMapping("/hello")
public String hello(String name) {
return helloService.hello("云天");
}
}

AndConsumerApplication.java启动类

package com.easy.andConsumer;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient; @EnableDiscoveryClient
@SpringBootApplication
public class AndConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(AndConsumerApplication.class, args);
}
}

使用示例

示例关联项目

本示例我们创建了三个项目实现

  • ali-nacos-dubbo-api:定义Dubbo服务接口工程

  • ali-nacos-dubbo-provider:Dubbo服务提供方并向nacos注册服务,服务名:ali-nacos-dubbo-provider,端口:9001

  • ali-nacos-dubbo-consumer:Dubbo服务消费方并向nacos注册服务,服务名:ali-nacos-dubbo-consumer,端口:9103

运行示例测试

首先要启动服务注册中心 nacos、ali-nacos-dubbo-provider服务及ali-nacos-dubbo-consumer服务

返回

你好 云天

或者你也可以通过 curl 命令执行 HTTP GET 方法

$curl http://127.0.0.1:9103/hello

HTTP 响应为:

你好 云天

以上结果说明应用 ali-nacos-dubbo-consumer 通过消费 Dubbo 服务,返回服务提供方 ali-nacos-dubbo-provider 运算后的内容。

以上我们完成了 Dubbo 服务提供方和消费方的入门运用,源代码请直接参考模块:

资料

Spring Cloud Alibaba(四)实现Dubbo服务消费的更多相关文章

  1. Spring Cloud Alibaba 使用RestTemplate进行服务消费

    创建服务提供者工程 创建spring-cloud-alibaba-service-member工程,会员中心服务该服务提供用户会员信息. pom.xml <?xml version=" ...

  2. Spring Cloud Alibaba 使用Feign进行服务消费

    为什么使用Feign? Feign可以把Rest的请求进行隐藏,伪装成类似SpringMVC的Controller一样.你不用再自己拼接url,拼接参数等等操作,一切都交给Feign去做. 使用Fei ...

  3. Spring Cloud(四):服务容错保护 Hystrix【Finchley 版】

    Spring Cloud(四):服务容错保护 Hystrix[Finchley 版]  发表于 2018-04-15 |  更新于 2018-05-07 |  分布式系统中经常会出现某个基础服务不可用 ...

  4. Spring Cloud Alibaba+Nacos搭建微服务架构

    1. Spring Cloud Alibaba 简介    Spring Cloud Alibaba是阿里巴巴为分布式应用提供的一站式解决方案,能够更方便快捷地搭建分布式平台,nacos拥有着替换eu ...

  5. Spring Cloud Alibaba系列之分布式服务组件Dubbo

    本博客的例子代码可以在github找到下载链接:代码下载 SpringBoot.SpringCloud Alibaba系列博客专栏:链接 1.分布式理论 1.1.分布式基本定义 <分布式系统原理 ...

  6. 阿里巴巴开源 Spring Cloud Alibaba,加码微服务生态建设

    本周,Spring Cloud联合创始人Spencer Gibb在Spring官网的博客页面宣布:阿里巴巴开源 Spring Cloud Alibaba,并发布了首个预览版本.随后,Spring Cl ...

  7. Spring Cloud Alibaba 实战 之 Nacos 服务注册和发现

    服务注册与发现,服务发现主要用于实现各个微服务实例的自动化注册与发现,是微服务治理的核心,学习 Spring Cloud Alibaba,首先要了解框架中的服务注册和发现组件——Nacos. 一.Sp ...

  8. Spring Cloud Alibaba(2)---RestTemplate微服务项目

    RestTemplate微服务项目 前言 因为要运用 Spring Cloud Alibaba 开源组件到分布式项目中,所以这里先搭建一个不通过 Spring Cloud只通过 RestTemplat ...

  9. Spring Cloud Alibaba 整合 Nacos 实现服务配置中心

    在之前的文章 <Nacos 本地单机版部署步骤和使用> 中,大家应该了解了 Nacos 是什么?其中 Nacos 提供了动态配置服务功能 一.Nacos 动态配置服务是什么? 官方是这么说 ...

  10. 一起来学Spring Cloud | 第四章:服务消费者 ( Feign )

    上一章节,讲解了SpringCloud如何通过RestTemplate+Ribbon去负载均衡消费服务,本章主要讲述如何通过Feign去消费服务. 一.Feign 简介: Feign是一个便利的res ...

随机推荐

  1. Ubuntu18.04 安装谷歌BBR

    说明:Ubuntu 18.04前几天发布了,改变挺大的,内核也直接升到了正式版4.15,而BBR内核要求为4.9,也就是说满足了,所以我们不需要换内核就可以很快的开启BBR,这里简单说下方法. 提示: ...

  2. QQ聊天记录分析

    今天我们用R语言来处理一下.我们会用到一下技术:. (1)正则表达式 (2)词频统计 (3)文本可视化 (4)ggplot2绘图 (5)中文分词 一.数据处理 首先我们要讲QQ聊天记录导出成txt文件 ...

  3. Window 同时安装Python2和Python3 终极版

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/vitaminc4/article/det ...

  4. TensorFlow Object Detection API中的Faster R-CNN /SSD模型参数调整

    关于TensorFlow Object Detection API配置,可以参考之前的文章https://becominghuman.ai/tensorflow-object-detection-ap ...

  5. UVA12433 【Rent a Car】

    这题应该算是比较难的一道网络流的题,(但却在我校OJ考试上出现了),但是大家只要能理解此图的建边方式就行. 假设有5天的租车需求,虚拟出2*n+2 即 12个节点,0为源点,12为汇点. 1,源点到1 ...

  6. CSPS模拟 81

    Z哥的题,真是见题如见人啊.. T1 实际状态数没有那么多,不要被数字吓倒就是了. 另外为什么吧轮廓线给忘了啊 T3 觉得自己是正解但是被hack了? 考试的时候想到了复杂度对的的解法,但是 spfa ...

  7. NOIP模拟 6

    考试时看了看T1,觉得是结论题,推了推没有成果,跑去看第二题, 题意很明确,求过定点的最小环,还没思考解题策略,然后觉得是水题 打了个tarjan找边双(据说会炸但是平均表现良好),在边双里暴力拆边找 ...

  8. UWP 带左右滚动按钮的横向ListView———仿NetFlix首页河的设计

    也是之前写的控件了,模仿NetFlix的河的设计. 大体要求如下: 1. 横向的ListView 2. 左右按钮,可以左右移动河卡片,左右的滚动条不可见 3. 左右按钮仅在鼠标Hover事件中可见 大 ...

  9. 微信小程序如何解析html内容

    最近项目上遇到在微信小程序里需要显示新闻内容,新闻内容是通过接口读取的服务器中的富文本内容,是html格式的,小程序默认是不支持html格式的内容显示的,那我们需要显示html内容的时候,就可以通过w ...

  10. 从壹开始 [ Ids4实战 ] 之五 ║ 多项目集成统一认证中心的思考

    前言 哈喽大家好,好久都没有写文章了,这次又重新开始写技术文章了,半年前我还是一直保持每周都写文章的,后来是为了响应群友的号召,开始踏上了录制视频(https://www.bilibili.com/v ...