一、前言

Spring Cloud原生的Rpc调用方式是Feign,Feign是一个声明式的伪Http客户端,它使得写 Http 客户端变得更简单,但代价是性能大幅度降低。它的底层协议是Http/Ip,协议报文较大,在网络传输中会消耗更多资源。如果在系统QPS达到万级每秒甚至更高,整个系统的性能瓶颈就会出现。这是,另一种RPC框架进入可选项,Dubbo的传输协议默认使用Dubbo协议,较Http协议,数据报文小。除了官方的协议,还支持其他高性能网络协议扩展,其底层通信基于Netty实现,因而传输性能比Feign高。

二、Spring Cloud Alibaba集成Dubbo

由于Dubbo本身也是由阿里巴巴研发并开源出来,系出同门,Spring Cloud Alibaba跟Dubbo体现看了良好的兼容性。
接下来本文将通过生成雪花算法生成Id演示两者如何集成。

接口定义

首先,创建服务者和消费者都需要用到的API接口:

/**
 * @author zhaolc
 * @version 1.0
 * @description TODO
 * @createTime 2021年08月20日 14:40:00
 */
public interface IdGenerateApi {

    Result getId(String key);
}

相关DTO定义如下:

public class Result implements Serializable {
    private long id;
    private Status status;



    public Result() {

    }

    public Result(long id, Status status) {
        this.id = id;
        this.status = status;
    }

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public Status getStatus() {
        return status;
    }

    public void setStatus(Status status) {
        this.status = status;
    }

    @Override
    public String toString() {
        final StringBuilder sb = new StringBuilder("Result{");
        sb.append("id=").append(id);
        sb.append(", status=").append(status);
        sb.append('}');
        return sb.toString();
    }
}
public enum Status {
    SUCCESS,
    EXCEPTION
}
服务提供者

在pom.xml中引入接口依赖:

<dependency>
            <groupId>cn.zk</groupId>
            <artifactId>spring-cloud-alibaba-dubbo-api</artifactId>
            <version>1.0.0</version>
        </dependency>

在父级项目pom.xml中引入dubbo依赖:

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

bootstrap.yml做以下配置,nacos配置不再赘述。

dubbo:
  scan:
    base-packages: cn.sarcae.spring.cloud.alibaba.dubbo.provider.dubbo
  protocol:
    name: dubbo // 除了该协议外还有hessian、thrift等其他协议可选
    port: -1 // -1默认为随机分配端口
  registry:
    address: spring-cloud://172.17.0.1:8848 注册中心地址,这里用nacos作为注册发现

接下来,需要再项目加载主类中显式配置开启dubbo。

@SpringBootApplication
@EnableDiscoveryClient
@EnableDubbo
public class SpringCloudAlibabaDubboProviderApplication {

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

}

以上准备工作就绪后,接下来实现服务提供接口:

/**
 * @author zhaolc
 * @version 1.0
 * @description TODO
 * @createTime 2021年08月20日 14:04:00
 */
@Service(version = "1.0.0")
public class IdGenerateApiImpl implements IdGenerateApi {

    @Autowired
    private SnowflakeService snowflakeService;

    @Override
    public Result getId(String s) {
        return snowflakeService.getId(s);
    }
}

致此,服务提供者编码完成,接下来启动系统,将服务注册到nacos。

spring cloud 和 spring cloud alibaba哪个更好用 spring cloud alibaba和dubbo_ide


如图所示,id生成服务暴露到注册中心。接下来,进行服务消费者编码。

服务消费者

pom依赖同服务提供者,此处不做赘述。

bootstrap.yml做以下核心配置

dubbo:
  protocol:
    name: dubbo
    port: -1
  registry:
    address: spring-cloud://127.0.0.1:8848
  cloud:
    subscribed-services: spring-cloud-alibaba-dubbo-provider
接下来进行服务消费者编码:
@RestController
@RequestMapping("/consumer")
@Slf4j
public class ConsumerController {


    // 此处需注意版本号需要与服务提供者保持一致
    @Reference(check = false,version = "1.0.0")
    private IdGenerateApi idGenerateApi;

    @GetMapping("/getId")
    public Object test() {
        return idGenerateApi.getId("");
    }
}

启动程序,连接到注册中心订阅服务提供者暴露的服务:

spring cloud 和 spring cloud alibaba哪个更好用 spring cloud alibaba和dubbo_spring_02

三、测试

接下来使用Postman进行接口测试:

spring cloud 和 spring cloud alibaba哪个更好用 spring cloud alibaba和dubbo_spring cloud_03

如上图所示,id生成服务被正确调用,这里只是做演示之用,实际生产环境要用时,id生成服务会部署多个,在服务请求数足够大时,做负载均衡,达到高可用。

四、总结

致此,spring cloud alibaba与dubbo集成演示到此完满结束,spring cloud alibaba体现了与dubbo很好的兼容性,几乎开箱即用。另外本文中涉及到的雪花算法生成id不在本文讲解范围之内,如果需要,可到笔者个人gitee地址拉取。