7.Spring Cloud Alibaba教程:整合Dubbo实现RPC调用

概述

Apache Dubbo 是一款高性能的、基于Java的开源RPC框架,它提供了以下特性:

  • 基于接口的远程方法调用
  • 智能负载均衡
  • 服务自动注册和发现
  • 高可扩展性
  • 运行期流量调度
  • 可视化的服务治理

架构

在这里插入图片描述
(0)provider基于dubbo容器启动

(1)provider注册到注册中心(Nacos)

(2)consumer订阅注册中心的服务变化

(3)注册中心将服务变化结果异步地通知给consumer

(4)consumer直接调用provider接口

(5)monitor监控流量请求数据

Spring Cloud Alibaba 整合 Dubbo

创建主工程

创建一个空的工程,pom配置如下:

<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.13.RELEASE</version>
    </parent>

    <groupId>com.train</groupId>
    <artifactId>alibaba-dubbo</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <project.version>1.0-SNAPSHOT</project.version>
        <spring-cloud.version>Greenwich.SR6</spring-cloud.version>
        <spring-cloud-alibaba.version>2.1.3.RELEASE</spring-cloud-alibaba.version>
    </properties>

    <modules>
        <module>hello-dubbo-provider</module>
        <module>hello-dubbo-consumer</module>
    </modules>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${spring-cloud-alibaba.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <!-- Spring Boot -->
        <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>

        <!-- 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>
</project>

创建provider子工程:hello-dubbo-provider

在alibaba-dubbo工程下,创建子工程,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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>

	<parent>
	    <groupId>com.train</groupId>
	    <artifactId>alibaba-dubbo</artifactId>
	    <version>1.0-SNAPSHOT</version>
	    <relativePath>../pom.xml</relativePath>
	</parent>
	
	<artifactId>hello-dubbo-provider</artifactId>
	<packaging>pom</packaging>
	
	<modules>
	    <module>hello-dubbo-provider-api</module>
	    <module>hello-dubbo-provider-service</module>
	</modules>
</project>

在hello-dubbo-provider工程下,创建hello-dubbo-provider子工程。目的是定义接口,后续consumer会引用该工程,然后就能直接调用provider借口了

<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>com.train</groupId>
        <artifactId>hello-dubbo-provider</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <artifactId>hello-dubbo-provider-api</artifactId>
    <packaging>jar</packaging>


</project>

创建接口类EchoService:

package com.train.dubbo.provider.api;

public interface EchoService {
    String echo(String name);
}

这样api工程就完成了,很简单

在这里插入图片描述

在hello-dubbo-provider工程下,创建hello-dubbo-provider-service子工程。该工程是api工程的具体实现,因此必须依赖上一步创建的api工程

<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>com.train</groupId>
        <artifactId>hello-dubbo-provider</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <artifactId>hello-dubbo-provider-service</artifactId>
    <packaging>jar</packaging>

    <dependencies>
        <dependency>
            <groupId>com.train</groupId>
            <artifactId>hello-dubbo-provider-api</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>
</project>

创建EchoServiceImpl实现EchoService接口

package com.train.dubbo.provider.service;

import com.train.dubbo.provider.api.EchoService;
import org.apache.dubbo.config.annotation.Service;

@Service(version = "1.0.0")
public class EchoServiceImpl implements EchoService {
    
    
    @Override
    public String echo(String name) {
    
    
        return "Dubbo Hello:" + name;
    }
}

注意:@Service注解必须引用dubbo的Service,而不是spring,不要弄错了

创建Application启动类

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

配置application.yml,前提必须安装好nacos,还没安装的童鞋参考前面的文章

spring:
  application:
    name: dubbo-provider
  main:
    allow-bean-definition-overriding: true
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.25.131:8848

dubbo:
  scan:
    base-packages: com.train.dubbo.provider.service
  protocol:
    name: dubbo
    port: -1
  registry:
    address: spring-cloud://192.168.25.131:8848
server:
  port: 8010

整个provider工程结构如下
在这里插入图片描述
启动provider-service,然后查看Nacos,确认服务是否注册

在主工程下创建hello-dubbo-consumer消费者工程,因为要消费provider接口,所以依赖provider-api工程

<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>com.train</groupId>
        <artifactId>alibaba-dubbo</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <artifactId>hello-dubbo-consumer</artifactId>
    <packaging>jar</packaging>

    <dependencies>
        <dependency>
            <groupId>com.train</groupId>
            <artifactId>hello-dubbo-provider-api</artifactId>
            <version>${project.parent.version}</version>
        </dependency>
    </dependencies>
</project>

创建controller接口以便测试

@RestController
public class EchoController {
    
    

    @Reference(version = "1.0.0")
    private EchoService echoService;

    @GetMapping("/echo/{name}")
    public String echo(@PathVariable String name){
    
    
        return echoService.echo(name);
    }
}

创建启动类

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

配置application.yml

server:
  port: 8020

dubbo:
  protocol:
    name: dubbo
    port: -1
  registry:
    address: spring-cloud://192.168.25.131:8848
  scan:
    base-packages: com.train.dubbo.consumer.controller
  cloud:
    subscribed-services: dubbo-provider
spring:
  application:
    name: dubbo-consumer
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.25.131:8848
  main:
    allow-bean-definition-overriding: true

然后同样启动consumer工程,再确认Nacos

在这里插入图片描述

附上整个工程结构:
在这里插入图片描述

测试

在浏览器输入http://localhost:8020/echo/zhangsan,能正常输出provider-service实现的接口内容,就说明正常运行

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_28834355/article/details/108829121
今日推荐