Cloud Foundry Service Broker开发部署实例解析

Cloud Foundry(CF)通过buildpack扩展运行不同语言应用的能力,通过service broker(SB)扩展支持应用所需的各种关系数据库、中间件、缓存、云存储、内存数据库等各种服务的能力。这篇博文将从头至尾介绍通用的SB开发和部署。

AD:

Cloud Foundry(CF)通过buildpack扩展运行不同语言应用的能力,通过service broker(SB)扩展支持应用所需的各种关系数据库、中间件、缓存、云存储、内存数据库等各种服务的能力。这篇博文将从头至尾介绍通用的SB开发和部署。


什么是service broker

SB就是实现了CF规定的一组rest api的服务端程序,它作用于CF与服务的资源池中间,CF通过调用SB上这些规定的rest api对服务资源池进行管理,而SB实际执行这些资源池管理操作。比如,对于oracle而言,管理意味着管理服务计划(即create/drop profile)、创建/绑定/解绑/删除服务实例(即create tablespace、create user、drop user、drop tablespace)。下面给出SB需要实现rest api列表,理论上有了这张表,随便用什么语言写个web service的服务端就行了,这些接口中有几个是博主为实现本文的开发和部署过程自行添加的。

METHODURL用途

Cloud Foundry service broker开发部署实例解析

开发

本文给出的SB使用java(spring)开发的,使用了hibernate,基本思路是下载源代码,按照下面的描述修改必要的实现,然后打包就可以开始部署了。这一SB的基本思路是将已有的资源池的授权信息存储到SB中,不自动化的做任何部署和管理工作,所以理论上,这个SB是用于任何服务的管理。

准备

首先下载源代码,这代码是个gradle工程,首先得准备好开发环境,不管用原生eclipse还是sts,都得先安装gradle support,以STS为例,下载解压后,打开集成开发环境,在dashborad-》IDE EXTENSIONS中,搜索gradle support并安装。将源代码解压,在STS的package explorer中import gradle project,选择到解压的目录,build model,然后点击finish。

修改源代码

   
   
  1. src/main/resources/ServiceDescription.json 

这个文件是json格式服务的描述信息,程序首次运行时,会将此json作为创建新服务的输入

  • name:服务的唯一标识
  • description:显示在UI里的描述信息
  • bindable:true
  • tags:关键字
  • longDescription:显示在UI里的详细描述信息
  • imageUrl:显示在GUI里的图片地址
  • displayName:显示在GUI里的服务名称
  • providerDisplayName:显示在GUI里的服务供应商名称
  • documentationUrl:显示在GUI里的服务文档地址
  • supportUrl:显示在GUI里的服务支持网站
   
   
  1. src/main/java/com/pivotal/cf/broker/config/AppConfig.java和RelationalCloudDataSourceConfig.java 

将这两个文件中的mdsbrokerdb修改为下一步部署在CF上时绑定的MySQL服务实例名称,比如samplebrokerdb

   
   
  1. src/main/java/com/pivotal/cf/broker/model/PlanMetadataRes.java 

将下面的属性替换为管理的资源所需的授权信息,当然也要修改属性对应的setter和getter

   
   
  1. @JsonProperty("kcxpaddr"
  2.  
  3. private String kcxpaddr; 
  4.  
  5. @JsonProperty("kcxpport"
  6.  
  7. private String kcxpport; 
  8.  
  9. @JsonProperty("rvipaddr"
  10.  
  11. private String rvipaddr; 
  12.  
  13. @JsonProperty("rvport"
  14.  
  15. private String rvport; 
  16.  
  17. @JsonProperty("username"
  18.  
  19. private String username; 
  20.  
  21. @JsonProperty("password"
  22.  
  23. private String password;1234567891011121314151617 
  • src/main/java/com/pivotal/cf/broker/model/ServiceInstance.java

将下面的属性替换为管理的资源所需的授权信息,当然也要修改对应的构造函数

   
   
  1. @JsonSerialize 
  2.  
  3. @JsonProperty("kcxpaddr"
  4.  
  5. @Column(name="kcxpaddr"
  6.  
  7. private String kcxpaddr; 
  8.  
  9. @JsonSerialize 
  10.  
  11. @JsonProperty("kcxpport"
  12.  
  13. @Column(name="kcxpport"
  14.  
  15. private String kcxpport; 
  16.  
  17. @JsonSerialize 
  18.  
  19. @JsonProperty("rvipaddr"
  20.  
  21. @Column(name="rvipaddr"
  22.  
  23. private String rvipaddr; 
  24.  
  25. @JsonSerialize 
  26.  
  27. @JsonProperty("rvport"
  28.  
  29. @Column(name="rvport"
  30.  
  31. private String rvport; 
  32.  
  33. @JsonSerialize 
  34.  
  35. @JsonProperty("username"
  36.  
  37. @Column(name="username"
  38.  
  39. private String username; 
  40.  
  41. @JsonSerialize 
  42.  
  43. @JsonProperty("password"
  44.  
  45. @Column(name="password"
  46.  
  47. private String password;1234567891011121314151617181920212223242526272829 

  • src/main/java/com/pivotal/cf/broker/model/ServiceManagementImpl.java

createInstance()中,修改ServiceInstance instance = new ServiceInstance的参数,输入正确的授权信息

removeServiceInstance()中,将下面代码修改为正确的授权信息

   
   
  1. res.setKCXPAddr(instance.getKCXPAddr()); 
  2.  
  3. res.setKCXPPort(instance.getKCXPPort()); 
  4.  
  5. res.setRVIPAddr(instance.getRVIPAddr()); 
  6.  
  7. res.setRVPort(instance.getRVPort()); 
  8.  
  9. res.setUserName(instance.getUserName()); 
  10.  
  11. res.setPassword(instance.getPassword());123456 

createInstanceBinding(),将下面代码修改为正确的授权信息

   
   
  1. credentials.put("KCXPAddr0", instance.getKCXPAddr()); 
  2.  
  3. credentials.put("KCXPPort0", instance.getKCXPPort()); 
  4.  
  5. credentials.put("RVIPAddr", instance.getRVIPAddr()); 
  6.  
  7. credentials.put("RVPort", instance.getRVPort()); 
  8.  
  9. credentials.put("UserName",instance.getUserName()); 
  10.  
  11. credentials.put("Password",instance.getPassword());123456 

编译打包

在STS的package explorer中,右键单击项目,run as-》gradle build,如果是初次运行,输入下面的编译打包gradle命令,run即可:

   
   
  1. clean 
  2.  
  3. build 
  4.  
  5. assemble123 

至此,我们就得到了程序包,下面就可以开始部署了。

通过上篇,我们得到service broker的程序包,之后我们将其部署到CF上,得到真正能使用的市场服务。

AD:

通过上篇,我们得到service broker的程序包,之后我们将其部署到CF上,得到真正能使用的市场服务。


发布应用程序

将源代码中的application.properties里的spring.jpa.hibernate.ddl-auto配置为create,编译打包发布到CF上:

     
     
  1. cf push samplebroker -p ./cf-sample-servicebroker.jar1 

创建一个MySQL服务实例,并绑定到此应用上:

     
     
  1. cf cs p-mysql 100m-dev samplebrokerdb 
  2.  
  3. cf bs samplebroker samplebrokerdb 
  4.  
  5. cf restart samplebroker123 

将源代码中的application.properties里的spring.jpa.hibernate.ddl-auto配置为validate,重新编译打包发布到CF上:

     
     
  1. cf push samplebroker -p ./cf-sample-servicebroker.jar1 

初始化服务信息

用ssh登陆Ops Manager的ubuntu,获取服务ID,其中的adminpassword就是Ops Manager的Elastic Runtime的credential页里的UAA模块admin的密码,samplebroker.open.mydomain.com是上一步发布的应用的域名

     
     
  1. curl -i -H "Content-type: application/json" -b cookies.txt -X GET http://admin:adminpassword@samplebroker.open.mydomain.com/v2/catalog1 

为对应的服务ID添加3个服务计划,其中的GUID是上一步中获取的,具体计划的详细信息请根据实际的资源情况进行修改

     
     
  1. curl -i -H "Content-type: application/json" -b cookies.txt -X POST http://admin:adminpassword@samplebroker.open.mydomain.com/v2/catalog/services/590017dc-1fd2-4cbc-99e6-ae668107cc7a/plans -d '{"name" : "bronze","description" : "all apps share 1 RV node","metadata" : {"max_size" : "10240M","connections" : 100,"bullets" : ["Each app has its own credential","100 apps at most"],"displayName":"Bronze"}}' 
  2.  
  3. curl -i -H "Content-type: application/json" -b cookies.txt -X POST http://admin:adminpassword@samplebroker.open.mydomain.com/v2/catalog/services/590017dc-1fd2-4cbc-99e6-ae668107cc7a/plans -d '{"name" : "silver","description" : "10 apps share 1 RV node","metadata" : {"max_size" : "20480M","connections" : 10,"bullets" : ["Each app has its own credential","10 apps for 1 RV node at most"],"displayName":"Silver"}}' 
  4.  
  5. curl -i -H "Content-type: application/json" -b cookies.txt -X POST http://admin:adminpassword@samplebroker.open.mydomain.com/v2/catalog/services/590017dc-1fd2-4cbc-99e6-ae668107cc7a/plans -d '{"name" : "gold","description" : "Each apps has its own RV node","metadata" : {"max_size" : "30720M","connections" : 1,"bullets" : ["Each app has its own credential","1 app for 1 RV node at most"],"displayName":"Gold"}}'123 

根据前三条命令的输出里的ID信息为每个服务计划添加单价

     
     
  1. curl -i -H "Content-type: application/json" -b cookies.txt -X PUT http://admin:adminpassword@samplebroker.open.mydomain.com/v2/catalog/services/590017dc-1fd2-4cbc-99e6-ae668107cc7a/plans/29cf4cb9-4d85-42a2-89b8-65db630357c5/costs -d '{"amount":{"usd":1.0},"unit":"day"}' 
  2.  
  3. curl -i -H "Content-type: application/json" -b cookies.txt -X PUT http://admin:adminpassword@samplebroker.open.mydomain.com/v2/catalog/services/590017dc-1fd2-4cbc-99e6-ae668107cc7a/plans/12dd3ed1-7076-409e-8a64-568c3edd82e4/costs -d '{"amount":{"usd":10.0},"unit":"day"}' 
  4.  
  5. curl -i -H "Content-type: application/json" -b cookies.txt -X PUT http://admin:adminpassword@samplebroker.open.mydomain.com/v2/catalog/services/590017dc-1fd2-4cbc-99e6-ae668107cc7a/plans/b4897b00-b6cc-4295-9dbb-bf4084fe4c97/costs -d '{"amount":{"usd":100.0},"unit":"day"}'123 

对于每一个服务计划,添加资源池,其中的资源信息按照实际情况进行修改

     
     
  1. curl -i -H "Content-type: application/json" -b cookies.txt -X PUT http://admin:adminpassword@samplebroker.open.mydomain.com/v2/catalog/services/590017dc-1fd2-4cbc-99e6-ae668107cc7a/plans/29cf4cb9-4d85-42a2-89b8-65db630357c5/pool -d '{"kcxpaddr":"10.23.119.61","kcxpport":"21000","rvipaddr":"10.23.119.57","rvport":"7500","username":"sxiang","password":"888888"}' 
  2.  
  3. curl -i -H "Content-type: application/json" -b cookies.txt -X PUT http://admin:adminpassword@samplebroker.open.mydomain.com/v2/catalog/services/590017dc-1fd2-4cbc-99e6-ae668107cc7a/plans/12dd3ed1-7076-409e-8a64-568c3edd82e4/pool -d '{"kcxpaddr":"10.23.119.61","kcxpport":"21000","rvipaddr":"10.23.119.57","rvport":"7500","username":"sxiang","password":"888888"}' 
  4.  
  5. curl -i -H "Content-type: application/json" -b cookies.txt -X PUT http://admin:adminpassword@samplebroker.open.mydomain.com/v2/catalog/services/590017dc-1fd2-4cbc-99e6-ae668107cc7a/plans/b4897b00-b6cc-4295-9dbb-bf4084fe4c97/pool -d '{"kcxpaddr":"10.23.119.61","kcxpport":"21000","rvipaddr":"10.23.119.57","rvport":"7500","username":"sxiang","password":"888888"}'123 

发布service

     
     
  1. cf create-service-broker p-sample admin adminpassword https://samplebroker.open.mydomain.com1 

创建service broker

获取3个服务计划的GUID

     
     
  1. cf curl /v2/service_plans1 

将3个服务计划设置为可见

     
     
  1. cf curl /v2/service_plans/54beb2e7-a5c5-40c4-9a9b-e12c8edef4be -X PUT -d '{"public":true}'1 

扩容

扩容时,需要使用a步增加资源池的容量,然后修改MySQL中的数据,再重启service broker应用

到此为止,在CLI或者GUI的maketplace里,就能找到这个p-sample的服务了。声明,本文中的源代码来源于github的开源代码,笔者进行了修正和完善。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值