前言:

  由于系统升级,之前的员工数据库(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. 用shell脚本守护后台进程

    假如现在在 crond 中添加了一个每分钟执行的定时任务如下: */ * * * * root cd /data/sbin; sh test.sh >/dev/>& 为了防止上一个 ...

  2. 3ds max学习笔记(二)--查看视点

    查看视点 文件 --打开 --指南文件--坦克(.max文件即可) 1.利用透视图(和眼睛看到的世界很相似)查看 2.alt+w :最大化显示(最大化视角切换按钮: ) 3.缩放视点:滚动鼠标滚轮;匀 ...

  3. Map集合架构总结

    说明;这里先学习Map集合,然后再学习Set集合,是因为Set集合中的HashSet依赖于hashMap,就是通过hashMap集合来实现的,TreeSet集合依赖于TreeMap集合,TreeSet ...

  4. nullptr/NULL

    NULL vs nullptr 在过去,我们如果要表示一个指针为空,我们条件反射肯定会这么写: int *p = NULL; 然而啊,有没有想过这是有问题的,比如下面的这段代码: #include & ...

  5. xcode9上传app时报错iTunes Store operation failed 解决方案

    问题 上传至itunes Connect时报了两个错: iTunes Store Operation Failed ERROR ITMS-xxxxx:"description length: ...

  6. win10电脑录教学视频的时候有回声或者通话的时候有回声,严重干扰录制效果,解决方式。

    1.右键点击屏幕右下脚的小喇叭图标. 2.选择声音. 3.选择“录制”,出现如下 4.选择侦听 5.把侦听此设备 的打勾去掉.然后点击应用,点击确定,即可. 再也没有回声的烦恼了.

  7. JAVA自学笔记04

    JAVA自学笔记04 1.switch语句 1)格式:switch(表达式){ case 值1: 语句体1; break; case 值2: 语句体2; break; - default: 语句体n+ ...

  8. .Net转Java.02.数据类型

    .NET中常见的数据类型分类分别是值类型和引用类型 值类型包括(基元类型.struct.枚举) 引用类型包括(类.类.数组.接口.指针) Java分为,基本类型和类   C#   Java   值类型 ...

  9. 前端 使用 crypto-js 对数据进行对称加密

    From:  https://www.cnblogs.com/CyLee/p/7216988.html 传送门: # crypto-js github https://github.com/brix/ ...

  10. SSE图像算法优化系列二十五:二值图像的Euclidean distance map(EDM)特征图计算及其优化。

    Euclidean distance map(EDM)这个概念可能听过的人也很少,其主要是用在二值图像中,作为一个很有效的中间处理手段存在.一般的处理都是将灰度图处理成二值图或者一个二值图处理成另外一 ...