一、前言
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。
如图所示,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("");
}
}
启动程序,连接到注册中心订阅服务提供者暴露的服务:
三、测试
接下来使用Postman进行接口测试:
如上图所示,id生成服务被正确调用,这里只是做演示之用,实际生产环境要用时,id生成服务会部署多个,在服务请求数足够大时,做负载均衡,达到高可用。
四、总结
致此,spring cloud alibaba与dubbo集成演示到此完满结束,spring cloud alibaba体现了与dubbo很好的兼容性,几乎开箱即用。另外本文中涉及到的雪花算法生成id不在本文讲解范围之内,如果需要,可到笔者个人gitee地址拉取。