Mybatis动态sql语句

  categories:资料  author:

1、MyBatis中#{ }和${ }的区别

在 mapper 中定义的参数传到 xml 中之后,在查询之前 mybatis 会对其进行动态解析。mybatis 为我们提供了两种支持动态 sql 的语法:#{} 以及 ${},他们都可以用来动态传递参数,补全SQL语句。

#{“参数名”}在SQL中相当于一个参数占位符“?”,用来补全预编译语句。它补全预编译语句时,可以理解为在此参数值两端加了单引号。举例如下,当需要动态的按id查询用户信息时。

select * from my_user where id = #{id};
如果我们为id赋值为1,这条SQL执行效果相当于下面的SQL。

select * from my_user where id = ‘1’;
由于预编译SQL使用PreparedStatement对象抽象预编译语句,之后使用也无需再次编译,而且能够防止注入式攻击。所以,虽然这时候两种方式得到相同的结果,但是只要能够使用#{ }解决,我们都应该使用#{ }。

${“参数名”}就是单纯的字符串拼接,拼接完成后才会对SQL进行编译、执行,所以性能较低,也无法复用。但是在有些#{ }无法胜任的地方,还是会需要${ }来完成。比如当SQL中数据库表名为参数时,如果使用#{ },如下所示。

阅读全文

Java 四种线程池

  categories:资料  author:

介绍new Thread的弊端及Java四种线程池的使用,对Android同样适用。本文是基础篇,后面会分享下线程池一些高级功能。

1、new Thread的弊端
执行一个异步任务你还只是如下new Thread吗?

new Thread(new Runnable() {
 
@Override
public void run() {
// TODO Auto-generated method stub
}
}).start();

那你就out太多了,new Thread的弊端如下:

a. 每次new Thread新建对象性能差。
b. 线程缺乏统一管理,可能无限制新建线程,相互之间竞争,及可能占用过多系统资源导致死机或oom。
c. 缺乏更多功能,如定时执行、定期执行、线程中断。
相比new Thread,Java提供的四种线程池的好处在于:
a. 重用存在的线程,减少对象创建、消亡的开销,性能佳。
b. 可有效控制最大并发线程数,提高系统资源的使用率,同时避免过多资源竞争,避免堵塞。

阅读全文

k8s1.6伸缩性升级,支持处理5000 Node 和 15 万个 Pod

  categories:资料  author:

上个夏天,我们分享了 Kubernetes 的伸缩性更新,经过一番努力,我们自豪的宣布 Kubernetes 1.6 能够处理 5000 个节点的集群和 15 万个 Pod 了;另外即使在这种负载规模下,端到端的 Pod 启动速度依然优于 2000 节点规模的 1.3 版本的 Kubernetes 集群,API 调用的延迟依然满足 1 秒的 SLO。

本文中我们会讨论到

  • 性能测试的指标和结果
  • 提高性能的改进
  • 未来在伸缩性方面的发展计划

XX 节点的集群意味着什么?

现在 Kubernetes 1.6 已经发布,那么当我们说到支持多少个节点的集群的时候,我们到底在说什么?前文说过,我们有两个性能相关的服务水平目标(SLO):

  • API 响应性:99% 的 API 调用应该在一秒之内返回。
  • Pod
阅读全文

使用Logstash收集Kubernetes的应用日志

  categories:资料  author:

 前言

本文同步更新到Github仓库kubernetes-handbook中。很多企业内部都有自己的ElasticSearch集群,我们没有必要在kubernetes集群内部再部署一个,而且这样还难于管理,因此我们考虑在容器里部署logstash收集日志到已有的ElasticSearch集群中。

方案选择

Kubernetes官方提供了EFK的日志收集解决方案,但是这种方案并不适合所有的业务场景,它本身就有一些局限性,例如:

  • 所有日志都必须是out前台输出,真实业务场景中无法保证所有日志都在前台输出
  • 只能有一个日志输出文件,而真实业务场景中往往有多个日志输出文件
  • Fluentd并不是常用的日志收集工具,我们更习惯用logstash
  • 我们已经有自己的ELK集群且有专人维护,没有必要再在kubernetes上做一个日志收集服务

基于以上几个原因,我们决定使用自己的ELK集群。

Kubernetes集群中的日志收集解决方案

编号 方案 优点 缺点
1 每个app的镜像中都集成日志收集组件 部署方便,kubernetes的yaml文件无须特别配置,可以为每个app自定义日志收集配置 强耦合,不方便应用和日志收集组件升级和维护且会导致镜像过大
2 单独创建一个日志收集组件跟app的容器一起运行在同一个pod中 低耦合,扩展性强,方便维护和升级 需要对kubernetes的yaml文件进行单独配置,略显繁琐
3 将所有的Pod的日志都挂载到宿主机上,每台主机上单独起一个日志收集Pod 完全解耦,性能最高,管理起来最方便 需要统一日志收集规则,目录和输出方式

综合以上优缺点,我们选择使用方案二。

该方案在扩展性、个性化、部署和后期维护方面都能做到均衡,因此选择该方案。

20170516222039

我们创建了自己的logstash镜像。创建过程和使用方式见https://github.com/rootsongjc/docker-images

镜像地址:index.tenxcloud.com/jimmy/logstash:5.3.0

测试

我们部署一个应用对logstash的日志收集功能进行测试。

创建应用yaml文件logstash-test.yaml

apiVersion: extensions/
阅读全文

如何在Kubernetes上玩转TensorFlow

  categories:资料  author:

女主宣言

该文章出自于ADDOPS团队,是关于如何在K8S上玩转tensorflow的主题,该文章深入浅出的给我们介绍了当前tensorflow的现状和架构特点等,然后介绍了让tensorflow如何基于k8s快速落地,让大家都能简单的上手tensorflow,整体文章脉络清晰,内容适度,所以希望能给大家带来启发。

PS:丰富的一线技术、多元化的表现形式,尽在“HULK一线技术杂谈”,点关注哦!

前言

Tensorflow作为深度学习领域逐渐成熟的项目,以其支持多种开发语言,支持多种异构平台,提供强大的算法模型,被越来越多的开发者使用。但在使用的过程中,尤其是GPU集群的时候,我们或多或少将面临以下问题:

  • 资源隔离。Tensorflow(以下简称tf)中并没有租户的概念,何如在集群中建立租户的概念,做到资源的有效隔离成为比较重要的问题;
  • 缺乏GPU调度。tf通过指定GPU的编号来实现GPU的调度,这样容易造成集群的GPU负载不均衡;
  • 进程遗留问题。tf的分布式模式ps服务器会出现tf进程遗留问题;
  • 训练的数据分发以及训练模型保存,都需要人工介入;
  • 训练日志保存、查看不方便;

因此,我们需要一个集群调度和管理系统,可以解决GPU调度、资源隔离、统一的作业管理和跟踪等问题。

目前,社区中有多种开源项目可以解决类似的问题,比如yarn,kubernetes。yarn是hadoop生态中的资源管理系统,而kubernetes(以下简称k8s)作为Google开源的容器集群管理系统,在tf1.6版本加入GPU管理后,已经成为很好的tf任务的统一调度和管理系统。

下文是我们公司在tensorflow on kubernetes方面的实践经验。

设计目标

我们将tensorflow引入k8s,可以利用其本身的机制解决资源隔离,GPU调度以及进程遗留的问题。除此之外,我们还需要面临下面问题的挑战:

  • 支持单机和分布式的tensorflow任务;
  • 分布式的tf程序不再需要手动配置clusterspec信息,只需要指定worker和ps的数目,能自动生成clusterspec信息;
  • 训练数据、训练模型以及日志不会因为容器销毁而丢失,可以统一保存;

为了解决上面的问题,我们开发了tensorflow on kubernetes系统。

架构

tensorflow on kubernetes包含三个主要的部分,分别是client、task和autospec模块。client模块负责接收用户创建任务的请求,并将任务发送给task模块。task模块根据任务的类型(单机模式和分布式模式)来确定接下来的流程:

如果type选择的是single(单机模式),对应的是tf中的单机任务,则按照按照用户提交的配额来启动container并完成最终的任务;

如果type选择的是distribute(分布式模式),对应的是tf的分布式任务,则按照分布式模式来执行任务。需要注意的是,在分布式模式中会涉及到生成clusterspec信息,autospec模块负责自动生成clusterspec信息,减少人工干预。

下面是tensorflow on kubernetes的架构图:

接下来将对三个模块进行重点介绍。

client模块

tshell

在容器中执行任务的时候,我们可以通过三种方式获取执行任务的代码和训练需要的数据:

  • 将代码和数据做成新的镜像;
  • 将代码和数据通过卷的形式挂载到容器中;
  • 从存储系统中获取代码和数据;

前两种方式不太适合用户经常修改代码的场景,最后一种场景可以解决修改代码的问题,但是它也有下拉代码和数据需要时间的缺点。综合考虑后,我们采取第三种方式。

阅读全文

TiledMap简单使用

  categories:资料  author:

tiled map是一款开源免费的游戏地图编辑开发工具,可以帮助您开发游戏的内容。软件最主要的功能便是编辑游戏中各种形式的瓷砖地图,侧重于一般的灵活性,同时保持直观,并支持图素、层次和对象等通用概念。tiled map支持快速的编辑游戏地图,使用方面也是非常的简单,不管是新手还是老手,都可轻松的进行编辑,软件里面还内置了大量的游戏地图模块,免费的提供给大家进行使用,是游戏开发人员快速开发游戏一大利器。

使用教程

1、创建新文件 ,然后写入自己的地图大小,和块大小。这里所谓的地图大家可以想象成自己游戏中的地图大小,tiled中将地图分为一个一个块,每一个块大小相同,所有的块拼接成一张地图

2、选择一张背景图片加入到该项目,直接将一张图片拖入到右边的“图块”中

3、接下来把图块中的图片全部选中拖入到左边的窗口中,可以贴很多张因为刚开始我们创建的项目图片大小是6400的高度

4、接下来创建地图中的对象,也就是所谓的敌军飞机,首先在地图中创建一个图层,然后再图层中画方框,或者圆形来代表敌军飞机,选中图层,然后选择矩形图标,你就可以在地图中画矩形对象了。

5、都完成后,基本页面就做好了,接下来就是代码的输入了

—-

官网下载地址

http://www.mapeditor.org/

官方文档

http://doc.mapeditor.org/

参考的文章

http://blog.csdn.net/zhy_cheng/article/details/8308609

http://blog.csdn.net/zhy_cheng/article/details/8316277

http://blog.csdn.net/zhy_cheng/article/details/8363028

关东升  http://blog.csdn.net/tonny_guan/article/details/39324041
泰然网1 http://www.taikr.com/article/1924
泰然网2 http://www.tairan.com/archives/7122/
Github  https://github.com/chukong/cocos-docs/blob/master/tutorial/framework/native/how-to-make-a-tile-based-game-with-cocos2d/part1/zh.md

图片素材网址 http://www.2gei.com/rpg-marker/map/pn3/

 

示例:

一》打开TiledMap,新建地图:
块大小可结合图片资源来设置,地图大小结合块大小和像素大小来设置。

新建完成后如下,右边默认图层名字为块层1,可更改图层的名字:

图层定义:

用于分隔不同作用的地图元素以方便管理和实现层叠显示。举例跑酷的场景中可以将地面、背景建筑、碰撞物体等分层放置,对于背景只是用来增加画面效果不会用于判断碰撞等事件,墙壁等瓦片图如果不能充满整个图块就会造成颜色不协调(同一个图块位置无法放置两种不同的瓦片图),所以层的出现解决了这个棘手的问题,保证了背景可以存在上面又能用墙壁等瓦片图遮挡显示一部分图片。 图层主要放置不会改变的图片,如地面或墙壁等

二》导入图块资源:

三》图块层布局:… 阅读全文

cocos2d-js引擎的工作原理和文件的调用顺序

  categories:资料  author:

Cocos2d-js可以实现在网页上运行高性能的2D游戏,实现原理是通过HTML5的canvas标签,该引擎采用Javascript编写,并且有自己的一些语法,因为没有成熟的IDE,一般建立工程是通过WebStorm手动创建文件与文件夹,实现将引擎跑起来,下面详解一下运行过程。

首先,用户最先访问到的是index.html页面,在index.html中引入引擎的启动文件CCBoot.js和自己编写的游戏的启动文件main.js。除此之外,还需要在工程的根目录下写一个project.json,来描述工程,引擎会自动读入这个文件,确定工程的类型、功能设置、引入的模块、自己的js文件列表等。

一般是将cocos2d的引擎拷贝到自己的工程目录下,使用frameworks/cocos2d-html5这个目录下的引擎文件。

下面的流程图说明了cocos2d的基本工作流程:

下面我们以frameworks/cocos2d-html5/template为例分析一下这个工程。

工程的运行结果为在屏幕上显示Hello、屏幕分辨率、Logo等内容。

首先分析一下index.html这个文件。

[html] view plaincopyprint?
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4.     <meta charset=“utf-8″>
  5.     <title>Cocos2d-html5 Hello World test</title>
  6.     <link rel=“icon”
阅读全文

数人云架构师:微服务体系中的K8S&Mesos调度与服务发现

  categories:资料  author:

9月10日在K8S GeekGathering Meetup上,数人云架构师保珠做了关于《K8S&mesos之我见》的主题分享,分别介绍了Kubernetes和Mesos对微服务的支撑,以下是本次分享的实录——

本次主要分享主要有以下五个方面:
– 容器的价值
– 微服务体系建设
– Kubernetes对微服务的支撑
– Mesos对微服务的支撑
– 总结

关于容器大家可能已经理解或者正在实践使用,所以今天会讲一下容器的价值方面内容,然后是目前比较火的微服务相关:将单体应用解构成微服务后它到底是一个怎样的概念,而后是Kubernetes和Mesos在微服务方面的支撑,最后是基于以上做一个总结。

容器的价值

Markdown

首先来思考一些问题:

  • Docker现在已经是容器界的事实标准,原因是什么?
  • Docker和VM各自都有什么优势?

2013年,Docker就已经在国内进行发展,2015年本人首次接触Docker是在客户现场进行生产应用部署,后来在和客户分享交流中,被问及的比较多的一点是Docker和VM究竟有什么区别,以及各自的价值是什么?Docker如此之火,难道就是因为轻量化、隔离性安全性以及秒级启动这些原因吗?这些特性VM也可以通过变通的方式做到,那么Docker的价值到底是什么?

请带着这些问题,继续往下看。

微服务体系建设

Markdown

试想下,目前比较火的微服务是不是和Docker或者说容器的经历很相似?为什么现在大家要用微服务,它都为我们带来了什么?单体应用时用的MVC架构,金融业会把应用切分成七层,接入层、服务层等等,微服务是否还要按照这种分层架构,用了它到底是简单了,还是复杂了,是不是用了Spring Cloud、Dubbo即是微服务了?

随着应用规模的膨胀导致运维规模线性增长,如何解决:有了微服务的概念后,应用可以按照业务模块做切分,做了微服务化切割够,一个小团队去管理开发一个服务,但随之而来的问题是,以前10个系统,5个运维就可以完成任务,使用微服务后可能会变成每个系统有几十个服务,部署的复杂度、团队之间的沟通协调、线上问题追踪,版本控制这些问题需要一些解决办法。

微服务的所有服务之间都是平等的关系,每个服务内部还可以遵循之前的分层架构。

当把系统做了模块化切分后,用Spring Cloud或者Dubbo框架去构建系统,虽然感觉上这就属于微服务的范畴,但随着对于这个体系的了解,其实会发现还远远不够。

〓 微服务体系建设

Markdown

为什么说微服务不是一个简单的框架而是一个体系,因为一个框架并不能解决微服务给我们带来的所有问题,如前面所提到的,其实还有很多,下面是在项目中遇到的一些体系方面建设的罗列,供以参考:

服务化框架:要解决的是服务之间调用的多通讯协议支持,数据交互的数据结构支持。

服务注册和发现:完成服务切分后,服务之间完成解耦,通过服务注册中心对服务统一管理,调用端去调用。

统一配置管理:不同环境如开发、生产、测试等环境的配置肯定不同,如果没有做出相应的改变,那么后续带来的修改以及升级问题是不可想象的。

API网关:服务被拉平后,身份验证、监控、负载均衡、缓存、请求分片与管理、静态相应处理。

监控报警阅读全文

StatefulSet: Kubernetes 中对有状态应用的运行和伸缩

  categories:资料  author:

在最新发布的 Kubernetes 1.5 我们将过去的 PetSet 功能升级到了 Beta 版本,并重新命名为StatefulSet。除了依照社区民意改了名字之外,这一 API 对象并没有太大变化,不过我们在向集合里部署 Pod 的过程中加入了“每索引最多一个”的语义。有了顺序部署、顺序终结、唯一网络名称以及持久稳定的存储,我们认为,对于大量的有状态容器化负载,我们已经具备了一定的支持能力。我们并不是宣称这一功能已经完全完成,但是我们相信他已经处于一个可用状态,并且我们会在推动其正式发布的过程中保持其兼容性。

StatefulSet 的采用时机

在 Kubernetes 中,Deployment 和 ReplicaSets 都是运行无状态应用的有效手段。但这两种方式对于有状态应用来说就不太合适了。StatefulSet 的目的就是给为数众多的有状态负载提供正确的控制器支持。然而需要注意的是,不一定所有的有存储应用都是适合移植到 Kubernetes 上的,在移植存储层和编排框架之前,需要回答以下几个问题。

应用是否可以使用远程存储?

目前,我们推荐用远程存储来使用 StatefulSets,就要对因为网络造成的存储性能损失有一个准备:即使是专门优化的实例,也无法同本地加载的 SSD 相提并论。你的云中的网络存储,能够满足 SLA 要求么?如果答案是肯定的,那么利用 StatefulSet 运行这些应用,就能够获得自动化的优势。如果应用所在的 Node 发生故障,包含应用的 Pod 会调度到其他 Node 上,在这之后会重新加载他的网络存储以及其中的数据。

这些应用是否有伸缩需求?

阅读全文

cocos creator入门

  categories:资料  author:

前面的话

  Cocos Creator 是一个完整的游戏开发解决方案,包括了 cocos2d-x 引擎的 JavaScript 实现,以及快速开发游戏所需要的各种图形界面工具。Cocos Creator 的编辑器完全为引擎定制打造,包含从设计、开发、预览、调试到发布的整个工作流所需的全功能,该编辑器提供面向设计和开发的两种工作流,提供简单顺畅的分工合作方式。Cocos Creator 目前支持发布游戏到 Web、Android 和 iOS,真正实现一次开发,全平台运行。Cocos Creator 是以内容创作为核心的游戏开发工具,在 Cocos2d-x 基础上实现了彻底脚本化、组件化和数据驱动等特点。本文将详细介绍cocos creator 入门知识

 

工作流程

cocos creator的流程如下所示

1

【创建或导入资源】

将图片、声音等资源拖拽到编辑器的资源管理器面板中,即可完成资源导入

此外,也可以在编辑器中直接创建场景、预制、动画、脚本、粒子等各类资源

【建造场景内容】

项目中有了一些基本资源后,就可以开始搭建场景了,场景是游戏内容最基本的组织方式,也是向玩家展示游戏的基本形态

通过场景编辑器将添加各类节点,负责展示游戏的美术音效资源,并作为后续交互功能的承载

【添加组件脚本,实现交互功能】

可以为场景中的节点挂载各种内置组件和自定义脚本组件,来实现游戏逻辑的运行和交互,包括从最基本的动画播放、按钮响应,到驱动整个游戏逻辑的主循环脚本和玩家角色的控制

几乎所有游戏逻辑功能都是通过挂载脚本到场景中的节点来实现的

【一键预览和发布】

搭建场景和开发功能的过程中,可以随时点击预览来查看当前场景的运行效果。使用手机扫描二维码,可以立即在手机上预览游戏

当开发告一段落时,通过构建发布面板可以一键发布游戏到包括桌面、手机、Web 等多个平台

 

安装和启动

阅读全文


快乐成长 每天进步一点点      京ICP备18032580号-1