
本节我们模拟一个简单的业务场景
* 系统管理员为某个用户重置密码,密码重置之后将重置的密码通过短信发送给用户
* 重置密码的业务定义在aservice-rbac中,服务端点为“/sysuser/pwd/reset”
* 短信发送业务定义在awervice-sms中,服务端点为“/sms/send”(在《通用微服务初始化模块构建》章节中3.3中定义的发短信的接口函数,需要先回头去看一下,再看本节的内容)
基础原理说明:
为了在aservice-rbac中更方便的调用远程服务,我们使用OpenFeign。它能使我们**像调用本地函数一样调用远程服务api**。是目前(2020年4月2日)结合Spring Cloud实现微服务,最简单、适配效果最好的远程服务调用方法。后面章节会详细讲解
## 一、服务调用者基础配置(aservice-rbac)
通过maven坐标引入OpenFeign
~~~
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
~~~

## 二、服务调用者业务实现(aservice-rbac)
### 2.1.远程服务伪装(feign)

在aservice-rbac本地服务中,伪装一个aervice-sms远程服务api接口。我们选择伪装《通用微服务初始化模块构建》章节中3.3中定义的发短信的Controller方法(几乎是将方法定义原样搬过来)。
~~~
@FeignClient("ASERVICE-SMS")
public interface SmsService {
@PostMapping(value = "/sms/send")
AjaxResponse send(@RequestParam("phoneNo") String phoneNo,
@RequestParam("content") String content);
}
~~~
注意
* "ASERVICE-SMS"决定了我们要在当前服务中调用哪一个远程服务,"ASERVICE-SMS"是远程服务的名称([spring.application.name](http://spring.application.name/))转大写,而且必须是大写。
* 接口抽象方法定义决定了我们要远程调用"ASERVICE-SMS"中的哪一个api,该抽象方法的定义就是一个"伪装"。将远程服务方法伪装成本地方法。
### 2.2.像调用本地服务一样调用伪装之后的远程服务
aservice-rbac中密码重置api的控制层定义如下:
~~~
@RestController
@RequestMapping("/sysuser")
public class SysuserController {
@Resource
private SysuserService sysuserService;
@PostMapping(value = "/pwd/reset")
public AjaxResponse pwdreset(@RequestParam Integer userId) {
sysuserService.pwdreset(userId);
return AjaxResponse.success("重置密码成功!");
}
}
~~~
服务层定义如下:SysuserService调用伪装之后的远程服务smsService.send,代码中的最后一行(其他的代码内容是从数据库sys\_config配置中取出默认密码,并对userId所代表的用户重置默认密码)。
~~~
@Resource
private SmsService smsService;
/**
* 根据用户的userId重置该用户的密码
* @param userId
*/
public void pwdreset(Integer userId){
if(userId == null){
throw new CustomException(CustomExceptionType.USER_INPUT_ERROR,
"重置密码必须带主键");
}else{
SysUser sysUser = sysUserMapper.selectByPrimaryKey(userId);
//去数据库sys_config表加载用户初始化默认密码,key为user.init.password
String defaultPwd = dbLoadSysConfig.getConfigItem("user.init.password");
sysUser.setPassword(passwordEncoder.encode(defaultPwd));
//更新该用户密码为默认初始化密码
sysUserMapper.updateByPrimaryKeySelective(sysUser);
//看上去就像是本地调用smsService接口方法,实际是发送http请求调用远程服务
smsService.send(sysUser.getPhone(),"您好,管理员已经将您的密码重置为" + defaultPwd);
}
}
~~~
## 三、业务测试
> 本测试用例,将贯穿我们微服务系统知识讲解的始终,一定把该测试用例记清楚。业务逻辑:根据用户的userId重置该用户的密码,代码如上文所示。(默认密码是配置信息,最开始存储在sys\_config表里面,等我们学了配置中心,就把它放到配置中心里面)
首先数据库里面sys\_user表里面有一条id=1的数据(《持久层模块单独拆分》里面的SQL脚本执行一下。如果SQL数据中该用户没有手机号,手动配置一下手机号。因为我们要模拟发短信,否则报错)

使用postman完成进行测试,向**aservice-rbac服务**的“/sysuser/pwd/reset”端点发送请求:重置密码业务。请求响应结果如下:

**aservice-rbac服务代码中远程调用了aservice-sms的短信发送接口**,所以aservice-sms(短信发送服务提供者)的服务控制台打印,该控制台内容的打印:

因为我们在《通用微服务初始化模块构建》章节中3.3中定义的发短信的接口函数中定义了控制台的打印信息。
- 文档简介
- 模块与代码分支说明
- dongbb-cloud项目核心架构
- 微服务架构进化论
- SpringBoot与Cloud选型兼容
- Spring Cloud组件的选型
- 单体应用拆分微服务
- 单体应用与微服务对比
- 微服务设计拆分原则
- 新建父工程及子模块框架
- 通用微服务初始化模块构建
- 持久层模块单独拆分
- 拆分rbac权限管理微服务
- Hello-microservice
- 构建eureka服务注册中心
- 向服务注册中心注册服务
- 第一个微服务调用
- 远程服务调用
- HttpClient远程服务调用
- RestTemplate远程服务调用
- RestTemplate多实例负载均衡
- Ribbon调用流程源码解析
- Ribbon负载均衡策略源码解析
- Ribbon重试机制与饥饿加载
- Ribbon自定义负载均衡策略
- Feign与OpenFeign
- Feign设计原理源码解析
- Feign请求压缩与超时等配置
- 服务注册与发现
- 白话服务注册与发现
- DiscoveryClient服务发现
- Eureka集群环境构建(linux)
- Eureka集群多网卡环境ip设置
- Eureka集群服务注册与安全认证
- Eureka自我保护与健康检查
- 主流服务注册中心对比(含nacos)
- zookeeper概念及功能简介
- zookeeper-linux集群安装
- zookeeper服务注册与发现
- consul概念及功能介绍
- consul-linux集群安装
- consul服务注册与发现
- 通用-auatator导致401问题
- 分布式配置中心-apollo
- 服务配置中心概念及使用场景
- apollo概念功能简介
- apollo架构详解
- apollo分布式部署之Portal
- apollo分布式部署之环境区分
- apollo项目权限管理实战
- apollo-java客户端基础
- apollo与SpringCloud服务集成
- apollo实例配置热更新
- apollo命名空间与集群
- apollo灰度发布(日志热更新为例)
- SpringCloudConfig配置中心
- config-git配置文件仓库
- config配置中心搭建与测试
- config客户端基础
- config配置安全认证
- config客户端配置刷新
- config配置中心高可用
- BUS消息总线
- bus消息总线简介
- docker安装rabbitMQ
- 基于rabbitMQ的消息总线
- bus实现批量配置刷新
- alibaba-nacos
- nacos介绍与单机部署
- nacos集群部署方式(linux)
- nacos服务注册与发现
- nacos服务注册中心详解
- nacos客户端配置加载
- nacos客户端配置刷新
- nacos服务配置隔离与共享
- nacos配置Beta发布
- 服务熔断降级hystrix
- 服务降级&熔断&限流
- Hystrix集成并实现服务熔断
- Jemter模拟触发服务熔断
- Hystrix服务降级fallback
- Hystrix结合Feign服务降级
- 远程服务调用异常传递的问题
- Hystrix-Feign异常拦截与处理
- Hystrix-DashBoard单服务监控
- Hystrix-dashboard集群监控
- 分布式系统流量卫兵sentinel
- sentinel简介与安装
- 客户端集成与实时监控
- 实战流控规则-QPS限流
- 实战流控规则-线程数限流
- 实战流控规则-关联限流
- 实战流控规则-链路限流
- 实战流控效果-WarmUp
- 实战流控效果-匀速排队
- BlockException处理
- 实战熔断降级-RT
- 实战熔断降级-异常数与比例
- DegradeException处理
- 注解与异常的归纳总结
- Feign降级及异常传递拦截
- 动态规则nacos集中存储
- 热点参数限流
- 系统自适应限流
- 微服务网关-GateWay
- 还有必要学习Zuul么?
- 简介与非阻塞异步IO模型
- GateWay概念与流程
- 新建一个GateWay项目
- 通用Predicate的使用
- 自定义PredicateFactory
- 编码方式构建静态路由
- Filter过滤器介绍与使用
- 自定义过滤器Filter
- 网关请求转发负载均衡
- 结合nacos实现动态路由配置
- 整合Sentinel实现资源限流
- 跨域访问配置
- 网关层面全局异常处理
- 微服务网关安全认证-JWT篇
- Gateway-JWT认证鉴权流程
- 登录认证JWT令牌颁发
- 全局过滤器实现JWT鉴权
- 微服务自身内部的权限管理
