企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持知识库和私有化部署方案 广告
![](https://img.kancloud.cn/65/c3/65c3e838f7c3803aae4cee483051bb1a_1060x510.png) 本节我们模拟一个简单的业务场景 * 系统管理员为某个用户重置密码,密码重置之后将重置的密码通过短信发送给用户 * 重置密码的业务定义在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> ~~~ ![](https://img.kancloud.cn/4b/e9/4be999cc5d23b80000d80cd19d92bcaf_678x198.png) ## 二、服务调用者业务实现(aservice-rbac) ### 2.1.远程服务伪装(feign) ![](https://img.kancloud.cn/11/f6/11f6ebf3c788a95f044f0a4f04c073d5_362x310.png) 在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数据中该用户没有手机号,手动配置一下手机号。因为我们要模拟发短信,否则报错) ![](https://img.kancloud.cn/df/0b/df0b665e2270a63b83b009d2bd20f34d_1300x88.png) 使用postman完成进行测试,向**aservice-rbac服务**的“/sysuser/pwd/reset”端点发送请求:重置密码业务。请求响应结果如下: ![](https://img.kancloud.cn/45/c8/45c8626b345e8773345b6ced0fbf7cc7_1432x607.png) **aservice-rbac服务代码中远程调用了aservice-sms的短信发送接口**,所以aservice-sms(短信发送服务提供者)的服务控制台打印,该控制台内容的打印: ![](https://img.kancloud.cn/e6/89/e6897c0cbea12cbd2399e3b81f9883d1_758x106.png) 因为我们在《通用微服务初始化模块构建》章节中3.3中定义的发短信的接口函数中定义了控制台的打印信息。