2014年5月16日星期五

带你走近AngularJS - 创建自定义指令

本邮件内容由第三方提供,如果您不想继续收到该邮件,可 点此退订
带你走近AngularJS - 创建自定义指令  阅读原文»

带你走近AngularJS - 创建自定义指令

为什么使用AngularJS 指令?

使用过 AngularJS 的朋友应该最感兴趣的是它的指令。现今市场上的前端框架也只有AngularJS 拥有自定义指令的功能,并且AngularJS 是目前唯一提供Web应用可复用能力的框架。

目前有很多JavaScript 产品提供插件给Web开发人员。例如, Bootstrap 就是当前比较流行的提供样式和JavaScript插件的前端开发工具包。但是开发人员在使用Booostrap中的插件时, 必须切换到JavaScript 模式来写 jQuery 代码来激活插件虽然 jQuery 代码写起来十分简单,但是必须和HTML进行同步,这是一个单调乏味且容易出错的过程。

AngularJS主页展示了一个简单的例子,用于实现Bootstrap中的 Tab功能,可以在页面中轻松添加 Tab 功能,并且使用方法和 ul 标签一样简单。HTML代码如下:

<body ng-app="components">
<h3>BootStrap Tab Component</h3>
<pane title="First Tab">
<div>This is the content of the first tab.</div>
<pane title="Second Tab">
<div>This is the content of the second tab.</div>

JavaScript代码如下:

angular.module('components', []).
directive('tabs', function() {
transclude: true,
controller: [ "$scope", function($scope) {
var panes = $scope.panes = [];
$scope.select = function(pane) {
angular.forEach(panes, function(pane) {
pane.selected = false;
pane.selected = true;
this.addPane = function(pane) {
if (panes.length == 0) $scope.select(pane);
'<div class="tabbable">' +
'<ul class="nav nav-tabs">' +
'<li ng-repeat="pane in panes" ng-class="{active:pane.selected}">'+
'<a href="" ng-click="select(pane)">{{pane.title}}</a>' +
'<div class="tab-content" ng-transclude></div>' +
directive('pane', function() {
require: '^tabs',
transclude: true,
scope: { title: '@' },
link: function(scope, element, attrs, tabsCtrl) {
tabsCtrl.addPane(scope);
'<div class="tab-pane" ng-class="{active: selected}" ng-transclude>' +

image

正如你所见,除了拥有用于实现指令的 <tabs> 和<pane> 标签,页面和常规HTML页面没有什么区别。HTML开发人员无需编写任何代码。当然,总需要有第一个吃螃蟹的人,创建指令共享使用,但是目前Tabs指令已经很常见了,可以在任何地方复用(如BootStrap,、jQueryUIWijmo, 和一些知名的前端插件集)。

由于指令的易用和易编写,许多用户已经开始使用AngularJS编写指令了。例如, AngularJS 开发组已经基于AngularJS实现了一系列指令-UI Bootstrap 来代替Bootstrap; 知名ComponentOne 控件厂商也在AngularJS 基础上创建了Wijmo ;我们也可以在GitHub上找到一些公共指令资料库:jQueryUI widgets

拥有了 AngularJS,是不是觉得自己已经站在了巨人的肩膀上了?但是不要高兴的太早,如果已经有了这么多的指令供我们使用,那我们为什么还要学习AngularJS ,为什么还要学习自定义指令呢?

举个简单的例子,也许你有特殊的需求:假设你在一家财务公司工作,你需要创建一张财务表单,它需要以表格的形式展示数据、拥有绑定、编辑、校验并且同步数据更新到服务器的功能。表单插件很常见但是能够满足这些具体需求的不得而知了,所以你必须根据实际业务需求来创建自定义指令。

<body ng-app="abcFinance">
<h3如何在一台ESXi主机上搭建一整套VSAN集群的环境  阅读原文»

如何在一台ESXi主机上搭建一整套VSAN集群的环境

从上周起,我开始翻译一本新书。IT类中文书籍的翻译往往有一个术语的问题,如何选择最准确的中文术语,让读者清楚明白而且在实际操作和配置的时候不至于误解,是一件不那么容易的事情。一个简单的例子就是cluster,中文可以译作"集群"或者"群集"。这两者本身都广为使用,而且是完全相同的意思。我查了一下中文亚马逊书店,136本IT类中文图书用了"集群",29本用了"群集"。看上去"集群"更为普及一些,而且我本人也习惯用"集群"这个术语。那么在本书中到底应该翻译成集群还是"群集"呢?我决定用"群集"。为啥呢?因为vSphere中文版客户端和中文版vSphere Web客户端都使用"群集"作为术语。为了方便读者阅读本书的时候,能够和中文版系统和中文版帮助文件对照起来,所有能够在中文版中找到的术语,我都将用中文版本里面的术语来进行翻译。

这本新书是关于VMware VSAN的,为了翻译的VSAN术语更加准确,我需要搭建一个VSAN集群。可是VSAN集群的构建有一些必要的前提条件:

  • 至少3台以上的vSphere ESXi 5.5U1主机

  • 每台主机需要至少一块SSD和一块磁盘(至少有3台主机有这样的配置)提供给VSAN数据存储用

  • 每台主机至少要有千兆网卡,推荐万兆。如果是千兆,建议有一个千兆端口专门提供给VSAN专用。

  • 每台主机最少6GB内存

  • 支持虚拟化技术的Intel或AMD处理器,至少是Intel XEON corei7级别或更高。


注:关于VSAN的安装和前提条件,可以参考一下文章和资料:
http://vsdsrevolution.blog.51cto.com/8674155/1381076
http://vsdsrevolution.blog.51cto.com/8674155/1386083
http://www.vmware.com/files/cn/pdf/products/vsan/VMware_Virtual_SAN_Whats_New.pdf

看了一下,3台主机就有点困难,每台2块千兆网卡、6GB内存,克服一下还能找到,大容量磁盘也还算容易,要搞3块SSD就难度略大。终于咬了咬牙,自己掏钱在亚马逊下单买了2块SSD,加上自己家里原来有的1块,凑够了3块。不过周二拜访了VMware公司,VMware中国研发中心的林博士却给了我一个建议,可以在虚拟机上模拟嘛。至于SSD问题,书里面第3章讲到某些SSD因为RAID-0控制器无法识别成SSD的时候,可以用命令行来强制指定为SSD,那么在虚拟机的情况下,也可以用同样的方法糊弄一下。我恍然大悟,于是回家在自己家里的ESXi主机上开搞。(那2块SSD的钱啊已经花出去了!哭!)

我家里只有一台DELL Precision T7500的工作站用作实验用的ESXi主机,这台机器是在淘宝上花4000元淘来的DELL的库存货,虽然是3年前的硬件,但是配上XEON处理器和24GB服务器专用内存,玩个服务器虚拟化还是不错滴。
image

废话一大篓,现在切入正题。

接下去,我就来介绍下如何在一台ESXi主机上配置3个ESXi并组建一个VSAN集群。昨天,我介绍了如何在一台ESXi主机上安装ESXi的客户机(当然这些ESXi本身也是主机哦,还可以在其上部署虚拟机,虽然性能会比较差)。因此,首先就是根据上面所说的硬件条件创建3个虚拟机用来安装ESXi5.5u1。我的配置是每一台主机都包括:

  • 4个CPU(最少2个)

  • 8GB内存

  • 3个硬盘,一个4GB(用来装系统)、一个40GB(模拟成SSD)、一个400GB(提供给vsan存放数据)

  • 2个网络适配器,一个在子网192.168.10.x用于管理和虚拟机网络,一个在子网192.168.20.x,用于VSAN VMkernel

  • 虚拟机版本10

image

注意,为了让ESXi客户机有2个网络适配器,在ESXi主机(本例中起名为esxi01)上的网络配置至少要配置2个不同的端口组,我将这2个端口组分别配置在了2个不同的vSwitch上:

  • vSwitch0,默认vSwitch,配置有管理网络(VMKernel)和VM Network 10端口组

  • vSwitch2,新增的vSwitch,配置有VM Network 20端口组

  • 此外,我还因为有iSCSI存储,因此配置了2个iSCSI的VMKernel分别在vSwitch1和vSwitch2上。

vSwitch0和vSwitch2的配置截图如下:

image

image
这里有一点要说明的是,如果仅为了vsan网络的通信,vSwitch2可以没有上联的物理适配器,我的截图里面配置了上联的物理适配器是因为我还有一个iSCSI2的VMkernel需要使用。

安装3台虚拟机的过程就不赘述了,只要你按照我昨天的文章来操作,就可以顺利完成。安装完之后,照例是配置静态IP地址、FQDN主机名、禁用IPv6、DNS并开启SSH和ESXi SHELL以备之后在控制台输入命令行使用。

需要强调一次的是,在你的实验网络中,需要配置好一台域控制器,它同时也是DNS服务器,并事先在DNS服务器里面添加好静态的ESXi主机的DNS项。在我的实验环境中,它们是:

  • esxi55u01.home.lab 192.168.10.31

  • esxi55u02.home.lab 192.168.10.32

  • esxi55u03.home.lab 192.168.10.33

请在黄色DCUI界面(安装完ESXi主机的初次配置界面)里面测试一下网络,如果主机域名也能顺利解析,那就说明网络配置都完备了。DNS对于正确配置VMware集群来说非常重要。

接下去就是用vSphere Web客户端再次连接到vCenter(我的是vCSA),把这几台新安装的ESXi主机添加进来,添加的时候要用FQDN,不能是IP地址。

现在让我们来看一看这些ESXi主机的磁盘情况(左边窗格点选主机,在右边窗格分别选择管理,存储器和存储设备,如图所示),可以看见置备的3个磁盘都是非SSD。下面要克服的问题是怎样欺骗ESXi,让它以为其中一块40GB的磁盘是SSD,这样才能满足VSAN配置的必要前提条件。

image

让我们进入到这台vSphere ESXi主机的管理控制台界面,在命令行里面输入下面的2条命令,就可以完成:

# esxcli storage nmp satp rule add --satp VMW_SATP_LOCAL --device mpx.vmhba1:C0:T1:L0 --option=enable_ssd
# esxcli storage core claiming reclaim -d mpx.vm

阅读更多内容

没有评论:

发表评论