首页 文章 精选 留言 我的

精选列表

搜索[初体验],共236篇文章
优秀的个人博客,低调大师

SQL自动化审核初体验

一、缘起 2015.12.5,广州,ACOUG Asia Tour 广州站 第一次参加ACOUG论坛,会上盖老师分享道:“云时代的DBA将自后向前置、DevOps势在必行—最佳实践是SQL审核”,当时心头一股狂热,原来数据库还能这样玩。 后来也在公司试水SQL审核,制定SQL开发规范、培训开发人员、人肉审核、人肉发布,乐此不疲,以为这就是传说中的数据库DevOps最佳实践;试水一段时间后,发现效果甚微,整个SQL审核过程都是人工,效率很低,而且可笑的是,开发人员也有同样的DB操作权限,干啥要听你DBA的呢?当时很天真的认为,只要DBA在SQL方面比开发更专业,人家就会自觉遵守游戏规则。现在回头看,当时站的太高,过于理想,不够踏实。 2017.5.11-13,北京,DTCC-数据库技术大会 第一次参加DTCC,这应该是转型专职DBA以来,收获最大的3天,全场超过一半讲师都讲到DB自动化运维,自此自动化运维在心里埋下一颗种子。 后来也在公司试水自动化运维,尝试用Python开发了几个小工具,切身感受到自动化带来的便利,自动化确实能避免很多低价值、重复繁琐的劳动。同时也一直在思考,能否借助自动化来实现SQL审核呢?也算是机缘巧合吧,偶然在github上发现一个SQL审核的开源项目archer,折腾试用一番后,两年前的那种狂热又冒出来了。 二、平台介绍 archer 基于inception的自动化SQL操作平台,支持工单、审核、认证、邮件、OSC等功能。 github地址:https://github.com/jly8866/archer 如果对archer做一个分解的话,个人觉得可以分为inception和django inception是内在,负责审核 django是外在,负责展示 ps:这种理解,不知道原作者会不会很郁闷,哈哈 inception 一个集审核、执行、备份及生成回滚语句于一身的MySQL自动化运维工具 github地址:https://github.com/mysql-inception/inception Django Django是一个开放源代码的Web应用框架,由Python写成。采用了MT'V的框架模式,即模型M,模板T和视图V。 三、二次开发 在archer的基础上也做了一些简单的二次开发: 屏蔽单点登录 修复邮件发送bug 显示中文全名 为工程师分配指定的数据库实例 接下来,计划在archer集成更多的功能: MSDB 数据归档 数据库备份 性能报告 巡检报告 四、小结 目前,已经将archer部署到生产环境,也为新上线的某x项目成功发布DB脚本,后续准备逐步铺开。 总的来说,个人觉得效果还是ok的,起码在数据库自动化和DevOps走出了一步,对比两年前的人工审核SQL,总结两点感受最深的经验: 一定要借助自动化工具/平台,纯人工效率实在低 一定要找到合适的审核点,让大家都来遵守,对于SQL审核来说,就是要把DB操作权限掌握在DBA手里,不能对外开放,这点一定要掐死了!!!是的,掐死了,要狠!!!哈哈 五、附录: 最后附上几张平台截图: 原文发布时间为:2018-01-29 本文作者:蓝剑锋 本文来自云栖社区合作伙伴“老叶茶馆”,了解相关信息可以关注“老叶茶馆”微信公众号

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

我的 OpenStack 代码贡献初体验

OpenStack如今已成为开源云平台中的明星项目,得到广泛关注。OpenStack的优秀出众依赖于众多开发者的努力,在享受其带来的便利与快捷的同时,为其做一份贡献也是一个开发者的义务。在前段时间的OpenStack的测试过程中,我发现Nova项目中的一个Bug,于是向社区提交了Bug报告,并提交代码修复了该Bug,从提交报告到代码入库经历近一月,下面重现整个过程。 一.发现Bug: Nova中的虚拟机软删除(soft-delete)功能,是指在一段时间内,仅将数据库中的某虚拟机记录做一个标记 (status='SOFT-DELETE'),然后将虚拟化平台(kvm等)中对应的虚拟机实例置为关机状态,当超过某一时间段后才将虚拟机实例真正删除;该功能为云平台用户提供了“后悔时间”,可以在一定程度上挽回误操作。默认情况下,软删除功能是关闭的,其开启方式是在nova配置文件中添加"reclaim_instance_interval"选项,并将其值设置为"后悔时间"的毫秒数。 在描述具体Bug前,需要对openstack中的用户管理方面的基本概念简单介绍一下。 上图是openstack用户模型的简化版本,为了便于理解将不属于keystone管理的quota也拿了过来。 Bug就与软删除相关。具体场景是这样的:假设OpenStack中有两个项目和两个用户:普通项目A其用户a,管理员项目Admin其用户为 admin(用户管理相关概念可以查阅keystone文档),用户a不慎将自己的一台虚拟机删除了,这时求助系统管理员看看有没有办法恢复,好在系统开启的软删除功能,而且被删除的虚拟机还在可回收的时间范围内,这时管理员便以admin的身份登录系统,为用户a恢复了虚拟机,但是细心的管理员却发现了一些不对:其Admin项目下并没有任何虚拟机,但是其配额却被使用了,难道这和刚才的操作有关?再来重试一下:普通用户删除虚拟机,admin用户来为其恢复,这时配额又发生了变化,果然如此:被恢复的虚拟机的配额错误的添加到了Admin项目下。该Bug在最新的kilo版本中仍然存在,感兴趣的同学可以实验一下。 二.定位Bug: 发现了Bug的存在,那就更进一步,到代码中找一下原因吧。 如何确定问题代码的位置呢?这需要对Nova的项目结构有大体的了解,我们来简单了解一下:上图是nova架构的极简版本,与本问题无关的组件都没有画上去,恢复虚拟机的操作过程大致是这样: nova api接收到用户请求,到数据库中查询虚拟机详情,将该虚拟机所在的主机、名称等数据发送到消息队列中; nova compute服务在监听到相关消息后,开始执行具体操作,将虚拟机在数据库中的记录做些调整,调用底层驱动恢复虚拟机。 既然软删除的功能层面没有任何问题,虚拟机的删除和恢复过程都很顺利,可见不会是驱动的问题,顺着API层的代码调用往下找,很快就可以定位了。直接看出问题的代码片段: defrestore(self,context,instance): #该代码做了删减 flavor=instance.get_flavor() #获取quotas对象 num_instances,quotas=self._check_num_instances_quota( context,flavor,1,1) self._record_action_start(context,instance,instance_actions.RESTORE) try: ifinstance.host: instance.task_state=task_states.RESTORING instance.deleted_at=None instance.save(expected_task_state=[None]) self.compute_rpcapi.restore_instance(context,instance) else: instance.vm_state=vm_states.ACTIVE instance.task_state=None instance.deleted_at=None instance.save(expected_task_state=[None]) #更新quotas quotas.commit() 上面的这段代码就是API层面上进行虚拟机回收的主要方法,可以看到其中有明显的配额操作(quotas),在解读这段代码前有必要先对nova 中"context"的概念做个简介。不仅是nova,在openstack其他项目中都随处可见这个"context",它是一个包装了用户请求信息的对象,包含用户的项目和认证信息等,通过它可以简便的进行各项目之间的API调用和用户信息的查询,API服务接收到用户的每一次HTTP请求,都会创建一个新的context。 回到这段代码,我们重点关注对quotas所作的操作:在方法的第二行,通过了一个方法获取了quotas,有在方法的结尾执行了 quotas.commit(),能够获取到的信息不多,我们再看一下获取quotas的方法:_check_num_instances_quota #这里只截取一部分 def_check_num_instances_quota(self,context,instance_type,min_count, max_count): req_cores=max_count*instance_type['vcpus'] vram_mb=int(instance_type.get('extra_specs',{}).get(VIDEO_RAM,0)) req_ram=max_count*(instance_type['memory_mb']+vram_mb) try: quotas=objects.Quotas(context) quotas.reserve(context,instances=max_count, cores=req_cores,ram=req_ram) ... returnmax_count,quotas 这里可以看到获取quotas的过程:通过当前的context创建quotas对象,并且执行了reserve操作; 我们知道context是由HTTP请求而来,里面保存的是发请求的用户的信息,所以这里的quotas对象的“所有者”也就是context中的用户。 结合Bug发生的场景来看:管理员还原用户a的虚拟机,发请求的是管理员,当前context中记录的是管理员的信息,这里的quotas理所当然的就是管理员的,然后操作了用户a的虚拟机,更新的却是管理员的quotas。嗯,真相大白! 三.修复Bug: Bug的原因是获取的quotas并不属于期望的用户,但是直接修改context显然不合适(会影响后续的操作),先了解一下quotas对象自身吧: classQuotas(base.NovaObject): #部分代码 def__init__(self,*args,**kwargs): super(Quotas,self).__init__(*args,**kwargs) #Setupdefaults. self.reservations=[] self.project_id=None self.user_id=None self.obj_reset_changes() ... defreserve(self,context,expire=None,project_id=None,user_id=None, **deltas): reservations=quota.QUOTAS.reserve(context,expire=expire, project_id=project_id, user_id=user_id, **deltas) self.reservations=reservations self.project_id=project_id self.user_id=user_id self.obj_reset_changes() defcommit(self,context=None): ifnotself.reservations: return ifcontextisNone: context=self._context quota.QUOTAS.commit(context,self.reservations, project_id=self.project_id, user_id=self.user_id) self.reservations=None self.obj_reset_changes() 注意看reserve方法的参数,默认为None的project_id和user_id,这正是改变quotas属主的方便入口! 修改后的代码这里就不贴了,感兴趣的同学可以到这次提交中看:Code Review 四.代码提交和Review: openstack社区有着整套项目管理流程,这里有一张图能够较详细的描述工作流程: 由图可见bugfix是其中最简单的流程。 关于如何提交代码,这篇文章有详细的介绍: 向 OpenStack 贡献您的代码。另外需要注意一点,在国内向社区提交代码,经常会因为网络问题导致无法提交,幸好找到了大牛的博客介绍了该类问题的解决办法。 修改完代码的单元测试和pep8本地测试当然不能少,早就知道社区对单元测试要求很严格,这次才真正领教了,三行代码的修改,单元测试却写了30 行,review期间多次因为单元测试的问题重提代码(哭)。社区里面的开发者,尤其是项目的core,对待项目有着像对自己孩子般的认真与细致:他们会在一个自己根本不会在意的地方提醒你、面对当前的问题他们会延伸的考虑类似的问题。他们的态度让我首先感受到的吃惊,然后是敬佩! 经历八次review、历时近一个月,我的代码总算是入库了!希望我的这篇记录能对你有帮助。 感谢休伦公司技术总监 孙琦 提供的英文支持,社区大牛Alex Xu给出的修改建议。 Launchpad上面的bug提交:Abnormal changes of quota usage after instance restored by admin 代码审查过程:Fix abnormal quota usage after restore by admin Git@OSC中的代码:Fix abnormal quota usage after restore by admin 博文出处:http://my.oschina.net/zyzzy/blog/509315 关于OpenStack OpenStack是一个由NASA(美国国家航空航天局)和Rackspace合作研发并发起的,是一个开源的云计算管理平台项目,由几个主要的组件组合起来完成具体工作。OpenStack支持几乎所有类型的云环境,项目目标是提供实施简单、可大规模扩展、丰富、标准统一的云计算管理平台。 OpenStack除了有Rackspace和NASA的大力支持外,还有包括戴尔、Citrix、Cisco、Canonical等重量级公司的贡献和支持,致力于简化云的部署过程并为其带来良好的可扩展性。 本文作者:YueZheng 来源:51CTO

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

DockerCon 2017: Docker新特性初体验

DockerCon2017已经结束了,从去年的版本到现在,Docker产生了很多的变化。Docker的开发者们一直强调他们希望Docker的体验越简单越好。观察下最近几个月Docker的新特性,你会发现所言非虚,DockerCon2017大会也向我们展示了这一点。下面介绍下Docker最近几个月发布的新特性 多阶段构建 构建一个镜像一般需要多个阶段。 编译你的应用 然后跑测试 当测试通过时,你将你的应用打包成可部署的软件包 最后你把软件包添加到镜像里面 你可以将这些步骤都放进一个Dockerfile中,但是这会导致镜像膨胀,加入了很多最终产品不需要的内容。例如编译和构建的框架,Docker镜像存储需要的空间也会变得很大。一个解决方法是在Docker外面编译测试打包应用程序,或者使用多个Dockerfile。你可以用一个Dockerfile来编译

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

每日一博 | RocketMQ 事务消息初体验

事务消息是 RocketMQ 的高级特性之一 。这篇文章,笔者会从应用场景、功能原理、实战例子三个模块慢慢为你揭开事务消息的神秘面纱。 1 应用场景 举一个电商场景的例子:用户购物车结算时,系统会创建支付订单。 用户支付成功后支付订单的状态会由未支付修改为支付成功,然后系统给用户增加积分。 通常我们会使用普通消费方案,该方案能够发挥 MQ 的优势:异步和解耦 , 同时架构设计非常简单。 用户购物车结算时,系统创建支付订单; 支付成功后,更新订单的状态从未支付修改为支付成功; 发送一条普通消息到消息队列服务端; 积分服务消费消息,添加积分记录。 但该方案有个非常直观的缺点:容易出现不一致的现象。 假如先发送消息,后修改订单状态,消息发送成功,订单没有执行成功,需要回滚整个事务(订单数据事务回滚,积分服务消费时,需要先反查事务状态,若事务提交,才插入积分记录)。 假如先修改订单状态,后发送消息,订单状态修改成功,但消息发送失败,需要补偿操作才能保持最终一致。 假如先修改订单,后发送消息,订单状态修改成功,但消息发送超时,此时无法判断需要回滚订单还是提交订单变更。 我们看到,为了完善普通消费方案,业务层还需要做到两点:补偿机制和提供事务状态查询接口。 要做到这两点,难不难呢? 不难,但是业务层代码会比较混乱,更优的方案还是得从中间件层面解决。 2 功能原理 RocketMQ 事务消息是支持在分布式场景下保障消息生产和本地事务的最终一致性。交互流程如下图所示: 1、生产者将消息发送至 Broker 。 2、Broker 将消息持久化成功之后,向生产者返回 Ack 确认消息已经发送成功,此时消息被标记为"暂不能投递",这种状态下的消息即为半事务消息。 3、生产者开始执行本地事务逻辑。 4、生产者根据本地事务执行结果向服务端提交二次确认结果( Commit 或是 Rollback ),Broker 收到确认结果后处理逻辑如下: 二次确认结果为 Commit :Broker 将半事务消息标记为可投递,并投递给消费者。 二次确认结果为 Rollback :Broker 将回滚事务,不会将半事务消息投递给消费者。 5、在断网或者是生产者应用重启的特殊情况下,若 Broker 未收到发送者提交的二次确认结果,或 Broker 收到的二次确认结果为 Unknown 未知状态,经过固定时间后,服务端将对消息生产者即生产者集群中任一生产者实例发起消息回查。 生产者收到消息回查后,需要检查对应消息的本地事务执行的最终结果。 生产者根据检查到的本地事务的最终状态再次提交二次确认,服务端仍按照步骤4对半事务消息进行处理。 笔者认为事务消息的精髓在于: 本地事务执行成功,消费者才能消费事务消息; 消息回查本身就是补偿机制的实现,事务生产者需提供了事务状态查询接口。 3 实战例子 为了便于大家理解事务消息 ,笔者新建一个工程用于模拟支付订单创建、支付成功、赠送积分的流程。 首先,我们创建一个真实的订单主题:order-topic 。 然后在数据库中创建三张表 订单表、事务日志表、积分表。 最后我们创建一个 Demo 工程,生产者模块用于创建支付订单、修改支付订单成功,消费者模块用于新增积分记录。 接下来,我们展示事务消息的实现流程。 <strong style="font-size: 15px;line-height: inherit;color: black;">1、创建支付订单</strong> 调用订单生产者服务创建订单接口 ,在 t_order 表中插入一条支付订单记录。 <strong style="font-size: 15px;line-height: inherit;color: black;">2、调用生产者服务修改订单状态接口</strong> 接口的逻辑就是执行事务生产者的 sendMessageInTransaction 方法。 生产者端需要配置事务生产者和事务监听器。 发送事务消息的方法内部包含三个步骤 : 事务生产者首先发送半事务消息,发送成功后,生产者才开始执行本地事务逻辑。 事务监听器实现了两个功能:执行本地事务和供 Broker 回查事务状态 。 执行本地事务的逻辑内部就是执行 orderService.updateOrder 方法。 方法执行成功则返回 LocalTransactionState.COMMIT_MESSAGE , 若执行失败则返回 LocalTransactionState.ROLLBACK_MESSAGE 。 需要注意的是: orderService.updateOrder 方法添加了事务注解,并将修改订单状态和插入事务日志表放进一个事务内,避免订单状态和事务日志表的数据不一致。 最后,生产者根据本地事务执行结果向 Broker 提交二次确认结果。 Broker 收到生产者确认结果后处理逻辑如下: 二次确认结果为 Commit :Broker 将半事务消息标记为可投递,并投递给消费者。 二次确认结果为 Rollback :Broker 将回滚事务,不会将半事务消息投递给消费者。 <strong style="font-size: 15px;line-height: inherit;color: black;">3、积分消费者消费消息,添加积分记录</strong > 当 Broker 将半事务消息标记为可投递时,积分消费者就可以开始消费主题 order-topic 的消息了。 积分消费者服务,我们定义了消费者组名,以及订阅主题和消费监听器。 在消费监听器逻辑里,幂等非常重要 。当收到订单信息后,首先判断该订单是否有积分记录,若没有记录,才插入积分记录。 而且我们在创建积分表时,订单编号也是唯一键,数据库中也必然不会存在相同订单的多条积分记录。 4 总结 RocketMQ 事务消息是支持在分布式场景下保障消息生产和本地事务的最终一致性。 编写一个实战例子并不复杂,但使用事务消息时需要注意如下三点: 1、事务生产者和消费者共同协作才能保证业务数据的最终一致性; 2、事务生产者需要实现事务监听器,并且保存事务的执行结果(比如事务日志表) ; 3、消费者要保证幂等。消费失败时,通过重试、告警+人工介入等手段保证消费结果正确。 本文涉及到的工程源码,笔者已上传到 Github ,感兴趣的同学可以了解一下,若有疑问直接加笔者好友,一起交流技术,一起成长。 笔者会在后续的文章里,详细解析事务消息的实现原理,敬请期待。 实战代码地址: https://github.com/makemyownlife/rocketmq4-learning 如果我的文章对你有所帮助,还请帮忙点赞、在看、转发一下,你的支持会激励我输出更高质量的文章,非常感谢!

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

开源认证授权管理平台Keycloak初体验

上一篇文章简单介绍了Keycloak,反响不错。看来大家都对这个东西感兴趣,今天就来进一步的体验Keycloak,让我们对它有一个直观的认识,然后逐步深入,把它的设计理念和概念各个击破。 总体思路 因为事先已经知道Keycloak提供了Spring Security的适配器。先独立把Keycloak的核心概念弄清楚,然后再去研究它如何结合Spring Security的。 安装Keycloak 本文的Keycloak版本为 14.0.0。 我向来不喜欢在安装上浪费时间,研究阶段能用Docker来安装是最省心的: docker run -d -p 8011:8080 --name keycloak-server -e KEYCLOAK_USER=admin -e KEYCLOAK_PASSWORD=admin jboss/keycloak 执行上述命令安装Keycloak,成功后打开http://localhost:8011/auth/admin输入账号admin和密码admin,就进入了管理控制台。如果你感觉英文不爽可以根据下图改成中文: 改完之后你随便点点栏目了解一下,想象一下它们各自的功能和作用,这时候你要放轻松点不用想的太深就是了解一下全貌。 Realm 如果你接触过知名安全框架Shiro相信对这个概念不会陌生。realm是管理用户和对应应用的空间,有点租户的味道,可以让不同realm之间保持逻辑隔离的能力。 默认情况下,Keycloack提供了一个叫Master的realm,这个Master不承担具体应用和用户的管理,它只用来管理其它realm的生命周期。 登入Master的realm创建一个自定义域felord.cn。 User User是能够登录到应用系统的实体,其实可以理解为账户。他们可以拥有与自己相关的属性,例如电子邮件、用户名、地址、电话号码和生日。可以为他们分配组成员身份并为其分配特定的角色。Keycloak中的User都有他们从属的realm。接下来在我上面的自定义域felord.cn中新建一个用户,步骤为: 菜单栏找到管理->用户,然后打开添加用户。 键入唯一的必填项用户名(username)。 开启(ON)邮件认证(Email Verified),然后保存。 点击凭据(Credentials)选项卡为新用户设置临时密码。此密码是临时的,用户将需要在第一次登录时更改它。如果您更喜欢创建永久密码,请将临时开关切换到关闭并单击设置密码。 然后注销当前用户admin并到http://localhost:8011/auth/realms/felord.cn/account以刚创建的用户felord的身份登录到felord.cn域。 有没有发现登录链接的特点? 到这里一个创建realm和账户的流程就熟悉完了,不过我相信大多数同学看到这里还是懵逼的。怎么就手动了呢?不要急后面会结合代码来实现上述的流程以及更加符合应用场景的流程。 Keycloak的核心概念 接下来是我们在使用Keycloak时需要掌握的一些概念,上面已经提到了realm和user,这里就不再赘述了 authentication 识别和验证用户的过程。证明“你说的这个你就是你”。 authorization 授予用户访问权限的过程。标明“你可以干什么、不可以干什么”。 credentials 证明用户身份的凭证。可能是密码、一次性密码、数字证书以及指纹。 roles 角色是RBAC的重要概念,用于表明用户的身份类型。 user role mapping 用户角色映射关系。通常一个用户可能有多个角色,一个角色也可以对应不同的人。 composite roles 复合角色,听起来很玄乎,其实就是角色的从属关系或者说继承关系。 B角色从属于A角色,那么你拥有了A角色就一定拥有B角色的权限。 groups 用户组,你可以将一系列的角色赋予定义好的用户组,一旦某用户属于该用户组,那么该用户将获得对应组的所有角色权限。 clients 客户端。通常指一些需要向keycloak请求以认证一个用户的应用或者服务,甚至可以说寻求keycloak保护并在keycloak上注册的请求实体都是客户端。 client adapters keycloak为了支持多语言和跨平台而设计的适配器,比如适配Java的、适配Python的。有些是内置的实现,有些需要我们按照keycloak的抽象定义来实现。后续我们主要和Spring Boot Adapter打交道。 identity provider 用来认证用户的服务,简称IDP。keycloak本身就是一个IDP。这个类似Spring Security中的AuthenticationProvider接口。 还有一些概念等遇到了会再补充,有点多,先消化消化。 总结 今天这一篇主要对keycloak进行一个初步的体验,搭建了一个开发环境供后续的学习,同时对keycloak的一些核心概念进行了汇总。不过由于篇幅限制没有完全的去梳理一些概念,不过学习都是循序渐进的,急不得。自定义realm和用户都建好了,下一篇我将尝试用keycloak来保护Spring Boot应用。业余时间,码字不易,还请多多关注,大力支持一下作者。 关注公众号:Felordcn获取更多资讯 个人博客:https://felord.cn

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

containerd 与安全沙箱的 Kubernetes 初体验

作者 | 易立 阿里云资深技术专家 containerd 是一个开源的行业标准容器运行时,关注于简单、稳定和可移植,同时支持 Linux 和 Windows。 2016 年 12 月 14 日,Docker 公司宣布将 Docker Engine 的核心组件 containerd 捐赠到一个新的开源社区独立发展和运营。阿里云、AWS、 Google、IBM 和 Microsoft 作为初始成员,共同建设 containerd 社区; 2017 年 3 月,Docker 将 containerd 捐献给 CNCF(云原生计算基金会)。containerd 得到了快速的发展和广泛的支持; Docker 引擎已经将 containerd 作为容器生命周期管理的基础,Kubernetes 也在 2018 年 5 月,正式支持 container

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

Groovy初体验:构建高性能JVM应用

为什么要学Groovy Groovy运行于JVM之上,然而其对动态语言、函数式编程范式以及元编程功能的加持所带来的表现力和简洁性可以说甩了Java几条街。我们可以利用Groovy的所有动态功能构建高性能的JVM应用、将开发效率提高几个数量级! 这就是我们为什么要学它! Groovy环境部署 本文实验所用OS为CentOS7,这里介绍使用sdk工具来安装Groovy的方法。 首先在命令行下执行: curl -s get.sdkman.io | bash 接下来执行: source "$HOME/.sdkman/bin/sdkman-init.sh" 然后我们就可以使用sdk工具来安装Groovy: 一句话搞定! sdk install groovy 完成之后我们来检查Groovy安装状态 groovy -v 一切就绪 Hello World From Groovy [root@localhost ~]# vim Hello.groovy [root@localhost ~]# more Hello.groovy println "Hello World From Groovy !" [root@localhost ~]# groovy Hello Hello World From Groovy ! Groovy语言特性 Groovy是轻量级的Java Groovy的信噪比比Java高:较少的代码获得更多结果 GDK = Groovy JDK:通过向JDK的各种类中添加便捷方法,Groovy扩展了JDK形成了GDK库 return语句可选,分号结尾可选 方法和类默认public 导航操作符可帮助实现对象引用不为空时方法才会被调用 Groovy不强迫捕获自己不关心的异常,没捕获的异常自动传到高层 静态方法内可使用this来引用Class对象,因此可以链式调用! 两大优点:表现力 + 简洁!!! 从Java到Groovy 用Java写一段代码如下: public class Greetingss { public static void main( String[] args ) { for( int i=0; i<3; i++ ) { System.out.println("ho "); } System.out.println("Merry Groovy"); } } 用Groovy重构一遍如下: for(i in 0..2) { print 'ho ' } print 'Merry Groovy' 看看两种语言的信噪比对比,真是给人不可估量的感动! 安全导航操作符 ?. 可以避免代码中的大量null引用的判断 def foo( str ) { str?.reverse() // 仅当str不为null时reverse才会执行 } 这可以帮我们省多少个if啊!!! 异常处理 与Java相比,Groovy的异常处理少了很多繁文缛节 对于那些不想处理或者不适合在代码当前层次处理的异常,Groovy对用户不做任何要求,任何用户未处理的异常会自动传递到高一层,我们啥也不用写: def openfile( fileName ) { // 无需throws new FileInputStream( fileName ) // 无需try...catch... 处理 } 异常可以放到其调用代码中处理: try { openFile("nonexistfile") } catch( FileNotFoundException ex ) { print "Oops: " + ex } 若捕获所有异常(Exception),则上面catch中异常的类型都可省略: try { openFile("nonexistfile") } catch( ex ) { // 省略类型表示可捕获所有异常 print "Oops: " + ex } 链式调用 静态方法内可使用this来引用Class对象,因此可以链式调用 class Wizard { def static learn( trick, action ) { //... this } } Wizard.learn('xxxx', {...}) .learn('yyyy', {...}) .learn('zzzz', {...}) 后记 作者更多的原创文章在此: https://www.jianshu.com/u/d19536b0189b

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

Exchange2013 RTM安装初体验(一)

前期微软发布了一系列的新产品,Office2013、Exchange2013、Lync2013,其中我最感兴趣的还是Exchange2013和Lync2013。当前我们同样得知前期是Preview version,可现在已经是RTM version了,无奈前段时间工作繁忙,没有抽出时间做,这两天终于腾出些时间,赶紧进行了安装测试;简单说下Exchange2013的改进,硬件方面变化很大,在测试中发现为虚拟机分配的动态内存4096-8192MB之间看,在初安装的时候占用内存不高,可在安装好后直接占用内存资源到7454MB了,结果告诉我们对内存的要求也越来越高了。活动目录DC和GC最低要求windows 2008 standard。最值得关注的是Exchange 2013 在角色上发生了重大改变,只有Client Access和Mailbox两种角色,邮箱服务器包含了典型的服务器组件和客户端访问服务器角色,用来处理所有的身份验证和代理等服务,同时只支持windows 2008 R2及windows server 2012系统。Exchange 2013 已不支持outlook 2003客户端。Exchange管理中心将取代于以前的EMC,Exchange 2013 的所有管理工作全部都迁移到了Web界面的管理中心当中;微软本来是将Exchange 2007之后的版本已经慢慢的开始启用了公用文件夹,但是现在在 Exchange 2013 中微软又启用了它。可以使用EAC来管理他们,并且现代公用文件夹将作为灾难恢复和数据库可用性组的一部分 初步了解后,我们开始安装Exchange 2013 RTM。基本信息如下: http://technet.microsoft.com/nl-NL/library/aa996719.aspx 安装步骤: 1. 环境架构---AD环境准备 2.安装DHCP服务,配置(授权及新建作用域) 3.部署命名为Ex2013-01的成员服务器, 4.下载Exchange2013必备应用程序(3个),具体见下 http://www.microsoft.com/en-us/download/details.aspx?id=34992 http://www.microsoft.com/en-us/download/details.aspx?id=17062 http://www.microsoft.com/en-us/download/details.aspx?id=26604 5.安装Exchange2013必备应用程序及安装 6.Exchange2013安全前准备,安装所需角色及功能 7.安装Exchange2013应用程序 环境介绍: Domain Name:abc.com Hostname:ABC-DC IP:192.168.100.3 Roles:DC、DHCP、DNS Hostname:MDT2012 IP:192.168.100.100 Roles:MDT Server2012 Hostname:EX2013-01 IP:192.168.100.10 Roles:Exchange Server 2013 Hostname:EX2013-02 IP:192.168.100.11 Roles:Exchange Server 2013 Hostname:TMG01 IP:192.168.100.1 Roles:Gateway Hostname:Test IP:192.168.100.x Roles:Test computer 一、环境架构---AD准备 首先是安装一台独立服务器,并且命名为:ABC-DC;同时安装ADDS服务及所需功能 开始安装ADDS服务 安装完后通过GUI来将安装了ADDS的独立服务器提升为域控制器 添加新林,域名为:ABC.COM 域及林的功能级别为:Windows server 2012;输入目录还原密码 森林中第一台DC担任DNS、GC角色 配置好信息后开始安装。 已成功将该服务器提升为DC,提升后重启即可 通过运行DSA.MSC打开用户和计算机管理控制台 为了方便管理,新建用户gaowenlong并且赋予最大的域权限 二、安装DHCP服务及配置(授权及新建作用域) 安装后,开始完成DHCP配置—授权 通过运行dhcpmgmt.msc打开DHCP控制台,新建作用域 定义地址分发范围;192.168.100.150----192.168.100.200 定义网关:192.168.100.1 DHCP服务配置完成 三、安装及部署Exchange Server2013(Ex2013-01)独立服务器;并且将该独立服务器命名为:Ex2013-01同时加入到abc.com域内 四、下载及安装Exchange2013前所需应用程序 http://www.microsoft.com/en-us/download/details.aspx?id=34992 http://www.microsoft.com/en-us/download/details.aspx?id=17062 http://www.microsoft.com/en-us/download/details.aspx?id=26604 五、将Exchange2013必备应用软件拷贝到Ex2013-01的桌面上准备安装; 安装应用所需程序; 安装以上应用程序后,需要卸载Unified安装后所附带应用程序:microsoft visual c+++++ 然后,因为运行windows server2012系统,然后安装Exchange2013所以需要安装一下角色 7.安装Exchange2013前准备;安装Exchange2013必需的角色及功能;通过powershell安装 Install-windowsfeature RSAT-ADDS 安装所需角色及功能;以管理员身份运行Powershell Install-WindowsFeature AS-HTTP-Activation, Desktop-Experience, NET-Framework-45-Features, RPC-over-HTTP-proxy, RSAT-Clustering, Web-Mgmt-Console, WAS-Process-Model, Web-Asp-Net45, Web-Basic-Auth, Web-Client-Auth, Web-Digest-Auth, Web-Dir-Browsing, Web-Dyn-Compression, Web-Http-Errors, Web-Http-Logging, Web-Http-Redirect, Web-Http-Tracing, Web-ISAPI-Ext, Web-ISAPI-Filter, Web-Lgcy-Mgmt-Console, Web-Metabase, Web-Mgmt-Console, Web-Mgmt-Service, Web-Net-Ext45, Web-Request-Monitor, Web-Server, Web-Stat-Compression, Web-Static-Content, Web-Windows-Auth, Web-WMI, Windows-Identity-Foundation–Restart 角色安装成功并且重启 7.安装exchange2013程序;不更新,直接下一步 开始拷贝所需文件 初始化设置 同意安装 开始正式安装Exchange 2013,选择所要安装的Exchange 2013的角色,本例安装所有角色(正如前面提到Exchange2013只有CAS和Mailbox两种角色),点击“next” Exchange organization Name:再次默认即可 警告再次可忽略,因为提示安装Exchange2013会对AD的架构进行扩展,忽略即可 开始安装,在此过程需要30分钟左右,具体时间可根据机器的性能来计算 在30分钟的等待中,我们看到了成功安装完成。 运行开始我们可以看见有两个Exchange控制台;一个为EMS一个是Exchange toolbox Exchange2013配置下节再做详细介绍 本文转自 高文龙 51CTO博客,原文链接:http://blog.51cto.com/gaowenlong/1059553,如需转载请自行联系原作者

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

Microsoft Band初体验:功能没有很大创新

微软在10月30号发布了全新的硬件产品Microsoft Band智能手环,这款产品在发布第二天就能在微软线上和线上的直营店购买,售价199美元。微软出品的智能手环到底如何呢?来看看国外媒体的上手体验。 之前并没有提到的是,微软这款手环拥有大小尺寸可选,不过目前有存货的都是小尺寸的。Gigaom的作者Kevin C. Tofel一早买了一台,并很快写了一篇初上手体验。 外观 Microsoft Band让人联想起Fitibit Force,但是感觉更加扎实,重量为60克。矩形屏幕则与三星Gear Fit有些类似。搭扣可以很容易调整松紧。 心率传感器在腕带搭扣的一端,不管屏幕在手腕内侧还是外侧它都能使用。整只手环只有两个按键。类Windows Phone的界面设计使用起来很直观。 手环佩戴起来最好屏幕放在手腕内侧,这样信息读取更容易,也

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

小白用户MaxCompute数据同步初体验

作为一个运营人员,工作中经常性地需要对大量业务数据进行分析,使用阿里云的MaxCompute可以非常方便的进行海量数据的处理。基于工作的特殊性,日常处理的都是CSV/TXT等碎片化的文件(比如用OSS存储的生产数据),如何将大文本文件写入到MaxCompute(原ODPS)是一件很头疼的事情。好在,阿里云大数据开发套件提供了非常强大的数据同步的工具。 近期体验了一下阿里云的数据同步工具,发现非常简单易用,同时又十分强大。作为非技术同学,借助文档,基本实现了从OSS到ODPS以及从OSS到本地自建FTP的数据同步,期间也碰到了许多问题。本文主要介绍自己作为一个小白用户,在使用过程中遇到的问题以及解决办法。 要解决的问题:OSS对象存储文件定时同步到ODPS 应用到的阿里云产品:OSS 数据同步组件 MaxCompute 1. 阿里云的数据同步为向导模式和脚本模式两种方式。向导模式是可视化操作,非常方便,不过有些类型的数据同步不支持。脚本模式通过Json脚本实现,功能更强大。OSS数据同步到ODPS,两种方式是均支持的。分为数据源读取、数据传输、写入目标数据三部分。具体操作,先添加数据源后,按照向导可一步步操作,不在赘述。 2. 数据同步的调度任务,无法自动识别OSS是否有文件增加,因此,如果OSS中的Object是不断增加的,调度任务需要设定为分钟或者小时级别的周期调度。 3. OSS的读取支持形如example*的通配符匹配: 同时,OSS的文件名可以用日期时间命名,这样调度任务可以通过时间参数来读取最新写入的Object。 4.调度任务执行的时候,数据源Object必须已经存在,可以调整时间参数的先后关系,例如: 该例子是延时一小时的。 5. 阿里云的文档非常详尽,基本可能遇到的问题通过查找文档都可以解决。数据同步文档

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

视频直播Android推流SDK初体验

场景:使用阿里云直播产品如何进行推流播流,可以参考视频直播快速开始进行创建直播域名推流播流。那么移动端要如何进行推流呢,视频直播提供了Android、IOS推流SDK,用户可以使用对应的SDK进行推流,本文旨在让读者可以按照文章快速的应用Android推流SDK进行推流并且了解常见推流参数的设置。 1)Android Studio安装,下载Android Studio打开https://developer.android.com/index.html 2) 安装Android Studio 3) 下载Android推流sdk 工程:https://help.aliyun.com/document_detail/45270.html?spm=5176.doc50101.6.609.3CsXTp 4) Android Stu

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

使用Rancher 2.3 启用Istio初体验

本文来自Rancher Labs Rancher的理念是Run Kubernetes Everywhere,Rancher 2.3中许多重大更新,让这一理念的实现又向前一步。 其中,最重要的两个特性是集成了Istio以及对Windows的支持。本文我们将主要讨论如何使用通过Rancher UI提供的Istio支持,并通过Kiali dashboard进行可视化。 前期准备: 正在运行的Kubernetes集群 安装Rancher并导入该集群 在本例中,我们将使用CIVO Cloud上的大型k3s托管集群,并且已经完成Rancher App的安装(在Civo Marketplace的Rancher应用程序将会在集群上安装Rancher,并将集群导入其中)。集群的设置可以参考以下步骤: https://medium.com/@SaiyamPathak/managed-k3s-is-it-a-thing-9397799c38a 启动集群之后,在集群创建过程中从marketplace选择Rancher进行安装。Civo将会启动Rancher server并导入集群。 集群准备就绪后,你将能看到Rancher 2.3的dashboard,它能够支持Istio和Kiali。让我们来探索一下这个dashboard吧! 集群创建之后,你可以下载kubeconfig,并连接集群。然后查看Rancher server以及cattle-agents是否起来并且运行。 kubectl get nodes NAME STATUS ROLES AGE VERSION kube-node-79ed Ready worker 96m v1.15.4-k3s.1 kube-master-bca5 Ready master 96m v1.15.4-k3s.1 kubectlg get pods -n cattle-system NAME READY STATUS RESTARTS AGE cattle-5669c57dcf-tw65t 1/1 Running 0 3h27m cattle-node-agent-8lppr 1/1 Running 0 3h27m cattle-node-agent-g5f6f 1/1 Running 0 3h27m cattle-cluster-agent-587b6d44cf-ppnjd 1/1 Running 0 3h27m 为了访问Rancher UI,创建一个ingress,rancher-ingress.yaml如下: >> kubectl apply -f rancher-ingress.yaml ingress.extensions/cattle-ingress created kubectl get ingress -n cattle-system NAME HOSTS ADDRESS PORTS AGE cattle-ingress * 172.31.0.189 80 32s 现在如果你访问任何节点ip,你都将看到Rancher server正在运行。 创建一个密码,保存URL。随后你应该能够看到导入的集群。 通过Rancher UI启用Istio 文档中是这样描述Istio的: 使用云平台的企业或组织可以从其中体会到很多益处。但是不可否认的是,采用云技术会对DevOps团队造成压力。开发人员必须使用微服务来构建可移植性,同时,运维人员管理超大型混合云和多云部署。而服务网格使得微服务更加易用,其中Istio可以帮助你连接、保护、控制和观察服务。 在很大程度上,Istio有助于降低部署的复杂性,并减轻开发团队的负担。它是一个完全开源的服务网格,可以在现有的分布式应用程序上透明地注入一层。同时,它也是一个平台,包括可将其集成到任何日志记录平台、遥测或策略系统中的各种API。Istio的多样功能可以让你能够成功、高效地运行分布式微服务架构,并提供统一地方式来保护、连接和监控微服务。 那么,现在我们开始通过Rancher UI中启用Istio,并部署吧。 要启用Istio,你需要访问UI上方的菜单栏,其路径是:工具> Istio。你可以更改许多配置选项。而现在,我想让所有配置都保持默认状态并将ingress网关设置为True。启用这一功能还将启用监控功能,这是Istio正常运行的先决条件。 启用之后,你将可以看到监控和Istio pod在命名空间cattle-prometheus(用于监控)和istio-system(用于istio)下出现。 >> kubectl get pods -n istio-system NAME READY STATUS RESTARTS AGE istio-citadel-6bb9c9f6fb-md9f8 1/1 Running 0 6m16s istio-tracing-64d646945-xm4sm 2/2 Running 0 6m15s istio-policy-68959c7999-5kmdb 2/2 Running 1 6m16s istio-galley-67848cd58-g5tbt 1/1 Running 0 6m16s kiali-5f8f876bd5-6djxf 2/2 Running 0 6m16s istio-telemetry-778bfdcf74-ps9vl 2/2 Running 1 6m16s istio-pilot-7546b9fdcc-rbxj8 2/2 Running 0 6m16s istio-ingressgateway-6f877dd689-rskn4 1/1 Running 0 6m16s istio-sidecar-injector-69c97ddbb5-x7jcv 1/1 Running 0 6m16s >> kubectl get pods -n cattle-prometheus NAME READY STATUS RESTARTS AGE prometheus-operator-monitoring-operator-79484b9c6f-zshlq 1/1 Running 0 7m42s exporter-node-cluster-monitoring-wnxtc 1/1 Running 0 7m39s exporter-node-cluster-monitoring-k68fb 1/1 Running 0 7m39s grafana-cluster-monitoring-5d676d89c5-vkbzm 2/2 Running 0 7m39s prometheus-cluster-monitoring-0 5/5 Running 1 7m15s exporter-kube-state-cluster-monitoring-5dfd658dc-pn8mt 1/1 Running 0 7m39s 现在,我们来进行Istio部署示例,生成流量并在Kiali dashboard中查看它。 我们将为示例应用程序创建deployment、Gateway以及虚拟服务,如下所示: kubectl label namespace default istio-injection=enabled namespace/default labeled kubectl apply -f service/details created serviceaccount/bookinfo-details created deployment.apps/details-v1 created service/ratings created serviceaccount/bookinfo-ratings created deployment.apps/ratings-v1 created service/reviews created serviceaccount/bookinfo-reviews created deployment.apps/reviews-v1 created deployment.apps/reviews-v2 created deployment.apps/reviews-v3 created service/productpage created serviceaccount/bookinfo-productpage created deployment.apps/productpage-v1 created kubectl apply -f gateway.networking.istio.io/bookinfo-gateway created kubectl apply -f virtualservice.networking.istio.io/bookinfo created 生成流量: 现在,应用程序已经部署,你可以通过Istio gateway查看它。 >> kubectl get pods NAME READY STATUS RESTARTS AGE details-v1-74f858558f-m5tsx 2/2 Running 0 10m ratings-v1-7855f5bcb9-lkhgg 2/2 Running 0 10m productpage-v1-8554d58bff-llnqh 2/2 Running 0 10m| reviews-v2-d6cfdb7d6-rl4zk 2/2 Running 0 10m reviews-v3-75699b5cfb-crdrd 2/2 Running 0 10m reviews-v1-59fd8b965b-rmct2 2/2 Running 0 10m >> kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 192.168.128.1 <none> 443/TCP 140m details ClusterIP 192.168.154.118 <none> 9080/TCP 10m ratings ClusterIP 192.168.207.69 <none> 9080/TCP 10m reviews ClusterIP 192.168.141.42 <none> 9080/TCP 10m productpage ClusterIP 192.168.128.87 <none> 9080/TCP 10m 点击Test用户和普通用户,来生成一些流量。 从UI上方的菜单栏中【资源】项,选择Istio。你可以看到以下图表: 点击屏幕上的Kiali图标。 Kiali Kiali是Istio的可视化控制台,它具有服务网格配置功能。它通过推断拓扑来帮助理解你的服务网格架构并提供你的网格的健康状态。此外,Kiali还提供了详细的指标,并且其集成了基本的Grafana,因此可用于高级查询。还集成了Jaeger,可提供分布式追踪。 您可以查看已部署应用程序的完整拓扑以及流程。 下面是已经部署的应用程序的图表: 以下是其他图表: 服务图表 版本化应用程序图 工作负载图 Jaeger 受Dapper和OpenZipkin的启发,Jaeger被设计为一个开源分布式跟踪系统,由Uber Technologies发布。它用于监控、诊断基于微服务的分布式系统,包括: 分布式上下文传播(Distributed Context Propagation) 分布式事务监控 根源分析(Root cause analysis) 服务依赖分析 性能/延迟优化 Jaeger UI Jaeger 查询 总 结 在本文中,我们讨论了在Rancher 2.3.x中如何安装Istio并使用Kiali可视化服务网格。我们还部署了一个示例应用程序并生成了一些流量,还使用Kiali和Jaeger查看它们。 如果你还想了解更多关于Istio、Kiali以及Jaeger的内容,欢迎访问以下网站观看视频: https://space.bilibili.com/430496045

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

阳光启明:文化产业上云初体验

本文正在参加“最佳上云实践”评选,来给我们投票吧:https://yq.aliyun.com/activity/158(编号36) 北京阳光启明科技文化有限公司是一家以计算机软件(信息技术)开发、销售自主产品、售后服务以及相关技术咨询的电子信息技术企业。作为国内首屈一指的顶级集成商之一,公司一直致力于协助国家推动公共文化服务体系建设,为各区域搭建数字服务平台、提供整体解决方案、研发特色文化产品。主要文化产品有公共文化数字服务云平台、公共文化一体机、扶贫资源宝等,目前已累计为全国各地区发放各类文化产品达10,000多台。 上云后取得显著成效 虽然我司目前使用阿里云还不足两年,但是效果非常显著。自从租用阿里云服务器后,无需手动装载服务器系统,只需勾选相应系统程序选项,即可予以自动装载服务器程序,操作上省时省力,性能上安全可靠。尤其在数据的可配处理以及安全稳定上,阿里云性能卓越,为我司开展线上活动提供了强有力的支撑,下面可通过具体数据来分析: 图1 各项目云平台使用记录 图2 项目具体数据 通过上图可看出阿里云的几个显著特点: 1. 带宽可配: 带宽资源稳定可靠、绝对独享,有效解决带宽瓶颈,消除传统IDC带宽资源争抢的烦恼。 2. 数据信息安全: 采用自定义防火墙和安全组隔离技术, 有效杜绝IP/MAC欺骗和ARP攻击。免费启用云盾后可进行端口入侵扫描、挂马扫描、漏洞扫描等,可以有效抗击来自互联网的DDoS及其他安全攻击,保障业务的持续运行。 3. 网络稳定: 绿色节能机房,BGP多线(中国电信、联通、移动、教育网等)接入,确保全国用户访问畅通。 带宽资源稳定可靠、绝对独享,有效解决带宽瓶颈,消除传统IDC带宽资源争抢的烦恼。 上云实践总结 我司通过亲身实践,深刻感受到上云后为给公司带来的效益,具体可总结为以下几点: 1、节约成本 企业想要在自己的服务器上进行数据存储,就必须购买高昂的硬件和软件,而且后期还需要花费大量的人力物力来维护这些软件。但是通过云存储,服务器商可以服务成千上万的企业,并可以划分不同消费群体服务,来帮助初创公司减少不必要的成本预算。 2、更好的备份本地数据并可以异地处理日常数据 云存储可以为企业提供重要数据备份和保护,即使遇到突发问题或在恶劣条件下,依然能保持正常工作。比如,企业办公场所发生自然灾害,如果数据是异地存储,那么数据依然存在,它是非常安全的。如果问题出现在企业办公室,那么你随便去一个安全的地方通过笔记本就可以继续访问数据和更新数据。 3、更多的访问和更好的竞争 对于于中小企业来说,由于自身条件和环境的限制,不能够花高昂的费用来打造好的管理系统。在同等商业机遇面前,相比可以花重金打造数据存储中心的大企业,中小企业完全没有实力与之竞争。而通过云存储,中小企业不需要多少费用就可以争取和大企业同等的商业机遇。 附:株洲星级评定活动真实案例 星级评定活动是我司为株洲市举办的一次全市文艺团队大联欢,共计93支团队参与活动,活动时间为2016年12月11日至2016年12月25日。下面通过活动期间的详细数据来看阿里云在活动中所起的关键性作用。 图3 活动详细数据 图4 活动数据折线展示 活动期间总访问量高达5,350,000次,通过图3、图4可以看出活动每天的实时数据变化非常大,即使是在这种数据激增、访问大量并发的情况下,阿里云依然能够依靠自身系统及时调整带宽,加大并发流量端口,保持整体网络的稳定有序,保证群众正常访问数据、浏览活动实时信息。最终活动取得圆满成功。

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

PaddleOCR初体验,基于PaddleHub Serving的服务部署

PaddleOCR提供2种服务部署方式: 基于PaddleHub Serving的部署:代码路径为"./deploy/hubserving",按照本教程使用; 基于PaddleServing的部署:代码路径为"./deploy/pdserving",使用方法参考文档。 基于PaddleHub Serving的服务部署 hubserving服务部署目录下包括检测、识别、2阶段串联三种服务包,请根据需求选择相应的服务包进行安装和启动。目录结构如下: deploy/hubserving/ └─ ocr_det 检测模块服务包 └─ ocr_rec 识别模块服务包 └─ ocr_system 检测+识别串联服务包 每个服务包下包含3个文件。以2阶段串联服务包为例,目录如下: deploy/hubserving/ocr_system/ └─ __init__.py 空文件,必选 └─ config.json 配置文件,可选,使用配置启动服务时作为参数传入 └─ module.py 主模块,必选,包含服务的完整逻辑 └─ params.py 参数文件,必选,包含模型路径、前后处理参数等参数 快速启动服务 以下步骤以检测+识别2阶段串联服务为例,如果只需要检测服务或识别服务,替换相应文件路径即可。 1. 准备环境 克隆代码:https://gitee.com/paddlepaddle/PaddleOCR.git,解压并进入PaddleOCR文件夹 # 安装paddlehub pip3 install paddlehub --upgrade -i https://pypi.tuna.tsinghua.edu.cn/simple 2. 下载推理模型 PaddleOCR下新建‘inference’文件夹,准备推理模型并放到‘inference’文件夹里面,默认使用的是v1.1版的超轻量模型, https://github.com/PaddlePaddle/PaddleOCR/blob/develop/doc/doc_ch/quickstart.md 默认模型路径为: 检测模型:./inference/ch_ppocr_mobile_v1.1_det_infer/ 识别模型:./inference/ch_ppocr_mobile_v1.1_rec_infer/ 方向分类器:./inference/ch_ppocr_mobile_v1.1_cls_infer/ 模型路径可在params.py中查看和修改。更多模型可以从PaddleOCR提供的模型库下载,也可以替换成自己训练转换好的模型。 3. 安装服务模块 PaddleOCR提供3种服务模块,根据需要安装所需模块。 在Linux环境下,安装示例如下: # 安装检测服务模块: hub install deploy/hubserving/ocr_det/ # 或,安装识别服务模块: hub install deploy/hubserving/ocr_rec/ # 或,安装检测+识别串联服务模块: hub install deploy/hubserving/ocr_system/ 在Windows环境下(文件夹的分隔符为\),安装示例如下: # 安装检测服务模块: hub install deploy\hubserving\ocr_det\ # 或,安装识别服务模块: hub install deploy\hubserving\ocr_rec\ # 或,安装检测+识别串联服务模块: hub install deploy\hubserving\ocr_system\ 4. 启动服务 方式1. 命令行命令启动(仅支持CPU) 启动命令: hub serving start -c D:\XHX\Develop\Paddale\PaddleOCR\deploy\hubserving\ocr_system\config.json 注意:如果启动报错xxx路径找不到,去PaddleOCR\deploy\hubserving下的ocr_system、ocr_det、ocr_rec的params.py文件,将所有的model_dir 替换为符合win格式的绝对路径即可; 参数: 参数 用途 --modules/-m PaddleHub Serving预安装模型,以多个Module==Version键值对的形式列出 当不指定Version时,默认选择最新版本 --port/-p 服务端口,默认为8866 --use_multiprocess 是否启用并发方式,默认为单进程方式,推荐多核CPU机器使用此方式 Windows操作系统只支持单进程方式 --workers 在并发方式下指定的并发任务数,默认为2*cpu_count-1,其中cpu_count为CPU核数 如启动串联服务:hub serving start -m ocr_system 这样就完成了一个服务化API的部署,使用默认端口号8866。 方式2. 配置文件启动(支持CPU、GPU) 启动命令: hub serving start -c config.json 其中,config.json格式如下: { "modules_info": { "ocr_system": { "init_args": { "version": "1.0.0", "use_gpu": true }, "predict_args": { } } }, "port": 8868, "use_multiprocess": false, "workers": 2 } init_args中的可配参数与module.py中的_initialize函数接口一致。其中,当use_gpu为true时,表示使用GPU启动服务。 predict_args中的可配参数与module.py中的predict函数接口一致。 注意: 使用配置文件启动服务时,其他参数会被忽略。 如果使用GPU预测(即,use_gpu置为true),则需要在启动服务之前,设置CUDA_VISIBLE_DEVICES环境变量,如:export CUDA_VISIBLE_DEVICES=0,否则不用设置。 use_gpu不可与use_multiprocess同时为true。 如,使用GPU 3号卡启动串联服务: export CUDA_VISIBLE_DEVICES=3 hub serving start -c deploy/hubserving/ocr_system/config.json 发送预测请求 配置好服务端,可使用以下命令发送预测请求,获取预测结果: python tools/test_hubserving.py server_url image_path 需要给脚本传递2个参数: server_url:服务地址,格式为 http://[ip_address]:[port]/predict/[module_name] 例如,如果使用配置文件启动检测、识别、检测+识别2阶段服务,那么发送请求的url将分别是: http://127.0.0.1:8866/predict/ocr_det http://127.0.0.1:8867/predict/ocr_rec http://127.0.0.1:8868/predict/ocr_system image_path:测试图像路径,可以是单张图片路径,也可以是图像集合目录路径 访问示例: python tools/test_hubserving.py http://127.0.0.1:8868/predict/ocr_system ./doc/imgs/ 返回结果格式说明 返回结果为列表(list),列表中的每一项为词典(dict),词典一共可能包含3种字段,信息如下: 字段名称 数据类型 意义 text str 文本内容 confidence float 文本识别置信度 text_region list 文本位置坐标 不同模块返回的字段不同,如,文本识别服务模块返回结果不含text_region字段,具体信息如下: 字段名/模块名 ocr_det ocr_rec ocr_system text ✔ ✔ confidence ✔ ✔ text_region ✔ ✔ 说明:如果需要增加、删除、修改返回字段,可在相应模块的module.py文件中进行修改,完整流程参考下一节自定义修改服务模块。 自定义修改服务模块 如果需要修改服务逻辑,你一般需要操作以下步骤(以修改ocr_system为例): 1、 停止服务 hub serving stop --port/-p XXXX 2、 到相应的module.py和params.py等文件中根据实际需求修改代码。 例如,如果需要替换部署服务所用模型,则需要到params.py中修改模型路径参数det_model_dir和rec_model_dir,如果需要关闭文本方向分类器,则将参数use_angle_cls置为False,当然,同时可能还需要修改其他相关参数,请根据实际情况修改调试。强烈建议修改后先直接运行module.py调试,能正确运行预测后再启动服务测试。 3、 卸载旧服务包 hub uninstall ocr_system 4、 安装修改后的新服务包 hub install deploy/hubserving/ocr_system/ 5、重新启动服务 hub serving start -m ocr_system

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

使用Python开发鸿蒙设备程序(0-初体验

到目前为止,鸿蒙设备开发的“官方指定语言”还是C语言! 这看起来是一件正常的事,毕竟鸿蒙设备开发还是属于嵌入式开发的范畴,而在嵌入式开发中C语言又是当之无愧的首选,所以,大家也都接受了这个现实。。。。。。。 上周末,有幸能和华为的大佬们进行面对面交流(其实我是去抱大腿的),我们都一致认为:如果设备开发能支持更简洁的开发方式(如:简单的语言,简单的开发环境),相信会有更多的开发者加入。。。 那么现在,有没有一种语言,受众面很广又简单易学呢? 当然是有的,相信你已经知道了,就是 Python ! 这几年 Python 借助 AI 的兴起而进入大众视野,她的简单易学深受欢迎,很多小学生都能够用她来编程了。 所以,一个看起来很疯狂的想法从我大脑蹦了出来:如果鸿蒙设备开发可以用 Python ,那么肯定能降低学习门槛,吸引更多的开发者。。。 于是,说干就干。。。 我先调研了目前的各种Python实现(Python是开源的,可以通过源码了解实现),发现公版 Python 和 MicroPython 都可以是我的起点(baseline),毕竟我没有必要照着 Python 规范写一个解释器出来!然而,困难还是有的,这两种实现都有非常多的依赖,而且设计目标又分别不同:公版 Python 是一个大而全的系统(解释器,库,等等),目标是只要资源丰富爱怎么玩就怎么玩;MicroPython 从公版 Python 剪裁而来,并做了扩展,基本定义成了一个微型嵌入式设备上的操作系统。 那么,怎么开始呢,做选择真的很难啊!!!! 我开始整理思路,我想干什么?!之后有了下面的架构图。 很显然,我想的是提供鸿蒙设备开发的其它方式,而不是用 Python 替换 C 语言!所以,我的第一个里程碑(milestone)是获得一个可以在鸿蒙设备(Hi3861)上运行的 Python 解释器!有了这个 Python 解释器,接下来就是设计 Python 版的鸿蒙系统开发接口了。。。 确定了目标之后,接下来的问题就是:究竟是用公版 Python 开刀还是用 MicroPython 开刀? 通过两者代码的对比阅读,我发现 MicroPython 居然在解释器部分对公版 Python 也做了剪裁。。。这,为什么啊??? 我暂时也没有确切答案,不过从代码实现可以看出 MicroPython 是为了适配更多低配置的硬件而做了取舍!那显然,很多东西人家都考虑过了!我想着目前鸿蒙设备的定位也是低配硬件,那么用 MicroPython 开刀看起来更合适。 =========== 华丽的分割线 Begin =========== 通过 2 天的手术的改造,能够运行的版本(DTPython)就有了!! 使用方式如下: 下载文末附件中的 libdtpython.a,并将其拷贝到 \code-1.0\vendor\hisi\hi3861\hi3861\build\libs 目录下,如图: 【可选】编写 Python 代码(目前未提供任何库支持),并使用文末附件中的 Txt2Str 工具将其转换为 C 字符串,用法如下: 说明: Txt2Str 将 Python 代码用 C 字符串的形式存储到 C 文件中(如上图中的 test.c) 将转换得到的 C 文件加入工程中即可在 C 代码中使用 Python 代码(可参考文末附件中的示例) 注意:目前还没有简单的方法直接将 Python 源文件烧写到设备中,因此才需要上述步骤。 在设备开发中使用 Python 代码,示例如下: 运行结果如下: =========== 华丽的分割线 End =========== 后记: 目前仅仅能够运行基本的 Python 代码,大概率还存在很多需要解决的问题。 希望大家都来试玩我的这个方案,多找Bug,多提Issue。 现阶段的代码乱一坨,实在不好意思拿出来丢人现眼,基本功能稍微稳定些,直接开源!!! Enjoy It ! 获取原文资源包 作者:唐佐林 想了解更多内容,请访问: 51CTO和华为官方战略合作共建的鸿蒙技术社区 https://harmonyos.51cto.com

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

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

Nacos

Nacos

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

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

用户登录
用户注册