SpringCloud服務調用Dubbo集成
開門見山, 這篇文章就是通過Spring Cloud Alibaba dubbo組件來實現服務調用的.
如果拿 Netflix 那一套來比較, Dubbo提供更好的服務治理 與 更優的性能
Dubbo = Ribbon + Feign
上一篇文章我們講到Nacos, 那我就勉強用Nacos 作為注冊中心吧
快速集成
先說明, 大多數情況都存在一個服務節點即是Consumer 又是 Client
maven配置
pom文件中引入如下依賴
<properties>
<spring.boot.version>2.2.4.RELEASE</spring.boot.version>
<spring.cloud.version>Hoxton.SR2</spring.cloud.version>
<spring.cloud.alibaba.version>2.2.0.RELEASE</spring.cloud.alibaba.version>
</properties>
<dependencyManagement>
<dependencies>
<!--spring cloud-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>${spring.boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring.cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring.cloud.alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<!--spring cloud-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>${spring.boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring.cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring.cloud.alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
application.yaml 配置
spring:
application:
name: barm-archetypes
cloud:
nacos: # 注冊中心
discovery:
server-addr: 127.0.0.1:8848
dubbo:
scan:
base-packages: com.barm.archetypes.core.provider # Dubbo 服務實現類的掃描基准包
protocols: # 服務暴露的協議配置
dubbo:
name: dubbo # 選用 dubbo 協議
port: -1 # 協議端口, -1 表示從 20880 開始自增端口
registry: # Dubbo 服務注冊中心配置, 對應 RegistryConfig 類
address: spring-cloud://127.0.0.1:8848
cloud:
subscribed-services: '' # 訂閱應用列表, 默認為 * 訂閱所有應用
provider: # Dubbo 服務端配置
cluster: failfast # 集群方式,可選: failover/failfast/failsafe/failback/forking
retries: 0 # 遠程服務調用重試次數, 不包括第一次調用, 不需要重試請設為0
timeout: 600000 # 遠程服務調用超時時間(毫秒)
token: true # 令牌驗證, 為空表示不開啟, 如果為true, 表示隨機生成動態令牌
dynamic: true # 服務是否動態注冊, 如果設為false, 注冊后將顯示后disable狀態, 需人工啟用, 並且服務提供者停止時, 也不會自動取消冊, 需人工禁用.
delay: -1 # 延遲注冊服務時間(毫秒)- , 設為-1時, 表示延遲到Spring容器初始化完成時暴露服務
version: 1.0.0 # 服務版本
filter: -exception # 服務提供方遠程調用過程攔截器名稱, 多個名稱用逗號分隔
consumer: # Dubbo 消費端配置
check: false
validation: true # 是否啟用JSR303標准注解驗證, 如果啟用, 將對方法參數上的注解進行校驗
version: 1.0.0 # 默認版本
server:
port: 8083
- spring.cloud.nacos : 注冊中心配置, 默認使用 spring.applicatrion.name 作為注冊服務名
- dubbo配置項
- scan.base-packages: Dubbo 服務實現類的掃描基准包
- protocols: 服務暴露的協議配置
- registry.address: Dubbo 服務注冊中心配置
- cloud.subscribed-services: 訂閱的服務列表, 默認為 * 訂閱所有應用
- provider: Dubbo 服務端配置, 詳情見 dubbo官方文檔>schema配置參考手冊> dubbo:provider
- consumer: Dubbo 消費端配置dubbo官方文檔>schema配置參考手冊> dubbo:consumer
provider端代碼端代碼
-
api項目目錄

package com.barm.archetypes.api.domain.dto.result;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* @author Allen
* @version 1.0.0
* @description 用戶主表DTO
* @create 2020/3/6 21:27
* @e-mail allenalan@139.com
* @copyright 版權所有 (C) 2020 allennote
*/
@Data
public class UserMainDTO implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 主鍵
*/
private Long id;
/**
* 用戶ID
*/
private Long userId;
/**
* 用戶名
*/
private String username;
/**
* 密碼
*/
private String password;
/**
* 昵稱
*/
private String nickname;
/**
* 創建人
*/
private String createBy;
/**
* 修改人
*/
private String modifyBy;
/**
* 創建時間
*/
private LocalDateTime gmtCreate;
/**
* 修改時間
*/
private LocalDateTime gmtModify;
/**
* 版本號
*/
private Long version;
/**
* 邏輯刪 0 未刪除 1 已刪除
*/
private Boolean deleted;
/**
* 冗余
*/
private String extend;
}
package com.barm.archetypes.api.domain.dto.spec;
import com.barm.common.domain.dto.spec.PageSpec;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import javax.validation.constraints.NotNull;
import java.time.LocalDateTime;
/**
* @author Allen
* @version 1.0.0
* @description UserMainPageSpec
* @create 2020/3/16 13:59
* @e-mail allenalan@139.com
* @copyright 版權所有 (C) 2020 allennote
*/
@Data
@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = true)
public class UserMainSpec extends PageSpec {
private static final long serialVersionUID = 1L;
/** 昵稱*/
private String nickname;
/** 用戶名*/
@NotNull(message = "用戶名不能為空")
private String username;
/** 修改時間*/
private LocalDateTime gmtModify;
}
package com.barm.archetypes.api.provider;
import com.barm.archetypes.api.domain.dto.result.UserMainDTO;
import com.barm.archetypes.api.domain.dto.spec.UserMainSpec;
import com.github.pagehelper.PageInfo;
public interface UserMainProvider {
PageInfo<UserMainDTO> page(UserMainSpec spec);
}
-
服務實現類目錄

package com.barm.archetypes.core.provider.impl;
import com.barm.archetypes.api.domain.dto.result.UserMainDTO;
import com.barm.archetypes.api.domain.dto.spec.UserMainSpec;
import com.barm.archetypes.api.provider.UserMainProvider;
import com.barm.archetypes.core.domain.assembler.UserMainMapping;
import com.barm.archetypes.data.domain.db.UserMainDO;
import com.barm.archetypes.data.domain.mapper.UserMainDOMapper;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.apache.dubbo.config.annotation.Service;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.List;
/**
* @author Allen
* @version 1.0.0
* @description UseMainProviderImpl
* @create 2020/3/16 14:32
* @e-mail allenalan@139.com
* @copyright 版權所有 (C) 2020 allennote
*/
@Service
@Component
public class UserMainProviderImpl implements UserMainProvider {
@Resource
private UserMainDOMapper userMainDOMapper;
@Resource
private UserMainMapping userMainMapping;
@Override
public PageInfo<UserMainDTO> page(UserMainSpec spec) {
PageHelper.startPage(spec.getPage(), spec.getPageSize());
UserMainDO params = userMainMapping.specToDO(spec);
List<UserMainDO> list = userMainDOMapper.findByAll(params);
return new PageInfo(userMainMapping.toDTO(list));
}
}
持久層代碼自行腦補吧. 嘿嘿嘿
consumer端代碼
我們可以通過上面的配置生出一個項目腳手架, 通過腳手架構建一個消費服務的項目,參考以前的文章
隨手寫個SpringBoot的Maven腳手架
- 引入provider-api依賴
<dependency>
<groupId>com.barm.archetypes</groupId>
<artifactId>archetypes-api</artifactId>
<version>1.0.1-RELEASE</version>
</dependency>
- application.yaml 配置
cloud:
subscribed-services: barm-archetypes
version: 1.0.0
- consumer項目路徑

package com.barm.order.core.facade;
import com.barm.archetypes.api.domain.dto.result.UserMainDTO;
import com.barm.archetypes.api.domain.dto.spec.UserMainSpec;
import com.github.pagehelper.PageInfo;
public interface UserMainService {
PageInfo<UserMainDTO> page(UserMainSpec spec);
}
package com.barm.order.core.facade.impl;
import com.barm.archetypes.api.domain.dto.result.UserMainDTO;
import com.barm.archetypes.api.domain.dto.spec.UserMainSpec;
import com.barm.archetypes.api.provider.UserMainProvider;
import com.barm.order.core.facade.UserMainService;
import com.github.pagehelper.PageInfo;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.stereotype.Service;
/**
* @author Allen
* @version 1.0.0
* @description UserMainServiceImpl
* @create 2020/3/16 21:15
* @e-mail allenalan@139.com
* @copyright 版權所有 (C) 2020 allennote
*/
@Service
public class UserMainServiceImpl implements UserMainService {
@Reference
private UserMainProvider userMainProvider;
@Override
public PageInfo<UserMainDTO> page(UserMainSpec spec){
return userMainProvider.page(spec);
}
}
- controller 接口
package com.barm.order.server.controller;
import com.barm.archetypes.api.domain.dto.spec.UserMainSpec;
import com.barm.common.domain.vo.ResultVO;
import com.barm.order.core.facade.UserMainService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
/**
* @author Allen
* @version 1.0.0
* @description UserMainController
* @create 2020/3/16 21:17
* @e-mail allenalan@139.com
* @copyright 版權所有 (C) 2020 allennote
*/
@RestController
public class UserMainController {
@Resource
private UserMainService userMainService;
@GetMapping("page")
public ResultVO page(UserMainSpec spec){
return new ResultVO(userMainService.page(spec));
}
}
啟動
- 啟動注冊中心nacos
docker start nacos
- 啟動 provider 服務


- 啟動 consumer 服務
測試結果

寫在最后
dubbo在國內普及度還是挺廣的. 相信springcloudalibaba 能SpringCloud多一個更好的選擇.
歡迎關注, 評論, 點贊, 轉發, 收藏~

