コンピュータネットワーク: HTMLフレームワークの階層化設計

计算机网络中的OSI七层模型

计算机网络中的OSI(Open Systems Interconnection)七层模型コンピュータ ネットワークにおけるデータ通信のプロセスを記述するための理論的枠組みです。OSI モデルは计算机网络通信プロセスを 7 つのレベルに分割し、各レベルには固有の機能とプロトコルがあります。この階層構造は、コンピュータ ネットワークの研究と理解に役立ちます通信原理OSI 7 層モデルのさまざまな層とその主な機能を以下に示します。

画像.png

应用层これは OSI モデルの 7 番目の層であり、网络应用程序と の网络协议間のインターフェイスでもあります。アプリケーション層は主に、ファイル転送、電子メール、Web ブラウジングなどのさまざまなアプリケーション サービスをユーザーに提供する役割を果たします。

表示层これは OSI モデルの 6 番目の層であり、主にネットワーク内で送信されるデータ ( data など) の表現の処理を担当します加密、解密、压缩、解压缩プレゼンテーション層は、異なるシステム間の通信を保証します数据兼容性

会话层これは OSI モデルの 5 番目の層であり、主にアプリケーション間の通信セッションの確立、維持、終了を担当します。セッション層は、データ交換のための同期および確認メカニズムを提供します。

传输层これは OSI モデルの 4 番目の層であり、主にソース ホストとターゲット ホスト間で信頼性の高いエンドツーエンドのデータ送信サービスを提供する役割を果たします。トランスポート層は、データをセグメント化、カプセル化、再構成することにより、信頼性の高いデータ送信を実現します。一般的なトランスポート層プロトコルには、TCP(传输控制协议)と が含まれますUDP(用户数据报协议)

网络层これは OSI モデルの 3 番目の層であり、主にホストをターゲット ホストに数据包从源主机路送信する。主にネットワーク層が担当します逻辑寻址、路由选择和分组转发一般的なネットワーク層プロトコルには、IP(互联网协议)および が含まれますICMP(互联网控制报文协议)

数据链路层これは OSI モデルの 2 番目の層であり、主にネットワーク層からのデータ パケットをフレームにカプセル化し、同じ LAN 内で送信する役割を果たします。データリンク層は主に、物理アドレス指定、データフレーミング、エラー検出、フロー制御を担当します。一般的なデータリンク層プロトコルには、以太网(Ethernet)、令牌环(Token Ring)和无线局域网(Wi-Fi)などが含まれます。

物理层これは OSI モデルの最初の層であり、主に物理メディア上のビット ストリームの透過的な送信を担当します。物理層は主にハードウェアインターフェース、電気的特性、光ファイバー、無線伝送などの問題に焦点を当てます。

OSI の 7 層モデルは、コンピュータ ネットワークにおける通信原理の研究と理解に役立つ一般的なフレームワークを提供します。実際のアプリケーションでは、通常 を使用しますTCP/IP四层模型。これには が含まれ应用层、传输层、网络层和链路层、OSI モデルと一定の対応関係があります。

HTMLフレームワークの必要性

HTML框架階層化設計の主な理由は、コードの可読性、保守性、再利用性を向上させることです。階層化によりHTML框架プロジェクト全体の構造とロジックが改善され、開発者がコードをより深く理解し、変更することが容易になります。レイヤード設計には次の利点があります。

  1. 可読性の向上: HTML フレームをさまざまなレイヤーに分割することで、コード構造が明確になり、開発者がコードの機能を迅速に理解できるようになります。
  2. メンテナンスの容易さ: 階層化された設計は機能のモジュール化に役立ち、コードの他の部分に影響を与えることなくモジュールを簡単に変更または交換できます。これは、プロジェクトの保守性の向上に役立ちます。
  3. 再利用性: HTML フレームワークを階層化すると、共通部分を再利用可能なコンポーネントに抽出できるため、これらのコンポーネントをさまざまなプロジェクトで再利用でき、開発効率が向上します。
  4. 適応性: 階層化された設計により、HTML フレームワークがさまざまなデバイスや画面サイズに適応しやすくなり、プロジェクトの互換性が向上します。
  5. コラボレーションの容易さ: 大規模なプロジェクトでは、複数の開発者が関与することがよくあります。階層化された設計により、開発者は独自のモジュールに集中できるため、コードの競合や通信コストが削減されます。

HTML框架的组成

HTML フレームワークには、Application层``middleware层``route层``codec层``transport层 Application层通常、アプリケーション層には、Web アプリケーションのコントローラー (Controller)、ビュー (View)、モデル (Model) などのビジネス ロジックに関連するコードが含まれます。アプリケーション層の主な役割は、ユーザーの要求を処理し、対応する応答を返すことです。

Middleware层ミドルウェア層は、アプリケーション層と基礎となるフレームワークの間の層であり、認証、認可、キャッシュ、ロギングなどのいくつかの一般的な機能の処理を担当します。ミドルウェア層は、ビジネス ロジックを一般的な機能から分離するのに役立ち、アプリケーション層をより簡潔にして保守しやすくします。

Route层ルーティング層は、HTTP リクエストの URL と HTTP メソッド (GET、POST など) を処理し、対応するコントローラとメソッドにリクエストをディスパッチします。ルーティング層の主な機能は、URL マッピングに従って特定の機能コードを見つけることです。

Codec层コーデック層はデータのエンコードとデコードを担当します。Web 開発では、通常、エンコードとデコードには、HTML、CSS、JavaScript などのフロントエンド テクノロジの処理と、JSON や XML などのデータ交換形式の処理が含まれます。コーデック層の主な機能は、異なる層間での送信と処理のためにデータを特定の形式に変換することです。

Transport层トランスポート層は、TCP や UDP などのプロトコルの使用など、基礎となるネットワーク通信の処理を担当します。Web 開発では、トランスポート層には通常、リクエストと応答の作成、送信、受信などの HTTP プロトコルの処理が含まれます。トランスポート層の主な役割は、ネットワーク内でのデータの信頼性の高い送信と正しいルーティングを保証することです。

画像.pngこれらの層は、実際のアプリケーションのフレームワークやシナリオによって異なる場合があります。ただし、提供された説明から判断すると、これらはそれぞれ Web アプリケーションのさまざまな機能を処理する責任を負い、一緒になって完全な Web 開発フレームワークを構成します。

HTML框架和服务端客户端之间的通信对比

画像.png

Application层アプリケーション層の設計

アプリケーション層の設計は主に、使用する各種タイプを設定すること接口です路由

たとえば、バイト バックエンドの高度なバージョンの大規模なプロジェクトです注册接口

/douyin/user/register/ - ユーザー登録インターフェイス

新しいユーザーが登録するときは、ユーザー名、パスワード、ニックネームを入力するだけです。ユーザー名は一意である必要があります。作成が成功した後、ユーザー ID と許可トークンを返します。

インターフェースの種類

役職

インターフェースの定義

go
复制代码
syntax = "proto2";
package douyin.core;

message douyin_user_register_request {
  required string username = 1; // 注册用户名,最长32个字符
  required string password = 2; // 密码,最长32个字符
}

message douyin_user_register_response {
  required int32 status_code = 1; // 状态码,0-成功,其他值-失败
  optional string status_msg = 2; // 返回状态描述
  required int64 user_id = 3; // 用户id
  required string token = 4; // 用户鉴权token
}
go
复制代码
func Register(username, password string) (id int64, token int64, err error) {
   if len(username) > 32 {
      return 0, 0, errors.New("用户名过长,不可超过32位")
   }
   if len(password) > 32 {
      return 0, 0, errors.New("密码过长,不可超过32位")
   }
   // 先查布隆过滤器,不存在直接返回错误,降低数据库的压力
   if userNameFilter.TestString(username) {
      return 0, 0, errors.New("用户名已经存在!")
   }
   //雪花算法生成token
   node, err := snowflake.NewNode(1) //这里的userIdInt64就是 User.Id(主键)
   if err != nil {
      log.Println("雪花算法生成id错误!")
      log.Println(err)
   }
   token1 := node.Generate().Int64()
   tokenStr := strconv.FormatInt(token1, 10)
   user := domain.User{}
   // 再查缓存
   data, err := dao.RedisClient.Get(context.Background(), tokenStr).Result()
   if err == redis.Nil {
      fmt.Println("token does not exist")
   } else if err != nil {
      fmt.Println("Error:", err)
   } else {
      num, err := strconv.ParseInt(data, 10, 64)
      if err != nil {
         fmt.Println("Error:", err)
         return num, 0, err
      }

      return num, token1, nil
   }
   //在查数据库
   user = domain.User{}
   dao.DB.Model(&domain.User{}).Where("name = ?", username).Find(&user)
   if user.Id != 0 {
      return 0, 0, errors.New("用户已存在")
   }
   user.Name = username
   // 加密存储用户密码
   user.Salt = randSalt()
   buf := bytes.Buffer{}
   buf.WriteString(username)
   buf.WriteString(password)
   buf.WriteString(user.Salt)
   pwd, err1 := bcrypt.GenerateFromPassword(buf.Bytes(), bcrypt.MinCost)
   if err1 != nil {
      return 0, 0, err
   }
   user.Pwd = string(pwd)

   //存在mysql里边
   dao.DB.Model(&domain.User{}).Create(&user)
   //再把用户id作为键 用户的所有信息作为值存在其中
   //用户信息的缓存是 保存在redis中 一个以id为键 user json为值
   jsonuser, err1 := MarshalUser(user)
   if err1 != nil {
      fmt.Println("err1", err1)
      return 0, 0, err1
   }
   err = dao.RedisClient.Set(context.Background(), strconv.FormatInt(user.Id, 10), jsonuser, 0).Err()
   if err != nil {
      fmt.Println("err", err)
      return 0, 0, err
   }
   // 布隆过滤器中加入新用户
   userIdFilter.AddString(strconv.FormatInt(user.Id, 10))
   userNameFilter.AddString(username)
   return user.Id, token1, nil
}

このインターフェイスの登録機能が実装されています。すべての情報を mysql に保存します。もちろん、redis にもこの情報があり、もちろんユーザー名も Bouillon フィルターに存在します。ユーザーのユーザー名を受け取ると、最初にそれが正しいかどうかを確認します。ブイヨンフィルター内 存在する場合は直接 err を返します。存在しない場合は、redis でクエリします。redis は mysql よりも軽いため、最初に redis で確認する必要があります。見つかったので、 mysql で確認します。見つからない場合は、登録していないことを示します。登録できます。

命名规范

画像.png命名規則の原則に従ってください。

Middleware层中间件

ginフレームワークのミドルウェアは、グローバルミドルウェアとローカルミドルウェアに分かれます。では、ミドルウェアとは何でしょうか? ミドルウェアは、アプリケーションに共通のサービスと機能を提供するソフトウェアです。データ管理、アプリケーションの提供、メッセージング、認証、および API 管理は、多くの場合、ミドルウェアを介して行われます。gin フレームワークでは、すべての API インターフェイスがミドルウェアを通過する必要があり、ミドルウェアでインターセプト処理を行うことができます。

ミドルウェアの一般的なモデル

画像.png

グローバルミドルウェア

これはサービスの開始時に登録され、グローバルとはすべての API インターフェイスがここを通過することを意味します。Gin のミドルウェアはUse、変数パラメータを受け取るメソッドを通じて設定されるため、複数のミドルウェアを同時に設定できます。

まず次のように定義します

go
复制代码
// 1.创建路由
r := gin.Default()  //默认带Logger(), Recovery()这两个内置中间件
r:= gin.New()      //不带任何中间件
// 注册中间件  
r.Use(MiddleWare())
r.Use(MiddleWare2())

ご了承ください

gin.Default()Loggerデフォルトでは、およびミドルウェアが使用されますRecovery。そのうちの 1 つは次のとおりです。 Logger ミドルウェアは、gin.DefaultWriterGIN_MODE=release が設定されている場合でもログを書き込みます。回復ミドルウェアがrecover何でもやってくれますpanicパニックが発生した場合、500 応答コードが書き込まれます。上記 2 つのデフォルトのミドルウェアを使用したくない場合は、gin.New()デフォルトのミドルウェアを使用せずに新しいルートを作成できます。

go
复制代码
// 定义中间
func MiddleWare() gin.HandlerFunc {
    return func(c *gin.Context) {
        t := time.Now()
        fmt.Println("中间件开始执行了")
        // 设置变量到Context的key中,可以通过Get()取
        c.Set("request", "这是中间件设置的值")
        status := c.Writer.Status()
        fmt.Println("中间件执行完毕", status)        
        t2 := time.Since(t)
        fmt.Println("time:", t2)
    }
}

次に、サービスを開始し、任意のインターフェイスにアクセスして、次のように出力を確認します。

これは、リクエストが最初にミドルウェアに到着し、次に API インターフェースに到着することです。ミドルウェアでは、変数をコンテキストのキーに設定し、API インターフェイスで値を取得できます。

go
复制代码
        r.GET("/", func(c *gin.Context) {
            // 取值
            req, _ := c.Get("request")
            fmt.Println("request:", req)
            // 页面接收
            c.JSON(200, gin.H{"request": req})
        })

このとき、ミドルウェアによって設定された値は、

nextこのメソッドはミドルウェア内で使用され、后续中间件リクエスト処理を実行することを意味します(未実行のミドルウェアや定義したGETメソッドの処理も含みます。複数のミドルウェアが連続して登録されている場合、先入れ後出力の順序で実行されます)。next就去执行下一个中间件里的next前面方法

go
复制代码
        // 执行函数
        c.Next()
        // 中间件执行完后续的一些事情

部分的なミドルウェア

部分的なミドルウェアとは、一部のインターフェイスが有効になり、ローカルでのみ使用されることを意味します。現時点では、http:127.0.0.1:8000/ にアクセスしてミドルウェアのログ出力を確認し、他の API インターフェイスは表示されません。

go
复制代码
   //局部中间件使用
    r.GET("/", MiddleWare(), func(c *gin.Context) {
        // 取值
        req, _ := c.Get("request")
        fmt.Println("request:", req)
        // 页面接收
        c.JSON(200, gin.H{"request": req})
    })

ジン組み込みミドルウェア

go
复制代码

func BasicAuth(accounts Accounts) HandlerFunc

func BasicAuthForRealm(accounts Accounts, realm string) HandlerFunc

func Bind(val interface{}) HandlerFunc

func ErrorLogger() HandlerFunc

func ErrorLoggerT(typ ErrorType) HandlerFunc

func Logger() HandlerFunc

func LoggerWithConfig(conf LoggerConfig) HandlerFunc

func LoggerWithFormatter(f LogFormatter) HandlerFunc

func LoggerWithWriter(out io.Writer, notlogged ...string) HandlerFunc

func Recovery() HandlerFunc

func RecoveryWithWriter(out io.Writer) HandlerFunc

func WrapF(f http.HandlerFunc) HandlerFunc

func WrapH(h http.Handler) HandlerFunc

要約する

カスタム ミドルウェアを介して、ロギング、認可検証、さまざまなフィルタリングなど、実行する必要があることを実行するリクエストを簡単にインターセプトできます。

余談

テクノロジーが急速に成長するこの最初の年において、プログラミングは多くの人にとって無限の可能性の世界へのチケットのようなものです。数あるプログラミング言語の中でも、Python はトップスターのような存在で、その簡潔でわかりやすい構文と強力な機能により、世界で最も人気のあるプログラミング言語の 1 つとなっています。


Python の急速な台頭は業界全体にとって非常に有益ですが、「人红是非多」のせいで多くの批判が加えられていますが、それでもその熱い開発の勢いを止めることはできません。

Python は今後 10 年間、関連性があり、そのままの状態であり続けるでしょうか? 今日は事実を分析し、いくつかの誤解を払拭していきます。

Python に興味があり、Python を学習してより高い給与を獲得したい場合は、次の Python 学習教材セットが役立つはずです。

教材には、Python インストール パッケージ + アクティベーション コード、Python Web 開発、Python クローラー、Python データ分析、人工知能、機械学習、その他の学習チュートリアルが含まれます。基礎0の初心者でもわかりやすく、チュートリアルに沿って基礎0から体系的にPythonを学べます!

1. Pythonの全方位学習ルート

Python の全方位ルートは、Python の一般的に使用される技術的なポイントを整理して、さまざまな分野の知識ポイントをまとめることです。その有用性は、上記の知識ポイントに応じて、対応する学習リソースを見つけて確実に学習できることにあります。より包括的に。
ここに画像の説明を挿入
2.Python学習ソフト

労働者が良い仕事をしたいなら、まず道具を研ぐ必要があります。Pythonを学ぶのによく使われる開発ソフトはこちら!
ここに画像の説明を挿入
3. Python入門学習ビデオ

基礎0から始めるのに適した学習動画も多数あり、これを読めば簡単にPythonを始めることができますよ~ここに画像の説明を挿入

4. Python の演習

各ビデオレッスンの後には、対応する練習問題があり、学習結果をテストできます (笑)。
ここに画像の説明を挿入

五、Python実戦事例

光学理論は役に立ちません。光学理論に沿ってコードを入力することを学び、学んだことを実際に適用する必要があります。このとき、いくつかの実践的な事例から学ぶことができます。こんな情報も載ってますよ~ここに画像の説明を挿入

6. Python インタビュー資料

Python を学んだ後は、そのスキルを活かして仕事を見つけることができます。以下の面接の質問はすべてアリババ、テンセント、バイトなどの一流インターネット企業からのものであり、一部のアリババの上司も権威ある回答をしています。この一連の面接資料を確認すれば、誰もが満足のいく仕事を見つけることができると思います。
ここに画像の説明を挿入
ここに画像の説明を挿入
7. 情報収集

上記完全版Pythonの学習教材一式はCSDN公式サイトにアップロードされており、必要な方は以下のCSDN公式認定資格のQRコードをWeChat上でスキャンすることで無料で入手できます。

おすすめ

転載: blog.csdn.net/pythonhy/article/details/132322134