Spring Cloud Alibaba专题--2.2.5.RELEASE--Dubbo作为RPC调用框架的使用(十一)

一:Dubbo介绍

1.历史简介

  • 2011年10月27日,阿里巴巴开源了自己的SOA服务化治理方案的核心框架Dubbo,服务治理和SOA的设计理念开始逐渐在国内软件行业中落地,并被广泛应用

  • 2012年10月23日Dubbo2.5.3发布后,在Dubbo开源将满一周年之际,阿里基本停止了对Dubbo的主要升级。只在之后的2013年和2014年更新过2次对Dubbo2.4的维护版本,然后停止了所有维护工作。Dubbo对Srping的支持也停留在了Spring 2.5.6版本上

  • 在阿里停止维护和升级Dubbo期间,当当网开始维护自己的Dubbo分支版本Dubbox,支持了新版本的Spring,并对外开源了Dubbox。同时,网易考拉也维护了自己的独立分支Dubbok,可惜并未对外开源

  • 随着微服务的火热兴起,在国内外开发者对阿里不再升级维护Dubbo的吐槽声中,阿里终于开始重新对Dubbo的升级和维护工作。在2017年9月7日,阿里发布了Dubbo的2.5.4版本,距离上一个版本2.5.3发布已经接近快5年时间了。在随后的几个月中,阿里Dubbo开发团队以差不多每月一版本的速度开始快速升级迭代,修补了Dubbo老版本多年来存在的诸多bug,并对Spring等组件的支持进行了全面升级。

  • 2018年1月8日,Dubbo 2.6.0版本发布,新版本将之前当当网开源的Dubbo分支Dubbox进行了合并,实现了Dubbo版本的统一整合

  • 2018年2月15日,大年三十,经过一系列紧张的投票,来自阿里巴巴的广受社区欢迎的RPC开源框架Dubbo宣布正式进入Apache孵化器

  • 2019 年 5 月,dubbo正式错Apache孵化毕业,成为第二个由 Alibaba 捐献后从 Apache 毕业的项目

2.Dubbo 架构简介

在这里插入图片描述
节点角色说明

节点角色说明
Provider暴露服务的服务提供方
Consumer调用远程服务的服务消费方
Registry服务注册与发现的注册中心
Monitor统计服务的调用次数和调用时间的监控中心
Container服务运行容器

调用关系说明

  1. 服务容器负责启动,加载,运行服务提供者
  2. 服务提供者在启动时,向注册中心注册自己提供的服务
  3. 服务消费者在启动时,向注册中心订阅自己所需的服务
  4. 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者
  5. 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用
  6. 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心

Dubbo 架构具有以下几个特点,分别是连通性、健壮性、伸缩性、以及向未来架构的升级性。

以上内容来自apache dubbo官网

在很长的一段时间,我们都在讨论Dubbo和Spring Cloud使用哪个比较好。事实上两个解决方案并没有可比性。
Dubbo是作为RPC的解决方案,而Spring Cloud是作为整个分布式系统的一站是解决方案。Dubbo解决的RPC领域只是分布式系统解决方案中的其中一部分。
但为什么大家总是拿这个两个解决方案进行对比呢?原因是Dubbo并非像Feign一样,仅实现的远程调用的功能。Dubbo在实现了这一能力的同时,还实现了客户端负载均衡,以及注册中心对接(对应的注册中心驱动)等功能,所以Dubbo某种程度上说,是一种mini版的分布式解决方案

严格来说,注册中心对接(对应的注册中心驱动)等相关功能并非RPC层的业务领域,而是上层Spring Cloud (Alibaba)的业务领域,所以在Spring Cloud(Alibaba)解决方案中,由Spring Cloud负责注册中心客户端的对接,而Dubbo仅是针对上层不同的注册中心,做了内部的兼容驱动。比如服务注册,在使用Nacos注册中心时,Dubbo直接连驱动都没有,全权由上层的Nacos驱动去处理注册的问题。这样:Dubbo更专注于RPC层的问题,其他的分布式层面的问题交由上层Spring Cloud(Alibaba)去做。

二:Spring Cloud Alibaba 接入Apache Dubbo

版本问题
Spring Cloud Alibaba专题–2.2.5.RELEASE–Spring Cloud Alibaba介绍(三)-组件版本关系中已经提到对应的dubbo版本
当然,我们使用了Spring Cloud Alibaba,直接使用Spring Cloud Alibaba提供的Dubbo 的Starter即可

1.在项目pom中引入版本控制pom

 <properties>
        <java.version>1.8</java.version>
        <spring-cloud-alibaba.version>2.2.5.RELEASE</spring-cloud-alibaba.version>
        <dubbo.version>2.7.8</dubbo.version>
        <spring-cloud.version>Hoxton.SR8</spring-cloud.version>
    </properties>
 <dependencyManagement>
        <dependencies>
            <!--spring-cloud-alibaba dependencies pom 依赖包-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-parent</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!--spring-cloud-alibaba dependencies pom 依赖包-->
            <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>
            <!--spring-cloud dependencies pom 依赖包-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!--apache Dubbo Dependencies pom 依赖包-->
            <dependency>
                <groupId>org.apache.dubbo</groupId>
                <artifactId>dubbo-dependencies-bom</artifactId>
                <version>${dubbo.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
</dependencyManagement>

除了了Spring Boot、Spring Cloud、Spring Cloud Alibaba的pom包以外,Dubbo同样提供了pom的依赖包用来管理在使用Dubbo过程涉及的jar版本

父工程说明

由于篇幅原因,搭建的项目是多model的项目,这里不方便贴出所有的配置,以下的model均继承该pom,因此pom定义过的jar包,均不用指定版本,父工程maven名称:

 <groupId>com.syl.learn</groupId>
 <artifactId>spring-cloud-alibaba-dubbo-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>

在这里插入图片描述
标记的为本文讨论的model

三:基础Spring Boot环境搭建

1.Api 模块

(1)创建model如下

在这里插入图片描述本文关注的接口只有EchoService

(2)Pom文件
<parent>
        <groupId>com.syl.learn</groupId>
        <artifactId>spring-cloud-alibaba-dubbo-demo</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-dubbo-sample-api</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>Spring Cloud Dubbo Sample API</name>

    <dependencies>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>${slf4j.version}</version>
        </dependency>
        <!-- Dubbo -->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo</artifactId>
            <version>${dobbo.version}</version>
        </dependency>
        <!-- validation -->
        <dependency>
            <groupId>javax.validation</groupId>
            <artifactId>validation-api</artifactId>
        </dependency>
        <!--Validate support dependencies-->
        <dependency>
            <groupId>org.glassfish</groupId>
            <artifactId>javax.el</artifactId>
            <version>${el-glassfish.version}</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate.validator</groupId>
            <artifactId>hibernate-validator</artifactId>
        </dependency>

    </dependencies>
(3)EchoService接口

,接口很简单

public interface EchoService {

	String echo(String message);

}

2.服务提供者模块

(1)创建model如下

在这里插入图片描述

(2)pom文件
<parent>
        <groupId>com.syl.learn</groupId>
        <artifactId>spring-cloud-alibaba-dubbo-demo</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>

    <modelVersion>4.0.0</modelVersion>

    <properties>
        <java.version>1.8</java.version>
        <javac.version>1.8</javac.version>
    </properties>

    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-dubbo-server-sample</artifactId>
    <name>Spring Cloud Dubbo Server Sample</name>
    <version>0.0.1-SNAPSHOT</version>

    <dependencies>

        <!-- Sample API -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-dubbo-sample-api</artifactId>
            <version>${project.parent.version}</version>
        </dependency>

        <!-- Spring Boot actuator dependencies -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-actuator</artifactId>
        </dependency>

        <!-- Dubbo Spring Cloud Starter -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-dubbo</artifactId>
        </dependency>

        <!-- Spring Cloud Nacos Service Discovery -->
        <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>

这里使用Nacos作为服务发现,方便测试,具体Nacos服务发现相关内容可参考Spring Cloud Alibaba专题–2.2.5.RELEASE–Nacos作为注册中心的使用(八)

(3)配置文件
spring.profiles.active=${profileActive}
#应用名称
spring.application.name=spring-cloud-alibaba-dubbo-server

server.port=8008
#注册中心地址
spring.cloud.nacos.discovery.server-addr=${maven.nacos.serverAddr}
#注册中心命名空间
spring.cloud.nacos.discovery.namespace=${maven.nacos.namespace}

#dubbo扫描base包
dubbo.scan.base-packages=com.alibaba.cloud.dubbo.bootstrap
dubbo.protocol.name=dubbo
dubbo.protocol.port=-1

这里的maven是定义的变量,为了支持nacos的环境切换,具体参考Spring Cloud Alibaba专题–2.2.5.RELEASE–Nacos作为配置中心的使用(五)-基于namespace环境隔离切换问题

(4)启动类DubboSpringCloudServerBootstrap

为了方便,接口实现都放在启动类中

/**
 * Dubbo Spring Cloud Server Bootstrap.
 *
 * @author 苏友良
 */
@EnableDiscoveryClient
@EnableAutoConfiguration
public class DubboSpringCloudServerBootstrap {

	public static void main(String[] args) {
		ConfigurableApplicationContext run = SpringApplication.run(DubboSpringCloudServerBootstrap.class);

	}

}

@DubboService(version = "1.0.0")
class EchoServiceImplV1 implements EchoService {

	@Override
	public String echo(String message) {
		LoggerUtils.log("echov1",message);
		return "[echov1] Hello, " + message;
	}

}


@DubboService(version = "2.0.0")
class EchoServiceImplV2 implements EchoService {

	@Override
	public String echo(String message) {
		LoggerUtils.log("echov2",message);
		return "[echov2] Hello, " + message;
	}

}

这里定义了两个不同版本的实现,EchoServiceImplV1和EchoServiceImplV2

3.消费者模块

(1)创建model如下

在这里插入图片描述

(2)pom文件
<parent>
        <groupId>com.syl.learn</groupId>
        <artifactId>spring-cloud-alibaba-dubbo-demo</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <properties>
        <java.version>1.8</java.version>
    </properties>

    <artifactId>spring-cloud-dubbo-client-sample</artifactId>
    <name>spring-cloud-dubbo-client-sample</name>

    <dependencies>
        <!-- Sample API -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-dubbo-sample-api</artifactId>
            <version>${project.parent.version}</version>
        </dependency>

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

        <!-- Dubbo Spring Cloud Starter -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-dubbo</artifactId>
        </dependency>

        <!-- Spring Cloud Nacos Service Discovery -->
        <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>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

同样引用了Nacos作为注册服务发现,方便测试,具体Nacos服务发现相关内容可参考Spring Cloud Alibaba专题–2.2.5.RELEASE–Nacos作为注册中心的使用(八)

(3)配置文件
spring.profiles.active=${profileActive}
#应用名称
spring.application.name=spring-cloud-alibaba-dubbo-client
server.port=8181
#注册中心地址
spring.cloud.nacos.discovery.server-addr=${maven.nacos.serverAddr}
#注册中心命名空间
spring.cloud.nacos.discovery.namespace=${maven.nacos.namespace}

#从注册中心订阅的服务,默认是* 这里指定
dubbo.cloud.subscribed-services=spring-cloud-alibaba-dubbo-server
#rpc调用使用协议 默认dubbo
dubbo.protocol.name=dubbo
#rpc协议暴露端口 -1则指自增端口(从20880开始)
dubbo.protocol.port=-1
#消费容错策略  默认failover 这里设置为快速失败
dubbo.consumer.cluster=failfast

这里订阅了服务提供者dubbo.cloud.subscribed-services对应的配置

(4)启动类


/**
 * Dubbo Spring Cloud Client Bootstrap.
 *
 * @author 苏友良
 */
@EnableDiscoveryClient
@EnableAutoConfiguration
@RestController
public class DubboSpringCloudClientBootstrap {
    //无法成功注入,server已经标识了服务的版本,dubbo filter做了version的严格匹配
//	@DubboReference
//	private EchoService echoService;

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

    @DubboReference(url = "172.16.27.230:20880",version = "2.0.0")
    private EchoService point2pointEchoService;

    @GetMapping("discovery/echo")
    public String discoveryEcho(String message) {
        return echoService.echo(message);
    }

    @GetMapping("point2point/echo")
    public String point2pointEcho(String message) {
        return point2pointEchoService.echo(message);
    }

    public static void main(String[] args) {
        SpringApplication.run(DubboSpringCloudClientBootstrap.class);
    }

}

三:基本测试

1.启动服务提供者

在这里插入图片描述

nacos控制台是否注册成功
在这里插入图片描述
在这里插入图片描述

2.启动服务消费者

在这里插入图片描述
nacos控制台是否注册成功
在这里插入图片描述

3.接口测试

(1)访问discovery/echo

在这里插入图片描述
访问成功

注意:VPN或翻墙软件可能会对本地访问造成影响,导致启动时找不到provider的问题,为排除干扰,关闭vpn或翻墙软件或设置局域网直连

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值