分散式總結

来源:https://www.cnblogs.com/lenlen/archive/2018/12/12/10109451.html
-Advertisement-
Play Games

一、TOKEN Token的特點: Token原理: TOKEN的實現: Token用在:登錄校驗。 TOKEN與session對比有更高的安全性,無狀態可擴展性和多平臺跨越的優點。 TOKEN可以完美解決跨站請求偽造,負載均衡,無狀態可擴展性等問題。 二、敏捷開發 敏捷開發是以人為核心,迭代循序漸 ...


一、TOKEN

  Token的特點:

  1. 無狀態、可擴展
  2. 支持移動設備
  3. 跨程式調用
  4. 安全

  Token原理:

  1. 將荷載PAYLOAD以及HEADER信息進行Base64加密,形成密文payload密文,head密文。
  2. 將形成的密文用句號連接起來,用服務端密鑰進行HS256加密,生成簽名。
  3. 將前面的兩個密文後面用句號連接簽名形成最終的TOKEN返回給服務端。

  TOKEN的實現:

  1. 用戶登錄校驗,校驗成功後就返回TOKEN給客戶端
  2. 客戶端收到數據後保存在客戶端
  3. 客戶端每次訪問API是攜帶TOKEN到伺服器端
  4. 伺服器端採用FILTER過濾器校驗。校驗成功則返回請求數據,校驗失敗則返回錯誤碼。

Token用在:登錄校驗。

TOKENsession對比有更高的安全性,無狀態可擴展性和多平臺跨越的優點。

TOKEN可以完美解決跨站請求偽造,負載均衡,無狀態可擴展性等問題。

 

二、敏捷開發

  敏捷開發是以人為核心,迭代循序漸進的開發方法。他不是一門技術,他是一種開發方式,也就是一種軟體開發流程。它採用的是迭代式開發。

  三大核心角色:

產品負責人:負責確定產品功能和達到要求的標準。規定軟體發佈日期和交付內容,同時又權利接受拒絕開發成果。

流程管理員: 負責整個敏捷開發流程在項目中的順利實施和進行,以及與客戶溝通排除溝通障礙,使開發滿足客戶需求。

開發團隊:負責開發工作。負責不同的技術方面,成員要求達到SPRINT的目標。

 

三個物件:

Productbacklog(產品待辦事項列表)、

Sprint backlog(迭代列表)

燃盡圖

四個會議:

Sprint計劃會議,每日例會

Sprint評審會議,sprint回顧會議

 

項目前:

  1. 敏捷開發需求分析
    2.  Product Backlog(產品需求列表)
    3.  Sprit計劃會議

項目中:

  1. print Backlog(迭代列表)
    2.  Daily Scrum Meeting(每日立會)
    3.  Sprint burn down(迭代周期燃盡圖)
    4.  版本迭代
    項目後:

  評審會議

總結會議

 

特點:

敏捷開發技術特點:

  1. 個體和交互勝過過程和工具
  2. 可以工作的軟體勝過面面俱到的文檔
  3. 客戶合作勝過合同談判
  4. 相應變化勝過遵循計劃

 

優點:

用戶參與其中,客戶滿意度高。

提高開發效率

市場快速反應能力高

缺點:

繁瑣,壓力大。

 

最小粒度:

什麼是服務:服務代表一個或一組相對較小且獨立的功能單元,是用戶可以感知的最小功能集。登錄,添加用戶。。。。。。

基本服務就是最小服務,這種服務有比較高的重用性。

合成:基本服務簡單組合。

組合服務:算是最大力度服務,裡面基本服務關係受到工作流程式控制制。

粒度就是功能大小,粗粒度表示功能業務多相對重用性較低,細粒度表示功能簡單重用性高。

 

最大粒度:在一個抽象介面封裝了大塊的業務邏輯和能力。

優點:減少了服務請求的交互次數,減少成本。

缺點:帶來更高的複雜性,交互大量數據,不能靈活適應需求變化,重用性低。

最小粒度:相對較小的功能單元,或交互少量數據。

優點:靈活性強,重用性高

缺點,需要通過多次服務交互才能實現。

特性:重用性、靈活性、性能

解決方案:

1、設計介面和實體類

2、統一管理設計模式

3、優化組件充足業務服務。

 

 

單點登錄(SSO):

單點登錄:就是用戶只需一次登錄就可以訪問所有相互信任的應用系統。簡單來說就是一處登錄,處處登錄,一處註銷,處處註銷。

 

作用:使得用戶只要登錄了其中一個系統,就可以訪問其他相關係統,而不用進行身份驗證登錄。即用戶只要登陸系統一次,該用戶的身份信息就可以被系統中的多個主機上的應用所識別,不需要在訪問每個應用時再分別進行登陸。

 

系統應用中的概念:

主要用於多系統的繼承,即在多系統當中,用戶只需要用到一個中央伺服器,登錄一次就可以訪問這些系統的任何一個,無需多次登錄。目前流行的企業業務整合的解決方案之一。

單點登錄的組成
單點登錄(SSO)體系主要有3個 :
(1)多個用戶
(2)多個Web應用
(3)1SSO認證中心(也就是我們的中央伺服器)。   其中多個用戶訪問不同的Web應用,是否需要登 錄由SSO認證中心來控制。

 

單點登錄的實現方式
1. Cookie作為憑證媒介 ;
2. 通過JSONP實現 ;
3. 通過頁面重定向的方式 ;
4.JWT+安全框架的實現方式
4. 使用獨立登錄系統 ;

 

單點登錄的兩種實現:

  1. redis實現單點登錄
  2. CAS中央認證實現單點登錄

 

Redis實現單點登錄 - 處理流程:
1、登錄頁面提交用戶名密碼。
2、登錄成功後生成tokenToken相當於原來的jsessionid,字元串,可以使用uuid
3、把用戶信息保存到redisKey就是tokenvalue就是實體類對象轉換成json
4、使用String類型保存Session信息。可以使用“首碼:token”為key
5、設置key的過期時間。模擬Session的過期時間。一般半個小時。
6、把token寫入cookie中。
7Cookie需要跨域。
8Cookie的有效期。關閉瀏覽器失效。
9、登錄成功。

 

CAS中央認證:CAS SERVER CAS CLIENT

 

CAS SERVER負責對用戶的認證工作,會為用戶簽發兩個重要的數據,登錄和服務。

CAS SERVER需要獨立部署。

 

CAS CLIENT負責處理對客戶端受保護的資源的訪問請求,要對請求方進行身份認證,重定向到CAS SERVER進行認證。以過濾方式保護受保護的資源。對於訪問受保護資源的請求,CAS CLIENT會分析請求中是否包含service ticket

 

Spring boot

Spring boot是一個非常好的微服務分散式開發框架,可以快速搭建一個系統。

 

Spring 4大核心:

  1. 自動配置
  2. 起步依賴
  3. 命令行界面
  4. Actuator

 

Springapplication的實現方法:

  1. 如果使用的是靜態run方法那麼首先要創建一個springapplication對象,他會提前做下麵幾件事情:

根據classpath裡面是否存在某個特征類來決定是否應該創建一個為web應用使用的applicationcontext。  

使用springfactoriesLoader在應用的classpath中查找載入所有可用的applicationContextInitializer。  

使用springFactoriesLoader在應用的classpath中查找並載入所有可用ApplicationListener

推斷並設置main方法定義類。

  1. springapplication實例初始化完成並完成設置後,就開始執行run方法的邏輯,方法執行開始,首先遍歷執行所有通過springFactoriesLoder可以查找到並載入的SpringApplicationRunlistener。調用它的started()方法,告訴SpringApplicationRunListenerspring boot開始執行。
  2. 創建並配置當前spring boot 應用將要使用的Environment。遍歷調用所有apringapplicationRunListenerenvironmentPrepared()方法,告訴他們當前springboot應用使用的Environment準備好了。如果springapplicationshowbanner屬性被設置為true。則需要列印banner
  3. 根據用戶是否明確設置applicationContextClass類型以及初始化階段的推斷結果,決定改為當前SpringBoot應用創建什麼類型的ApplicationContext並創建完成,然後根據條件決定是否添加ShutdownHook,決定是否使用自定義的BeanNameGenerator,決定是否使用自定義的ResourceLoader,當然最重要的是將之前準備好的Environment設置給創建好的ApplicationContext使用。
  4. ApplicationContext創建好之後,SpringApplication會再次藉助Spring-FactoriesLoader,查找並載入classpath中所有可用的ApplicationContext-Initialzer然後遍歷調用這些ApplicationContextInitializerinitialize(applicationContext)方法來對已經創建好的ApplicationContext進行進一步處理。
  5. 遍歷所有SpringApplicationRunListenercontextPrepared()方法。最核心的一步,將之前通過@EnableAutoConfiguration獲取的所有配置以及其他形式的IOC容器配置載入到已經準備完畢的ApplicationContext。遍歷調用所有SpringApplicationRunListenercontextLoaded()方法。調用ApplicationContextrefresh()方法,完成IOC容器可用的最後一步,查找當前ApplicationContext中是否註冊有CommandLineRunner,如果有遍歷執行他們。

正常情況下,遍歷執行SpringApplicationRunListenerfinished()方法,只不過這種情況會將異常信息一併傳入處理。

 

Spring boot整合Redis

創建redis.properties配置文件。

然後建一個封裝redisTemplateredisutil

最後建一個redisconf即可實現使用redis

 

Spring boot 整合jpa

Jpa查詢:基本查詢分為兩種,一種是spring data預設實現,一種是根據查詢方法來自動解析成SQL

  1. 繼承JpaRepositoy

通過繼承這個類來實現最基本的增刪改查。

  1. 自定義簡單查詢:

JPA這裡遵循的是約定大約配置的原則,就是遵循spring以及jpql定義的方法命名。Spring提供一套可以通過命名規範進行查詢構建的機制,這套機制會把方法名過濾一些關鍵字,比如find...byread...byquery...byget...by。系統會根據關鍵字將命名解析成兩個子語句,第一個By是區分這兩個子語句的關鍵詞.這個BY之前的是查詢子語句(知名返回要查詢的對象),後面的部分是條件子語句。如果直接findby...返回的就是定義respository時指定的領域對象集合,同時jpql中也定義了豐富的關鍵字:andor等等...

Jpa關鍵註解一覽:

@Entity 聲明類為實體或表。

@Table 聲明表名。

@Basic 指定非約束明確的各個欄位。

@Embedded 指定類或它的值是一個可嵌入的類的實例的實體的屬性。

@Id 指定的類的屬性,用於識別(一個表中的主鍵)。

@GeneratedValue 指定如何標識屬性可以被初始化,例如自動、手動、或從序列表中獲得的值。

@Transient 指定的屬性,它是不持久的,即:該值永遠不會存儲在資料庫中。

@Column 指定持久屬性欄屬性。

@SequenceGenerator 指定在@GeneratedValue註解中指定的屬性的值。它創建了一個序列。

@TableGenerator 指定在@GeneratedValue批註指定屬性的值發生器。它創造了的值生成的表。

@AccessType 這種類型的註釋用於設置訪問類型。如果設置@AccessTypeFIELD),則可以直接訪問變數並且不需要gettersetter,但必須為public。如果設置@AccessTypePROPERTY),通過gettersetter方法訪問Entity的變數。

@JoinColumn 指定一個實體組織或實體的集合。這是用在多對一和一對多關聯。

@UniqueConstraint 指定的欄位和用於主要或輔助表的唯一約束。

@ColumnResult 參考使用select子句的SQL查詢中的列名。

@ManyToMany 定義了連接表之間的多對多一對多的關係。

@ManyToOne 定義了連接表之間的多對一的關係。

@OneToMany 定義了連接表之間存在一個一對多的關係。

@OneToOne 定義了連接表之間有一個一對一的關係。

@NamedQueries 指定命名查詢的列表。

@NamedQuery 指定使用靜態名稱的查詢

And findByLastnameAndFirstname

Or findByLastnameOrFirstname

Is,Equals findByFirstnameIs,findByFirstnameEquals

Between findByStartDateBetween

LessThan findByAgeLessThan

LessThanEqual find ByAgeLessThanEqual

GreaterThan findByAgeGreaterThan

GreaterThanEqual findByAgeGreaterThanEqual

After findByStartDateAfter

Before findByStartDateBefore

IsNull findByAgeIsNull

IsNotNull,NotNull findByAge(Is)NotNull

Like findByFirstnameLike

NotLike findByFirstnameNotLike

StartingWith findByFirstnameStartingWith

EndingWith findByFirstnameEndingWith

Containing findByFirstnameContaining

OrderBy findByAgeOrderByLastnameDesc

Not findByLastnameNot

In findByAgeIn(Collection ages)

NotIn findByAgeNotIn(Collection age)

TRUE findByActiveTrue()

FALSE findByActiveFalse()

IgnoreCase findByFirstnameIgnoreCase

 

 

Spring常用註解:

@Configuration 等同於springXML配置文件;使用Java代碼可以檢查類型安全。

@Controller:用於定義控制器類,在spring 項目中由控制器負責將用戶發來的URL請求轉發到對應的服務介面

service層),一般這個註解在類中,通常方法需要配合註解@RequestMapping

@RestController:用於標註控制層組件(struts中的action)@ResponseBody@Controller的合集。

@RequestMapping:提供路由信息,負責URLController中的具體函數的映射。

@Service:一般用於修飾service層的組件

@Autowired:自動導入依賴的bean

@Repository:使用@Repository註解可以確保DAO或者repositories提供異常轉譯,這個註解修飾的DAO或者repositories類會被ComponetScan發現並配置,同時也不需要為它們提供XML配置項。

@ControllerAdvice:包含@Component。可以被掃描到。統一處理異常。

@ExceptionHandlerException.class):用在方法上面表示遇到這個異常就執行以下方法。

 

定時任務:

現實生活中我們需要很多定製的任務,記住一些事情然後定時提醒我們,比如鬧鐘。應用開發中也經常需要一些周期性的操作,這時候就用到定時任務。

實現定時任務的集中實現方法:

  1. java.util.Timer

Java自帶的方法,允許調度一個task任務。使用這種方法可以讓你程式按照一個頻度執行,但不能在指定時間運行。Timertask類實現由timer安排的一次或重覆執行的某個人物。每個timer對象對應的是一個線程,因此計時器所執行的任務應該迅速完成不然會延遲後續的任務。

舉個慄子:

Timer  timer=new Timer();  

    MyTask myTask=new MyTask();  

    timer.schedule(myTask, 1000, 2000);

TimerTask類主要實現run()方法里的業務邏輯,用法如下:

 

import java.text.SimpleDateFormat;  

import java.util.Date;  

import java.util.TimerTask;  

 

public class MyTask extends TimerTask {  

 

    @Override  

    public void run() {  

        // TODO Auto-generated method stub  

        SimpleDateFormat simpleDateFormat=null;  

        simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");  

        System.out.println("當前的系統時間為:"+simpleDateFormat.format(new Date()));

 

 

    }  

}

Timer線程如何終止:

預設情況下,創建的timer線程會一直執行,所以我們有4中方法終止timer線程。

調用timercancle方法

timer線程設置成daemon線程,(new Timer(true)創建daemon線程),在jvm里,如果所有用戶線程結束,那麼守護線程也會被終止,不過這種方法一般不用。

當所有任務執行結束後,刪除對應timer對象的引用,線程也會被終止。

調用System.exit方法終止程式

註意點:

每個timer僅對唯一一個線程

Timer不保證任務執行的十分精確。

Timer類是線程安全的。

 

  1. 連接池實現定時任務:

出現原因:

  1. timer之創建了一個線程,任務執行時間超過設置的時間將會出現問題。
  2. Timer創建的線程沒有處理異常,因此一旦拋出異常,該線程就立刻終止。

 

方法簡介

 

scheduleAtFixedRate(Runnable command,

                                long initialDelay,

                                  long period,

                                  TimeUnit unit)1234

 

上面的四個參數進行講解:

第一個command參數是任務實例,

第二個initialDelay參數是初始化延遲時間,

第三個period參數是間隔時間,

第四個unit參數是時間單元。

 

3.Spring-Task

Spring自帶的Task實現定時任務也有兩種方式,一種是xml配置的方式,一種是使用註解@Scheduled,不管是那種方式,首先都需要在xml開頭聲明task

 

Quartz

Quartz用一個jar文件,這個庫文件包括了所有quartz核心功能。這些功能主要通過介面是Scheduler介面。

quartz的原理不是很複雜,只要搞明白幾個概念,然後知道如何去啟動和關閉一個調度程式即可。

1Job

表示一個工作,要執行的具體內容。此介面中只有一個方法

void execute(JobExecutionContext context)

2JobDetail

JobDetail表示一個具體的可執行的調度程式,Job是這個可執行程調度程式所要執行的內容,另外JobDetail還包含了這個任務調度的方案和策略。

3Trigger代表一個調度參數的配置,什麼時候去調。Scheduler可以將Trigger綁定到某一JobDetail中,這樣當Trigger觸發時,對應的Job就被執行。一個Job可以對應多個Trigger,但一個Trigger只能對應一個Job

4Calendarorg.quartz.Calendar是一些日曆特定時間點的集合, 一個Trigger可以和多個Calendar關聯。

5.ThreadPoolScheduler使用一個線程池作為任務運行的基礎設施,任務通過共用線程池中的線程提高運行效率

 

Quartz 中,有兩類線程,Scheduler 調度線程和任務執行線程,其中任務執行線程通常使用一個線程池維護一組線程

 

Spring boot實現定時任務:

<dependencies>

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter</artifactId>

</dependency>

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-test</artifactId>

<scope>test</scope>

</dependency>

     <dependency>

        <groupId>org.springframework.boot</groupId>

        <artifactId>spring-boot-devtools</artifactId>

        <optional>true</optional>

</dependency>

</dependencies>

 

然後在啟動類上面加上@EnableScheduling即可開啟定時任務(@EnableScheduling  註解,它的作用是發現註解 @Scheduled的任務並由後臺執行。沒有它的話將無法執行定時任務)

創建定時任務實現類

 

安全框架Shiro

Shirojava的一個安全框架,功能強大,使用簡單的java安全框架,為開發人員提供一個直觀而全面的認證,授權,加密以及繪畫管理解決方案。

為什麼使用shiro

  1. 易於使用,提供易於理解的java security API
  2. 簡單的身份認證,支持多數據源(LDAP,JDBC,Kerberos)
  3. 支持一級緩存,以及提升應用程式的性能。
  4. Shiro乾凈的API和設計模式使它可以方便與許多的其他框架和應用進行集成。

 

 

Shiro的用途:

  1. 驗證用戶來核實他們的身份
  2. 對用戶執行訪問控制,如:判斷用戶是否被分配了一個確定的安全形色、判斷用戶是否被允許做某事。
  3. 在任何環境下使用sessionAPI,即使沒有webejb容器。
  4. 在身份驗證,訪問看哦內置期間或在會話的生命周期,對時間做出反應。
  5. 啟用單點登錄功能
  6. 數據加密,防止密碼明文儲存。

 

主要功能特點:

 

Authentication:身份認證/登錄,驗證用戶是不是擁有相應的身份。

Authorization:授權,即許可權驗證,驗證某個已認證的用戶是否擁有某個許可權;即判斷用戶是否能做事情,常見的如:驗證某個用戶是否擁有某個角色。或者驗證某個用戶對某個資源是否具有某個許可權;

Session Manager:會話管理,即用戶登錄後就是一次會話,在沒有退出之前,它的所有信息都在會話中;會話可以是普通JavaSE環境的,也可以是如Web環境的;

Cryptography:加密,保護數據的安全性,如密碼加密存儲到資料庫,而不是明文存儲;

Web SupportWeb支持,可以非常容易的集成到Web環境;

Caching:緩存,比如用戶登錄後,其用戶信息、擁有的角色/許可權不必每次去查,這樣可以提高效率;

Concurrency:併發,shiro支持多線程應用的併發驗證,即如在一個線程中開啟另一個線程,能把許可權自動傳播過去;

Testing:提供測試支持;

Run As:允許一個用戶假裝為另一個用戶(如果允許)的身份進行訪問;

Remember Me:記住我,這個是非常常見的功能,即一次登錄後,下次再來的話不用登錄了。

 

總體架構:

1) Subject:主體,代表了當前“用戶”。這個用戶不一定是一個具體的人,與當前應用交互的任何東西都是 Subject,如第三方進程,後臺賬戶等,它僅僅意味著“當前跟軟體交互的東西”。 Subjectshiro中是一個介面,介面中定義了很多認證授相關的方法,外部程式通過subject進行認證授,而subject是通過SecurityManager安全管理器進行認證授權 ,我們可以把 Subject 認為是一個門面,SecurityManager 才是實際的執行者。

2) SecurityManager:安全管理器。對全部的subject進行安全管理,Shiro框架的核心,即所有與安全有關的操作都會與 SecurityManager 交互。通過SecurityManager可以完成subject的認證、授權等,實質上SecurityManager是通過Authenticator進行認證,通過Authorizer進行授權,通過SessionManager進行會話管理等。  SecurityManager是一個介面,繼承了Authenticator, Authorizer, SessionManager這三個介面

3) Realm:域。Shiro Realm 獲取安全數據(如用戶、角色、許可權),就是說 SecurityManager 要驗證用戶身份,那麼它需要從 Realm 獲取相應的用戶進行比較以確定用戶身份是否合法,也需要從 Realm 得到用戶相應的角色/許可權進行驗證用戶是否能進行操作。我們可以把 Realm 看成 DataSource,即安全數據源。

記住一點,Shiro不會去維護用戶、維護許可權;這些需要我們自己去設計/提供;然後通過相應的介面註入給Shiro即可。

也就是說對於我們而言,最簡單的一個Shiro應用:

1、應用代碼通過Subject來進行認證和授權,而Subject又委托給SecurityManager

2、我們需要給ShiroSecurityManager註入Realm,從而讓SecurityManager能得到合法的用戶及其許可權進行判斷。

內部結構:

 

1) Subject:主體,可以看到主體可以是任何與應用交互的“用戶”。

2) SecurityManager:它是 Shiro 的核心,所有具體的交互都通過 SecurityManager 進行控制。它管理著所有 Subject、且負責進行認證和授權、及會話、緩存的管理。

3) Authenticator:認證器,負責主體認證的,認證就是核實用戶身份的過程。這個過程常見的例子是“用戶名/密碼”組合。多數用戶再登錄軟體系統時,通常會提供自己的用戶名和密碼,如果儲存在系統里的密碼與用戶提供的匹配,他們就被認為通過認證。

4) Authrizer:授權器,或者訪問控制器。它用來決定主體是否有許可權進行相應的操作,即控制著用戶能訪問應用中的哪些功能。

5) Realm 可以有1個或多個Realm,可以認為是安全實體數據源,即用於獲取安全實體的;可以是JDBC實現,也可以是LDAP實現,或者記憶體實現等等;由用戶提供;註意:Shiro不知道你的用戶/許可權存儲在哪及以何種格式存儲;所以我們一般在應用中都需要實現自己的Realm

6) SessionManager:即會話管理 ,shiro框架定義了一套會話管理,它不依賴web容器的session,所以shiro可以使用在非web應用上,也可以將分散式應用的會話集中在一點管理,此特性可使它實現單點登錄。

7) SessionDAO:用於會話的增刪改查。我們可以自定義 SessionDAO 的實現,控制session 存儲的位置。如通過 JDBC 寫到資料庫或通過 jedis 寫入 redis 中。另外SessionDAO 中可以使用 Cache 進行緩存,以提高性能。

8) CacheManager:緩存管理器。它來管理如用戶、角色、許可權等的緩存的。因為這些數據基本上很少去改變,放到緩存中後可以提高訪問的性能。

9) Cryptography:密碼模塊,Shiro 提高了一些常見的加密組件用於如密碼加密/解密的。

 

環境配置:

<dependencies>  

    <dependency>  

        <groupId>junit</groupId>  

        <artifactId>junit</artifactId>  

        <version>4.9</version>  

    </dependency>  

    <dependency>  

        <groupId>commons-logging</groupId>  

        <artifactId>commons-logging</artifactId>  

        <version>1.1.3</version>  

    </dependency>  

    <dependency>  

        <groupId>org.apache.shiro</groupId>  

        <artifactId>shiro-core</artifactId>  

        <version>1.2.2</version>  

    </dependency>  

</dependencies>    

 

身份驗證:

 

驗證流程:

1、首先調用Subject.login(token)進行登錄,其會自動委托給Security Manager,調用之前必須通過SecurityUtils. setSecurityManager()設置;

2SecurityManager負責真正的身份驗證邏輯;它會委托給Authenticator進行身份驗證;

3Authenticator才是真正的身

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

-Advertisement-
Play Games
更多相關文章
  • 一. 概述 上一篇我們介紹瞭如何將數據從 mysql 拋到 kafka,這次我們就專註於利用 storm 將數據寫入到 hdfs 的過程,由於 storm 寫入 hdfs 的可定製東西有些多,我們先不從 kafka 讀取,而先自己定義一個 Spout 數據充當數據源,下章再進行整合。這裡預設你是擁有 ...
  • 刪除數據分為兩種:一種是刪除索引(數據和表結構同時刪除,作用同SQLSERVER 中 DROP TABLE "表格名" ),另一種是刪除數據(不刪除表結構,作用同SQLSERVER中Delete 語句)。 一:刪除索引: 刪除單個索引可以使用命令 【DELETE /索引名稱】 刪除多個索引可以使用命 ...
  • mysql是使用最廣泛的開源關係資料庫之一,大多數開發人員只會簡單的用sql語句操作數據,而不理解服務端架構和sql查詢語句在服務端的執行過程,本文會從sql語句執行路徑來介紹mysql服務端架構,包括連接器,查詢緩存,分析器,優化器等。 ...
  • 1.排序概述 2.排序分類 3.WritableComparable案例 這個文件,是大數據-Hadoop生態(12)-Hadoop序列化和源碼追蹤的輸出文件,可以看到,文件根據key,也就是手機號進行了字典排序 欄位含義分別為手機號,上行流量,下行流量,總流量 需求是根據總流量進行排序 Bean對 ...
  • 登錄之後使用如下命令: 還有不知是不是因為mysql版本問題,一開始設置的密碼,使用navicat進行連接測試的時候,報錯: 解決辦法,就是使用如下語句再進行一次密碼修改: ...
  • 遷移主要是通過Navicat工具來實現的。遷移工具的選定在此不討論。 遷移前準備 1.提前通知DBA\SA\BI等,並確認發佈計劃及資料庫遷移方案。 2.梳理出SQL Server DB 中影響業務的Job(遷移的過程中要關閉)、DB LinkServer、相關賬號。 3.模擬數據遷移,評估出相關精 ...
  • 今天自學完了大數據方面生態系統的一些核心技術,在這裡整理一下學過的知識算是複習,也方便初學者參考 ...
  • 一. 複製環境準備 1.1 主庫環境(172.168.18.201) 環境 說明 1.2 從庫環境(172.168.18.203) 環境 說明 二. 複製配置 2.1 主庫環境密碼設置 在201主庫上,找到redis目錄下的redis.conf文件,打開文件找到requirepass,在500行,下 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...