首页 文章 精选 留言 我的

精选列表

搜索[异步扫描],共10000篇文章
优秀的个人博客,低调大师

重磅消息:Dromara团队正式开源高性能异步API网关-Soul

微服务为什么需要网关? 微服务的流行,服务之间的调用,需要统一的请求标准。 微服务接口,需要监控,限流,熔断,等等。 微服务接口需要统一的鉴权。 接口问题定位 A/B test等等。太多功能了,就不一一列举了。 Soul是什么? soul 是一款高性能,响应式的网关。我在参考Kong 的插件设计思想,高性能的webflux后,开发而来。 官网 : https://dromara.org 如果打不开,改成http即可. github地址 :https://github.com/Dromara/soul gitee地址: https://gitee.com/shuaiqiyu/soul Soul架构设计 执行流程图 Soul功能: 支持各种语言,无缝集成Dubbo,SpringCloud,以及http服务。 丰富的插件支持,监控,鉴权,限流,熔断,代理,防火墙等等。 网关多种规则动态配置,支持各种策略配置。 插件热插拔,易扩展。 支持集群部署,支持A/B Test。 当然也有很多其他的功能,就不一一说了。 Soul 最大的亮点? 插件的热插拔,规则的动态配置。举个列子,比如一个接口你限流是1秒50次,但是你想调小点,像Springcloud-gateway 或者zuul 是不是还得改动配置 然后重启。 soul则不需要,直接在soul-admin找到对应的接口修改即可. soul提供了比较丰富的插件功能,插件与插件规则,选择器,用户可以自由定义 不想用就停用或者删除就行。想用就开启或者新增。 soul 是基于webflux的, 依赖rxJava ,其实高性能的,响应式的网关。 soul 提供了dubbo ,springcloud rpc框架的支持。 Soul适合人群 是适合所有的微服务系统。 后端是java,使用了一些rpc框架(dubbo,springcloud), 然后前端或者其他系统是 .net php 然后需要对接? 然后你问java 后端开发者,dubbo接口怎么调用? java 狗肯定不愿意给你提供http接口,或者直接回一句,你去找领导吧? 这个时候,你只需要告诉它,使用soul,你后端代码一句都不要动,只需要告诉我你zookeeper的地址就好! 当然也适合一些其他语言的系统,或者是老系统。 只要你是http服务就行,soul会进行代理请求调用。 Soul性能 soul 天然支持集群部署,底层采用webflux。 soul 所有的配置走的都是本地缓存。 双11,我们的高峰单台QPS 1W左右。 Soul VS java体系的Zuul,springcloud-gateway 性能上来说,soul和sc-gateway 都采用webflux,性能相当 sc-gateway 或者zuul 基于配置的,接口很多很难集成,而且配置规则不是动态化的。 soul是插件化的思想,插件热插拔,配置灵活并且是动态化的。 soul还可以用来排除问题,A/B test。 soul提供了监控插件来统计qps等等信息。 soul提供了waf,sign插件,来阻止外来攻击 soul vs kong kong 也是非常优秀的框架,但是其实lua语言,开发维护成本高,但是soul完全是java,所以javaer你懂的。 篇幅原因,此文只是一个简单介绍,Soul有很大的价值,喜欢的朋友可以去官网详细介绍。也欢迎大家进行star 和fork

优秀的个人博客,低调大师

MP实战系列(十三)之批量修改操作(前后台异步交互)

MyBatis的批量操作其实同MyBatis基本是一样的。并无多大区别,要说区别,除了封装的方法之外,主要就是注解方面的区别,比如@TableId、@TableField、@TableName等等区别。 示例描述: 本次描述的是批量相关的操作,主要是批量修改等操作。 项目讲解:如何批量修改开锁方式? 准备环境和IDE工具:MySQL5.7+Maven3以上+JDK8或者JDK7+SSM框架+tomcat8或者tomcat7应用服务器+Eclipse。 本文核心:主要是Controller代码和数据传输对象和js文件中的test2()方法内的ajax。 其他的只是附加的,便于博主我个人以后回顾比较个人代码风格是否有所进步。我的理想是写一手优雅的代码。 注意:特别是有经验的开发者们,本文核心代码可用供你们参考 一、准备实体 @TableName("`lock`") public class LockEntity implements Serializable { private static final long serialVersionUID = 1L; /** * */ private Integer id; @TableId private String lock_no; @TableField("house_code") private String houseCode; @TableField("room_code") private String roomCode; @TableField("install_time") private String installTime; @TableField("lock_kind") private Integer lockKind; private Integer power; @TableField("power_update_time") private String powerUpdateTime; @TableField("comu_status") private String comuStatus; @TableField("comu_status_update_time") private String comuStatusUpdateTime; private String region; private String address; @TableField("guarantee_time_start") private String guaranteeTimeStart; @TableField("guarantee_time_end") private String guaranteeTimeEnd; private Integer doorsensor; private String description; @TableField("hardware_version") private String hardwareVersion; private Integer type; @TableField("verify_code") private String verifyCode; private String no; @TableField("housing_code") private String housingCode; @TableField("first_open_way") private String firstOpenWay; @TableField("laster_open_way") private String lasterOpenWay; @TableField(value="node_no",exist=false) private String nodeNo; @TableField(value="user_id") private String userId; private Integer status; @TableField(exist=false) private String name; set get方法省略.... } 二、编写DAO public interface LockDao extends BaseMapper<LockEntity> { /** * 批量更新门锁开锁方式 * @param lock * @return */ public void updateLockOpenLockWayInfo(@Param ("lock") List<LockEntity> lock); } xml代码: <!-- 批量更新门锁开锁方式 --> <update id="updateLockOpenLockWayInfo" parameterType="java.util.List"> <foreach collection="lock" item="lock" index="index" separator=";"> update `lock` <set> first_open_way=#{lock.firstOpenWay}, laster_open_way=#{lock.lasterOpenWay} </set> where id=#{lock.id} </foreach> </update> 三、编写Service代码 public interface LockService extends IService<LockEntity> { /** * 批量更新门锁开锁方式 * @param lock * @return */ public void updateLockOpenLockWayInfo(@Param ("lock") List<LockEntity> lock); } 四、编写Service实现类 @Service("lockService") public class LockServiceImpl extends ServiceImpl<LockDao, LockEntity> implements LockService { @Override public void updateLockOpenLockWayInfo(List<LockEntity> lock) { // TODO Auto-generated method stub lockDao.updateLockOpenLockWayInfo(lock); } } 五、Controller代码 @RestController @RequestMapping("/lock") public class LockController { private static Logger logger = Logger.getLogger(LockController.class); @Autowired private LockService lockService; /** * 批量修改开锁方式 * @param openLockWayQueryVoy * @return */ @PostMapping(value="/updateLockOpenLockWayInfo",produces="application/json;charset=utf-8") public Object batchUpdateLockOpenLockWayInfo(@RequestBody OpenLockWayQueryVo openLockWayQueryVo) { Integer ids[]=openLockWayQueryVo.getIds(); String items[]=openLockWayQueryVo.getItems(); String items2[]=openLockWayQueryVo.getItems2(); JSONObject json = new JSONObject(); try { String str=""; for (int i = 0; i < items.length; i++) { if(items[i].equals("on")) { items[i]="0"; }else if(items[i].equals("0")) { items[i]="1"; } str+=items[i]; logger.info("items[i]:"+str); } String str2=""; for (int j = 0; j < items2.length; j++) { if(items2[j].equals("on")) { items2[j]="0"; }else if(items2[j].equals("0")) { items2[j]="1"; } str2+=items2[j]; logger.info("items2[i]:"+str2); } String first=str+"00000"; logger.info("first:"+first); String laster=str2+"00000"; logger.info("laster:"+laster); for (int i = 0; i < ids.length; i++) { logger.info("ids[i]:"+ids[i]); LockEntity lockEntity = new LockEntity(); lockEntity.setId(ids[i]); lockEntity.setFirstOpenWay(first.substring(0,8)); lockEntity.setLasterOpenWay(laster.substring(0,8)); List<LockEntity> list = new ArrayList<LockEntity>(); list.add(lockEntity); //批量修改方法调用 lockService.updateLockOpenLockWayInfo(list); } json.put("returnMsg", "批量修改成功"); json.put("returnCode", "000000"); } catch (Exception e) { e.printStackTrace(); json.put("returnMsg", "批量修改失败"); json.put("returnCode", "111111"); } return json; } } 六、编写数据传输对象 public class OpenLockWayQueryVo{ Integer ids[]; String items[]; String items2[]; set get方法此处省略.... } 七、前端HTML代码 <!DOCTYPE html> <html lang="zh-cmn-Hans"> <head> <!-- <script src="../js/tologin.js"></script> --> <meta charset="UTF-8"> <meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" name="viewport"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" /> <meta name="renderer" content="webkit"> <meta http-equiv="Cache-Control" content="no-siteapp" /> <link type="image/x-icon" href="/../images/fav.ico?rel=1522142498852" rel="shortcut icon"/> <link rel="stylesheet" href="../fonticon/iconfont.css?rel=1522142498852" /> <link rel="stylesheet" href="../css/normalize.min.css?rel=1522142498852"/> <link rel="stylesheet" href="../css/app.min.css?rel=1522142498852"/> <link rel="stylesheet" href="../css/lock-css.min.css?rel=1522142498852"/> <link rel="stylesheet" href="../css/node-css.min.css?rel=1522142498852"/> <link rel="stylesheet" href="../css/common.min.css?rel=1522142498852"/> <link rel="stylesheet" href="../js/limarquee/liMarquee.css"/> <link rel="stylesheet" href="../css/ammeter-css.min.css"/> <link rel="stylesheet" href="../layui/css/modules/layer/default/layer.css" media="all"> <title>批量修改开锁方式</title> <style> #menu li[data-body='lockList'],#menu li[data-body='nodeList'],#menu li[data-body='index']{ display: none; } .yw_list table th { font-size: 12px; background-color: #dcdcdc; height: 36px; line-height: 36px; } .yw_list table td { text-align: center; font-size: 12px; color: #1f2f3e; height: 38px; word-break: break-all; word-wrap: break-word; line-height: 20px; border:1px #ddd solid; } .yw_list table tr:nth-child(odd){background:#f3f3f3;} .yw_list table tr:nth-child(even){background:#fff;} </style> <script src="../js/baiduTemplate.js"></script> <body> <div class="warper" data-body="userManage"> <!--s: sidebar--> <div class="sidebar" id="sidebar"> <a href="javascript:;" id="showBar"><i class="iconfont icon-icon-test15"></i></a> <div class="user-pic"> <div class="user-picn"> <span id="applytop-div-wrap-user" class="applytop-div-wrap" style="background: url('../images/3-30.png') no-repeat center; -webkit-background-size: cover;-moz-background-size: cover;-ms-background-size: cover;background-size: cover;"> </span> <span class="png6"></span> </div> <p id="sidebarName"></p> </div> <ul class="menu" id="menu"> <!--<li data-body="home" style="display: none;"><a class="png6" href="home.html"><em class="iconfont icon-pingtai" style="position: relative;right: -4px;"></em><span>平台主页</span></a></li>--> <li data-body="lockList" style="display: block;"><a class="png6" href="lockList.html"><em class="iconfont icon-icon-test" style="position: relative;right: -4px;"></em><span>智能门锁</span></a></li> <li data-body="nodeList" style="display: block;"><a class="png6" href="nodeList.html"><em class="iconfont icon-icon-test2"></em><span>智能网关</span></a></li> <li data-body="ammeterList" style="display: none;"><a class="png6" href="ammeterList.html"><em class="iconfont icon-dianbiao1" style="vertical-align:middle;font-size:25px"></em><span>智能电表</span></a></li> <li data-body="userManage" class="menu-f" style="display:none;"><a class="png6" href="userManageList.html"><em class="iconfont icon-guanli" style="font-size: 1.8em;position:relative;top:4px;"></em><span style="padding-left:5px;">审批管理</span></a></li> <li data-body="mySet"><a href="mySet.html"><em class="iconfont icon-icon-test1"></em><span>个人中心</span></a></li> <li data-body="index" class="menu-f" style="display: block;"><a class="png6" href="index.html"><em class="iconfont icon-icon-test11"></em><span>统计分析</span></a></li> </ul> </div><!--e: sidebar--> <!--s: toper--> <div class="toper"> <div class="icon"><img src="../images/3-30.png" width="80" height="60" alt=""></div> <div class="loginout" > <a class="png6" href="javascript:;" id="link_loginOut"><i class="iconfont icon-icon-test9"></i><span id="exit">退出</span></a> </div> </div><!--e: toper--> <!--通知--> <div id="pageInfo"><div class="dowebok" id="marTxt"></div></div> <!--s: container--> <div class="container" id="container"> <div class="h60"></div> <!--s: main--> <div class="main"> <h2 class="titpos"><span class="curpage">批量修改管理</span></h2> <!--s: part-3--> <h3 class="clrfix subtit subtitmargin combox" style="padding:10px 0 10px 30px;"> <i class="fl subtit-l" id="yw_9"> <input id="houseCode" type="text" class="add_ftxt" placeholder="房源编号" style="width:214px;background:#f3f3f3" maxlength="45"> <input id="roomCode" type="text" class="add_ftxt" placeholder="房间编号" style="width:214px;background:#f3f3f3" maxlength="45"> <a class="addbtn red" id="J_addSearch_hong" href="javascript:;" style="margin-right:50px;margin-left:8px;">搜索</a> <button class="layui-btn" style="float:right;" onclick="test()">开锁方式批量设置</button> </i> <span class="fr wordicos" style="margin-top:7px; display: none;"> <span class="word_w" id="locknum_1">共 <span class="red" id="rows"></span> 条数据</span> </span> </h3> <div id="user_search" class="clrfix part-s part-3 combox" style="display: none;"> <ul class="ful lockmnglist lockmnglist2" id="forSelect1"></ul> </div><!--e: part-3--> <div id="yw_list" class="clrfix part-s yw_list combox"> <span style="line-height: 40px;">数据列表</span> <table class="alert-tb tdh60" width="100%" cellpadding="0" cellspacing="0" border="0"> <thead> <tr> <tr> <th width="60">选择</th> <th>门锁编码</th> <th>房源编码</th> <th width="150">房间编码</th> <th width="100">门锁类型</th> <th width="100">是否支持门磁</th> <th width="100">通信状态</th> <th width="100">电池电量</th> <th width="100">安装地址</th> <th width="100">安装时间</th> <th width="100">运营商</th> <th width="100">网关</th> <th width="100">操作</th> </tr> </thead> <tbody id="list"> </tbody> </table> </div> <!--s: pages--> </div><!--e: main--> <div class="h60"></div> </div><!--e: container--> </div> <!--s: over--> <div class="over" id="over"></div> <!--e: over--> <!--s: dialog--> <div class="msg" id="msg"> <div class="msgtit" style="background:#e70012"><p style="color:#fff;"></p><a href="javascript:;" title="点击关闭">X</a></div> <div class="msgcon"> <div class="msginner"> <div tabindex="5" class="confirm"></div><!--alert confirm dialog--> </div> </div> </div> <!--js--> <script src="../js/jquery-1.11.3.min.js"></script> <script src="../js/jquery.cookie.min.js"></script> <script src="../js/common/common.js"></script> <script src="../layui/layui.js" charset="utf-8"></script> <script type="text/javascript" src="../js/common/common.js"></script> <script type="text/javascript" src="../js/lock/companyLockList.js"></script> <div id="ldings" class="ldings"> <span></span> </div> </body> </html> 八、主要核心js代码 function test2(){ var ids = [];//定义一个门锁编号空数组 //初次开锁方式空数组 var items = []; //后续开锁方式空数组 var items2=[] $("input[name='lock_id']:checked").each(function(i){//把所有被选中的复选框的值存入数组 ids[i] =$(this).val(); }); $("input[name='first_way']").each(function() { items.push($(this).val()); }); $("input[name='laster_way']").each(function() { items2.push($(this).val()); }); var first = $('input[name="first_way"]:checked').length; var laster = $('input[name="laster_way"]:checked').length; if(first<2){ layui.use('layer', function(){ var layer = layui.layer; layer.alert("初次开锁方式至少选择两种"); }); return false; }else if(laster<2){ layui.use('layer', function(){ var layer = layui.layer; layer.alert("后续开锁方式至少选择两种"); }); return false; }else{ var data = { ids:ids, items:items, items2:items2 } $.ajax({ url: "/lms/lock/updateLockOpenLockWayInfo", type: "POST", contentType: 'application/json;charset=utf-8', data : JSON.stringify(data), dataType : 'json', success: function(data){ if(data.returnCode=="000000"){ layui.use('layer', function(){ var layer = layui.layer; layer.msg(data.returnMsg,{icon:1}); }); setTimeout(() => { closeLayui(); }, 800); }else{ layui.use('layer', function(){ var layer = layui.layer; layer.alert(data.returnMsg,{icon:5}); }); } },error:function(XMLHttpRequest, textStatus, errorThrown){ // 状态码 alert(XMLHttpRequest.status); // 状态 alert(XMLHttpRequest.readyState); // 错误信息 alert(textStatus); } }); return true; } } //关闭layui弹框 function closeLayui(){ parent.layer.closeAll() location.reload(); } 小结:通过上述例子,即可完成批量修改功能。

优秀的个人博客,低调大师

Flink SQL 功能解密系列 —— 维表 JOIN 与异步优化

引子 流计算中一个常见的需求就是为数据流补齐字段。因为数据采集端采集到的数据往往比较有限,在做数据分析之前,就要先将所需的维度信息补全。比如采集到的交易日志中只记录了商品 id,但是在做业务时需要根据店铺维度或者行业纬度进行聚合,这就需要先将交易日志与商品维表进行关联,补全所需的维度信息。这里所说的维表与数据仓库中的概念类似,是维度属性的集合,比如商品维,地点维,用户维等等。 在流计算中,这是一个典型的 stream-to-table jon 的问题。本文主要讲解在 Flink SQL 中是如何解决这个问题的,用户如何简单上手使用这个功能。 维表 JOIN 语法 由于维表是一张不断变化的表(静态表只是动态表的一种特例)。那如何 JOIN 一张不断变化的表呢?如果用传统的 JOIN 语法SELECT * FROM T JOIN dim_ta

优秀的个人博客,低调大师

实操python3.6当中的异步IO( asyncio) 协程

我们的自动化部署平台升级到django2+python3了, 并发方面的知识点,也跟进一下啦。 http://python.jobbole.com/87310/ 这篇讲得挺入门的~~ 实操一下。 import time import asyncio import functools now = lambda : time.time() async def do_some_work(x): print('Waiting: ', x) await asyncio.sleep(x) return 'Done after {}s'.format(x) def callback(t, future): print('Callback: ', t, future.result()) start = now() coroutine1 = do_some_work(1) coroutine2 = do_some_work(2) coroutine4 = do_some_work(4) tasks = [ asyncio.ensure_future(coroutine1), asyncio.ensure_future(coroutine2), asyncio.ensure_future(coroutine4), ] loop =asyncio.get_event_loop() for task in tasks: task.add_done_callback(functools.partial(callback, 2)) loop.run_until_complete(asyncio.wait(tasks)) for task in tasks: task.add_done_callback(functools.partial(callback, 2)) print('Task return: {}'.format(task.result())) print('TIME: ', now() - start)

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册