Cassandra Nosql Database Play Framework for Scala
Cassandra是一個Open Source的Database,這幾年來越來越多人使用Nosql取代傳統式的Databse,Nosql Databse特點就是免費、分散式架構,比起一般傳統式的DB速度較快,可運用在Win Linux, Mac Os平台上 ,但缺點就是技術文件較少,需要自已研讀國外技術文件及研究API。
今天要介紹的是使用Docker虛擬化平台,建置簡易Cassnadra Database Login model , 首先安裝Docker,安裝完成Docker後至DockerHub下載Cassandra官方建置完成的Docker image。 1.下載Cassandra Docker Image
2.啟動Cassandra,在啟動Cassandra之前記得開啟對外Port,否則無法連線至Cassandra Database
docker run -it --name cassandra -p 7199:7199 -p 8888:8888 -p 9016:9016 -p 9042:9042 -p 9160:9160 -p 50031:50031 -p 61620:61620 -p 61621:61621 cassandra
解釋:-it 執行Docker image
--name 指定docker 名稱
-p 對外port 7199:7199 前面port為docker image內部:後面port為本機對外port
啟動完成後透過
DevCenter工具,DevCenter像是MySqlWorkbench介面工具。透過DevCenter可以直接使用CQL語法CURD功能。
DevCenter是一套連接Cassandra工具,由DataStax Team所開發,下載時需要先註冊,
DataStax下次有時間在介紹。
3.啟動DataStax測試連線Cassandra for Docker image
連線正常將會在左面出現 docker cassandra [1/1 Connected] 。
3. 建立Cassandra KEYSPCE 及TABLE User Schema
透過DevCenter工具執行CQL語法
Create login KEYSPCE
CREATE KEYSPACE IF NOT EXISTS login
WITH replication = {
'class' : 'SimpleStrategy',
'replication_factor' : 1
};
------------------------------------------------------------------------------------------------------------------
Create user Table
CREATE TABLE login.user (
id uuid,
name text,
password text,
PRIMARY KEY (id)
);
------------------------------------------------------------------------------------------------------------------
在Cassandra比較特別的是如果你需要查詢欄位,是以PRIMARY KEY為主,
如果需要查詢Table內的欄位,只能建立index是否在查詢只能透過PRIMARY KEY才可以。
Create index for search user name
CREATE INDEX IF NOT EXISTS by_name ON login.user (name);
------------------------------------------------------------------------------------------------------------------
新增一筆USER資料
Insert data
insert into user(id,name,password)VALUES(now(),'neil','1234');
4.依個人使用開發工具習慣為主,本身比較習慣使用Intellij IDEA, 建立Play Framework
開啟build.sbt,加入Cassandra Library
libraryDependencies ++= Seq(
"com.datastax.cassandra" % "cassandra-driver-core" % "3.0.1" ,
"com.datastax.cassandra" % "cassandra-driver-mapping" % "3.0.1"
)
加入Library後,建立兩個Package ,cassandraDAO,loingModel,
app
|--- controllers
|--- cassandraDAO
|--- loginModel
Download My GitHub Cassandra_login_model
controllers資料夾建立一個Login Class
在Class 建立三個
函式def ,分別為 login,logout,authenticate
登入動作
def login = Action { implicit request =>
println("login: "+request.body.asFormUrlEncoded)
Ok(views.html.login(loginForm))}
登出 動作
def logout = Action {
Redirect(routes.Login.login).withNewSession.flashing(
"success" -> "You are now logged out.")}
驗證user資料,當name與password有一項不符合無法登入
def authenticate = Action { implicit request =>
loginForm.bindFromRequest.fold(
formWithErrors => BadRequest(views.html.login(formWithErrors)),
user => Redirect(routes.Application.index()).withSession("user" -> user.name ))}
建立Cassandra Connect 新增project 名稱為cassandraDAO, 這個Connect將是連接Cassandra DB
建立一個scala trait
trait Cassandra {
protected def cassandra_session:Session = {
val cluster = new Cluster.Builder().
addContactPoint("192.168.99.100"). // local docker cassandra
withPort(9042).
withQueryOptions(new QueryOptions()
.setConsistencyLevel(QueryOptions.DEFAULT_CONSISTENCY_LEVEL)
).build
val session = cluster.connect()
session}
}
新增project models,建立一個檔案為loginModel object 內容為
object loginModel {
val KEYSPACE = "login"
val USER_TABLE = "user"
/**
* login page check username is exist
* true: return index page
* false: return login page
*/
def authenticate(name:String,password:String,cassandra_session:Session): Boolean= {
val query_by_user = QueryBuilder.select().from(KEYSPACE,USER_TABLE).where(QueryBuilder.eq("name",name))
val resultByUser = cassandra_session.executeAsync(query_by_user)
val data = resultByUser.get().one()
cassandra_session.closeAsync()
if(data == null){
println("check username is not null ")
true
}else{
if( (name.equals(data.getString("name")) && password.equals(data.getString("password")) ) ){
println("success good")
false
}else{
println("username and password fail")
true}}
}}
新增html一個 login.scala.html,透過後端程式將資料傳送至html
login.scala.html
如果對於Play Framework 不太瞭解可以參考
Play官方Form說明
最後加入在conf/routes加入以下資訊,讓play framework可以取得到Controller資訊
# Home page
GET /index controllers.Application.index
#login
GET / controllers.Login.login
POST /login controllers.Login.authenticate
GET /login controllers.Login.logout
啟動Intellij IDE Test project
登入畫面
登入失敗
登入成功
如果有任何問題歡迎來信 討論與交流 Thanks!
References:
https://hub.docker.com/
https://hub.docker.com/_/cassandra/
http://www.datastax.com/
http://www.datastax.com/what-we-offer/products-services/devcenter