前言:

  由于系统升级,之前的员工数据库(mongo库)被弃用,改为用python维护的mysql库,其他系统访问通过http请求,表结构对外不可见,其他系统之前对员工mongo库的依赖要解除。每套系统都去写请求的接口太麻烦,所以打算写一个员工查询服务,http请求用原生的FeignClient实现。

实现思路:

  场景:python端只提供了查询所有员工,其他系统请求多种多样。

  解决:请求接口 -->  查询所有员工  -->  FeignClient包装的http请求  -->  过滤条件

实现步骤演示:

  • Feign包装的http请求:
 /**
* 对外暴露接口.
*/
@FeignClient(name = XXXXClientConfig.APPLICATION_NAME, url = "https://xx.xxxx.com")
public interface IEmployService { @RequestMapping(value = "/xx/employee/search",
headers = {"Content-Type=application/json",
"App-Id=xxx",
"App-Secret=xxxx"})
@ResponseBody
ReturnUser getAllUser(@RequestBody GetAllUserForm getAllUserForm); }
  • 员工服务接口:
 @FeignClient(XXXXConfig.APPLICATION_NAME)
public interface IUserService { @RequestMapping(value = "/xxxx/getAll", method = RequestMethod.GET)
List<User> getAll(); @RequestMapping(value = "/xxxx/getUserByIds", method = RequestMethod.POST)
List<User> getUserByIds(@RequestBody List<String> userIds); @RequestMapping(value = "/xxxx/getById", method = RequestMethod.GET)
User getById(@RequestParam(value = "userId") String userId); @RequestMapping(value = "/xxxx/getByQuery", method = RequestMethod.POST)
List<User> getByQuery(@RequestBody UserQuery userQuery);
}
  • 员工服务实现:
 @RestController
public class UserSearchService implements IUserService {
private final static Logger log = LoggerFactory.getLogger("xxx");
private List<User> users = null;
private Long lastTime = null;
@Resource
private IEmployService employService; @Override
public List<User> getAll() {
if(users != null && users.size() > 0 && lastTime != null && (System.currentTimeMillis() - lastTime) <= 1000*60*10){
return users;
}
try {
GetAllUserForm form = new GetAllUserForm();
form.setPageNo(1);
form.setPageSize(99999);
ReturnUser allUser = employService.getAllUser(form);
users = new ArrayList<>();
allUser.getData().getRecords().forEach(returnUser -> {
User user = getUserFromReturnUser(returnUser);
users.add(user);
});
lastTime = System.currentTimeMillis();
return users;
}catch (Exception e){
if(users.size() > 0){
return users;
}else {
throw new RuntimeException("getAll(): user is null");
}
}
} @Override
public List<User> getUserByIds(@RequestBody List<String> userIds) {
List<User> all = getAll();
List<User> users = all.stream().filter(user -> userIds.contains(user.getId())).collect(Collectors.toList());
return users;
} @Override
public User getById(@RequestParam(value = "userId") String userId) {
List<User> all = getAll();
List<User> users = all.stream().filter(user -> user.getId().equals(userId))
.collect(Collectors.toList());
return users.size() == 1? users.get(0):null;
} @Override
public List<User> getByQuery(@RequestBody UserQuery userQuery) {
List<User> list = new ArrayList<>();
getAll().stream().filter(user -> {
if (CommonUtil.isNotBlank(userQuery.getName())) {
if (!userQuery.getName().equals(user.getName()) &&
!userQuery.getName().equals(user.getRealName())) {
return false;
}
}
if (CommonUtil.isNotBlank(userQuery.getKeyword())) {
if (!user.getName().contains(userQuery.getKeyword()) &&
!user.getRealName().contains(userQuery.getKeyword())) {
return false;
}
}
if (userQuery.getIds() != null) {
if (!userQuery.getIds().contains(String.valueOf(user.getNumber()))) {
return false;
}
}
return true;
}).forEach(user -> {
list.add(user);
});
return list;
} private User getUserFromReturnUser(Employee returnUser) {
User user = new User();
user.setName(returnUser.getName());
return user;
} }
  • springboot启动添加

      @EnableFeignClients(basePackages = {XXXXClientConfig.PACKAGE_PATH}) 

基于FeignClient提供简单的用户查询服务的更多相关文章

  1. 九、frp对外提供简单的文件访问服务

    通过 static_file 插件可以对外提供一个简单的基于 HTTP 的文件访问服务.类似于http的文件索引! 服务端frps.ini配置[common]bind_addr = 0.0.0.0bi ...

  2. C++ 容器的综合应用的一个简单实例——文本查询程序

    C++ 容器的综合应用的一个简单实例——文本查询程序 [0. 需求] 最近在粗略学习<C++ Primer 4th>的容器内容,关联容器的章节末尾有个很不错的实例.通过实现一个简单的文本查 ...

  3. GraphQL介绍&使用nestjs构建GraphQL查询服务

    GraphQL介绍&使用nestjs构建GraphQL查询服务(文章底部附demo地址) GraphQL一种用为你 API 而生的查询语言.出自于Facebook,GraphQL非常易懂,直接 ...

  4. 基于Servlet、JSP、JDBC、MySQL的一个简单的用户注冊模块(附完整源代码)

    近期看老罗视频,做了一个简单的用户注冊系统.用户通过网页(JSP)输入用户名.真名和password,Servlet接收后通过JDBC将信息保存到MySQL中.尽管是个简单的不能再简单的东西,但麻雀虽 ...

  5. 基于CentOS与VmwareStation10搭建Oracle11G RAC 64集群环境:2.搭建环境-2.10.配置用户NTF服务

    2.10.配置用户NTF服务 2.10.1.配置节点RAC1 1) [root@linuxrac1 sysconfig]#sed -i 's/OPTIONS/#OPTIONS/g' /etc/sysc ...

  6. 【分布式】-- 基于Nacos、OpenFeign搭建的微服务抽奖系统后台小案例

    1.项目介绍 最近入项目之前要求熟悉一下SpringCloud Nacos微服务基于Feign接口调用并整合Swagger2进行接口文档展示给前端,所以自己按照要求来编写并整合了一套基于SpringC ...

  7. MaxCompute,基于Serverless的高可用大数据服务

    摘要:2019年1月18日,由阿里巴巴MaxCompute开发者社区和阿里云栖社区联合主办的“阿里云栖开发者沙龙大数据技术专场”走近北京联合大学,本次技术沙龙上,阿里巴巴高级技术专家吴永明为大家分享了 ...

  8. 用.net访问电子枢纽信用中心的数据查询服务

    概要说明 电子枢纽全称国家交通运输物流公共信息平台,主要提供物流及生产企业进行物流相关数据交换的标准和API,详细介绍可参考其官网www.logink.org,本文假定阅读者对该平台已有了解,并已成功 ...

  9. 基于Solr的HBase多条件查询测试

    背景: 某电信项目中采用HBase来存储用户终端明细数据,供前台页面即时查询.HBase无可置疑拥有其优势,但其本身只对rowkey支持毫秒级 的快 速检索,对于多字段的组合查询却无能为力.针对HBa ...

随机推荐

  1. Yii2 DetailView小部件

    DetailView小部件 Yii 提供了一套数据库小部件 widgets,这些小部件可以用于显示数据 DetailView 小部件用于显示一条记录数据 ListView 和 GridView 可以用 ...

  2. java第二周的学习知识4(对原码,补码,反码和java中浮点数计算不准确的总结)

    原码:一个正数,转换为二进制位就是这个正数的原码.负数的绝对值转换成二进制位然后在高位补1就是这个负数的原码. 但是原码有几个缺点,零分两种 +0 和 -0 .很奇怪是吧!还有,在进行不同符号的加法运 ...

  3. pygame-KidsCanCode系列jumpy-part12-platform图片

    目前为止,Player的站立.行走.跳跃都是动画了,只有跳板(即:Platform类)还是难看的矩形,这节我们把Platform也换成图片: 原来的Platform类长这个样子: class Plat ...

  4. 宿主机系统 Deepin 15.4,解决 Virtualbox 5.1 中 XP虚拟机无法使用 USB设备(如:U盘、罗技优联接收器等)的问题

    软件环境 宿主机系统:Deepin 15.4.1, 虚拟机软件:VirtualBox 5.1 虚拟机系统:XP 操作步骤如下: (1)  安装 Virtualbox Extension Pack 进入 ...

  5. 初始化bootstrap treeview树节点

    最近在做启明星图库时,使用了Jquery Bootstrap  Treeview插件.但是,遇到了一个初始化的问题.先看效果如下: 当用户打开图库时,左边分类第一个类别是“所有分类”,默认需要选中. ...

  6. 浅谈MFC类CrackMe中消息处理函数查找方法

    最近一个学姐发给我了一份CrackMe希望我解一下,其中涉及到了MFC的消息函数查找的问题,就顺便以此为例谈一下自己使用的消息函数查找的方法.本人萌新,如果有任何错漏与解释不清的地方,欢迎各路大佬指正 ...

  7. Docker Mysql数据库双主同步配置方法

    一.背景 可先查看第一篇<Docker Mysql数据库主从同步配置方法>介绍 二.具体操作 1.创建目录(~/test/mysql_test1): --mysql --mone --da ...

  8. Native App开发 与Web App开发(原生与web开发优缺点)

    Native App开发 Native App开发即我们所称的传统APP开发模式(原生APP开发模式),该开发针对IOS.Android等不同的手机操作系统要采用不同的语言和框架进行开发,该模式通常是 ...

  9. 抽奖活动 mark

    ).prizeName().remainingPrize().prizeRate().prizeName().remainingPrize().prizeRate().prizeName().rema ...

  10. 物联网架构成长之路(28)-Docker练习之MQ中间件(Kafka)

    0. 前言 消息队列MQ,这个在一般的系统上都是会用到的一个中间件,我选择Kafka作为练手的一个中间件,Kafka依赖Zookeeper.Zookeeper安装上一篇博客已经介绍过了. 1. Kaf ...