[MOOC][Java][Programming Cloud Service] 額外學習 NoSQL,GAE與更多其它

主要的作業都做完了,不過接下來都是選修的部分.但是課程可是一點都不馬虎,又有mongoDB,又有GAE還有其他的部分.都是很值得學習的部分.

筆記:

  • 關於MongoDB的設定
    • 如果要使用local mongodb 一切都比想像中的簡單的多
      • 不需要帳號,與密碼
      • 建立mongoDB 與執行
        • brew mongodb
        • sudo mongd
      • 在Spring 裡面鏈結
        • add application.properties
        • spring.data.mongodb.host=127.0.0.1
        • spring.data.mongodb.port=27017
      • 這樣就可以了… 其他都不用改
      • 想要檢查是否有存取的話
        • mongo
        • use test
        • db.video.find()
  • 在原來的Spring 加入MongoDB support
    • 使用MongoRepository 換掉 VideoRepository
    • Gradle 增加:
      • compile(“org.springframework.boot:spring-boot-starter-data-mongodb”)
    • 就這麼簡單,不過預設會寫到
      • Database: test
      • Collection: Video
      • 如果要使用自己定義的資料庫名字(database name),需要增加以下的code (參考這裡)
class ApplicationConfig extends   AbstractMongoConfiguration 
    {
 
      @Override
      protected String getDatabaseName() {
        return "moocs";
      }
 
      @Override
      public Mongo mongo() throws Exception {
        return new Mongo();
      }
 
      @Override
      protected String getMappingBasePackage() {
        return"com.oreilly.springdata.mongodb";
      }
    }

參考

  • Spring Document
    • Spring getting start with MongoDB https://spring.io/guides/gs/accessing-data-mongodb/
    • Access MongoDB with REST https://spring.io/guides/gs/accessing-mongodb-data-rest/
    • http://docs.spring.io/spring-data/data-mongo/docs/current/reference/html/mongo.repositories.html
  • JPA Repositories http://docs.spring.io/spring-data/jpa/docs/1.3.0.RELEASE/reference/html/jpa.repositories.html

[MOOC][Java][Programming Cloud Service] 筆記與第二次作業

前言:

這些學習主要都是針對Mooc 上面的課程(Programming Cloud Service)所學到的一些部分.

 心得:
第二個作業不確定是不是最後的作業,但是卻相當的有趣.主要是透過架設OAuth2 的Server 然後去搭配測試程式的Client來做Video是否有喜歡 (like)的操作.
裡面幾個邏輯都算是很簡單,比如說Video不能被同一個使用者喜歡兩次. 喜歡的Video是必須存在的….

主要的難度,還是在跟Https 與 OAuth2的部分,不過由於我有習慣從第一個範例開始就寫同一個程式然後慢慢去改~慢慢學習裡面的幾個比較奧妙的地方.
所以這次的作業反而相當快就寫完了.

很值得修的課程,對於 HTTPS, OAUTH都有相當清楚地介紹,想要了解透過Exclipse去架設Java Server (不論是 Jetty 或是 Tomcat)這都是好選擇.
當然如果你對於Eclipse上面Gradle不太熟,這個也可以告訴你怎麼學習啊~~因為我也卡了很久.主要就是每次加了新component 之後都忘記要 Gradle->Refresh.

最後提一下學這堂課的動機吧,第一個部分是希望好好把Cloud Programming 有系統地學一下,雖然說懂 JSON,REST跟 OAuth.但是詳細的原理跟真正在Java (畢竟JSON是Java出來的)上要如何實現才能真正的了解;另外一個原因就是因為我一直以來對於Java與使用Eclipse有一種排斥感(雖然我修過Scala),但是我希望透過這個學習會讓我更熟悉這些部分.

我學習的Github 在這裏

  

課堂筆記:

  • @ComponentScan 會搜尋指定範圍的原件,是會重啟Spring.除了一些PaaS可能會踢掉之外(GAE?),一般而言並不會造成任何效能上的影響.

  • @Autowired 對應著Application.java 的一個@Bean/@Component/@Service/@Repository,可以讓他根據不同狀況來改變injection 不同的class. 如果沒有@Bean在Application 會產生exception.

    • 使用上可以類似C++的繼承方式,使用 @Autowired 在一個parent class上.然後利用@Bean 或其他的方式來mapping 到你需要的child class來改變或是更換你需要的物件.
  • Java Persistence API @Entity @Respository 需要做以下的事情
    • 需要在Grandle 先加上以下的資訊

      • compile(“org.springframework.boot:spring-boot-starter-data-jpa:${springBootVersion}”)       

      • compile(“jdbc:jdbc:2.0”)    

      • compile(“com.h2database:h2”)    

    • 如果要連接一些資料庫,也需要在application.properties裡面設定好

      • spring.datasource.url=jdbc:mysql://localhost/test

      • spring.datasource.username=dbuser

      • spring.datasource.password=dbpass

      • spring.datasource.driverClassName=com.mysql.jdbc.Driver

  • About Data REST

    • 要把整個Spring 從controller 改成由這個改變)

      • Application 繼承RepositoryRestMvcConfiguration

      • Gradle 要加入compile(“org.springframework.data:spring-data-rest-webmvc”)

      • 整個Controller 不再需要,直接移除後開始使用 VideoRepository

      • 修改 VideoRepository 傳回與接收直,注意以下事項: (參考另外一個改變)

        • findByXXX 必須回傳 Collection 不然就會錯誤<

        • addVideo 不回傳

    • 重要的是必須要 ObjectMapper弄好~不然傳回HATEOS就沒辦法直接使用/li>

  • Spring Security 增加一些安全性的保護(登入機制)並且利用加密的cookie來辨別身份,並且可以根據使用者權限來決定可以執行的REST指令或是要求.

    • 要加上https的支援,必須要做以下的修改:

      • 加入mainresourcesprivatekeystone (如何產生看這裡)

      • 要把Jetty 改成用tomcat

        • compile(“org.springframework.boot:spring-boot-starter-web:${springBootVersion}”)    

        • compile(“org.springframework.boot:spring-boot-starter-tomcat:${springBootVersion}”)

      • 必須在Application 加入以下的東西

        • @Bean

        • EmbeddedServletContainerCustomizer containerCustomizer()

      • 千萬記住在test那邊要把網址改成 https://localhost:8443/ 而且在properties 裡面設定的 SERVER_PORT=9000 也沒有效果

    • 要加上login redirection 需要完成以下的修改: (參考以下修改  )

      • Add in build.gradle    

        • compile(“org.springframework.boot:spring-boot-starter-security:${springBootVersion}”)
      • 需要新增一個class 繼承  WebSecurityConfigurerAdapter 來處理帳號與login/logout的問題與設定.

        • 必須要加上以下兩個設定,不然啟動的時候會有問題

          • @Configuration// Setup Spring Security to intercept incoming requests to the Controllers

          • @EnableWebSecurity

      • 在unit test的時候,需要注意以下的部分:

        • 根據目前的設定,任何的method都需要登入才能執行. 不然會跳出exception 可以由retrofit 接過來為 HttpStatus.SC_MOVED_TEMPORARILY

        • logout後應該也是要發生,exception 如果要試著去執行任何指令.

    • 課程以外,我把關於認證的部分做了一點小研究,主要就是根據不同的使用者權限來設定哪些方法可以執行~哪些會失敗 (參考Github)

         @Autowired public void    
         configureGlobal(AuthenticationManagerBuilder auth)
    { 
    auth .inMemoryAuthentication() .withUser("user") 
    //#1 
    .password("password") .roles("USER") 
    .and() .withUser("admin") // #2 
    .password("password") .roles("ADMIN","USER"); 
    } 
  • 前面設定密碼是一樣的,就不重複敘述,這裡唯一要注意的,由於HasRoles 是使用字串,所以大小寫是有差別的.

  • 最後來到OAuth2,要完成OAuth2 需要有以下的步驟:

    • 先要在build.gradle 裡面加上:

      • compile(“org.springframework.security.oauth:spring-security-oauth2:2.0.0.RC2”)    

      • compile(“org.springframework.security.oauth:spring-security-oauth2-javaconfig:1.0.0.M1”)

      • compile(“org.apache.httpcomponents:httpclient:4.3.4”)

    • 新增檔案去控制 UserDetails 與 UserDetailsService (參考: 這個改變)

    • 針對Retrofit 的client 部分,需要implement 更多關於OAuth的部分,主要是:

      • 新增一個OAuthHandler 去負責 RequestInterceptor

      • 並且直接修改 RestAdapter.Builder 去新增OAuth的處理.

  • 在開發這種有client跟server的程式的時候,特別要注意的是如果發現有問題的時候,需要去釐清究竟是server還是client的問題.

    • 如果是學習這個課堂的範例的話,可以考慮跑跑課堂內附的client搭上你自己寫的server.有時候問題是出在client而不是你server有問題.

    • 如果是web server (Tomcat 或是 jetty )可能比較麻煩~需要一步步把所加上的部分蓋掉來追蹤.

    • 千萬要注意 @PathVariable 跟  @RequestParam的差異,簡單解釋一下:

      • @PathVariable 是當你使用 GET Path 為參數比如說  video/2 

      • @RequestParam 雖然也走GET但是卻不是Path 而是會以其他方式傳遞.

  • 有個需要注意的部分是,關於回傳Http.Status Exception Code

    • 404:  Resource Not Found 

      • 可以直接用 throw new ResourceNotFoundException();
    • 400: Bad Request

      • 可以繼承 RuntimeExcption然後依照以下修改

        • @ResponseStatus(value = org.springframework.http.HttpStatus.BAD_REQUEST)

        • public final class BadRequestException extends RuntimeException  {   //  class definition}

參考:

 

[研討會心得] PaaS Meetup #3 MSFT Azure/ IBM BlueMix

心得:

  • MSFT Azure 在宣傳資料上面,似乎數據相當的嚇人.之前使用的經驗上還算不錯.

    • PaaS服務其實挺多的,只是支援語言有點少.可能要使用還是以IaaS為主.
  • IBM BlueMix 網路的服務其實很不錯 (hub.jazz.net) 甚至有IOT的SDK,這是比較有競爭力的地方. 不過使用狀況上不算快,可能是台灣的網路都不快,看IBM哪時候把骨幹加強.

    • 有一些免費的quata 其實可以去使用,只是速度堪慮. IOT目前不收費,可能是比較有趣的地方.

速記:

[研討會心得] PaaS Meetup #2 AWS Docker

前言:

就像上次有提到的,這個meetup主要是由IBM的 BlueMix團隊的人主辦的.
但是相當有趣的是主要是來研究各種不同的PaaS的部分.這是第二次參加主講的部分是AWS與 Docker

心得:

  • 第一部分:  

    • AWS 的部分很有趣,也開了AWS的帳號.發現建立一個Beantalk 相當的方便.

    • 這次在Coscup裡面也有聽到其實AWS裡面有相當大的一個DevOps的一系列工具.不僅僅能當PaaS連,IaaS都有類似的功能.

    • CLI的操作起來也是學習Heroku,這部分久不需要詳談.這次參加也發現 AWS Beanstalk 其實有支援docker了.

  • 第二部分:

    • 這個部分的講解相當的Cool,主要是利用 Dokku 來架設一個lightweight 的 Heroku在 DigitalOcean上面.

    • 在這裡面docker是為了讓dokku能夠跑出類似heroku的不同dyno 的功能,

    • 類似這樣應用其實挺有趣的,也不斷的思考有沒有什麼特別的應用可以來用.

AWS (Amazon Web Service)  Beanstalk  (slide)

  • 主講人: 

  • Amazone Web Service architecture:

  • 優點:

    • 快速部署,方便管理

    • 整合AWS服務

      • EC2 (運算)

      • S3 (File storage)

      • SNS (message queuing)

      • Cloud Watch 

      • Elastic Load balance

      • Auto Scaling

    • 比較一下:

    • Deployment working flow:

      • Create Application -> Upload version -> launch Environment -> manage Environment
    • Deployment command line toolkit (refer here)

    • Demo (Python -> AWS EB with Flask)

      • Local run

      • Implement Application.py (for Flask)

      • Add Requirement.txt (similar with heroku virtualenv -> pip freeze )

      • init Git

        • Tools : git aws.push
      • eb start

        • Server type 

        • LoadBalance

        • RDS (Relation Database )

      • eb stop (to kill application)

        • 注意: 如果EB 移除的時候,該DB 也會一起被移除.

        • 也會自動傳一個S3 (作為 log, Version control system)

  • Q&A:

    • Q: 如果主機與本機設定不一樣怎麼處理?

    • A:  

      • 程式內必須處理,PaaS重開後會會把檔案清掉.
    • Q: 要主機執行background command or command line

    • A: 

    • Q:  各個語言使用的 Web Server 也是不同

    • A:  

      • Python -> Apache, Ruby -> Rails , Java -> Tomcat

      • 所以針對不同web  server 需要跑不同command 也要注意.

  • 公司主要用途:

    • 本來只用AWS EC2,後來都用 AWS EB (對於Startup 有優惠)
  • 參考:

 

Docker on Dokku on DigitalOcean

  • 主講人:

  • Introduce about docker (skip) refer more in http://docker.com/whatisdocker

  • Docker Ecosystem 

    • Take all operation in Heroku using DockerDocker - Container runtime and manager
  • 要架設一個mini-heroku 需要以下的設備

  • It might take 500s

    • Download all image

    • Download docker /lxc-docker

    • Laucn docker on heroku

  • All slide in https://github.com/mose/20140814-dokku

  • Q&A:

    • Q: 為何使用 docker in dokku 在DigitalOcean? 既然 dokku 已經可以讓自己的電腦可以架起來測試類似PaaS的功能了

    • A:

      • 依舊需要給外部人使用.
    • Q: Dokku 可以有 loadbalance?

    • A:

      • 目前還沒有那麼強大的功能,不過flynn 似乎有把比較強大的方式.

[MOOC][Java][Programming Cloud Service] 關於Spring Boot 的基本學習 -完成第一次作業心得與筆記

前言:

這些學習主要都是針對Mooc 上面的課程(Programming Cloud Service)所學到的一些部分.
雖然說同時在學習Golang跟Java 是有一些混亂的,能夠學習一下關於Java上面架設REST Server的方法有是挺有趣的.

第一個作業大綱與心得: 

這個課程的第一份作業其實相當的有趣,就是實作一個REST 的server可以查詢video info 還有就是能夠上傳video.
雖然相當有趣,但是其實讓我相當的苦惱.就是整個Controller的parameter到底該怎麼設計才能讓Retrofit  能夠正確的讀取與呼叫到.
其實如果Java或是Spring有點熟悉的人應該可以快速地完成第一次的作業.我卻也繳了不少時間當學費來好好學習整個架構與溝通的方法.

Spring Boot:

  • 簡介:

    • Spring Boot 可以快速的幫助你建立一個Java Based 的俱有REST 的Web Application.
  • 使用上的筆記:

    • 比較需要管理的只有兩個部分,一個是Application.java 另外一個是Controller.java .其中檔名可以改,但是需要有annotation 來表明清楚哪個是application 哪個是 controller.

    • 其中關於Controller裡面,重點是需要有 annotation 註名是 controller

      • @Controller
    • 相較於Java Serverlet 對於 Web Request 的處理上,Spring Boot 相對的簡單多了.不需要繼承 HttpServlet 然後去 overwrite doGet 跟 doPost,只需要在前端去註解出這個function 要對應到哪個http request.

      • @RequestMapping(value=“videos”, method=RequestMethod.POST)

      • 這個就是代表著 ,只要從http XXXXvideos的 POST request 都會轉到這個地方.

    • 對於去處理Http Request的部分,最麻煩了不外乎是處理 輸入與輸出的參數,而Spring Boot 可以很漂亮的做出這件事情.

      • @RequestBody/@ResponseBody

      • 這個會自動地把參數轉成你所要求的,不論是把Boolean轉成@ResponseBody(JSON的形態) 或是把@RequestBody轉成你所要求的變數形態.

    • 更改運作的port (change connection port) 官方提出兩個方法,不過我是第二個才成功

      • 新增 application.properties 在 src/main/resources/  並且加上 server.port = 9000

      • 在 Eclipse 的properties -> Run/Debug Settings -> Application -> Environment -> Add [SERVER_PORT] = 9000

    • 同時需要debug - Server 與 Client (test)

      • 先跑 Server - debug as Java Application (設定好break point)

      • 再接者跑test - debug as JUnit test

      • 在同時做 server  與 client debug 的時候,常常會有一個動作卡在 client 之後 server就沒回應.或是專心的看server的code,client 就停住了. 我會繼續研究看看.

    • 對於 /path/{id} 這一類型的RequestMapping 需要使用以下,不然會找不到:

    @RequestMapping(value=“/departments/{departmentId}”)
    </br>
    public String findDepatmentAlternative(@PathVariable(“departmentId”)String someDepartmentId)
    </br>{…
    }

    • 對於multipart 的敘述,一開始不是很了解會以為是POST的必須的API.回去看了關於Retrofit 的敘述才知道Multipart只針對檔案的上傳

      • 他在controller裡面對應的API是 @RequestParam(”data”) MultipartFile uploadFiles…
    • 其實在實作controller的時候,是不需要參考Retrofit 的API,那個API只是幫助你的test client 知道該怎麼跟server溝通.

    • 很多參數在Controller是可以基本帶入的:

      • HttpServletResponse 跟 HttpServletRequest 可以加入在parameter內然後看看有沒有呼叫到.
  • 參考:

[研討會訊息][PaaS] Pivotal 與 Heroku討論

Taiwan PaaS Meetup http://www.meetup.com/%E5%8F%B0%E7%81%A3-PaaS-%E9%9B%B2%E7%AB%AF%E6%8A%80%E8%A1%93%E4%BA%A4%E6%B5%81%E6%9C%83/about/
Meetup PaaS HackPad: https://paas-tw.hackpad.com/Getting-Started-with-Pivotal-Web-Services-PadMnuFp1vd

總結:

  • 相較於Pivotal (Cloud Foundry) ,Heroku可能真的比較廉價.

  • 收費方式都不是算流量:

    • Pivotal : 記憶體

    • Heroku: 依照計算能力 Dyno

  • 自動Scale

    • Pivotal似乎沒有自動調節scale 的能力.

    • Heroki似乎沒有看到

  • 與git的搭配:

    • Pivotal並沒有

    • heroku 不僅僅原生就支援git,也可以直接跟github互動.

心得:

  • 這次參加的人數不算多,不過倒是很多高手.有看到ihower 還有似乎是他同公司的mose.可見PaaS再用的人真的都不是DevOP的人而是developer.

  • 文創中心算是不錯的場地,交通也算方便.場地費似乎也不貴.其他人要辦活動挺推的.

  • 看起來Pivotal跟 Heroku沒有太多差異,但是 Heroku有免費的方式, Pivotal卻沒有,可能在初期是可以先用 Heroku 正式上線後再考慮要不要挑到 Pivotal.

  • 有很多的討論都可以看出來PaaS跟docker有更多的交錯,只是接下來接近會走向dokku 還是???

 

 

Pivotal:

 

Heroku:   /her-OH-koo/ 

  • 架構:

    • Slug Compiler -> Slug

      • Slug -> dyno (based on scale)
  • Dyno 特性:

    • isolated

    • self-healing

    • read-only

    • stateless

    • recycle 24hrs

  • Twelve factors App: http://12factor.net/

    • Codebase

    • Dependency

    • Config

      • Store config in environment don’t check-in it in your codebase.
    • Backing Services

      • Treat backing service as a attachment service(可抽換)
    • Build, release and run

      • 每個階段應該要是可以切割的
    • Processes

      • stateless, isolated
    • Port binding

      • via port not specific service. 
    • Concurrency

    • Disposability

      • 快速地啟動,優雅的結束
    • Logs

      • Treat logs as stream
    • Dev/Product Parity

      • 必須把 staging,Dev與 Production 要分得開~但是應該要緊接著.
    • Admin Processes

  • Docker V.S. Heroku

Docker vs. Heroku

DOCKERHEROKU
Dockerfile BuildPack
Image Slug
Container Dyno
Index Add-Ons
CLI CLI
  * [http://tuhrig.de/docker-vs-heroku](http://tuhrig.de/docker-vs-heroku)