1. 程式人生 > >手把手教你用Java搭建自己的網站

手把手教你用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 秒以下即可,無論是獨享型還是共享型都是如此。

Memcached

Memcached 服務同樣也要在你建立的應用中開啟面板,初始化一下。容器使用的 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,以後新的服務,會在不斷的增加。

Storage

Storage 服務是新浪雲開發的一套物件儲存服務,首先也要在面板上開啟服務,初始化,然後在 servlet 中新增如下的程式碼:

StorageClient sc = new StorageClient();
sc.createBucket("testbucket");
sc
.putObjectFile("testbucket", "test.txt", "test storage client upload text".getBytes(), null);

然後上傳到新浪雲上,然後訪問一下 Servlet,之後可以在自己 Storage 面板裡,可以看到檔案。如下圖:

雲端儲存

參見雲端儲存,有詳細的 API

分散式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 相關的問題,主要是在新浪雲相關的服務上,如果以後有新的服務或者問題,我會繼續更新相關的使用方法和文件。當然使用中如果遇到上面問題,可以提交工單 求助或直接在本文留言評論。

具體相關的服務可以參看容器服務的文件中心