Dubbo:Dubbo服务发现

Posted 流楚丶格念

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Dubbo:Dubbo服务发现相关的知识,希望对你有一定的参考价值。

文章目录

Dubbo服务发现

Dubbo是阿里巴巴公司开源的RPC框架,在国内有着非常大的用户群体,但是其微服务开发组件相对Spring Cloud 来说并不那么完善。

官方网站:https://dubbo.apache.org/zh/index.html

Spring Cloud Alibaba微服务开发框架集成了Dubbo,可实现微服务对外暴露Dubbo协议的接口,Dubbo协议相比RESTful协议速度更快。

RPC:RPC是远程过程调用(Remote Procedure Call)的缩写形式,调用RPC远程方法就像调用本地方法一样,非常方便。

下面案例讲解具体调用过程实现:

1. Dubbo服务架构

下图是微服务采用Dubbo协议的系统架构图:

组件说明:

  1. 客户端:前端或外部系统
  2. API网关:系统唯一入口,路由转发
  3. application-1 :应用1,前端提供Http接口,接收用户的交互请求
  4. service-1 :微服务1,提供业务逻辑处理服务
  5. service-2:微服务2,提供业务逻辑处理服务

交互流程:

  1. 网关负责客户端请求的统一入口,路由转发,前端通过网关请求后端服务。
  2. 网关收到前端请求,转发请求给应用。
  3. 应用接收前端请求,调用微服务进行业务逻辑处理
  4. 微服务为应用提供业务逻辑处理的支撑,为应用提供Dubbo协议接口

优势分析:

此架构同时提供RESTful和Dubbo接口服务,应用层对前端提供RESTful接口,RESTful是互联网通用的轻量级交互协议,方便前端接入系统;微服务层向应用层提供Dubbo接口,Dubbo接口基于RPC通信协议速度更快。

本架构采用阿里开源的Nacos,集服务发现和配置中心于一身,支持RESTful及Dubbo服务的注册。

2. 案例环境搭建

父工程:仍然使用nacos-dicovery。

application1:使用nacos-restful-consumer。

service1微服务:需要新建

service2微服务:需要新建

api网关:这次没有搭建

3. service2微服务

service2对外暴露dubbo协议的接口,考虑远程接口可能 会被其它多个服务调用,这里将service2的接口单独抽取出api工程,service2微服务工程的结构如下:

service2-api:存放接口,独立成一个工程方便被其它服务工程依赖。

service2-server:存放接口实现,即dubbo服务的实现部分。

3.1 定义service2-api

1、创建service2工程

父级 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">
    <parent>
        <artifactId>nacos-discovery</artifactId>
        <groupId>com.yyl.nacos</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>nacos-dubbo-service2</artifactId>


</project>

2、创建service2-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">
    <parent>
        <artifactId>nacos-dubbo-service2</artifactId>
        <groupId>com.yyl.nacos</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>service2-api</artifactId>


</project>

3、定义接口

package com.yyl.microservice.service2.api;

/
 * Created by Administrator.
 */
public interface Service2Api 
    public String dubboService2();


3.2 定义service2-server

1、创建service2-server工程

<?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">
    <parent>
        <artifactId>nacos-dubbo-service2</artifactId>
        <groupId>com.yyl.nacos</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>service2-server</artifactId>

    <dependencies>
        <dependency>
            <groupId>com.yyl.nacos</groupId>
            <artifactId>service2-api</artifactId>
            <version>1.0-SNAPSHOT</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>

</project>

2、定义接口实现
注意:使用@org.apache.dubbo.config.annotation.Service标记dubbo服务
如下图所示:

package com.yyl.microservice.service2.service;

import com.yyl.microservice.service2.api.Service2Api;

/
 * @author Administrator
 * @version 1.0
 /
@org.apache.dubbo.config.annotation.Service
public class Service2ApiImpl implements Service2Api 
    public String dubboService2() 

        return "dubboService2";
    


3、定义启动类

package com.yyl.microservice.service2;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/
 * @author Administrator
 * @version 1.0
 /
@SpringBootApplication
public class Service2Bootstrap 
    public static void main(String[] args) 
        SpringApplication.run(Service2Bootstrap.class,args);
    


4、定义配置文件bootstrap.yml

注意:Spring Boot 2.1 需要设定 allow-bean-definition-overriding (允许bean定义重写覆盖)为true

server:
  port: 56040 #启动端口 命令行注入

spring:
  application:
    name: dubbo-service2
  main:
    allow-bean-definition-overriding: true # Spring Boot 2.1 需要设定
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
dubbo:
  scan:
    # dubbo 服务扫描基准包
    base-packages: com.yyl.microservice.service2.service
  protocol:
    # dubbo 协议
    name: dubbo
    # dubbo 协议端口
    port: 20891
  registry:
    address: nacos://127.0.0.1:8848
  application:
    qos-enable: false #dubbo运维服务是否开启
  consumer:
    check: false  #启动时就否检查依赖的服务

5、启动service2-server

启动成功观察nacos的服务列表

6、bootstrap.yml配置说明

配置说明
dubbo.scan.base-packages指定 Dubbo 服务实现类的扫描基准包,将@org.apache.dubbo.confifig.annotation.Service注解标注的service暴露为dubbo服务。
dubbo.protocolDubbo 服务暴露的协议配置,其中子属性 name 为协议名称, port 为dubbo协议端口可以指定多协议,如:dubbo.protocol.rmi.port=1099
dubbo.registryDubbo 服务注册中心配置,其中子属性 address 的值 “nacos://127.0.0.1:8848”,说明 dubbo服务注册到nacos
相当于原生dubbo的xml配置中的 <dubbo:registry address="10.20.153.10:9090" />

bootstrap.yml内容的上半部分为SpringCloud的相关配置:

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

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

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

4. application1调用service2

根据dubbo服务的架构图,我们将nacos-restful-consumer作为application1,实现application1调用 service2。

4.1 引用service2

在nacos-restful-consumer工程中引用service2依赖

在pom.xml中引入service2-api的依赖

<dependency>
    <groupId>com.yyl.nacos</groupId>
    <artifactId>service2-api</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>

引入 spring-cloud-starter-dubbo依赖,它会根据接口生成代理对象

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-dubbo</artifactId>
</dependency>

4.2 实现远程调用

修改nacos-restful-consumer工程的RestConsumerController:

@org.apache.dubbo.config.annotation.Reference
Service2Api service2Api;

@GetMapping(value = "/service2")
public String service2()
    //远程调用service2
    String providerResult = service2Api.dubboService2();
    return "远程调用 consumer dubbo invoke |"+providerResult;

注意:这里的 @Reference 注解是 org.apache.dubbo.config.annotation.Reference

测试: 请求:http://127.0.0.1:56020/service2

显示:

dubboService2 表明service2调用成功。

5. service1微服务

service1采用和service2相同的工程结构。

本节实现service1对外暴露dubbo接口,并用实现service1调用service2。

5.1 定义service1-api

1、创建service1工程

<?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">
    <parent>
        <artifactId>nacos-discovery</artifactId>
        <groupId>com.yyl.nacos</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>nacos-dubbo-service1</artifactId>


</project>

2、创建service1-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">
    <parent>
        <artifactId>nacos-dubbo-service1</artifactId>
        <groupId>com.yyl.nacos</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>service1-api</artifactId>

</project>

3、定义接口

package com.yyl.microservice.service1.api;

/**
 * Created by Administrator.
 */
public interface Service1Api 
    public String dubboService1();


5.2 定义service1-server

1、创建service1-server工程

由于实现service1调用service2,这里需要引入 service2依赖。

<?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">
    <parent>
        <artifactId>nacos-dubbo-service1</artifactId>
        <groupId>com.yyl.nacos</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>service1-server</artifactId>

<dependencies>
    <dependency>
        <groupId>com.yyl.nacos</groupId>
        <artifactId>service1-api</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>
    <!-- 引入 service2依赖-->
    <dependency>
        <groupId>com.yyl.nacos</groupId>
        <artifactId>service2-api</artifactId>
        <version>1.0-SNAPSHOT</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>
</project>

2、定义接口实现

package com.yyl.microservice.service1.service;

import com.yyl.microservice.service1.api.Service1Api;
import com.yyl.microservice.service2.api.Service2Api;

/**
 * @author Administrator
 * @version 1.0
 **/
@org.apache.dubbo.config.annotation.Service
public class Service1ApiImpl implements Service1Api 

    @org.apache.dubbo.config.annotation.Reference
    Service2Api service2Api;

    public String dubboService1() 
        //远程调用service2
        String s = service2Api.dubboService2();
        return "先调用 dubboService1 | 再调用"+s;
    


3、定义启动类

package com.yyl.microservice.service1;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * @author Administrator
 * @version 1.0
 **/
@SpringBootApplication
public class Service1Bootstrap 
    public static void main(String[] args) 
        SpringApplication.run(Service1Bootstrap.class,args);
    


4、定义配置文件bootstrap.yml

server:
  port: 56030 #启动端口 命令行注入

spring:
  application:
    name: dubbo-service1
  main:
    allow-bean-definition-overriding: true # Spring Boot 2.1 需要设定
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
dubbo:
  scan:
    # dubbo 服务扫描基准包
    base-packages: com.yyl.microservice.service1.service
  protocol:
    # dubbo 协议
    name: dubbo
    # dubbo 协议端口
    port: 20881
  registry:
    address: nacos://127.0.0.1:8848
  application:
    qos-enable: false #dubbo运维服务是否开启
  consumer:
    check: false  #启动时就否检查依赖的服务

5、启动service1-server

启动成功观察nacos的服务列表

5.3 application1调用service1

1、在application1引入 service1-api的依赖

<dependency>
    <groupId>com.yyl.nacos</groupId>
    <artifactId>service1-api</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>

2、在application1的controller中调用service1接口

@org.apache.dubbo.config.annotation.Reference
Service1Api service1Api;


@GetMapping(value = "/service3")
public String service3()
    //远程调用service1
    String providerResult = service1Api.dubboService1();
    return "远程调用 consumer dubbo invoke |"+providerResult;

3、测试,请求http://127.0.0.1:56020/service3

显示 :

表明调用service1成功,service1调用service2成功。

以上是关于Dubbo:Dubbo服务发现的主要内容,如果未能解决你的问题,请参考以下文章

Dubbo RPC 框架-服务发现&常用特性

Dubbo源码解析:服务暴露与发现

小白也能看懂的dubbo3应用级服务发现详解

Dubbo中服务注册与发现实现原理

Dubbo注册中心

迈出云原生重要一步 — Dubbo 3 应用级服务发现