2015年7月13日星期一

Fuse_019:基础入门之八:fabric profile

环境:JBoss Fuse 6.2.0 + Maven 3.2.2

本实验跟上一个实验有关。



1. 学习重点
(1)创建 fabric
(2)创建 container
(3)创建 profile

2. 创建 fabric
简单的创建命令:fabric:create --wait-for-provisioning
创建 fabric 时,只有一个 fabric server,其中安装了 registry service,它也是 fabric 中的第一个 container,默认名称 root。其它 container 是 root container 的子 container。
如果想修改第一个 container 的名字,修改 InstallDir/etc/system.properties 文件内容。
对于 fabric 中的第一个 container,不必修改名字;但是如果想加入其它 fabric 中的 root container,就要修改相关信息,防止冲突。
所有的 containers 存储在 InstallDir/instances 目录下。

复杂的创建命令:
fabric:create --new-user AdminUser
--new-user-password AdminPass
--new-user-role Administrator
--resolver manualip
--manual-ip 127.0.0.1
--zookeeper-password ZooPass
--wait-for-provisioning

--new-user, --new-user-password, 和 --new-user-role 用于指定新管理员。
--zookeeper-password  用于连接由 ZooKeeper 实现的 Fabric registry service。
所有的Fabric registry service 节点位于 InstallDir/fabric 目录下。
大多数情况下,访问 fabric registry service 时,不需要输入 Zookeeper 口令,因为它保存在当前 session 中。但是当加入一个 container 到一个 fabric 中时,需要提供 Zookeeper 口令。
建议生产环境中,为 fabric server 配置静态 IP 地址,并使用 --resolver 指定端口,使用 --manual-ip 指定 IP。

3. 创建 child container
(1)简单的创建命令:fabric:container-create-child root child 2
输出如下:
Creating new instance on SSH port 8102 and RMI ports 1100/44445 at: /Users/maping/Redhat/fuse/jboss-fuse-6.2.0.redhat-133/instances/child
Creating new instance on SSH port 8103 and RMI ports 1101/44446 at: /Users/maping/Redhat/fuse/jboss-fuse-6.2.0.redhat-133/instances/child2
The following containers have been created successfully:
    Container: child2.
    Container: child.

这里假定你的 root container 名字就是 root。
子 containers 也存储在 InstallDir/instances 目录下。
可以看出,创建成功了两个子 container,每个 container 都使用了默认的 default profile。

完整命令语法:
fabric:container-create-child [--help] [--ensemble-server] [--profile profileID] [--version version] [--jvm-opts jvmOpts] [--resolver policy] {parent} {name} [number]

// TODO 如何在创建时指定子 container 的名字?

(2)查看 container 列表:fabric:container-list
[id]      [version]  [type]  [connected]  [profiles]              [provision status]
root*     1.0        karaf   yes          fabric                  success          
                                          fabric-ensemble-0000-1                   
                                          jboss-fuse-full                          
  child   1.0        karaf   yes          default                 success          
  child2  1.0        karaf   yes          default                 success     

// TODO 如何修改 container 名称?

(3)停止 container
每个子 containers 运行在它自己的 JVM 中,因此即使 root container 被停掉,子 container 还会保持运行。因此要停止整个 fabric,要先停止子 container,然后再执行 shutdown 命令。
fabric:container-stop child
fabric:container-stop child2
shutdown
而启动子 container 时,要先启动 root container,再启动子 container。
startup
fabric:container-start child
fabric:container-start child2

4. 创建 profile
一个 profile 是一个 fabric 中的基本部署单元。可以发布一个或多个 profiles 到一个 container 中。

fabric profile 可以包含如下信息:
  • features repositories的URL
  • 需要安装的 features 列表
  • 需要安装的 bundles 列表(打成 JAR 包,可以是 OSGi bundle/Fuse Application Bundles/WAR)
  • OSGi Config Admin service 的配置
  • 影响 Apache Karaf 的 Java 环境变量(etc/config.properties)
  • 影响安装后的 bundles 的 Java 环境变量(etc/system.properties)
(1)创建 base profile
fabric:profile-create --parent feature-cxf gs-cxf-base
profile 支持继承,比如当部署到集群中多个 server 时,除了 IP 地址和端口之外,其它部署内容都一样。这时,可以先创建一个 base profile。
每个 server 可以继承该 base profile,然后加上自己的特别的设置。

(2)为 gs-cxf-base 添加 get-started features repository
profile-edit -r mvn:org.fusesource.example/get-started/1.0-SNAPSHOT/xml/features gs-cxf-base

(3)为 gs-cxf-base 添加 cxf-http-jetty feature 和 get-started-cxf feature
profile-edit --feature cxf-http-jetty gs-cxf-base
profile-edit --feature get-started-cxf gs-cxf-base

(4)创建 child profile gs-cxf-01 和 gs-cxf-02
profile-create --parent gs-cxf-base gs-cxf-01
profile-create --parent gs-cxf-base gs-cxf-02
 (5)修改 profile gs-cxf-01 和 gs-cxf-02 的属性
profile-edit -p org.fusesource.example.get.started/portNumber=8185 gs-cxf-01
profile-edit -p org.fusesource.example.get.started/portNumber=8186 gs-cxf-02

5. 发布 profile
(1)发布 gs-cxf-01 profile 到 child  container:fabric:container-change-profile child gs-cxf-01
(2)发布 gs-cxf-02 profile 到 child2  container:fabric:container-change-profile child2 gs-cxf-02
(3)启动子 container:container-start child
(4)查看 container:watch container-list
(5)连接到子 container:container-connect child
(6)列出 CXF  Endpoint:cxf:list-endpoints
Name                      State      Address                                                      BusID                                  
[FabricResource         ] [Started ] [/fabric8                                                  ] [io.fabric8.fabric-rest-cxf140787777   ]
[HelloWorldImplPort     ] [Started ] [http://0.0.0.0:8185/cxf/HelloWorld                        ] [org.fusesource.example.cxf-basic-cxf531356605]

6. 修改 profile 
默认情况下,修改一个已经发布到 container 的 profile 会立即生效,这是因为 container 中的 fabric agent 会实时监控 container 的变化,然后把变化告知 fabric server。
实际情况下,修改立即生效可能不是一个好主意,更多是灰度升级,比如先升级一个 container 看看有没有问题,没有问题再升级其它 container。
为了保证原子级事务提交所有的改动,fabric 提供了 profile 版本化功能。
比如一开始,container 指向的是某个 profile 的 1.0 版本。
接着创建了该 profile 的 2.0 版本,这个新版本在应用到 container 之前,其中的改动对 container 没有生效。
最后你可以升级 container 使用新版本的 profile。

(1)创建 profile 新版本
fabric:version-create
该命令会把所有的 profile 都拷贝一份作为升级的版本。
也就是说,所有的 profile 必须是同一个版本,不能有的 profile 使用 1.0 版本,有的 profile 使用 1.1 版本。

(2)查看 profile 版本
fabric:version-list

(3)修改 profile gs-cxf-01 1.1 版本,把端口改为 8087:
fabric:profile-edit -p org.fusesource.example.get.started/portNumber=8187 gs-cxf-01 1.1
注意这里指定了 profile 以及版本号,说明改的是哪个 profile 的哪个版本。

(4)升级 container child2 到版本 1.1:fabric:container-upgrade 1.1 child2

(5)回滚 container child2 到版本 1.0:fabric:container-rollback 1.0 child2

参考文献:
1. Red_Hat_JBoss_Fuse-6.2-Getting_Started-en-US.pdf

没有评论: