首页 文章 精选 留言 我的

精选列表

搜索[企业级市场],共10000篇文章
优秀的个人博客,低调大师

基于SpirngBoot的企业级后台管理框架Guns完整解析

小Hub领读: guns这个项目相信很多人都知道,不知道你们有没完整读过呢,今天一起跟着小Hub来学习下哈。 一共几个主要模块比较重要: map + warpper模式 Api数据传输安全 数据范围限定 视频讲解:https://www.bilibili.com/video/BV1P5411j7yA/ 简介 Guns基于SpringBoot 2,致力于做更简洁的后台管理系统。Guns项目代码简洁,注释丰富,上手容易,同时Guns包含许多基础模块(用户管理,角色管理,部门管理,字典管理等10个模块),可以直接作为一个后台管理系统的脚手架! 官网:https://www.stylefeng.cn 视频讲解:https://www.bilibili.com/video/BV1P5411j7yA/ 本次解读版本:tag-v4.2版本,因为5.0后的项目都是maven单项目,核心类都封装到jar中了,所以学习的话最好使用v4.2的最后一版本maven多模块项目学习。 https://gitee.com/stylefeng/guns/tree/v4.2/ 项目特点 基于SpringBoot,简化了大量项目配置和maven依赖,让您更专注于业务开发,独特的分包方式,代码多而不乱。 完善的日志记录体系,可记录登录日志,业务操作日志(可记录操作前和操作后的数据),异常日志到数据库,通过@BussinessLog注解和LogObjectHolder.me().set()方法,业务操作日志可具体记录哪个用户,执行了哪些业务,修改了哪些数据,并且日志记录为异步执行,详情请见@BussinessLog注解和LogObjectHolder,LogManager,LogAop类。 利用beetl模板引擎对前台页面进行封装和拆分,使臃肿的html代码变得简洁,更加易维护。 对常用js插件进行二次封装,使js代码变得简洁,更加易维护,具体请见webapp/static/js/common文件夹内js代码。 利用ehcache框架对经常调用的查询进行缓存,提升运行速度,具体请见ConstantFactory类中@Cacheable标记的方法。 controller层采用map + warpper方式的返回结果,返回给前端更为灵活的数据,具体参见com.stylefeng.guns.modular.system.warpper包中具体类。 简单可用的代码生成体系,通过SimpleTemplateEngine可生成带有主页跳转和增删改查的通用控制器、html页面以及相关的js,还可以生成Service和Dao,并且这些生成项都为可选的,通过ContextConfig下的一些列xxxSwitch开关,可灵活控制生成模板代码,让您把时间放在真正的业务上。 控制器层统一的异常拦截机制,利用@ControllerAdvice统一对异常拦截,具体见com.stylefeng.guns.core.aop.GlobalExceptionHandler类。 技术选型 springboot mybatis plus shiro beetl ehcache jwt 模块分析 学习一个项目就是学习项目的亮点地方,在分析guns的过程中,有些地方值得我们学习,下面我们一一来分析: map + warpper模式 访问后台的用户列表时候,我们通常需要去查询用户表,但是用户表里面有些外键,比如角色信息、部门信息等。因此有时候我们查询列表时候一般在mapper中关联查询,然后得到记录。 官网介绍: map+warpper方式即为把controller层的返回结果使用BeanKit工具类把原有bean转化为Map的的形式(或者原有bean直接是map的形式),再用单独写的一个包装类再包装一次这个map,使里面的参数更加具体,更加有含义,下面举一个例子,例如,在返回给前台一个性别时,数据库查出来1是男2是女,假如直接返回给前台,那么前台显示的时候还需要增加一次判断,并且前后端分离开发时又增加了一次交流和文档的成本,但是采用warpper包装的形式,可以直接把返回结果包装一下,例如动态增加一个字段sexName直接返回给前台性别的中文名称即可。 guns项目中,作者说独创了一种map+warpper模式。我们来看下是如何实现的。 看看下UserController的代码: /** * 查询管理员列表 */ @RequestMapping("/list") @Permission @ResponseBody public Object list(@RequestParam(required = false) String name , @RequestParam(required = false) String beginTime , @RequestParam(required = false) String endTime , @RequestParam(required = false) Integer deptid) { if (ShiroKit.isAdmin()) { List<Map<String, Object>> users = userService.selectUsers(null, name, beginTime, endTime, deptid); return new UserWarpper(users).warp(); } else { DataScope dataScope = new DataScope(ShiroKit.getDeptDataScope()); List<Map<String, Object>> users = userService.selectUsers(dataScope, name, beginTime, endTime, deptid); return new UserWarpper(users).warp(); } } userService.selectUsers中只是一个单表的查询操作,没有关联其他表,因此查询出来的结果中有些字段需要手动转换,比如sex、roleId等,因此作者定义了一个UserWarpper,用来转换这些特殊字段,比如sex存的0转成男,roleId查库之后转成角色名称等。 /** * 用户管理的包装类 * * @author fengshuonan * @date 2017年2月13日 下午10:47:03 */ public class UserWarpper extends BaseControllerWarpper { public UserWarpper(List<Map<String, Object>> list) { super(list); } @Override public void warpTheMap(Map<String, Object> map) { map.put("sexName", ConstantFactory.me().getSexName((Integer) map.get("sex"))); map.put("roleName", ConstantFactory.me().getRoleName((String) map.get("roleid"))); map.put("deptName", ConstantFactory.me().getDeptName((Integer) map.get("deptid"))); map.put("statusName", ConstantFactory.me().getStatusName((Integer) map.get("status"))); } } 因为mybatis plus支持查询返回map的形式,所以只需要把map传进来,就可以转换成功,如果查询结果是一个实体的bean,那就先转成map,然后再用warpTheMap。其中BaseControllerWarpper也是一个关键抽象类,提供转换结果。 日志模块 日志记录采用aop(LogAop类)方式对所有包含@BussinessLog注解的方法进行aop切入,会记录下当前用户执行了哪些操作(即@BussinessLog value属性的内容)。 如果涉及到数据修改,会取当前http请求的所有requestParameters与LogObjectHolder类中缓存的Object对象的所有字段作比较(所以在编辑之前的获取详情接口中需要缓存被修改对象之前的字段信息),日志内容会异步存入数据库中(通过ScheduledThreadPoolExecutor类)。 日志注解标识:com.stylefeng.guns.core.common.annotion.BussinessLog 日志处理切面:com.stylefeng.guns.core.aop.LogAop 日志记录字段字典:com.stylefeng.guns.core.common.constant.dictmap.base.AbstractDictMap 任务式保存记录:LogManager.me().executeLog(TimerTask task) jwt校验 在之前的课程中,我们已经说过了很多次jwt的形式作为用户的token,在这项目中,jwt讲到了与Api的数据传输安全结合起来一起运用。首先我们看下guns-rest项目,打开com.stylefeng.guns.rest.modular.auth.controller.AuthController,这个类是客户端调用登录生成Jwt的地方。 @RestController public class AuthController { @Autowired private JwtTokenUtil jwtTokenUtil; @Resource(name = "simpleValidator") private IReqValidator reqValidator; /** * 请求生成jwt * * @param authRequest * @return */ @RequestMapping(value = "${jwt.auth-path}") public ResponseEntity<?> createAuthenticationToken(AuthRequest authRequest) { boolean validate = reqValidator.validate(authRequest); if (validate) { final String randomKey = jwtTokenUtil.getRandomKey(); final String token = jwtTokenUtil.generateToken(authRequest.getUserName(), randomKey); return ResponseEntity.ok(new AuthResponse(token, randomKey)); } else { throw new GunsException(BizExceptionEnum.AUTH_REQUEST_ERROR); } } } 来说明一下上面的代码: IReqValidator :账号密码校验器 DbValidator SimpleValidator randomKey :随机生成的key,用于数据安全校验 token:生成保护用户id的jwt 所以app登录调用这接口生成的值如下: { "randomKey": "1jim2v", "token": "eyJhbGciOiJIUzUxMiJ9.eyJyYW5kb21LZXkiOiIxamltMnYiLCJzdWIiOiJhZG1pbiIsImV4cCI6MTU2MjM5NjgwNCwiaWF0IjoxNTYxNzkyMDA0fQ.vr3HwhV_e8MrpNZY0rxbqs1cOzHIBdon4cQT-Gs9wvmv8UZEBbc4QNSMxTh_ulcVpkaw2uwZY4_8zJ7I2G-36Q" } 好了,客户端拿到token之后,每次请求需要在header中把token带上,然后服务过滤器校验 AuthFilter:校验jwt是否过期和是否正确 //验证token是否过期,包含了验证jwt是否正确 boolean flag = jwtTokenUtil.isTokenExpired(authToken); ok,jwt的生成和校验逻辑都很简单,下面我们来说说接口传输安全是怎么做到的。 Api数据传输安全 上面我们说到客户端登录之后拿到了一个token和randomKey,token是用来校验用户身份的,那么这个randomKey是用来干嘛的呢,其实是用来做数据安全加密的。 当开启传输安全模式时候,客户端发送数据给服务器的时候会进行加密传输,具体的加密过程,guns中有一个com.stylefeng.guns.jwt.DecryptTest: public static void main(String[] args) { String salt = "1jim2v"; SimpleObject simpleObject = new SimpleObject(); simpleObject.setUser("stylefeng"); simpleObject.setAge(12); simpleObject.setName("ffff"); simpleObject.setTips("code"); String jsonString = JSON.toJSONString(simpleObject); String encode = new Base64SecurityAction().doAction(jsonString); String md5 = MD5Util.encrypt(encode + salt); BaseTransferEntity baseTransferEntity = new BaseTransferEntity(); baseTransferEntity.setObject(encode); baseTransferEntity.setSign(md5); System.out.println(JSON.toJSONString(baseTransferEntity)); } 上面的过程就是把simpleObject 对象进行new Base64SecurityAction().doAction自定义加密(可自定义,项目只是简单Base64编码),然后加把加密后的值和salt进行Md5计算,得出来的md5就是签名,那么这个salt是哪里来的呢,其实这个salt的值就是randomKey的值。 DataSecurityAction:加密、解密的抽象类 Base64SecurityAction:其中一种实现,简单的Base64编码完成加密解密 如果其他方式的直接实现DataSecurityAction即可 上面的main方法运行之后得到的值如下: {"object":"eyJhZ2UiOjEyLCJuYW1lIjoiZmZmZiIsInRpcHMiOiJjb2RlIiwidXNlciI6InN0eWxlZmVuZyJ9", "sign":"34bdd49a0838b1ef69cca928d71e885d"} 因此,客户端就是把这串数据传送到服务器: 注意要填请求头:Authorization的值是:Bearer+空格+token,这个可以从AuthFilter中知道 好了,上面发送给hello接口,那么我们看下是如何接收和解密的,首先来看下接口: @Controller @RequestMapping("/hello") public class ExampleController { @RequestMapping("") public ResponseEntity hello(@RequestBody SimpleObject simpleObject) { System.out.println(simpleObject.getUser()); return ResponseEntity.ok("请求成功!"); } } 貌似没啥特殊的,参数SimpleObject应该是解析之后得到的值得,我们都知道,我们把参数写到控制器中时候,spring会自动帮我们完成参数注入到实体bean的过程,我们传过来的是一个加密的json,spring是帮不了我们自动解析的,因此,这里我们要做个手动转换json(解密)的过程,再完成注入; 先来分析一下spring的过程:在springboot项目里当我们在控制器类上加上@RestController注解或者其内的方法上加入@ResponseBody注解后,默认会使用jackson插件来返回json数据。 因此我们需要实现手动转成json与bean,只需要继承FastJsonHttpMessageConverter,重写read的过程。 guns项目中有WithSignMessageConverter 这样一个类: /** * 带签名的http信息转化器 * * @author fengshuonan * @date 2017-08-25 15:42 */ public class WithSignMessageConverter extends FastJsonHttpMessageConverter { @Autowired JwtProperties jwtProperties; @Autowired JwtTokenUtil jwtTokenUtil; @Autowired DataSecurityAction dataSecurityAction; @Override public Object read(Type type, Class<?> contextClass , HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException { InputStream in = inputMessage.getBody(); Object o = JSON.parseObject(in, super.getFastJsonConfig().getCharset(), BaseTransferEntity.class, super.getFastJsonConfig().getFeatures()); //先转化成原始的对象 BaseTransferEntity baseTransferEntity = (BaseTransferEntity) o; //校验签名 String token = HttpKit.getRequest().getHeader(jwtProperties.getHeader()).substring(7); String md5KeyFromToken = jwtTokenUtil.getMd5KeyFromToken(token); String object = baseTransferEntity.getObject(); String json = dataSecurityAction.unlock(object); String encrypt = MD5Util.encrypt(object + md5KeyFromToken); if (encrypt.equals(baseTransferEntity.getSign())) { System.out.println("签名校验成功!"); } else { System.out.println("签名校验失败,数据被改动过!"); throw new GunsException(BizExceptionEnum.SIGN_ERROR); } //校验签名后再转化成应该的对象 return JSON.parseObject(json, type); } } 分析:首先从body中获取到json数据,然后从header中获取到jwt的token(为了拿到randomKey),然后再Md5计算,比较传过来的sign,一致代表数据是没被串改过的,然后dataSecurityAction.unlock解密得到原始的json数据,最后调用JSON.parseObject(json, type);把json转成SimpleObject,所以整过过程就是这样,perfect。 数据范围限定 关于数据范围限定的概念很多人不知道,我们先来看下效果: 超级用户:admin登录查看用户列表 运营主管(运营部):test登录查看用户列表 从上面的两个登录账号中可以很直观看到,admin作为超级管理员,可以看到所有的数据,而test作为运营部的运营主管角色只能看到自己部门下的用户。 因此数据范围限定的意思就是根据用户的角色决定用户能查看的数据范围。 要完成这个功能有两个关键类: DataScope: public class DataScope { /** * 限制范围的字段名称 */ private String scopeName = "deptid"; /** * 具体的数据范围 */ private List<Integer> deptIds; ... } DataScopeInterceptor @Intercepts({@Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class, Integer.class})}) public class DataScopeInterceptor implements Interceptor { @Override public Object intercept(Invocation invocation) throws Throwable { StatementHandler statementHandler = (StatementHandler) PluginUtils.realTarget(invocation.getTarget()); MetaObject metaStatementHandler = SystemMetaObject.forObject(statementHandler); MappedStatement mappedStatement = (MappedStatement) metaStatementHandler.getValue("delegate.mappedStatement"); if (!SqlCommandType.SELECT.equals(mappedStatement.getSqlCommandType())) { return invocation.proceed(); } BoundSql boundSql = (BoundSql) metaStatementHandler.getValue("delegate.boundSql"); String originalSql = boundSql.getSql(); Object parameterObject = boundSql.getParameterObject(); //查找参数中包含DataScope类型的参数 DataScope dataScope = findDataScopeObject(parameterObject); if (dataScope == null) { return invocation.proceed(); } else { String scopeName = dataScope.getScopeName(); List<Integer> deptIds = dataScope.getDeptIds(); String join = CollectionKit.join(deptIds, ","); originalSql = "select * from (" + originalSql + ") temp_data_scope where temp_data_scope." + scopeName + " in (" + join + ")"; metaStatementHandler.setValue("delegate.boundSql.sql", originalSql); return invocation.proceed(); } } ... } 可以看出,其实就是一个mybatis的拦截器,拦截StatementHandler的prepare方法,然后在需要执行的sql外包装一层select * from(...)别名 where 别名.字段 in (范围)。 看起来逻辑还是挺清晰的。回头看下用户的list代码, DataScope dataScope = new DataScope(ShiroKit.getDeptDataScope()); List<Map<String, Object>> users = userService.selectUsers(dataScope, name, beginTime, endTime, deptid); 因此在需要数据范围限定的地方加上DataScope dataScope参数,拦截器会扫描参数中是否有 DataScope 类型,有的话就在sql外套上一层select * from,然后加上定义的字段限定范围。perfect~ 结束语 好了,这里是MarkerHub,我是小Hub吕一明。就解读到这里,更多开源项目解读可以上 httts://markerhub.com 。 推荐阅读: B站50K播放量,SpringBoot+Vue前后端分离完整入门教程! 分享一套SpringBoot开发博客系统源码,以及完整开发文档!速度保存! Github上最值得学习的100个Java开源项目,涵盖各种技术栈! 2020年最新的常问企业面试题大全以及答案

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

企业级 React 组件库 tinper-bee 发布 2.3.5 版本

🌟 时间控件 输入框格式校验修改,支持moment所有合法格式 🐞 Tooltip 解决宽度设置无效问题 🌟 Modal confirm类型新增第二种形式 🌟 优化 组件库 默认英文 🐞 修复 Table 组件 模态框中表格滚动条计算错误问题 查看详细升级内容:https://github.com/iuap-design/tinper-bee/releases/tag/2.3.5 iuap design 官网:点击查看 相关链接 tinper-bee 的详细介绍:点击查看 tinper-bee 的下载地址:点击下载

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

企业级 React 组件库 tinper-bee 发布 2.3.4 版本

tinper-bee 发布 V2.3.4版本: 🌟 时间控件支持自由设置时、分、秒是否显示 🌟 Popover 气泡卡片样式优化 🌟 Upload 拖拽上传,增加文件移入和移出时的钩子函数 🌟 优化 Table 表格固定表头样式 🐞 修复 Table 组件 onDropBorder 回调触发时机不对的问题 查看详细升级内容:https://github.com/iuap-design/tinper-bee/releases/tag/2.3.4 iuap design 官网:点击查看

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

企业级 React 组件库 tinper-bee 发布 2.3.3 版本

tinper-bee 发布 V2.3.3 版本: 1、Grid 编辑表格新增校验方法和示例,优化校验提示交互 2、Grid 编辑表格新增列禁用和列提示设置 3、Menus 菜单支持设置菜单弹出位置 4、数字输入框,支持负号是否在右边 5、Icon 组件展示,支持点击图标复制源码 查看详细升级内容:https://github.com/iuap-design/tinper-bee/releases/tag/2.3.3 iuap design 官网:点击查看

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

企业级自动化运维工具方案设计

1.企业运维现状与发展趋势 随着企业信息化的不断发展,运维人员需要面对越来越复杂的业务和越来越多样化的用户需求,不断扩展的应用需要越来越合理的模式来保障运维服务能灵活便捷、安全稳定地持续。某企业从初期的几台服务器发展到庞大的数据中心,单靠人工已经无法满足在技术、业务、管理等方面的要求,那么标准化、自动化、架构优化、过程优化等降低运维服务成本的因素越来越被人们所重视。其中,自动化开始代替人工操作在企业的运维过程中逐渐体现出来了强大的优势。 运维随着企业业务的发展,自动化作为其重要属性之一已经不仅仅只是代替人工操作,更重要的是深层探知和全局分析,关注的是在当前条件下如何实现性能与服务最优化,同时保障投资收益最大化。通过自动化运维能最大限度地在更少的维修时间内实现运维目标,提高运维服务质量。因此, 对于越来越复杂的运维来说,将人工操作逐渐改变为自动化管理是一个重要发展趋势。 2.企业运维存在的问题与需求 某企业初期只有文件共享和邮件服务等几台服务器,运维工作完全由人工操作,随着企业的发展,新业务系统不断上线企业建设了中心机房,运维工作还是以人工为主,但是这一阶段增加了网络管理系统和环境监控系统,这两个系统在一定程度上减轻了运维的工作量,基本上实现了运维的半自动化。企业在发展,运维工作量在不断的增加,企业的运维工作面临以下的问题及需要解决: 2.1运维人员的工作效率与工作主动性需要提升 在企业运维过程中,只有当故障已经发生并且造成业务影响时才能发现和着手处理,这种被动“救火”不但使运维人员终日忙碌,也使运维本身质量很难提高,导致IT部门和业务部门对运维服务满意度都不高。运维人员日常大部分时间和精力是处理一些简单重复的问题,而且由于故障预警机制不完善,往往是故障发生后或报警后才会进行处理,使得运维人员的工作经常是处于被动的状态,怎样才能在故障发生前及时发现并把故障处理掉,使运维工作变被动为主动? 2.2需要建立一套高效的运维机制 企业在运维管理过程中缺少自动化的运维管理模式,没有明确的运维人员角色定义和责任划分,使到问题出现后很难快速、准确地找到根本原因,无法及时地找到相应的人员进行修复和处理,或者是在问题找到后缺乏流程化的故障处理机制,而在处理问题时不但欠缺规范化的解决方案,也缺乏全面的跟踪记录,企业需要建立一套高效的运维管理制度为运维工作提供方向和依据。 2.3缺乏高效的运维技术工具 随着信息化建设的深入,企业业务系统日趋复杂,各种各样的网络设备、服务器、存储设备、业务系统等让运维人员难以从容应对,即使加班加点地维护、部署、管理也经常会因设备出现故障而导致业务的中断,严重影响企业的正常运转。出现这些问题部分原因是企业缺乏事件监控和诊断工具等运维技术工具,因为在没有高效的技术工具的支持下故障事件很难得到主动、快速处理。 3.业务流程标准化与健全运维管理制度 3.1实现业务流程标准化,为自动化运维打好基础 标准化是自动化运维的基础,想要实现标准化,首先识别各个运维对象,然后我们日常做的所有运维工作都应该是针对这些对象的运维。如果运维操作脱离了对象,那就没有任何意义。同样,没有理清楚对象,运维自然不得章法。例如扩容,首先确定是服务器的扩容,还是应用的扩容,还是其它对象的扩容。你会发现,对象不同,扩容这个场景所实施的动作是完全不一样的。如果把服务器的扩容套用到应用的扩容上去,必然会导致流程错乱。同时对于对象理解上的不一致,也会增加无谓的沟通成本,造成运维效率低下。这种情况下的自动化运维不但不能提升效率,还会越自动越混乱。 实现标准化的第一步是物理基础设施的标准化,例如,识别物理对像服务器、交换机、机柜等硬件;识别这些物理对像的属性,服务器的序列号、ip地址、厂商等信息;识别这些对像之间的关系,服务器所在的机柜、接入哪个交换机的哪个接口了等信息。服务器物理基础设施的标准化如下图(其它设备的标准化以此类推): 第二步是应用的标准化,应用服务、中间件,数据库等;例如,数据库的表、视图、存储过程的标准化,表的字段名、值,索引等,表和视图之间的关联关系等。 第三步是流程标准化,如备份、软件升级、杀毒,新业务上线等流程的标准化,下图是现在的运维流程: 自动化运维是基于流程化的框架,将事件与IT流程相关联,一旦被监控系统发现性能超标,超过预先配置的阀值或宕机,就会触发相关事件以及事先定义好的流程,可自动启动故障响应和恢复机制。自动化工作平台还可帮助运维人员完成日常的重复性工作,提高运维效率,下图是实现自动化运维的流程图: 运维的自动化能够预测故障、在故障发生前能够报警,让运维人员把故障消除在发生前,将所产生损失减到最低。由过去的手工执行转为自动化操作,从而减少乃至消除运维中的延迟,实现“零延时”的运维。 3.2建立完整、全面的运维管理制度,为自动化运维的实现保驾护航 运维制度的建立包括环境管理、资产管理、介质管理、设备管理、监控管理、网络安全管理、系统安全管理、恶意代码防范管理、密码管理、变更管理、备份与恢复管理、安全事件处置,应急预案管理等制度。 1)运维管理制度是衡量运维工作的一把尺子,完善的管理制度能有效的提升运维工作效率,日常工作以管理制度为依据,按规定的要求和规定的流程操作既快速又准确; 2)全面的运维管理制度能在问题和故障还没有出现没有造成损失前就被及时的发现,从而问题得到有效的处理,业务连续性得到了保障; 3)运维管理制度为运维工作提供了规范化的解决方案,使运维人员在处理问题时有章可循快速找到问题的根本原因,把问题对业务造成的损失降到最低; 4)运维管理制度是为业务服务的,业务是不断发展的,运维管理制度要跟得上业务的不断发展实现管理制度的创新。 4.自动化运维技术路线选型 4.1自动化运维概述 自动化运维范围包括安装自动化、部署自动化、监控自动化、发布自动化、升级自动化、安全管控自动化、优化自动化、数据备份自动化等。 自动化运维系统包括商用自动化运维系统、开源自动化运维系统,自建(研发)自动化运维系统。 商业的运维系统在功能上要全面一些,服务支持上能好一些,更新与升级有保障,采购成本较高,对运维人员的技术要求相对较低。开源运维系统更灵活一些,服务支持需要运维人员自身多投入一些时间和精力,更新与升级更个性化一些,相对成本较低。自建自动化运维系统对人员的技术要求最高,成本也不低,但是当企业发展到一定规模后自建的运维系统才能更适合企业对于自动化运维的要求。 4.2开源运维工具的应用场景与优势 1)Puppet是一个开源的软件自动化配置和部署工具,它使用简单且功能强大,很多大型IT公司均在使用puppet对集群中的软件进行管理和部署。优缺点分析:优点是Web界面生成处理报表、资源清单、实时节点管理,push命令可即刻触发变更,缺点是相对其他工具较复杂、需学习Puppet的DSL或Ruby,安装过程缺少错误校验和生成错误报表。 2)SaltStack是一种全新的基础设施管理方式,部署轻松,在几分钟内可以运行起来,扩展性好,很容易管理上万台服务器,速度够快,服务器之间秒级通讯。 优缺点分析:优点是可以使用简单的配置模块或复杂的脚本,Web界面可以看到运行和监控的工作状态、事件日志,扩展能力极强,缺点是缺少生成深度报告的能力。 3)Ansible是新出现的运维工具是基于Python研发的综合了众多老牌运维工具的优点实现了批量操作系统配置、批量程序的部署、批量运行命令等功能。在进行大规模部署时,手工配置服务器环境是不现实的,这时必须借助于自动化部署工具。 优缺点分析:优点是模块可以用任何语言开发、备管节点不需要安装代理软件、有Web管理界面、安装运行简单,缺点是对windows备管节点需要加强、执行效率相对较低。 下图是Puppet、Saltstack、Ansible这三款运维工具处理能力与处理效率的对比: 各种运维工具只是用于帮助人员进行运维的,每种工具都有其使用的优势领域,Puppet适用于软件自动化配置和部署;SaltStack适用于基础设施管理,在几分钟内可运行起来,很容易管理上万台服务器,速度够快;Ansible适用于批量操作系统配置、批量程序的部署、批量运行命令等。 4.3 Saltstack实现服务器部署的自动化 Saltstack在企业中实现服务器部署的自动化运维,saltstack是基于python开发的一套C/S架构配置管理工具,它的底层使用zeroMQ消息队列pub/sub方式通信,使用SSL证书签发的方式进行认证管理。 salt我们选择了0.16.0版,该版中加入了multi-masterr 特性,在这种架构下所有的minion将连接到所有配置的master上去。当一个master出现故障可以使用其余的master继续提供服务,不会影响我们的正常使用,saltstack架构如下图: Saltstack在企业中的部署步骤: 1、确定saltstack软件依赖关系是否满足要求:saltstack要求python的版本大于2.6或小于3.0,还需要检查以下的库,包括msgpack-python、yaml、jinja2、markupsafe、apache-libcloud、requests等。2、创建一个master服务的备份节点并复制主master节点的key到备节点: 默认的master的private key是在目录:/etc/salt/pki/master. 将该目录下的master.pem拷贝到备master节点的同一位置,对master的public key文件master.pub做同样的操作,启用备master节点,在备节点接受key。 3、重启minions:配置完成后,minion将会对主master和备master进行核对,并且两个master都对minion有操作权限。 注:minion可以自动检测失败的master,并且尝试重连到一个更快的master,将minion端的参数master_alive_interval 设置为true,即可开启该功能。 4、saltstack状态文件的编写,saltstack上线后,运维工作从复杂的重复的服务器部署和配置工作转移到saltstack状态文件的编写和维护,状态文件的编写要考虑模块化和通用性,在大批量部署之前要经过测试,没有问题后再部署,以下是一些经常用到的测试命令: (1)、查询网络连接情况--是否能连接到客户端(2)、查询网卡ip(3)、查询磁盘空间还有很多经常用到的命令在此就不一一列举了,Saltstack可以实现云计算与数据中心架构编排,Saltstack可以由zabbix监控事件调用,通过Saltstack的salt-cloud实现对docker和openstack等云平台的支持,配合saltstack的mine实时发现功能就可以实现各种云平台业务自动扩展;Saltstack可以与CMDB相结合实现运维平台化、自动化和智能化。 5.自动化运维方案设计 5.1自动化运维规划图 提到自动化运维就不能不说ITIL,ITIL即信息技术基础架构库(Information Technology Infrastructure Library),主要适用于IT服务管理(ITSM)。ITIL为企业的IT服务管理实践提供了一个客观、严谨、可量化的标准和规范。ITIL已经成为了IT服务管理的国际标准,而CMDB配置管理数据库(Configuration Management Database)则是实现ITIL最重要的内容。 随着企业的发展,对于运维要求越来越高,使用现有的开源工具已经不能满足企业对于运维的要求,根据企业业务的发展与对运维的要求建设统一的运维管理平台成为了企业迫切的需求。下面是企业自动化运维总体规划图: 自动化运维平台的建设以ITIL标准为依据,按照先底层后高层的原则先建设服务工具区域的各个运维子系统,各个运维子系统通过API的方式对上层提供服务,最后不同的业务平台去调用这些服务接口即可,运维平台的各个层面建设要全面符合管理制度的要求。 5.2自动化运维平台模块设计 自动化运维平台以ITIL标准为依据在此规范上开发的,第一阶段已经做到了业务流程的标准化,现阶段从事件管理子系统开始逐渐完善各个子系统,把各种配置当作服务来看待,CMDB也可以理解成统一的元数据库,比如说机房信息、服务器信息、人员信息、服务信息、业务信息以及他们之间的物理和业务拓扑关系等,上层的所有系统都应该关联到CMDB,以CMDB为中心,变更后的数据信息必须实时反馈到CMDB中,各个运维子系统才能看到最新的数据信息,确保其他系统能同步这份变更,以达到统一同步的目的。因此把CMDB系统当作运维的核心系统来对待,有利于后续各个系统之间的互通。以下是部分模块的设计要求: 事件管理:负责记录、归类和安排专家处理事故并监督整个处理过程直至事故得到解决和终止。事件管理的目的是在尽可能最小地影响客户和用户业务的情况下使IT系统恢复到SLA服务级别协议(Service-Level Agreement)所定义的服务级别; 问题与日志管理:通过调查和分析IT基础架构的薄弱环节、查明事故产生的原因,并制定解决事故的方案和防止事故再次发生的措施,将由于问题和事故对业务产生的负面影响减小到最低的服务管理流程。在问题管理这部分要做好问题处理过程的日志的功能,对于问题的处理提供查询的功能,可以追踪问题以防止类似问题再次发生。 变更管理:在最短的时间窗口内完成基础架构或服务的变更而对其进行控制的服务管理流程。变更管理的目标是确保在变更实施过程中使用标准的方法和步骤,尽快地实施变更,以将由变更所导致的业务中断对业务的影响减小到最低。 可行性管理:通过分析用户和业务系统的可行性需求并据以优化和设计IT基础架构的可行性,从而确保以合理的成本满足不断增长的可行性需求的管理流程。可行性管理是一个前瞻性的管理流程,它通过对业务和用户可行性需求的定位,使得IT服务的设计建立在真实需求的基础上,从而避免IT服务运作中采用了过度的可行性级别,节约了IT服务的运作成本。 突发事件:分析业务系统的运行状况和已经发生过的问题日志,掌握系统常规问题发生的根源、对于突发事件做到规范化的处理流程。及时发现、及时解决,强化监控监管、技术、备件备品、应急措施、方案、策略等相结合的办法避免和及时的解决突发事件。 自动化运维平台是面向业务的调度平台,平台以业务为导向协调各个子系统,指挥底层各个子系为它服务。自动化运维平台的建设是一个循序渐进的过程,根据业务和运维的需要不断的测试和改进才能从根本上改变运维现状,提升运维工作效率,最终实现自动化运维。 6.企业自动化运维方案总结 企业的运维工作经历了从最开始的全部人工操作,到后来的大部分人工操作少部分自动化,到现在的自动化运维的过程。在没有建设运维平台之前,一个新业务上线,需要做很多操作,例如DNS变更、LVS变更、OS初始化、自动化测试、持续部署、持续反馈、监控、业务调用关系配置等等。现在新业务上线只需要简单的配置,剩余的工作由平台协调自动完成上线。使用自动化运维平台后用户满意度从33%上升到95%,同时期IT费用营收占比从4%下降到2.4%。 通过建设自动化运维平台实现了对业务流程的有效梳理,有效的了解现有的IT资源、运行状况、可靠性与可用性,使企业从全局掌握IT资源和资产的详细信息,为企业的决策提供了有力的支撑; 通过建设自动化运维平台提高了运维工作效率,以前有很多需要人工参与处理的故障和事件,现在绝大部分由运维平台自动按预定的规则进行处理,在运维响应时间上有了很大的提升; 通过建设自动化运维平台发现潜在的问题,降低了故障率,运维人员再也不是以前的“救火”队员了,一些潜在的问题在萌芽阶段就被发现和处理了,避免了故障造成的业务中断; 通过建设自动化运维平台有利于故障的快速恢复,通过对以往时间点配置的保存建立配置基准快照,然后根据出现故障前后的配置基准的比对快速的发现故障的线索和根源,及时找到故障处理办法恢复系统运行。

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

企业级 React 组件库 tinper-bee 发布 2.3.0 版本

tinper-bee 发布 V2.3.0 版本: 1、增强了 Datepicker 日期组件的易用性,支持传入字符串类型的 value 2、Grid 表格增加 EditGrid,支持单元格编辑 3、Table 组件分组表头表格支持拖拽列宽度 4、FormControl 输入框支持设置前后缀 5、InputNumber 数字框支持设置 size 大小 查看详细升级内容:https://github.com/iuap-design/tinper-bee/releases/tag/2.3.0 iuap design 官网:点击查看

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

企业级 React 组件库 tinper-bee 发布 2.2.3 版本

tinper-bee 2.2.3 bee-input-number@2.1.7 🐞 [ Fixbug ] 解决点击加减按钮,触发输入框onBlur事件的问题。 🐞 [ Fixbug ] 输入框为空时,无法输入负号的问题。#385 bee-tabs@2.1.6 🐞 [ Fixbug ]解决TabPane面板中的事件自动触发tabs组件onChange回调的问题。#387 bee-tree@2.1.11 🐞 [ Fixbug ]双击事件触发了两次onDoubleClick回调。 bee-table@2.2.15 🐞 [ Fixbug ]树形表,onRowHover方法返回参数异常。#376 bee-complex-grid@2.0.26 🐞 [ Fixbug ]解决动态改变 column 的属性值,组件报错的问题。#389 bee-svgicon@0.0.1 🌟 [ Feature ]新增 SVG图标组件。 iuap design 官网:点击查看

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

tinper-bee 发布 2.2.2 版本,企业级 React 组件库

iuap design 官网:点击查看 tinper-bee 2.2.2 bee-form-control@2.0.9 💄 [ Update ]解决 Warning: React does not recognize thedebounceDelayprop on a DOM element. 💄 [ Update ]解决value设置为undefined或null时,报警告的问题。 bee-tabs@2.1.5 🌟 [ Feature ]支持自定义属性。 🐞 [ Fixbug ]解决 max-width 导致的样式问题。 🌟 [ Feature ]底层支持DNDclick事件。 bee-tree@2.1.10 🌟 [ Feature ]支持自定义属性。 🐞 [ Fixbug ]树节点展开鼠标移开后会自动收起来。#354 🐞 [ Fixbug ]解决设置 defaultExpandedAll 时,树参照节点自动收起的问题。#379 bee-upload@2.0.5 🌟 [ Feature ]支持自定义属性。 🐞 [ Fixbug ]删除按钮样式不对。 🐞 [ Fixbug ]onRemove返回值为 false 时,依然可以删除。#373 bee-datepicker@2.2.12 🐞 [ Fixbug ]切换年的时候不触发 onChange 事件。#347 🌟 [ Feature ]RangePicker 的 onChange 回调增加第三个参数(dateStrings: [string, string]),类型为字符串数组。 🐞 [ Fixbug ]多语言包增加monthFormat字段。#370 🐞 [ Fixbug ]日期时间范围控件开始时间赋值不了。#367 bee-message@2.1.6 🐞 [ Fixbug ]解决新老版本样式冲突问题,主要是关闭按钮样式问题。#363 bee-menus@2.0.11 🌟 [ Feature ]底层支持DNDclick事件 bee-radio@2.0.18 🐞 [ Fixbug ]解决 radio 在第二次初始值为0 不会被选中的问题。#361 🌟 [ Feature ]支持单独使用 Radio,解决不包裹 RadioGroup 会报错的问题。 bee-checkbox@2.0.9 🐞 [ Fixbug ]checkbox inverse 模式下没有 disabled 样式。#364 🐞 [ Fixbug ]解决点击复选框报错的问题。 bee-pagination@2.0.12 🐞 [ Fixbug ]解决dataNum属性更新失败的问题。#366 🐞 [ Fixbug ]dataNum第一次传0不生效的问题。 bee-table@2.2.14 🐞 [ Fixbug ]Grid 多级表头在点隐藏按钮时,多级表头变成了一级表头。#360 🐞 [ Fixbug ]单元格内容超出列宽时,表头和表体出现错位。 💄 [ Update ]优化多选表格data更新处理逻辑。#314 bee-loading@2.0.3 🐞 [ Fixbug ]loadingType='line' 时不显示tip的bug,tip和children都传的时候,tip优先。 bee-input-number@2.1.5 🌟 [ Feature ]onFocusonBlur回调函数,增加第二个参数:event对象。 bee-popover@3.0.5 🌟 [ Feature ]支持自定义属性。 🌟 [ Feature ]兼容 react 15。 bee-tooltip@2.1.4 🌟 [ Feature ]支持自定义属性。 bee-select@2.0.16 🌟 [ Feature ]支持自定义属性。 bee-affix@1.0.17 🌟 [ Feature ]支持自定义属性。 bee-anchor@0.0.5 🌟 [ Feature ]支持自定义属性。 bee-notification@2.0.3 🌟 [ Feature ]支持自定义属性。 bee-message@2.1.6 🌟 [ Feature ]支持自定义属性。 bee-carousel@1.0.1 🌟 [ Feature ]支持自定义属性。 bee-form@2.0.12 🌟 [ Feature ]支持自定义属性。

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

tinper-bee 2.2.1 版本发布,企业级 React 组件库

iuap design 官网:点击查看 tinper-bee 2.2.1 升级内容 bee-loading@2.0.2 💄 [ Update ]组件内添加默认容器样式 "position : relative"。#327 🌟 [ Feature ]增加tip属性,自定义描述文字。 🌟 [ Feature ]支持服务端渲染。 🌟 [ Feature ]支持自定义属性。 bee-checkbox@2.0.7 🌟 [ Feature ]CheckboxGroup 新增defaultValueAPI,用于设置默认选中的选项。 🌟 [ Feature ]CheckboxGroup 新增optionsAPI,支持通过传入数组,生成可选项 Checkbox。#329 bee-tabs@2.1.2 🐞 [ Fixbug ]竖向tabs,设置额外元素时,样式错乱的问题。 🌟 [ Feature ]新增onEditAPI,新增和删除页签的回调,在tabBarStyle="editable-card"时有效。 🐞 [ Fixbug ]解决onPrevClick、onNextClick属性无效问题。 bee-timepicker@2.0.5 🐞 [ Fixbug ]disabled 状态不显示清空按钮。 🌟 [ Feature ]增加showClear参数,控制清空按钮是否显示。 bee-tree@2.1.6 🐞 [ Fixbug ]解决动态获取数据源时,defaultExpandAll 和 defaultExpandedKeys 不生效的问题。#331 🐞 [ Fixbug ]解决动态改变 treeData 时,没有重新截取数据的问题。 💄 [ Update ]递归遍历数据方法中,优化对 expandedKeys 的处理。 🐞 [ Fixbug ]滚动加载时,获取树节点真实行高。 bee-tree-select@0.0.6 🌟 [ Feature ]树选择 TreeSelect 多选的时候支持搜索。#315 bee-cascader@2.1.6 🐞 [ Fixbug ]解决了点击清除按钮时,被包裹在form中的级联组件Cascader的值不会被清除。#300 🌟 [ Feature ]新增separatorAPI,用于自定义分隔符。#338 bee-upload@2.0.1 🌟 [ Feature ]新增disabledAPI,用于禁止上传、删除已上传列表行为。#336 🌟 [ Feature ]listTypeAPI 新增picture-card类型,支持图片预览及删除功能。 🐞 [ Fixbug ]解决预览图片显示不出来的问题。#326 bee-table@2.2.12 💄 [ Update ]嵌套表格,扩展行支持高度自适应。#333 🐞 [ Fixbug ]解决多选表格,某一行禁用多选,通过行点击仍然可以操作多选框的问题。#334 🌟 [ Feature ]增加自定义整行整列样式(包括背景色和字体内容颜色)。 🌟 [ Feature ]多选表格,新增multiSelectConfigAPI,用于自定义 Checkbox 属性,如设置复选框为红色填充。 🐞 [ Fixbug ]解决层级树大数据场景,动态改变data时,数据未同步的问题。 🐞 [ Fixbug ]修正 props 拼写错误。 bee-affix@1.0.16 🌟 [ Feature ]支持服务端渲染。#340 bee-datepicker@2.2.8 🌟 [ Feature ]支持服务端渲染。#343 🐞 [ Fixbug ]RangePicker 缺少onOk事件。 🐞 [ Fixbug ]MonthPicker 缺少onOpenChange事件。 💄 [ Update ]format 参数增加默认值。 💄 [ Update ]优化组件额外页脚的样式。#343 bee-modal@2.1.2 🌟 [ Feature ]modal静态方法支持设置backdropClose、centered参数。#342 🐞 [ Fixbug ]解决 warning:React does not recognize the “X” prop on a DOM element。#350 bee-pagination@2.0.10 🌟 [ Feature ]分页条中的特殊按钮添加类名标识。#344

资源下载

更多资源
腾讯云软件源

腾讯云软件源

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

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

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等操作系统。

用户登录
用户注册