SpringCloud服務調用Dubbo集成


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

provider端代碼端代碼

  • api項目目錄

    provider

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);

}
  • 服務實現類目錄

    providerimpl

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項目路徑

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 服務

provider

providerInfo

  • 啟動 consumer 服務

測試結果

test

寫在最后

dubbo在國內普及度還是挺廣的. 相信springcloudalibaba 能SpringCloud多一個更好的選擇.

源碼地址: https://github.com/AllenAlan/barm

歡迎關注, 評論, 點贊, 轉發, 收藏~

30vtGq.gif


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM