手把手教你用Java搭建自己的網站
經過一段時間的開發,更新,迭代,新浪雲容器 Java 環境逐漸成熟起來,相比過去的 Java 執行環境,可用性和易用性都得到了大量的提升。同時也收到了不少使用者反饋的使用問題,特此在這篇文章裡綜合介紹一下容器 Java 使用以及相關服務的整合。
環境說明新浪雲容器 Java 環境基於 Docker 搭建,支援多例項負載均衡,近乎原生虛擬機器環境,使用無門檻。
-
JDK 1.8
-
Web 容器 tomcat-8.0.35
注意:這裡以後可能會提供相應的 Web 容器定製服務
準備開發自己的應用之前,我們先要準備好自己的開發環境,新浪雲的容器 Java 應用所需的環境和一般開發環境類似。
-
JDK(最好是能與線上同步,當然低版本也可以) version:1.7 以上
-
開發 IDE(推薦 eclipse,有相應的開發外掛,能夠快速上傳) version:eclipse(Mars.1 Release (4.5.1) 此版本自帶了 maven 外掛,不需要另裝了)
-
maven(推薦使用,能夠方便使用新浪雲提供的 sdk) version:3.3.9
安裝方式就不累述了,各個環境下如何安裝配置,大家可以自行用百度谷歌一下
建立初始化應用首先我們要建立自己的新浪雲賬號,這個就不累述了,具體參看新浪雲。
然後我們來著手建立一個 maven 的專案,當然我們可以通過 maven 的命令來建立一個專案,不過我們有 IDE,可以方便的利用視覺化介面操作,而且也方便使用外掛。
好了,我們開啟 Eclipse,接下來我們就開始建立自己的 Web 專案,點選"File"->"New"->"Maven project",如下圖:
然後點選"Next",注意接下來選擇的"Archetype",咱們是 Web 專案,所以一定要選擇"maven-archetype-webapp",如下圖:
然後點選"Next",填寫 Group Id 和 Artifact Id,然後在點選"Finish"。
然後咱們的專案就建好了,目錄結構如下圖,接下來我們就開始開發我們自己的專案。
首先我們建立一下原始碼目錄,在 src->main 下面新建一個資料夾 java,然後就可以看到如圖的應用結構了:
這裡還有一個注意的地方,建立好新的 maven 專案之後,可能需要一些簡單的配置,如果預設配置好了可以忽略了,主要注意兩個方面的配置,一是 Servlet 版本,一是 JDK 版本,以及專案結構。
改下 JDK,點選專案右鍵 ->proerties->java compile,如下圖:
將 JDK 版本調整為 1.7 以上以匹配線上版本。
在修改下專案的結構,如下圖。點選 Project Facet,修改下 Java 的版本和剛剛修改的版本一致。
修改下 Dynamic Web Module,改成 3.1 版本(如果點選下面提示無法改變版本的話,就先反選 Dynamic Web Module 然後確定,在重新進入這個介面在勾選即可修改)。如下圖:
注意圖中的標註位置,點選進去,配置一下 Web 目錄,如下圖:
將我們建立專案的 Web 目錄配置下。
最後,我們在來安裝下新浪雲的 Eclipse 外掛,具體安裝的方法參見使用 Eclipse 外掛部署 Java 應用。
至此,我們開發前的準備工作就完成了,接下來我們可以開始開發了。
接下來的 Web 應用就可以根據自己的業務需求開始開發,就不說具體的開發過程了,下面著重介紹下新浪雲相關服務的使用方法和注意事項。
我們先來建立一個 Servlet,通過這個 Servlet 來演示相關功能的展示,建立一個如下圖的 package 在建立一個名為 test 的 Servlet。
create-servlet
然後可以通過 Eclipse 外掛將應用上傳到新浪雲,外掛使用見使用 Eclipse 外掛部署 Java 應用,也就是你剛剛建立的應用,注意填寫相關的資訊。部署時間大約為 3 分鐘,然後可以在瀏覽器裡訪問我們建立的 servlet 了,如下圖:
這樣,我們的 Servlet 的就建立好了,接下來我們的演示就基於這個 Servlet 展開介紹。
MySQL新浪雲的資料庫服務有兩種,一種是共享型資料庫,一種是獨享型資料庫,但其實操作方式都是一樣的,具體參看相關文件。以共享型資料庫為例子吧,通過 jdbc 方式即可連線。
首先,在新浪雲控制面板中建立自己的共享型 mysql 例項,然後在pom.xml裡新增下 jdbc 驅動。
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.20</version></dependency>
然後,在咱們剛剛建立的 Serlvet 中,新增如下程式碼:
String driver = "com.mysql.jdbc.Driver";String username = System.getenv("ACCESSKEY");String password = System.getenv("SECRETKEY");String dbName = System.getenv("MYSQL_DB");String host = System.getenv("MYSQL_HOST");String port = System.getenv("MYSQL_PORT");String dbUrl = "jdbc:mysql://"+host+":"+port + "/" +dbName;try { Class.forName(driver); Connection conn = DriverManager.getConnection(dbUrl,username,password); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("show status"); while(rs.next()){ response.getWriter().println(rs.getString("Variable_name") + " : " +rs.getString("value")); }} catch (ClassNotFoundException e) { e.printStackTrace();} catch (SQLException e) { e.printStackTrace();}
通過外掛在上傳到你的應用上,稍等一會就能看到如下的效果。
這裡只是展示了最基本的使用方法,有些專案中會使用連線池,連線池只需要注意一項,將 idle 時間調整到 10 秒以下即可,無論是獨享型還是共享型都是如此。
MemcachedMemcached 服務同樣也要在你建立的應用中開啟面板,初始化一下。容器使用的 memcache 有 auth 認證,需要使用支援 SASL 協議的客戶端,推薦使用spymemcached客戶端,首先在pom.xml檔案中新增如下依賴。
<dependency> <groupId>net.spy</groupId> <artifactId>spymemcached</artifactId> <version>2.12.0</version></dependency>
同樣,我們在剛剛我們新建的 servlet 中新增如下的程式碼。
String username = System.getenv("ACCESSKEY");String password = System.getenv("SECRETKEY");String server = System.getenv("MEMCACHE_SERVERS");AuthDescriptor ad = new AuthDescriptor(new String[] { "PLAIN" }, new PlainCallbackHandler(username, password));MemcachedClient mc = new MemcachedClient( new ConnectionFactoryBuilder().setProtocol(Protocol.BINARY).setAuthDescriptor(ad).build(), AddrUtil.getAddresses(server));OperationFuture<Boolean> of = mc.set("key", 0, "sinacloud");try { response.setCharacterEncoding("gbk"); response.getWriter().println("設定結果是否成功:"+ of.get()); response.getWriter().println("獲取結果:"+mc.get("key"));} catch (InterruptedException e) { e.printStackTrace();} catch (ExecutionException e) { e.printStackTrace();}
上傳伺服器後效果如下:
這裡只是簡單的實現了 set 和 get 方法,其他的可以參看 spymemcached。
Redis新浪雲 Redis 服務,類似於 Memcache 服務,先在pom.xml裡新增一個 redis 的客戶端,如 jedis
<dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.0.0</version></dependency>
然後還是在剛剛建立的 Servlet 裡新增如下程式碼:
String redis_url = System.getenv("REDIS_URL");try { URI redisUri = new URI(redis_url); JedisPool pool = new JedisPool(new JedisPoolConfig(),redisUri.getHost(),redisUri.getPort(),Protocol.DEFAULT_TIMEOUT,redisUri.getUserInfo().split(":",2)[1]); Jedis jedis = pool.getResource(); response.getWriter().println(jedis.set("key".getBytes(), "sinacloud".getBytes())); response.getWriter().println(jedis.get("key"));} catch (URISyntaxException e) { e.printStackTrace();}
最後上傳到新浪雲上,可以看到效果。如下圖:
MongoDB首先還是在pom.xml中新增一下依賴。
<dependency> <groupId>org.mongodb</groupId> <artifactId>mongo-java-driver</artifactId> <version>3.2.2</version></dependency>
同時也需要在面板裡初始化服務。然後可以根據自己的需要在 mongodb 例項中建立庫或者是集合,我自己建立了一個叫"test"的庫,然後建立了一個叫"users"的集合。
還是在那個 servlet 中插入如下的程式碼。
MongoClientURI uri = new MongoClientURI("YOUR_MONGODB_URL");
MongoClient client = new MongoClient(uri);
MongoDatabase db = client.getDatabase("test");
MongoCollection<Document> users = db.getCollection("users");
Document user = new Document("key", "sinacloud");
users.insertOne(user);response.getWriter().println(users.find(user).iterator().next().get("key"));
然後上傳到新浪雲,可以看到如下結果:
儲存服務這裡還是在上面建立的那個 Servlet 演示操作。對於容器 Java,我們提供了一套 SDK 支援,相關儲存的操作,SDK 已經放在了 maven 的中央倉庫上,可以通過 maven 進行下載,在專案的pom.xml中新增如下依賴:
<dependency> <groupId>com.sinacloud.java</groupId> <artifactId>java-sdk</artifactId> <version>1.2.1</version></dependency>
目前,SDK 裡包含了 kvdb(已經在 1.2.2 版本中去除)、雲端儲存、Storage,以後新的服務,會在不斷的增加。
StorageStorage 服務是新浪雲開發的一套物件儲存服務,首先也要在面板上開啟服務,初始化,然後在 servlet 中新增如下的程式碼:
StorageClient sc = new StorageClient();
sc.createBucket("testbucket");
sc.putObjectFile("testbucket", "test.txt", "test storage client upload text".getBytes(), null);
然後上傳到新浪雲上,然後訪問一下 Servlet,之後可以在自己 Storage 面板裡,可以看到檔案。如下圖:
雲端儲存分散式Session
多例項的情況下,準備了兩種解決方案,一種是粘滯會話,另一種是第三方 Session 儲存。粘滯會話可以在建立應用的時候開啟。下面演示一下使用第三方 Redis 服務儲存 Session為了方便演示,我先把我測試的容器例項擴充套件到多個,到了 3 個 JVM,如圖:
然後我們建立一個 redis 服務,具體建立參見 Redis 文件,然後進入"應用"->"環境變數面板",點選新增環境變數,新增以下兩個環境變數。新增如下的環境變數。
-
REDISURL="YOURREDIS_URL"
-
SESSION_MANAGER=REDIS
然後我們重啟下我們的應用。
還是在我們上面建立的 Servlet 裡演示:
HttpSession session = request.getSession();
session.setAttribute("key", "sinacloud");
response.getWriter().println(session.getAttribute("key"));
然後我們訪問下我們的 Servlet,如下圖:
最後我們在確認下是否將 Session 的資料儲存到了 Redis,進入到 Redis 控制面板,點選管理,輸入如下命令:
-
keys *
可以看到如下的效果:
可以看到,由 Tomcat 自主存的 Session 資訊,都在我們的 Redis 裡了,這樣就可以實現多例項之間的 Session 共享了。如果使用過程中需要儲存物件,要預先對物件進行序列化。
總結以上簡單的介紹了一下,新浪雲容器環境 Java 相關的問題,主要是在新浪雲相關的服務上,如果以後有新的服務或者問題,我會繼續更新相關的使用方法和文件。當然使用中如果遇到上面問題,可以提交工單 求助或直接在本文留言評論。
具體相關的服務可以參看容器服務的文件中心。