1. 程式人生 > >Token Vending Machine:移動應用客戶端安全訪問AWS服務的解決方案

Token Vending Machine:移動應用客戶端安全訪問AWS服務的解決方案

背景介紹

廣大移動網際網路應用和移動遊戲開發者在利用AWS服務進行開發過程中,經常需要為移動客戶端提供AWS服務訪問安全證書,以便讓這類移動端應用有許可權直接訪問AWS服務,比如通過AWS S3服務上傳圖片檔案或者通過AWS SQS服務傳送訊息。

有些移動開發者可能會考慮為每個移動應用使用者分配一個固定的AWS IAM安全證書來實現移動客戶端訪問AWS服務。但是一款熱門的移動網際網路應用或者移動遊戲往往擁有數百萬甚至上千萬的使用者基數,讓系統管理員為每一個使用者分配和管理IAM 安全證書工作量將會非常巨大。而且移動客戶端相對伺服器端具有較低的安全等級,儲存在移動裝置內部的敏感資訊比如使用者賬號或密碼存在洩露的風險,強烈建議移動開發者不要將AWS安全證書長期儲存在使用者的移動裝置中。

利用AWS 安全令牌服務Security Token Service (簡稱STS)可以動態的為大量移動客戶端使用者分配臨時安全證書 ,並且可以限制這些臨時安全證書的AWS服務訪問許可權和有效時間。使用AWS STS臨時安全證書沒有使用者總數的限制,也不需要主動輪換,證書自動會過期,擁有非常高的安全性。對於這種採用AWS STS和其他相關AWS服務構建的移動客戶端訪問AWS服務安全證書分配系統,我們把它命名為Token Vending Machine,即令牌售賣機,簡稱TVM。

下面我們以一個典型的手機圖片管理APP演示專案為例來介紹如何利用AWS相關服務設計和開發一套TVM系統。讀者可以通過參考演示專案的設計思想和相關原始碼快速開發出符合自己專案需求的TVM系統。

假設該演示專案的基本需求如下:

1) 使用者在使用該APP前要先完成註冊

2)   使用者成功登入後可以通過APP上傳,檢視和管理自己的圖片

3)   使用者不可以訪問到其他使用者的圖片

實現原理


整個演示專案實現可以分為三個主要模組:移動客戶端、TVM系統和S3服務。

A. 移動客戶端

  • 包括訪問TVM系統獲取臨時安全證書的客戶端程式碼
  • 包括直接訪問AWS S3儲存桶使用者個人目錄內容和圖片管理相關的程式碼邏輯實現。

B. TVM系統

  • 使用了一臺AWS EC2例項來執行Apache Tomcat Web伺服器,用於向移動客戶端提供遠端訪問介面以獲取臨時安全證書。在Tomcat內部則部署了使用JAVA語言開發的TVM伺服器端實現。
  • 使用了AWS 高效能的NoSQL資料庫DynamoDB做為後臺使用者資料庫。該資料庫用來儲存註冊使用者的賬號、密碼和會話Key等資訊。

開發者自行設計和實現TVM系統的時候,完全可以使用自己熟悉的資料庫產品或者整合第三方已有的使用者資料庫服務,比如基於LDAP的企業內部使用者資料庫。

  • TVM系統的JAVA實現通過訪問AWS STS服務獲取臨時安全證書以提供給移動客戶端。
  • 在真實的專案中,執行TVM系統的伺服器端往往還將直接管理S3中儲存的所有使用者資源,比如可以限制每個使用者允許上傳圖片的數量和檔案合計大小等等。這部分功能在本演示專案中暫時沒有實現。

C. S3服務

  • AWS S3服務為使用者上傳圖片提供了持久化儲存能力。

在使用者成功完成賬號註冊後,TVM系統的基本工作流程如下:

1) 使用者通過移動客戶端輸入賬號和密碼,登入系統。

2) TVM查詢使用者資料庫,校驗賬號和密碼組合的合法性。

3) TVM訪問AWS STS服務,請求分配臨時證書,TVM將獲得的臨時安全證書返回移動客戶端。

4) 移動客戶端使用獲取的臨時安全證書,呼叫AWS S3 API,執行檔案的上傳、列表和下載等操作。

部署過程

  1. 使用IAM使用者賬號登入AWS控制檯
  2. 建立IAM EC2角色
  3. 建立臨時安全證書角色
  4. 在Launch TVM EC2例項的過程中,選擇使用建立的IAM EC2角色
  5. 在TVM EC2例項中部署Tomcat和TVM war包
  6. 下載並安裝TVM apk檔案到安卓移動終端

細節說明

IAM EC2角色定義

基於對生產環境高安全性要求的考慮,我們沒有在JAVA程式碼中直接使用靜態配置的IAM使用者Access Key Id和Access Key來訪問AWS DynamoDB, S3和STS等AWS服務,而是希望使用AWS動態分配的臨時安全證書。為此我們建立了一個專門的IAM EC2角色,併為該角色賦予了足夠的AWS服務訪問許可權。這樣一來,執行在帶有該IAM角色的EC2例項中的TVM元件,就可以通過EC2上下文獲得擁有足夠AWS服務訪問許可權的臨時安全證書。請注意不要將TVM元件自己使用的臨時安全證書與TVM元件將為移動客戶端分配的臨時安全證書相混淆。這裡通過EC2上下文獲取的臨時安全證書主要用於TVM元件在伺服器端訪問AWS相關服務,比如讀寫DynamoDB或者向STS服務請求為移動客戶端分配臨時安全證書。

下面的例子IAM Policy檔案賦予了IAM EC2角色訪問AWS STS服務的AssumeRole介面和其他AWS服務的許可權。開發者可以根據自己的實際需求增加或減少相關許可權分配。

{

    "Version": "2012-10-17",

    "Statement": [

        {

            "Effect": "Allow",

            "Action": "sts:AssumeRole",

            "Resource": "*"

        },

        {

            "Effect": "Allow",

            "Action": [

                "sqs:*" ,

                "sns:*" ,

                "dynamodb:*"

            ],

            "Resource": "*"

        },

        {

            "Effect": "Allow",

            "Action": [

                "s3:*"

            ],

            "Resource": "*"

        }

    ]

}

TVM元件實現程式碼在構造STS服務訪問客戶端物件的時候,我們使用了AWS JAVA SDK提供的com.amazonaws.auth.InstanceProfileCredentialsProvider證書載入類檔案。該類例項可以自動訪問EC2執行環境上下文,獲取臨時安全證書以供構造的STS服務訪問客戶端物件使用。並且當獲取的臨時安全證書即將失效時,該類例項還可以自動去獲取新的安全證書。通過使用該類例項,TVM元件開發者就不再需要考慮訪問STS或DynamoDB服務時需要提供的安全證書問題。

下面的程式碼片段演示瞭如何構建一個帶有自動安全證書管理能力的STS服務訪問客戶端物件。

程式碼片段來自於TVM元件的com.amazonaws.tvm.TemporaryCredentialManagement.java原始檔。

AWSSecurityTokenServiceClient sts =

    new AWSSecurityTokenServiceClient(

        new InstanceProfileCredentialsProvider() );         

STS API方法選擇和使用

AWS STS服務提供了多個API方法,分別用於不同場景下的臨時證書獲取。其中的AssumeRole 方法是唯一支援臨時安全證書呼叫的。這種STS API方法的呼叫方式看上去非常有趣:我們使用了來自EC2上下文的臨時安全證書去呼叫STS AssumeRole 方法,目的是為了幫助移動客戶端使用者申請訪問AWS S3服務的臨時安全證書。實際上通過EC2上下文獲取的臨時安全證書也是來自AWS STS服務的動態分配。這一點恰恰也證明了AWS服務的鬆耦合設計思想,使用者可以通過靈活組合不同的服務來達到自己的設計目的。


STS AssumeRole 方法提供了多個引數,可以靈活的設定分配的臨時安全證書的各種特性。我們這裡主要介紹演示專案用到的幾個重要引數。

名稱 型別 必填 含義
DurationSeconds 整型

以秒為單位的臨時安全證書有效時間限制。最小可以是15分鐘(900秒),最大可以是1個小時(3600秒)

預設值:3600秒。

RoleArn 字串

臨時安全證書對應的角色Arn值。開發者在為移動客戶端分配臨時安全證書的時候,需要首先在AWS系統中建立該角色物件,並且為角色設定適當的許可權。STS AssumeRole方法返回的臨時安全證書的許可權就將以該角色所擁有的許可權為基礎。如果開發者呼叫STS API時候還提供了Policy引數,返回的安全證書許可權還將在此基礎上做進一步限制。以兩個引數提供許可權的交集作為返回的臨時安全證書的最終許可權設定。

RoleArn格式舉例:

“arn:aws-cn:iam::358620XXXXXX:role/TVMClientRole”

Policy 字串 以Json格式表示的附加許可權設定。如果該引數被設定,STS服務將使用RoleArn引數中指定的角色對應的許可權和該引數設定許可權的交集來定義即將返回的安全證書的許可權。一種常用的做法就是使用該引數來進一步限制返回安全證書的許可權到每個具體的實體。在我們的演示專案中,就是通過設定Policy來進一步限制每個登入使用者只能訪問屬於自己的S3檔案。
RoleSessionName 字串

角色會話名稱,主要用來區分申請臨時安全證書的不同使用者或者不同使用場景。

在我們的演示專案中,設定的角色會話名稱就是使用者通過手機客戶端應用輸入的登入名。

下面的程式碼片段演示瞭如何呼叫STS AssumeRole方法申請新的臨時安全證書。

程式碼片段來自於TVM元件的com.amazonaws.tvm.TemporaryCredentialManagement.java原始檔。

//構造請求物件

AssumeRoleRequest assumeRoleRequest = new AssumeRoleRequest();

assumeRoleRequest.setRoleArn("Arn of your TVM role");

assumeRoleRequest.setPolicy(

        TemporaryCredentialManagement.getPolicyObject( myUserName ));

assumeRoleRequest.setRoleSessionName(myUserName);

assumeRoleRequest.setDurationSeconds(

new Integer( Configuration.SESSION_DURATION ));   

//獲取臨時安全證書

AssumeRoleResult assumeRoleResult = sts.assumeRole(assumeRoleRequest);

if (assumeRoleResult != null && assumeRoleResult.getCredentials() != null)

{   

    log.info("利用EC2角色從STS服務獲取臨時證書操作成功!");

    log.info("AccessKeyId = "

    + assumeRoleResult.getCredentials().getAccessKeyId());

}

else

{

    log.warning("利用EC2角色從STS服務獲取臨時證書操作失敗!");

}       

設定安全證書許可權

在我們演示專案的需求列表中,有一個需求是不同的使用者只能訪問S3物件儲存服務中屬於自己的檔案。實現該需求有不同的方法,我們這裡採用方法的是限制移動客戶端使用的AWS 臨時安全證書的S3訪問許可權。在AWS STS AssumeRole 方法中有兩個引數可以設定返回的臨時安全證書的許可權:一個是臨時安全證書角色Arn值,一個是附加的Policy字串。

在我們演示專案的實現過程中,我們為建立的臨時安全證書角色分配了如下許可權策略,保證AWS STS服務返回的臨時安全證書擁有指定S3儲存桶的必要操作許可權。

{

    "Version": "2012-10-17" ,

    "Statement": [

        {

            "Effect": "Allow",

            "Action": "s3:ListBucket",

            "Resource": "arn:aws-cn:s3:::tvm-examplebucket"

        },

        {

            "Effect": "Allow",

            "Action": [

                "s3:GetObject",

                "s3:PutObject",

                "s3:DeleteObject"

            ],

            "Resource": "arn:aws-cn:s3:::tvm-examplebucket/*"

        }

    ]

}

請注意,在建立臨時安全證書角色的過程中,還需要新增該角色對於之前建立的IAM EC2角色的信任關係。否則TVM伺服器端元件在執行AssumeRole方法時候,AWS系統會提示當前使用者沒有對臨時安全證書角色執行AssumeRole操作的許可權。

接下來我們將利用模板檔案動態地構造附加的Policy,目的是限制每個登入使用者只能夠訪問自己目錄下的S3資源。

模板檔案的格式如下:

{

    "Version": "2012-10-17",

    "Statement": [

        {

            "Effect": "Allow",

            "Action": "s3:ListBucket",

            "Resource": "arn:aws-cn:s3:::tvm-examplebucket"

        },

        {

            "Effect": "Allow",

            "Action": [

                "s3:GetObject",

                "s3:PutObject",

                "s3:DeleteObject"

            ],

            "Resource": "arn:aws-cn:s3:::tvm-examplebucket/__USERNAME__/*"

        }

    ]

}

以下的例子程式碼利用登入使用者名稱替換模板中的“__USERNAME__”,構造出指定使用者的許可權Policy。

程式碼片段來自於TVM元件的com.amazonaws.tvm.TemporaryCredentialManagement.java原始檔。

protected static String getPolicyObject( String username ) throws Exception

{

    // Ensure the username is valid to prevent injection attacks.

    if ( !Utilities.isValidUsername( username ) )

    {

        throw new Exception( "Invalid Username" );

    }

    else

    {

        return Utilities.getRawPolicyFile()

                        .replaceAll( "__USERNAME__", username );

    }

}

許可權分級控制

在本演示系統中,用於開發和部署TVM系統的IAM使用者、最終執行TVM系統的EC2例項對應的IAM角色和移動客戶端所獲得的臨時安全證書分別擁有不同大小的許可權,實現了很好的許可權分級控制。

移動客戶端臨時安全證書的過期問題處理

在前面我們介紹的TVM系統的基本流程裡面,移動客戶端應用在登入成功後,TVM元件將直接返回臨時安全證書。而實際的實現過程要比這複雜一些,主要是為了解決移動客戶端獲取的臨時安全證書過期後的自動更新問題。


TVM系統的完整工作流程如下:

1) 使用者通過移動客戶端輸入賬號和密碼,登入系統。

2) TVM查詢使用者資料庫,校驗賬號和密碼組合的合法性,建立並返回代表當前使用者會話的Key值給移動客戶端。

3) 移動客戶端在本地快取獲取的會話Key。移動客戶端利用本地儲存的會話Key和使用者動態ID向TVM系統發起請求,申請臨時安全證書。

4) TVM系統校驗移動客戶端使用者身份和會話Key,訪問AWS STS服務,請求分配臨時安全證書,TVM將獲取的臨時安全證書返回移動客戶端。

5) 移動客戶端在本地快取獲取的臨時安全證書。移動客戶端使用本地儲存的臨時安全證書,持續呼叫AWS S3 API,執行檔案的上傳、列表和下載等操作。

關於移動客戶端獲取臨時安全證書,請注意下面的細節:

  • 在臨時安全證書有效時間範圍內,移動客戶端可以直接使用本地儲存的臨時安全證書訪問AWS 服務,比如S3儲存桶。
  • 一旦臨時安全證書過期,移動客戶端需要憑藉本地儲存的使用者會話Key和動態使用者ID向TVM系統再次申請臨時安全證書,不需要再提供使用者名稱和密碼資訊。
  • 如果是剛剛啟動移動客戶端或者TVM使用者會話Key已經失效,移動客戶端需要執行上述完整的登入和臨時安全證書獲取過程。

下面的程式碼片段演示如何登入TVM系統,獲取當前使用者的會話Key。

程式碼片段來自於安卓移動客戶端元件的com.amazonaws.tvmclient.AmazonTVMClient.java原始檔。

public Response login( String username, String password ) {

    Response response = Response.SUCCESSFUL;

    if ( AmazonSharedPreferencesWrapper.getUidForDevice( this.sharedPreferences ) == null ) {

        String uid = AmazonTVMClient.generateRandomString();

        LoginRequest loginRequest = new LoginRequest(this.endpoint,

                                                     this.useSSL,

                                                     this.appName,

                                                     uid,

                                                     username,

                                                     password );

        ResponseHandler handler = new LoginResponseHandler( loginRequest.getDecryptionKey() );

        response = this.processRequest( loginRequest, handler );

        if ( response.requestWasSuccessful() ) {

            AmazonSharedPreferencesWrapper.registerDeviceId(this.sharedPreferences,

                                                            uid, 

                                                            ((LoginResponse)response).getKey());

            AmazonSharedPreferencesWrapper.storeUsername( this.sharedPreferences, username );                       

        } 

    }

    return response;

}

下面的程式碼片段演示如何使用當前使用者的會話Key和動態使用者ID訪問TVM系統,更新本地儲存的臨時安全證書。

程式碼片段來自於安卓移動客戶端元件的com.amazonaws.demo.personalfilestore.AmazonClientManager.java和com.amazonaws.tvmclient.AmazonTVMClient.java原始檔。

public Response validateCredentials() {

    Response ableToGetToken = Response.SUCCESSFUL;

    if (AmazonSharedPreferencesWrapper.areCredentialsExpired( this.sharedPreferences ) ) {

        //清空本地儲存的過期臨時安全證書   

        clearCredentials();      

        AmazonTVMClient tvm =

            new AmazonTVMClient(this.sharedPreferences,

                                PropertyLoader.getInstance().getTokenVendingMachineURL(),

                                PropertyLoader.getInstance().getAppName(),

                                PropertyLoader.getInstance().useSSL() );

        if ( ableToGetToken.requestWasSuccessful() ) {

            ableToGetToken = tvm.getToken();           

        }

    }

    if (ableToGetToken.requestWasSuccessful() && s3Client == null ) {        

        AWSCredentials credentials =

            AmazonSharedPreferencesWrapper.getCredentialsFromSharedPreferences(

                this.sharedPreferences );

        s3Client = new AmazonS3Client( credentials );

        s3Client.setRegion(Region.getRegion(Regions.CN_NORTH_1));

    }

    return ableToGetToken;

}

public Response getToken() {

    String uid = AmazonSharedPreferencesWrapper.getUidForDevice( this.sharedPreferences );

    String key = AmazonSharedPreferencesWrapper.getKeyForDevice( this.sharedPreferences );

    Request getTokenRequest = new GetTokenRequest( this.endpoint, this.useSSL, uid, key );

    ResponseHandler handler = new GetTokenResponseHandler( key );

    GetTokenResponse getTokenResponse =

        (GetTokenResponse)this.processRequest( getTokenRequest, handler ); 

    if ( getTokenResponse.requestWasSuccessful() ) {

        AmazonSharedPreferencesWrapper.storeCredentialsInSharedPreferences(

            this.sharedPreferences,                                                                    

            getTokenResponse.getAccessKey(),                                                                    

            getTokenResponse.getSecretKey(),                                                                                   

            getTokenResponse.getSecurityToken(),                                                                    

            getTokenResponse.getExpirationDate() );

    }

    return getTokenResponse;

}

移動客戶端和TVM系統安全通訊設計

開發者如果需要移動客戶端應用在非安全的網際網路上直接與TVM系統通訊,比如直接使用HTTP而非HTTPS傳送登入請求和接收臨時安全證書,開發者還需要自己實現一定程度的訊息加密解密過程,避免敏感資訊比如會話Key或臨時安全證書內容在傳輸過程中被洩密。

演示效果

使用者通過手機客戶端註冊新賬號,執行完成登入操作後,就可以上傳,檢視和刪除屬於自己的圖片檔案。上傳檔案過程支援使用者輸入文字內容由系統自動產生上傳檔案和直接從手機客戶端選擇需要上傳的圖片檔案。


通過檢視AWS S3儲存桶內容,我們可以看到每個使用者上傳的圖片或文字檔案都儲存在屬於該使用者自己的S3儲存桶路徑下面:

在TVM系統DynamoDB使用者資料庫的使用者表中儲存了使用者名稱、使用者動態ID和加密的使用者密碼資訊:

在TVM系統DynamoDB使用者資料庫的裝置表中儲存了使用者的會話Key值:

例子原始碼

TVM系統伺服器端原始碼

安卓客戶端原始碼

參考連結

敬請關注

在移動應用設計開發過程中,開發者除了完全靠自己開發實現使用者註冊和管理功能外,還可以考慮與主流社交媒體身份提供商實現聯合身份認證,讓已經擁有這些社交媒體身份提供商註冊賬號的使用者能夠順利訪問其移動應用。AWS Cognito服務已經支援與Google、Facebook、Twitter 或 Amazon等國際知名社交媒體身份提供商的聯合身份認證。後續我們會陸續推出如何與微信、QQ和微博等國內主要社交媒體的聯合身份認證方案探討。

作者介紹:

蒙維

亞馬遜AWS解決方案架構師,負責基於AWS的雲端計算方案架構諮詢和設計,有超過十年以上電信行業和移動網際網路行業複雜應用系統架構和設計經驗,主要擅長分散式和高可用軟體系統架構設計,移動網際網路應用解決方案設計,研發機構DevOps最佳實施過程。

相關推薦

Token Vending Machine移動應用客戶安全訪問AWS服務解決方案

背景介紹 廣大移動網際網路應用和移動遊戲開發者在利用AWS服務進行開發過程中,經常需要為移動客戶端提供AWS服務訪問安全證書,以便讓這類移動端應用有許可權直接訪問AWS服務,比如通過AWS S3服務上傳圖片檔案或者通過AWS SQS服務傳送訊息。 有些移動開發

canal 修改mysql資料後Java客戶無反應的問題解決方案

canal官方文件可以點選這裡檢視。 按照官網的教程完成配置後會發現,在修改mysql時java客戶端還是沒有反應。暫時發現有以下兩種原因: 1.需要修改canal.properties配置,但是官網沒有講解。(大概率) 進入canal解壓檔案 ,編輯conf/canal.prope

Redis之—— java客戶連結不上redis解決方案

出現問題描述: 1.Could not get a resource from the pool, Connection refused: connect windows java這邊客戶端連結被拒接了,想想問題 1.Vmware裡面的linux所安裝的redis已

關於cocos2dx客戶程式的自動更新解決方案

轉載自:簾卷西風的專欄(http://blog.csdn.net/ljxfblog) 隨著手機遊戲的不斷髮展,遊戲包也越來越大,手機網路遊戲已經超過100M了,對於玩家來說,如果每次更新都要重新下載,那簡直是災難。而且如果上IOS平臺,每次重新發包都要稽核,勞神

微信 IOS客戶 Audio自動播放的解決方案

對於安卓機來說,下面的程式碼足以 var player = document.getElementById('mp3play'); player.play(); 但是對於IOS版本的微信,卻發現不能自動播放,網上也沒有好的解決

客戶產生CLOSE_WAIT狀態的解決方案

現象生產環境和測試環境都發現有個外圍應用通過搜尋服務調用搜索引擎時,偶爾會出現大量的訪問超時的問題,通過如下方式進行分析排查:l 首先是拿到搜尋服務的JavaCore,發現其堵在HttpClient的傳送上面,被堵的連線有數百個,原因是不能夠從連線池中獲取到連線;l 首先想到

2016HTML5移動最新兼容問題解決方案

並不是 按鈕 關鍵字 initial button 手機開發 div off spin 1、安卓瀏覽器看背景圖片,有些設備會模糊。用同等比例的圖片在PC機上很清楚,但是手機上很模糊,原因是什麽呢?經過研究,是devicePixelRatio作怪,因為手機分辨率太小,如果按照

初涉掃碼登錄edusoho實現客戶掃碼登錄(簡版)

confirm 鍵值 版本號 error == form 通過 遮罩層 strrev 一、項目簡介及需求 edusoho是一套商業版的在線教育平臺,項目本身基於symfony2框架開發,現在有一款自己的APP,要求在不多修改edusoho自身代碼的基礎上,實現客戶端對P

springCloud(7)Ribbon實現客戶側負載均衡-消費者整合Ribbon

spring cloud ribbon 消費者整合ribbon 一、簡介 Ribbon是Netfix發布的負載均衡器,它有助於控制HTTP和TCP客戶端的行為。為Ribbon配置服務提供者地址列表後,Ribbon就可基於某種負載均衡算法,自動地幫助服務消費者去請求。Ribbon默認為我們提供了很

springCloud(8)Ribbon實現客戶側負載均衡-自定義Ribbon配置

spring cloud ribbon 自定義ribbon配置 一、簡介很多場景下,可能根據需要自定義的Ribbon的配置,例如修改Ribbon的負載均衡規則等。Spring cloud Camden允許使用Java代碼或屬性自定義Ribbon的配置。二、使用Java代碼自定義Ribbon配置在S

SVN使用技巧[4]TortoiseSVN客戶使用

刪除 svn服務器 1-1 技巧 svn客戶端 本地文件 版本 bsp 擁有 創建倉庫 檢出數據(從SVN服務器下載數據到本地) 更新本地版本為SVN服務器最新版本 添加文件 修改文件 刪除文件 恢復本地文件(修改/刪除了

[ 搭建Redis本地服務器實踐系列三 ] 圖解Redis客戶工具連接Redis服務

done not 必須 tin 復雜 start exe eas 方便 上一章 [ 搭建Redis本地服務器實踐系列二 ] :圖解CentOS7配置Redis 介紹了Redis的初始化腳本文件及啟動配置文件,並圖解如何以服務的形式來啟動、終止Redis服務,可以說我們的R

Netty(二)簡單的客戶服務demo

cat println 客戶端連接 監聽端口 rbo 異常 服務端 max auth 使用Java IO實現客戶端服務端 服務端監聽端口 客戶端連接服務端 客戶端循環寫數據到服務端 import java.io.IOException; import java.net.S

(已解決)c# 客戶程式訪問oracle報錯ORA-12154: TNS: 無法處理服務

錯誤:ORA-12154: TNS: 無法處理服務名 這個錯誤大家在百度上一搜一大把,但是我出現這個錯誤的原因跟百度不太一樣,我的客戶端程式在不同的目錄可以正常執行,但在其中1個目錄就是要出錯,因此我想到是目錄路徑中出了問題,既然是路徑那就只能是資料夾名有什麼特殊之處導致不能執行,後來發現不能執

如何安裝和配置打印服務器之六自定義客戶電腦使用網絡打印機的默認設置

oss strong mode 客戶端 pre 51cto col str 裝配 如何安裝和配置打印服務器之六:自定義客戶端電腦使用網絡打印機的默認設置 ?Lander Zhang 專註外企按需IT基礎架構運維服務,IT Helpdesk 實戰培訓踐行者http://blo

etcd入門系列四開啟客戶證書訪問

etcd入門系列 一. etcd在docker中的安裝與使用 二. etcd 開啟 https 三. 身份驗證訪問控制 四. 開啟客戶端證書訪問 1. 生成客戶端證書 生成client.json: $ cfssl print-defaults csr > client.

記筆記C# Socket客戶監聽伺服器處理方案【同步】

方案主要功能:        (1)客戶端同步監聽來自伺服器端的資料(開啟子執行緒監聽)        (2)客戶端向伺服器端傳送資料(主執行緒傳送,並控制)        

NetCore實踐篇分散式監控客戶ZipkinTracer從入門到放棄之路

上面三篇文章普及了一些依賴注入的知識。sorry,這塊我研究的很淺。。。這次順帶了解了不少,以後要抽空專門研究一下。 Single:單例是一個將持續應用程式整個生命週期的例項。在Web術語中,這意味著在服務的初始請求之後,每個後續請求將使用相同的例項。這也意味著它跨越Web請求(因此

Spring Cloud 入門教程(五) Ribbon實現客戶的負載均衡

接上節,假如我們的Hello world服務的訪問量劇增,用一個服務已經無法承載, 我們可以把Hello World服務做成一個叢集。  很簡單,我們只需要複製Hello world服務,同時將原來的埠8762修改為8763。然後啟動這兩個Spring Boot應用, 就可

JavaWeb學習(九)HttpServletRequest基本應用——客戶提交表單到伺服器(2)

一、獲得客戶機請求引數(客戶端提交的資料) getParameter(String)方法(常用) getParameterValues(String name)方法(常用) getParameterNames()方法(不常用) getParameterMap()方法(編寫