項目實戰8—tomcat企業級Web應用伺服器配置與會話保持

来源:http://www.cnblogs.com/along21/archive/2017/12/11/8024719.html
-Advertisement-
Play Games

tomcat企業級Web應用伺服器配置與實戰 環境背景:公司業務經過長期發展,有了很大突破,已經實現盈利,現公司要求加強技術架構應用功能和安全性以及開始向企業應用、移動APP等領域延伸,此時原來開發web服務的php語言已經不適應新的場景,需要上java技術架構,現要求你根據公司需要,實現基於jav ...


tomcat企業級Web應用伺服器配置與實戰

  環境背景:公司業務經過長期發展,有了很大突破,已經實現盈利,現公司要求加強技術架構應用功能和安全性以及開始向企業應用、移動APP等領域延伸,此時原來開發web服務的php語言已經不適應新的場景,需要上java技術架構,現要求你根據公司需要,實現基於java平臺的web應用服務選型、搭建、實現和應用,此時你如何選擇?

  項目實戰系列,總架構圖 http://www.cnblogs.com/along21/p/8000812.html

  本篇實戰所需的包,都存放在我的網盤中 http://pan.baidu.com/s/1c2B7BO0,需要的私聊我。

實戰一:在linux上,安裝tomcat

1、下載安裝java所需要的環境和開發工具包

(1)Java 所需要的環境和開發工具包介紹

JRE: Java Runtime Environment

JDK:Java Development Kit JRE

JRE顧名思義是java運行時環境,包含了java虛擬機,java基礎類庫。是使用java語言編寫的程式運行所需要的軟體環境,是提供給想運行java程式的用戶使用的。

JDK顧名思義是java開發工具包,是程式員使用java語言編寫java程式所需的開發工具包,是提供給程式員使用的。JDK包含了JRE,同時還包含了編譯java源碼的編譯器javac,還包含了很多java程式調試和分析的工具:jconsole,jvisualvm等工具軟體,還包含了java程式編寫所需的文檔和demo例子程式。如果你需要運行java程式,只需安裝JRE就可以了。如果你需要編寫java程式,需要安裝JDK。JRE根據不同操作系統(如:windows,linux等)和不同JRE提供商(IBM,ORACLE等)有很多版本,最常用的是Oracle公司收購SUN公司的JRE版本。

 

(2)安裝相應版本的rpm包 jdk-VERSION-OS-ARCH.rpm

yum -y localinstall jdk-8u144-linux-x64.rpm

centos7系統自帶:jdk-1.8.0_25-linux-x64.rpm

java -version 顯示java程式的版本信息

 

(3)安裝完成後,要配置JAVA_HOME環境變數

vim /etc/profile.d/java.sh

export JAVA_HOME=/usr/java/jdk1.8.0_144
export JRE_HOME=$JAVA_HOME/jre
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH

2、下載安裝tomcat

方法一:二進位安裝(推薦)

(1)從官網下載tomcat二進位安裝包 http://tomcat.apache.org/

https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-8/v8.5.23/bin/

 

(2)解包,設置目錄

① 解包

tar xvf apache-tomcat-8.5.11.tar.gz -C /usr/local/

② 為了方便管理,設置軟連接,若以後換版本了,可以很容易切換

ln -s /usr/local/apache-tomcat-7.0.78/ /usr/local/tomcat

 

(3)設置環境配置管理腳本

vim /etc/profile.d/tomcat.sh

export CATALINA_BASE=/usr/local/tomcat
export PATH=$CATALINA_BASE/bin:$PATH
source /etc/profile.d/tomcat.sh   執行載入環境配置

 

方法二:yum安裝

(1)安裝

yum install tomcat -y #安裝tomcat主程式
yum install -y tomcat-admin-webapps tomcat-docs-webapp tomcat-webapps  #安裝tomcat對應的頁面
mkdir /var/lib/tomcat/webapps/{ROOT,test}/{WEB-INF,META-INF,classes,lib} -pv  #創建頁面所需要的工作目錄

(2)rpm包安裝的程式環境:

配置文件目錄:/etc/tomcat

主配置文件:server.xml

webapps存放位置:/var/lib/tomcat/webapps/

examples

manager

host-manager

docs

Unit File:tomcat.service

環境配置文件:/etc/sysconfig/tomcat #調整jdk記憶體使用大小等初始值

 

3、啟動tomcat

(1)catalina.sh start

 

(2)測試本地8080埠是否正常監聽

curl -I 127.0.0.1:8080

通過瀏覽器訪問測試(需指定8080埠)

 

實戰二:基於tomcat佈署一個開源java產品

1、去網上下載開源Java 代碼

可以去開源中國下載自己需要的https://www.oschina.net/

我已經下好一個,需要的私密我http://pan.baidu.com/s/1c2B7BO0

 

2、解包、佈署和查看使用說明

① unzip zchuanzhao-jeesns-master.zip

② mv /jeesns/war/jeesns.war .../webapps 把jeesns.war移到你的tomcat的webapps 下

如果你是自動佈署,會自動在/webapps 下生成jeesns目錄;若不是,可以自己unzip 解包,佈署

autoDeploy="true" 是自動佈署

③ cat README.md 有詳細的操作過程

 

3、同步數據到資料庫

(1)在資料庫創建一個存放的庫

MariaDB [(none)]> create database along;

(2)把數據同步到資料庫

cd /jeesns/jeesns-web/database/

mysql -uroot -p -D along < jeesns.sql

 

4、修改資料庫連接

vim /webapps/jeesns/WEB-INF/classes/jeesns.properties

修改資料庫和登錄用戶和密碼

 

5、訪問頁面,佈署成功

① 登錄首頁 http://192.168.30.107:8080/jeesns

 

② 進入後臺管理 http://192.168.30.107:8080/jeesns/manage/login

用戶名:admin

密碼:jeesns

③ 登錄後臺成功!

這個設計的還是挺高級的!!! 大家可以嘗試一番

 

實戰三:實現LNMT,nginx代理tomcat

分析:就是由nginx 代理tomcat 來實現的

1、直接在nginx 上設置跳轉

vim /etc/nginx/nginx.conf

location / {
        proxy_pass http://192.168.30.107:8080;
}
location ~* \.(jsp|do)$ {
        proxy_pass http://192.168.30.107:8080;
}

2、訪問測試,http://192.168.30.107/

訪問80埠,能代理到8080埠

 

3、實現集群代理服務

(1)先在http 段定義

vim /etc/nginx/nginx.conf

upstream tomcat_srv {
server 192.168.30.107:8080 weight=1;
server 192.168.30.7:8080 weight=2;
} 

(2)再在server 段定義location

location / {
        proxy_pass http://tomcat_srv;
}
location ~* \.(jsp|do)$ {
        proxy_pass http://tomcat_srv;
}

(3)創建測試頁面

① 在server1 上定義一個頁面

vim webapps/test/index.jsp

<%@ page language="java" %>
<%@ page import="java.util.*" %>
<html>
<head>
<title>Test Page</title>
        </head>
        <body>
        <% out.println("hello world");%>
        </body>
</html>

② 在server2 上定義一個頁面

vim webapps/test/index.jsp

<%@ page language="java" %>
<%@ page import="java.util.*" %>
<html>
<head>
<title>Test Page</title>
        </head>
        <body>
        <% out.println("hello world2");%>
        </body>
</html>

(4)頁面訪問測試

輪詢出現

實戰四:LNMT的會話保持原理及基於ip_hash實現

1、原理:有三種類型的方法,實現會話保持的方法

(1) session sticky(貼) 基於hash 和cookie 來實現會話保持,簡單的負載均衡演算法

① 基於source_ip(源地址hash)

  nginx: ip_hash 、 haproxy: source 、 lvs: sh

② 基於cookie nginx基於cookie實現,需載入cookie模塊,cookie 力度更新

  nginx:sticky 、haproxy: cookie

 

(2) session cluster:delta session manager 基於tomcat集群會話保持

分析:tomcat自身帶的機制 session cluster,基於組播的方式,一個tomcat 被用戶登錄訪問,記錄session通過組播給集群中的其他機器複製一份;那麼當用戶再次訪問時,每個機器都有session 會話記錄;從而實現了會話保持

 

(3) session server:redis(store), memcached(cache) 共用存儲

分析:新建立一個存放各個tomcat session記錄的server,每台tomcat伺服器都將自己的session記錄在這個伺服器中,用戶再次訪問,每台tomcat 都從這個server中獲取;實現會話保持

2、簡單實現基於ip hash 實現會話保持

vim /etc/nginx/nginx.conf 只需加一條ip_hash即可

upstream tomcat_srv {

upstream tomcat_srv {
ip_hash;
server 192.168.30.107:8080 weight=1;
server 192.168.30.7:8080 weight=2;
}

3、測試

訪問頁面,一直匹配到107的server 上,沒有輪詢;會話保持成功

 

實戰四:基於tomcat會話集群實現LNMT的會話保持

原理:Tomcat集群的會話管理器,它通過將改變了會話數據同步集群中的其它節點實現會話複製。這種實現會將所有會話的改變同步給集群中的每一個節點

1、環境準備

 

機器名稱

IP配置

服務角色

備註

nginx

192.168.30.107

代理伺服器

開啟代理功能

tomcat-srv1

192.168.30.106

web服務

配置集群會話

tomcat-srv2

192.168.30.7

web服務

配置集群會話

2、配置nginx代理

vim /etc/nginx/nginx.conf

upstream tomcat_srv {    #在http 段配置
server 192.168.30.106:8080 weight=1;
server 192.168.30.7:8080 weight=2;
}

location / {    #在server 段配置
        proxy_pass http://tomcat_srv;
}
location ~* \.(jsp|do)$ {
        proxy_pass http://tomcat_srv;
}

systemctl start nginx 開啟服務

3、tomcat 集群會話的配置

註意:兩台tomcat-srv的配置是一模一樣的,除了測試的頁面設置不同

cd /usr/local/tomcat/ 進入自己的tomcat 的目錄下

vim conf/server.xml 在Engine 引擎段中,添加下麵代碼,註意:註釋千萬別加去

<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="8">    定義集群節點,“8”表示非同步

<Manager className="org.apache.catalina.ha.session.DeltaManager"    定義Manger採用DeltaManager 會話管理器
expireSessionsOnShutdown="false"    一個節點關閉,不影響集群其他session
notifyListenersOnReplication="true"/>    複製、刪除操作通知session listener

<Channel className="org.apache.catalina.tribes.group.GroupChannel">   
<Membership className="org.apache.catalina.tribes.membership.McastService"
address="228.0.0.4" port="45564" frequency="500" dropTime="3000"/>
<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
address="auto" port="4000" autoBind="100" selectorTimeout="5000" maxThreads="6"/>
<Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
<Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
</Sender>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>
</Channel>

<Valve className="org.apache.catalina.ha.tcp.ReplicationValve" filter="/"/>
<Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>
<ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
</Cluster>

4、配置註釋

(1)Cluster配置:

Cluster(集群,族) 節點,如果你要配置tomcat集群,則需要使用此節點.

className 表示tomcat集群時,之間相互傳遞信息使用那個來實現信息之間的傳遞.

channelSendOptions可以設置為2、4、8、10,每個數字代表一種方式

  2 = Channel.SEND_OPTIONS_USE_ACK(確認發送)

  4 = Channel.SEND_OPTIONS_SYNCHRONIZED_ACK(同步發送)

  8 = Channel.SEND_OPTIONS_ASYNCHRONOUS(非同步發送)

在非同步模式下,可以通過加上確認發送(Acknowledge)來提高可靠性,此時channelSendOptions設為10,半同步

例:

<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="8">

 

(2)Manager

(a)Manager介紹

Manger對象用於實現HTTP會話管理的功能,Tomcat中有4種Manger的實現:

① StandardManager

Tomcat6的預設會話管理器,用於非集群環境中對單個處於運行狀態的Tomcat實例會話進行管理。當Tomcat關閉時,這些會話相關的數據會被寫入磁碟上的一個名叫SESSION.ser的文件,併在Tomcat下次啟動時讀取此文件。

② PersistentManager

當一個會話長時間處於空閑狀態時會被寫入到swap會話對象,這對於記憶體資源比較吃緊的應用環境來說比較有用。

DeltaManager

用於Tomcat集群的會話管理器,它通過將改變了會話數據同步集群中的其它節點實現會話複製。這種實現會將所有會話的改變同步給集群中的每一個節點,也是在集群環境中用得最多的一種實現方式。

④ BackupManager

用於Tomcat集群的會話管理器,與DeltaManager不同的是,某節點會話的改變只會同步給集群中的另一個而非所有節點

(b)Manager配置

className-指定實現org.apache.catalina.ha.ClusterManager介面的類,信息之間的管理
expireSessionsOnShutdown-設置為true時,一個節點關閉,將導致集群下的所有Session失效
notifyListenersOnReplication-集群下節點間的Session複製、刪除操作,是否通知session listeners

 

(3)Channel 頻道的介紹和配置

(a)介紹

Channel是Tomcat節點之間進行通訊的工具。Channel包括4個組件:

  Membership:集群的可用節點列表

  Receiver :接收器,負責接收消息

  Sender :發送器,負責發送消息

  Interceptor :Cluster的攔截器

 

(b)Membership 配置

① Membership:維護集群的可用節點列表,它可以檢查到新增的節點,也可以檢查到沒有心跳的節點

② className-指定Membership使用的類

③ address-組播地址

④ port-組播埠

⑤ frequency-發送心跳(向組播地址發送UDP數據包)的時間間隔(單位:ms)。預設值為500

⑥ dropTime-Membership在dropTime(單位:ms)內未收到某一節點的心跳,則將該節點從可用節點列表刪除。預設值為3000

 

註:組播(Multicast):一個發送者和多個接收者之間實現一對多的網路連接。

一個發送者同時給多個接收者傳輸相同的數據,只需複製一份相同的數據包。

它提高了數據傳送效率,減少了骨幹網路出現擁塞的可能性

相同組播地址、埠的Tomcat節點,可以組成集群下的子集群

例:

<Membership className="org.apache.catalina.tribes.membership.McastService"
address="228.0.0.4"
port="45564"
frequency="500"
dropTime="3000"/>

 

(c)Receiver 配置

Receiver : 接收器,負責接收消息

接收器分為兩種BioReceiver(阻塞式)、NioReceiver(非阻塞式)

  className-指定Receiver使用的類

  address-接收消息的地址

  port-接收消息的埠

  autoBind-埠的變化區間

  如果port為4000,autoBind為100,接收器將在4000-4099間取一個埠,進行監聽

  selectorTimeout-NioReceiver內輪詢的超時時間

  maxThreads-線程池的最大線程數

例:

<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
address="auto"
port="4000"
autoBind="100"
selectorTimeout="5000"
maxThreads="6"/>

 

(d)Sender 配置

Sender : 發送器,負責發送消息

Sender內嵌了Transport組件,Transport真正負責發送消息

Transport:定義傳輸方式

Transport分為兩種:bio.PooledMultiSender(阻塞式)、nio.PooledParallelSender(非阻塞式)

例:

<Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
<Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
</Sender>

 

(e)Interceptor 配置

Interceptor : Cluster的攔截器

TcpFailureDetector-網路、系統比較繁忙時,Membership可能無法及時更新可用節點列表,此時TcpFailureDetector可以攔截到某個節點關閉的信息,並嘗試通過TCP連接到此節點,以確保此節點真正關閉,從而更新集群可以用節點列表

MessageDispatch15Interceptor-查看Cluster組件發送消息的方式是否設置為Channel.SEND_OPTIONS_ASYNCHRONOUS(Cluster標簽下的channelSendOptions為8時)。 設置為Channel.SEND_OPTIONS_ASYNCHRONOUS時,MessageDispatch15Interceptor先將等待發送的消息進行排隊,然後將排好隊的消息轉給Sender

例:

<Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>

 

(4)ClusterListener 配置

ClusterListener : 監聽器,監聽Cluster組件接收的消息

使用DeltaManager時,Cluster接收的信息通過ClusterSessionListener傳遞給DeltaManager

例:

<ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>

 

5、創建測試頁面

mkdir webapps/test

cd webapps/test

① 設置一個web.xml 的配置文件

mkdir WEB-INF

cp /usr/local/tomcat/conf/web.xml WEB-INF/

vim WEB-INF/web.xml 在</web-app>上加一行

<distributable/> 表示分散式

② vim session.jsp 創建測試頁面,在tomcat-srv1上是TomcatA;在tomcat-srv1上是TomcatB

<%@ page language="java" %>
<html>
<head><title>TomcatA</title></head>    //TomcatA的標題
<body>
<h1><font color="blue">TomcatA </h1>  
<table align="centre" border="1">
<tr>
<td>Session ID</td>    
<% session.setAttribute("abc","abc"); %>
<td><%= session.getId() %></td>
</tr>
<tr>
<td>Created on</td>
<td><%= session.getCreationTime() %></td>
</tr>
</table>
</body>
</html>

 

6、測試

頁面訪問http://192.168.30.107/test/session.jsp;輪詢,但是session ID是一樣的,會話保持成功

已經會話保持

 

實戰五:基於共用存儲實現LNMT的會話保持

原理:新建立一個存放各個tomcat session記錄的server,每台tomcat伺服器都將自己的session記錄在這個伺服器中,用戶再次訪問,每台tomcat 都從這個server中獲取;實現會話保持

1、環境準備

機器名稱

IP配置

服務角色

備註

nginx

192.168.30.107

代理伺服器

開啟代理功能

tomcat-srv1

192.168.30.106

web服務

指向共用存儲

tomcat-srv2

192.168.30.7

web服務

指向共用存儲

memcached

192.168.30.6

共用存儲

 

 

2、下載提供,實驗所依賴的.jar包

memcached-session-manager項目地址,http://code.google.com/p/memcached-session-manager/, https://github.com/magro/memcached-session-manager

① 下載如下jar文件至各tomcat節點的tomcat安裝目錄下的lib目錄中,尋找自己需要的版本號,tc的版本號要與tomcat版本相同。

  memcached-session-manager-1.8.3.jar

  memcached-session-manager-tc7-1.8.3.jar

  spymemcached-2.11.1.jar

  msm-javolution-serializer-1.8.3.jar

  javolution-5.4.3.1.jar

我已經下到了我的網盤,有需要的私聊 http://pan.baidu.com/s/1nvGFgKD

② 把這些包,上傳到 lib 目錄下

/usr/local/tomcat/lib

 

3、配置nginx代理

vim /etc/nginx/nginx.conf

upstream tomcat_srv {    #在http 段配置
server 192.168.30.106:8080 weight=1;
server 192.168.30.7:8080 weight=2;
}

location / {    #在server 段配置
        proxy_pass http://tomcat_srv;
}
location ~* \.(jsp|do)$ {
        proxy_pass http://tomcat_srv;

systemctl start nginx 開啟服務

4、在server.xml 中配置

vim /usr/local/tomcat/conf/server.xml

<Context path="/test" docBase="test" reloadable="true">
  <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
  memcachedNodes="192.168.30.106:11211"
  requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
  transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory"/>
</Context>

5、和上實驗一樣,創建測試頁面並測試

頁面訪問http://192.168.30.107/test/session.jsp;輪詢,但是session ID是一樣的,會話保持成功

已經會話保持

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1. 前言 WPF的本地化是個很常見的功能,我做過的WPF程式大部分都實現了本地化(不管最終有沒有用到)。通常本地化有以下幾點需求: 在程式啟動時根據 "CultureInfo.CurrentUICulture" 或配置項顯示對應語言的UI。 在程式運行時可以動態切換UI語言(無需重啟程式)。 製作 ...
  • 變數是指一塊存儲數據的記憶體空間,並且該記憶體區域的數據內容可以發生變化。 變數是必須先聲明後賦值。 基本的語法:數據類型+變數名; 變數名=數據; 簡單的使用技巧:聲明賦值簡寫 Static void Main (srring[] args) { int num1=2,num2=3; string s ...
  • 有的時候,我們要做的事情,就是簡單的重覆某個行為指定的次數。 就比如在這裡重覆輸出100個*號 在這裡,就可以使用一個for迴圈 for(i=0;i<100;i++) //定義一個i 讓它代表次數,重覆的動作就是:輸出*; 重覆次數:100; 重覆後要做的是:輸出*; { Console.Write ...
  • 匿名函數指函數定義體(即代碼塊)本身,使得函數成為所謂的“一等公民”,函數也可以像變數一樣進行賦值定義、傳遞和使用。本文還介紹了函數式編程的各種技巧,如嵌套、遞歸、高階、閉包等,站在函數式編程的頂峰,讓你感嘆“會當凌絕頂,一覽眾山小”! ...
  • Beats 平臺集合了多種單一用途數據採集器。這些採集器安裝後可用作輕量型代理,從成百上千或成千上萬台機器向 Logstash 或 Elasticsearch 發送數據。 一、架構圖 此次試驗基於前幾篇文章,需要先基於前幾篇文章搭建基礎環境。 二、安裝Filebeat 下載並安裝Filebeat 修 ...
  • 學習目標: 1:一但出發,必到達。 2:爭取在半年完成基礎學習。 3:出發目標8K,一到兩年爭取有18K-26K (會不會更高呢?) 學習制度: 五次不完成當日課程退課。 銘哥聯繫:QQ·微信·電話·不回覆黑名單。 班主任發消息:必須回覆表示收到。 必須有:課程筆記·有讓傻瓜都能看得懂的筆記。 課程 ...
  • 1.1 部署LNMP架構說明 1.1.1 LNMP架構內容 01.部署linux系統 02.部署nginx網站服務 03.部署mysql資料庫服務 04.部署php動態解析服務 1.1.2 配置LNMP架構步驟 01.配置Nginx配置文件 02.配置mysql資料庫信息(SQL語句) 03.配置w ...
  • Logstash 是一款強大的數據處理工具,它可以實現數據傳輸,格式處理,格式化輸出,還有強大的插件功能,常用於日誌處理。 一、原理 Input 可以從文件中、存儲中、資料庫中抽取數據,Input有兩種選擇一個是交給Filter進行過濾、修剪。另一個是直接交給Output Filter 能夠動態地轉 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...