IBM的云平台Bluemix使用初体验——创建Go语言 Web 应用程序,添加并使用语言翻译服务

概述

上篇讲了:创建PHP Web 应用程序,添加并使用语言翻译服务

通过本文学习,你将能够在IBM的云平台Bluemix上创建自己的Go语言 Web 应用程序,添加并使用语言翻译服务,发布自己的GO语言Web应用到云服务器上。


本地开发测试环境:Windows 7 x64,Go,与其它Web后端语言不同,Go语言需要自己编写Web服务器

有关本地环境的搭建与基础学习,请参考:

《Go语言入门》如何在Windows下安装Go语言编程环境

《Go语言入门》第一个Go语言程序——HelloWorld

《Go语言入门》第一个Go语言Web程序——简单的Web服务器


Bluemix 是什么?

IBM Bluemix 是开放式标准云平台,用于构建、运行和管理应用程序。使用 Bluemix,开发者可以集中通过灵活的计算选项、DevOps 工具的选择以及一组强大的 IBM 及第三方 API 和服务来构建卓越的用户体验。

了解更多

  1. 注册Bluemix云服务器,注册戳这里
  2. 登陆Bluemix平台,进行部署/开发,登录戳这里


创建 Web 应用程序


通过 IBM® Bluemix™,可以在 Bluemix 用户界面中创建应用程序。创建应用程序后,可以决定是继续使用 UI,使用 cf 命令行界面,还是使用 IBM Bluemix DevOps Services 来开发、跟踪、规划和部署应用程序。

在 Bluemix 中创建应用程序时,首先是创建入门模板。入门模板是一种模板,包含预定义的服务和使用特定 buildpack 配置的应用程序代码。入门模板有两种类型:样板和运行时。
样板是一种容器,用于应用程序及其关联的运行时环境,以及针对特定域的预定义服务。例如,“移动云”样板包含 Node.js 运行时,以及 Mobile Data、Mobile Application Security 和 Push 服务。样板还包含 SDK 和样本应用程序,方便着手开发用于访问这些服务的移动应用程序。
运行时是用于运行应用程序的一组资源。Bluemix 提供运行时环境来作为不同类型应用程序的容器。运行时环境作为 buildpack 集成到 Bluemix 中,并自动配置以供使用,只需很少维护,甚至完全无需维护。
要开始创建应用程序,请执行以下步骤:

  1. 1、在 Bluemix 用户界面中,转至“仪表板”。
  2. IBM的云平台Bluemix使用初体验——创建Go语言 Web 应用程序,添加并使用语言翻译服务_第1张图片
  3. 2、单击创建应用程序
  4. IBM的云平台Bluemix使用初体验——创建Go语言 Web 应用程序,添加并使用语言翻译服务_第2张图片
  5. 3、单击 Web,然后按照指导经验来选择入门模板,指定名称以及选择编码方式。
  6. IBM的云平台Bluemix使用初体验——创建Go语言 Web 应用程序,添加并使用语言翻译服务_第3张图片
  7. 输入应用程序名称
  8. IBM的云平台Bluemix使用初体验——创建Go语言 Web 应用程序,添加并使用语言翻译服务_第4张图片
  9. 应用程序名称是唯一的,接下来要通过它做为二级域名来访问你的应用!
  10. 点击完成之后,需要等待一会儿,然后可以看到下图的界面
    1. IBM的云平台Bluemix使用初体验——创建Go语言 Web 应用程序,添加并使用语言翻译服务_第5张图片
    2. 这时就可以访问你刚刚创建的应用了。如下图:
    3. IBM的云平台Bluemix使用初体验——创建Go语言 Web 应用程序,添加并使用语言翻译服务_第6张图片
  11. 4、按照指导经验完成操作后,单击查看应用程序概述。“仪表板”上将显示应用程序的“概述”。
  12. IBM的云平台Bluemix使用初体验——创建Go语言 Web 应用程序,添加并使用语言翻译服务_第7张图片
  13. 通过文件和日志,可以查看默认页面的源代码:
  14. IBM的云平台Bluemix使用初体验——创建Go语言 Web 应用程序,添加并使用语言翻译服务_第8张图片
  15. 通过仪表板页面的应用程序,可以找到自己已经创建的应用程序;
  16. IBM的云平台Bluemix使用初体验——创建Go语言 Web 应用程序,添加并使用语言翻译服务_第9张图片
  17. 5、可以通过单击 Bluemix 用户界面中应用程序“概述”上的添加服务或 API,将服务添加到应用程序中。也可以使用 cf 命令行界面。请参阅处理应用程序的可用选项。
  18. IBM的云平台Bluemix使用初体验——创建Go语言 Web 应用程序,添加并使用语言翻译服务_第10张图片
  19. IBM的云平台Bluemix使用初体验——创建Go语言 Web 应用程序,添加并使用语言翻译服务_第11张图片
  20. IBM的云平台Bluemix使用初体验——创建Go语言 Web 应用程序,添加并使用语言翻译服务_第12张图片
  21. IBM的云平台Bluemix使用初体验——创建Go语言 Web 应用程序,添加并使用语言翻译服务_第13张图片
  22. 6、在应用程序“概述”上,单击添加 Git 可将应用程序源代码保存到 Git 存储库中,并创建 Git 托管的项目。您还可以从 IBM Bluemix DevOps Services 部署应用程序。
  23. IBM的云平台Bluemix使用初体验——创建Go语言 Web 应用程序,添加并使用语言翻译服务_第14张图片
  24. 本文不使用Git,而是使用CF(Cloud Foundry)上传应用程序!

注: 如果绑定到应用程序的服务崩溃,那么该应用程序可能会停止运行或发生错误。Bluemix 不会自动重新启动应用程序以从这些问题中恢复。请考虑对应用程序进行编码,以便识别中断、异常和连接失败状况并从中进行恢复。请参阅应用程序不会自动重新启动故障诊断主题,以获取更多信息。


开发基于服务的应用


1、获取服务信息

进入自己的应用程序》概述页面,找到已经添加的服务,点击“显示凭证”,可以查看服务的具体信息:

IBM的云平台Bluemix使用初体验——创建Go语言 Web 应用程序,添加并使用语言翻译服务_第15张图片

在浏览器中访问服务URL

IBM的云平台Bluemix使用初体验——创建Go语言 Web 应用程序,添加并使用语言翻译服务_第16张图片

在浏览器请求支持的语言:

服务URL:https://gateway.watsonplatform.net/language-translation/api/v2/identifiable_languages

IBM的云平台Bluemix使用初体验——创建Go语言 Web 应用程序,添加并使用语言翻译服务_第17张图片

2、编写Go语言代码

注意:云平台上Go语言的环境与PHP的有所不同,我直接在本地创建的应用上传之后都是启动失败,

不清楚是哪里的原因!

可能是缺少manifest.yml,Procfile,Godeps\Godeps.json文件的原因。

建议最好是“下载起动器代码”,在这个基础上修改,

如下图:下载后解压到 C:\Go\src\goinfo 目录下

IBM的云平台Bluemix使用初体验——创建Go语言 Web 应用程序,添加并使用语言翻译服务_第18张图片

AJAX调用代码

//通过AJAX调用后台翻译程序
function doExecTrans(){
	var txt = $("#InputText").val();
	if (txt == ""){
		alert("请输入要翻译的文本!");
		return;
	}
	
	$("#ProgressDiv").show();
	$.ajax({
	   type: "GET",
	   url: "/trans",
	   dataType:"json",
	   data: {"txt":txt},
	   success: function(data){
		 $("#ProgressDiv").hide();
		 console.log(data);
		 $("#OutputText").text(data.text);
	   },
	   error: function(data){
		 console.log(data);
		 alert( "Error Msg: " + data );
		 $("#ProgressDiv").hide();
	   }
	});
}


Go语言代码

package main
// powered by: testcs_dn
// Blog: http://blog.csdn.net/testcs_dn
// Create time: 2015/11/14
//简单的Web服务

import (
    "fmt"
    "net/http"
    "log"
    "errors"
    "io/ioutil"
    "net/url"
	"os"
	"html/template"
	//for extracting service credentials from VCAP_SERVICES
	//"github.com/cloudfoundry-community/go-cfenv"
)

//异常捕获方法
func catch(){
    if err := recover(); err != nil {
		fmt.Println(err) 
    } 
}

//错误检测方法
func checkError(err error) {  
	if err != nil {
		fmt.Println("Fatal error ", err.Error())
		os.Exit(1)
	}
}

const (
	DEFAULT_PORT = "8080"	//默认端口号
	//服务URL,注意@符号前用冒号分隔的字符串为语言翻译服务的username:password
	Surl = "https://用户名:密码@gateway.watsonplatform.net/language-translation/api/v2/translate?";
)


//调用WebServices处理翻译请求
func trans(w http.ResponseWriter, r *http.Request) {
	defer catch()
	
	r.ParseForm()  //解析参数,默认是不会解析的
    values := url.Values{}
    values.Add("source", "en") //source=en&target=es&text=hello
	values.Add("target", "es")
	
	//要翻译的文本
	txt := r.FormValue("txt")
	if (txt == ""){
		fmt.Fprintf(w, "{\"error\":\"请输入要翻译的文本!\"}")
		return
	}
	
	values.Add("text", txt)
	
    //拼接要翻译的文本
    url := Surl + values.Encode()
    resp, err := http.Get(url)	//改送HTTP Get请求
    if err != nil {
		fmt.Fprintf(w, err.Error())
        return
    }
 
    if resp != nil && resp.Body != nil {
        defer resp.Body.Close()
    }
 
    if resp.StatusCode != http.StatusOK {
		fmt.Fprintf(w, errors.New(resp.Status).Error())
        return
    }
 
    data, err := ioutil.ReadAll(resp.Body)
    if err != nil {
		fmt.Fprintf(w, err.Error())
        return
    }

	if err != nil {
        fmt.Fprintf(w, err.Error())
		return
    }
	fmt.Fprintf(w, "{\"text\":\"" + string(data) + "\"}")
}

func helloworld(w http.ResponseWriter, r *http.Request) {
	t, err := template.ParseFiles("templates/index.html");
	checkError(err)  
  
	err = t.Execute(w, nil)  
	checkError(err)
}


func main() {
	var port string
	if port = os.Getenv("PORT"); len(port) == 0 {
		port = DEFAULT_PORT
	}
	
	http.HandleFunc("/", helloworld) 	//设置访问的路由
    http.HandleFunc("/trans", trans)	 //设置访问的路由
	http.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.Dir("static"))))  // 启动静态文件服务
    http.Handle("/templates/", http.FileServer(http.Dir("templates")))
	
	log.Printf("Starting app on port %+v\n", port)
    err := http.ListenAndServe(":"+port, nil) //设置监听的端口
    if err != nil {
        log.Fatal("ListenAndServe: ", err)
    }
}


上传应用程序

登录到 Bluemix™ 后,可以使用 cf push 命令来上传应用程序。

开始之前,您必须:
  1. 1、安装 Cloud Foundry 命令行界面。

  2. IBM的云平台Bluemix使用初体验——创建Go语言 Web 应用程序,添加并使用语言翻译服务_第19张图片
  3. 请根据自己使用的操作系统下载对应的版本;我使用的是Windows 7 64位操作系统,
  4. 下载Binaries版本的不需要安装,直接解压到Windows目录就可以了
  5. IBM的云平台Bluemix使用初体验——创建Go语言 Web 应用程序,添加并使用语言翻译服务_第20张图片
  6. 以下执行的命令你可以通过访问 https://www.ng.bluemix.net/docs/#starters/upload_app.html#upload_app__push
  7. 查看属于自己的命令;
  8. 2、连接到 Bluemix
  9. 打开命令提示符窗口:开始》运行,输入“cmd”,回车
  10. 执行:cf api https://api.ng.bluemix.net,如下图:
  11. IBM的云平台Bluemix使用初体验——创建Go语言 Web 应用程序,添加并使用语言翻译服务_第21张图片
  12. 3、登录到 Bluemix
  13. 注意,这里要换成对应你自己账户的命令!
  14.      
        
        
        
    cf login -u [email protected] -o [email protected] -s ivu4e

4、发出 cf push 命令时,cf 命令行界面将提供使用 buildpack 来构建并运行应用程序的 Bluemix 环境的工作目录。

  1. 从应用程序目录中,输入带有应用程序名称的 cf push 命令。在 Bluemix 环境中,应用程序名称必须是唯一的。
  2. 后面的"-m 512m"是修改应用程序内存配额的,可以不带这个参数,如下图:
  3. IBM的云平台Bluemix使用初体验——创建Go语言 Web 应用程序,添加并使用语言翻译服务_第22张图片
  4. 提示: 使用 cf push 命令时,cf 命令行界面会将当前目录中的所有文件和目录复制到 Bluemix。确保应用程序目录中只包含必需的文件。
  5. 上传完成,启动成功就可以通过后面的地址看效果了:http://goinfo.mybluemix.net/static/
  6. cf push 命令上传应用程序并将其部署到 Bluemix。有关 cf push 的更多信息,请参阅 cf 命令。有关 buildpack 的信息,请参阅使用社区 buildpack。

  7. 如果更改了应用程序,可以通过再次输入 cf push 命令来上传这些更改。 cf 命令行界面会使用您先前的选项以及您对提示的响应来通过新的代码段更新应用程序的任何运行中实例。
提示: 您还可以从  Bluemix DevOps Services 上传或部署应用程序。请参阅 在 Node.js 中使用 Web IDE 开发 Bluemix 应用程序。


应用上线效果

IBM的云平台Bluemix使用初体验——创建Go语言 Web 应用程序,添加并使用语言翻译服务_第23张图片

点击效果图片链接可以直接在线访问,由于目前服务器还在国外,打开速度有点慢;http://goinfo.mybluemix.net/static/


使用体验

在Bluemix上创建应用、添加服务、上传应用的过程步骤基本都是一样的,

不同的地方在于应用使用的语言,本地开发测试环境的搭建,以及一些相关的配置等。

注意:云平台上Go语言的环境与PHP的有所不同,我直接在本地创建的应用上传之后都是启动失败,不清楚是哪里的原因!

可能是缺少manifest.yml,Procfile,Godeps\Godeps.json文件的原因。

建议最好是“下载起动器代码”,在这个基础上修改,我之前忽略了“下载起动器代码”的作用,浪费了不少时间。

“下载起动器代码”感觉这个翻译的不够确切,改为“下载初始Hello World示例代码”是不是更好些?


创建、部署和维护 Web 应用程序都很简单,让开发人员可以更专注于应用的开发。

文档比较全面,不过感觉有些地方说的不够细,比如语言翻译服务我就没有找到如何翻译一句话或一篇文章的方法,每次只能翻译一个单词!

由于目前服务器还在国外,打开速度有点慢;希望能早日进驻国内。


你可能感兴趣的:(IBM,云平台,go语言,云服务器,bluemix)