springcloud-alibaba整合dubbo
记一次springcloud-alibaba框架下整合spring-cloud-starter-dubbo
现状: 现在微服务之间的相互调用使用feign
接口都需要注解@FeignClient,例:@FeignClient(contextId = "sysRoleMenuService", value = FeignConstants.UserClient, fallbackFactory = SysRoleMenuServiceFallBack.class)
在原框架基础上集成dubbo
一、提供api接口
public interface TestService { String test(String name); }
二、服务提供者
1.引入相关的pom配置
<!-- Dubbo Spring Cloud Starter --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-dubbo</artifactId> </dependency>
2.dubbo相关配置
dubbo: scan: base-packages: com.cloud.rapid.user.service.api.dubbo protocol: #Dubbo 服务暴露的协议配置,其中子属性 name 为协议名称,port 为协议端口( -1 表示自增端口,从 20880 开始) name: dubbo port: -1 #dubbo协议缺省端口为20880,rmi协议缺省端口为1099,http和hessian协议缺省端口为80;如果没有配置port,则自动采用默认端口,如果配置为-1,则会分配一个没有被占用的端口。Dubbo 2.4.0+,分配的端口在协议缺省端口的基础上增长,确保端口段可控 registry: #dubbo服务注册端口,注册中心服务器地址,如果地址没有端口缺省为9090,同一集群内的多个地址用逗号分隔,如:ip:port,ip:port #其中前缀spring-cloud说明:挂载到 Spring Cloud注册中心 address: spring-cloud://119.3.107.157:8848 # address: spring-cloud://localhost #check: false #关闭注册中心是否启动的相关检查,false表示不检查注册中心是否启动,就不会报错 # cloud: # subscribed-services: dubbo-product provider: timeout: 10000
3.启动类加上@EnableDubbo注解
@EnableShardingJdbc @EnableDiscoveryClient @SpringBootApplication @EnableDubbo public class RapidUserServiceApplication { public static void main(String[] args) { SpringApplication.run(RapidUserServiceApplication.class, args); } }
4.实现api接口
package com.cloud.rapid.user.service.impl.dubbo; import com.cloud.rapid.user.service.api.dubbo.TestService; import org.apache.dubbo.config.annotation.Service; import org.apache.dubbo.config.spring.context.annotation.DubboComponentScan; // 注意该serveice为dubbo的注解,不是framework的,引入应该为import org.apache.dubbo.config.annotation.Service; @Service public class TestServiceImpl implements TestService { @Override public String test(String name) { return "hello " + name; } }
三、服务消费者
1.引入相关的pom配置
<!-- Dubbo Spring Cloud Starter --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-dubbo</artifactId> </dependency>
2.dubbo相关配置
dubbo: consumer: timeout: 5000 check: false #关闭订阅服务是否启动的检查【检查时,没有服务提供者会报错】 protocol: #Dubbo 服务暴露的协议配置,其中子属性 name 为协议名称,port 为协议端口( -1 表示自增端口,从 20880 开始) name: dubbo port: -1 #dubbo协议缺省端口为20880,rmi协议缺省端口为1099,http和hessian协议缺省端口为80;如果没有配置port,则自动采用默认端口,如果配置为-1,则会分配一个没有被占用的端口。Dubbo 2.4.0+,分配的端口在协议缺省端口的基础上增长,确保端口段可控 registry: #其中前缀spring-cloud说明:挂载到 Spring Cloud注册中心 address: spring-cloud://119.3.107.157:8848 # address: spring-cloud://localhost #dubbo服务注册端口,注册中心服务器地址,如果地址没有端口缺省为9090,同一集群内的多个地址用逗号分隔,如:ip:port,ip:port cloud: subscribed-services: rapid-user-service
3.调用api接口,实现dubbo
package com.cloud.rapid.company.web.controller.dubbo; import com.cloud.rapid.common.security.annotation.Inner; import com.cloud.rapid.user.service.api.dubbo.TestService; import lombok.extern.slf4j.Slf4j; import org.apache.dubbo.config.annotation.Reference; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/test") @Slf4j public class TestController { @Reference private TestService testService; @Inner @PostMapping("/cjq") public String test() { String str = testService.test("cjq"); log.info("str:{}", str); return str; } }
四、备注
1.dubbo中在消费方和服务方都配置超时时间timeout的情况,会以消费方(controller)的设置的timeout时间为准。
2.dubbo和feign的区别:
相同点:Dubbo 与 Feign 都依赖注册中心、负载均衡。
不同点:
1、协议
Dubbo:
支持多传输协议(Dubbo、Rmi、http、redis等等),可以根据业务场景选择最佳的方式。非常灵活。
默认的Dubbo协议:利用Netty,TCP传输,单一、异步、长连接,适合数据量小、高并发和服务提供者远远少于消费者的场景。
Feign:
基于Http传输协议,短连接,不适合高并发的访问。
2、负载均衡
Dubbo:
支持4种算法(随机、轮询、活跃度、Hash一致性),而且算法里面引入权重的概念。
配置的形式不仅支持代码配置,还支持Dubbo控制台灵活动态配置。
负载均衡的算法可以精准到某个服务接口的某个方法。
Feign:
只支持N种策略:轮询、随机、ResponseTime加权。
负载均衡算法是Client级别的。
3、容错策略
Dubbo:
支持多种容错策略:failover、failfast、brodecast、forking等,也引入了retry次数、timeout等配置参数。
Feign:
利用熔断机制来实现容错的,处理的方式不一样。
比较项 | Feign(RESTful) | Dubbo |
---|---|---|
通讯协议 | HTTP | 默认Dubbo协议 |
性能 | 略低 | 较高 |
灵活度 | 高 | 低 |