本项目演示如何使用 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 服务
访问服务消费方地址: http://localhost:9103/hello
返回
你好 云天
或者你也可以通过 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 示例源码
来源: https://www.cnblogs.com/tqlin/p/11941949.html