通过Spring Cloud Alibaba 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
- 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多一个更好的选择.