記一次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協議 |
性能 | 略低 | 較高 |
靈活度 | 高 | 低 |