自定义头部 -->

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

posted @ 2020-03-21 23:05  AllenAlan  阅读(9059)  评论(0编辑  收藏  举报