我们在微服务中最常使用的就是服务调用了,这也是各个服务互相交互拆分的核心部分,spring cloud 项目一般使用 feign 来完成服务调用,且是基于http 协议的,其实HTTP属于RPC的一种,不过如果是基于HTTP1.1的协议,请求中会包含很多无用的内容,这会导致他比原始的RPC调用效率更低。RPC,使用自定义的TCP协议,可以让请求报文体积更小,或者使用HTTP2协议,也可以很好的减少报文的体积,提高传输效率。RPC主要用于公司内部的服务调用,性能消耗低,传输效率高,服务治理方便。HTTP主要用于对外的异构环境,浏览器接口调用,APP接口调用,第三方接口调用等。相比较而言小公司更喜欢HTTP的服务调用,不需要很高的访问效率,而且程序需要不断迭代,HTTP开发更加友好些。大型的互联网企业则更喜欢RPC调用,这样服务调用效率更高一些,安全性也比HTTP要好些。
阿里巴巴维护的springcloud-alibaba可以十分方便的将spring cloud 与dubbo 集成起来。首先我们引入依赖:
<!-- Spring Boot 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>
项目使用时,需要注意 spring cloud 与spring boot 版本的对应关系:
Release Train | Boot Version |
---|---|
Hoxton |
2.2.x |
Greenwich |
2.1.x |
Finchley |
2.0.x |
Edgware |
1.5.x |
Dalston |
1.5.x |
实现dubbo 服务
@org.apache.dubbo.config.annotation.Service class EchoServiceImpl implements EchoService { @Override public String echo(String message) { return "[echo] Hello, " + message; } }
其中,@org.apache.dubbo.config.annotation.Service 是 Dubbo 服务注解,仅声明该 Java 服务(本地)实现为 Dubbo 服务。 因此,下一步需要将其配置 Dubbo 服务(远程)。
配置 Dubbo 服务提供方
dubbo: scan: # dubbo 服务扫描基准包 base-packages: com.magicdu.cloud.dubbo protocol: # dubbo 协议 name: dubbo # dubbo 协议端口( -1 表示自增端口,从 20880 开始) port: -1 registry: # 挂载到 Spring Cloud 注册中心 address: spring-cloud://localhost spring: application: # Dubbo 应用名称 name: spring-cloud-alibaba-dubbo-server main: # Spring Boot 2.1 需要设定 allow-bean-definition-overriding: true cloud: nacos: # Nacos 服务发现与注册配置 discovery: server-addr: 127.0.0.1:8848
以上 YAML 内容,上半部分为 Dubbo 的配置:
dubbo.scan.base-packages : 指定 Dubbo 服务实现类的扫描基准包
dubbo.protocol : Dubbo 服务暴露的协议配置,其中子属性 name 为协议名称,port 为协议端口( -1 表示自增端口,从 20880 开始)
dubbo.registry : Dubbo 服务注册中心配置,其中子属性 address 的值 “spring-cloud://localhost”,说明挂载到 Spring Cloud 注册中心
实现 Dubbo 服务消费方
@EnableDiscoveryClient @EnableAutoConfiguration @RestController public class DubboSpringCloudClientBootstrap { @Reference private EchoService echoService; @GetMapping("/echo") public String echo(String message) { return echoService.echo(message); } public static void main(String[] args) { SpringApplication.run(DubboSpringCloudClientBootstrap.class); } }
Dubbo 服务消费方配置与服务提供方类似,当前应用 spring-cloud-dubbo-client-sample 属于纯服务消费方,因此,所需的外部化配置更精简:
dubbo: registry: # 挂载到 Spring Cloud 注册中心 address: spring-cloud://localhost cloud: subscribed-services: spring-cloud-alibaba-dubbo-server spring: application: # Dubbo 应用名称 name: spring-cloud-alibaba-dubbo-client main: # Spring Boot 2.1 需要设定 allow-bean-definition-overriding: true cloud: nacos: # Nacos 服务发现与注册配置 discovery: server-addr: 127.0.0.1:8848
对比应用 spring-cloud-dubbo-server-sample,除应用名称 spring.application.name 存在差异外,spring-cloud-dubbo-client-sample 新增了属性 dubbo.cloud.subscribed-services 的设置。并且该值为服务提供方应用 “spring-cloud-dubbo-server-sample”。
dubbo.cloud.subscribed-services : 用于服务消费方订阅服务提供方的应用名称的列表,若需订阅多应用,使用 “,” 分割。 不推荐使用默认值为 “*”,它将订阅所有应用.