rcf遠程調用框架編譯
1. 什麼是rpc框架,及其作用,在php方向上的使用
遠程調用」
通常我們調用一個方法,譬如: localAdd(10, 20),localAdd方法的具體實現要麼是用戶自己定義,要麼存在於該語言的庫函數中,也就說在localAdd方法的代碼實現在本地,它是一個本地調用!
「遠程調用」意思就是:被調用方法的具體實現不在程序運行本地,而是在別的某個地方;
遠程調用原理
譬如 A調用B提供的remoteAdd方法:,
首先A與B之間建立一個TCP連接;
然後A把需要調用的方法名(這里是remoteAdd)以及方法參數(10, 20)序列化成位元組流發送出去;
B接受A發送過來的位元組流,然後反序列化得到目標方法名,方法參數,接著執行相應的方法調用(可能是localAdd)並把結果30返回;
A接受遠程調用結果
RPC框架無非就是把我剛才說的那些細節通通封裝起來,給用戶暴露簡單友好的API使用(ps:有些遠程調用選擇比較底層的socket協議,有些遠程調用選擇比較上層的HTTP協議);
遠程調用好處:
解耦:當方法提供者需要對方法內實現修改時,調用者完全感知不到,不用做任何變更;這種方式在跨部門,跨公司合作的時候經常用到,並且方法的提供者我們通常稱為:服務的暴露方
至於soap,yar,phprpc,thrift這幾樣的東西,一個都沒用過,所以不好評價
2. 什麼是DWR
DWR 是什麼?
DWR是Direct Web Remoting 的縮寫。
DWR 是一個開放源碼的使用 Apache 許可協議的解決方案,它包含伺服器端 java 庫、一個 DWR servlet 以及 JavaScript 庫。雖然 DWR 不是 Java 平台上唯一可用的 Ajax-RPC 工具包,但是它是最成熟的,而且提供了許多有用的功能。
從最簡單的角度來說,DWR 是一個引擎,可以把伺服器端 Java 對象的方法公開給 JavaScript 代碼。使用 DWR 可以有效地從應用程序代碼中把 Ajax 的全部請求-響應循環消除掉。這意味著客戶端代碼再也不需要直接處理 XMLHttpRequest 對象或者伺服器的響應。不再需要編寫對象的序列化代碼或者使用第三方工具才能把對象變成 XML。甚至不再需要編寫 servlet 代碼把 Ajax 請求調整成對 Java 域對象的調用。
DWR 是作為 Web 應用程序中的 servlet 部署的。把它看作一個黑盒子,這個 servlet 有兩個主要作用:首先,對於公開的每個類,DWR 動態地生成包含在 Web 頁面中的 JavaScript。生成的 JavaScript 包含存根函數,代表 Java 類上的對應方法並在幕後執行 XMLHttpRequest。這些請求被發送給 DWR,這時它的第二個作用就是把請求翻譯成伺服器端 Java 對象上的方法調用並把方法的返回值放在 servlet 響應中發送回客戶端,編碼成 JavaScript。DWR 還提供了幫助執行常見的用戶界面任務的 JavaScript 工具函數。
3. 反應式微服務框架Flower
Flower是一個構建在Akka上的反應式微服務框架,開發者只需要針對每一個細粒度的業務功能開發一個Service服務,並將這些Service按照業務流程進行可視化編排,即可得到一個反應式系統。
Flower既是一個反應式編程框架,又是一個分布式微服務框架。
Flower框架使得開發者無需關注反應式編程細節,即可得到一個反應式系統。
快速上手
Flower框架的主要元素包括:Flower Service(服務)、Flower 流程和Flow容器。Service實現一個細粒度的服務功能,Service之間通過Message關聯,前一個Service的返回值(Message),必須是後一個Service的輸入參數(Message),Service按照業務邏輯編輯成一個Flow(流程),Flower容器負責將前一個Service的返回消息,傳遞給後一個Service。
安裝
Maven
Gradle
SBT
Ivy
Flower初始化
Flower使用前需要進行初始化,這里演示最簡單的方式。
Flower初始化
定義Flower服務
開發Service類必須實現Flower框架的Service介面或者繼承AbstractService基類,在process方法內完成服務業務邏輯處理。
UserServiceA
UserServiceB
UserServiceC1
服務注冊
Flower提供兩種服務注冊方式:配置文件方式和編程方式。
服務流程編排
Flower框架提供兩種服務流程編排方式:配置文件方式和編程方式。
兩種編排方式的結果是一樣:
調用Flower流程
前面定義了3個Flower服務,並編排了名稱為flower_test的服務流程。那麼怎麼使用它呢?
完整示例
在Flower裡面消息是一等公民,基於Flower開發的應用系統是面向消息的應用系統。 消息由Service產生,是Service的返回值;同時消息也是Service的輸入。前一個Service的返回消息是下一個Service的輸入消息,沒有耦合的Service正是通過消息關聯起來,組成一個Service流程,並最終構建出一個擁有完整處理能力的應用系統。流程舉例:
術語
Flower消息處理模式
消息除了將服務串聯起來,構成一個簡單的串列流程,還可以組合應用,產生更強大的功能。
消息分叉
消息分叉是指,一個服務輸出的消息,可能產生分叉,分發給1個或者多個其他服務。消息分叉後有兩種處理方式,全部分發和條件分發。
全部分發
將輸出消息分發給全部流程後續服務。後續多個服務接受到消息後,並行執行。這種模式多用於可並行執行的多個子任務,比如用戶注冊成功後,需要1、將用戶數據寫入資料庫,2、給用戶發送激活郵件,3、給用戶發送通知簡訊,4、將新用戶注冊信息發送給關聯產品,實現賬戶打通。上述4個服務就可以採用消息全部分發模式,接受用戶注冊消息,並發完成上述4個任務。
要實現消息全部分發,需要在流程中進行配置,所有需要接受前序服務的輸出消息的服務都要配置在流程中,如
service1是前序服務,service2和service3是後繼服務。 如果service2和service3的class定義中,實現Service介面的聲明中指定了泛型,則泛型類型必須是service1的輸出類型或者其父類。
Service1
Service2
Service3
條件分發
有時候,前一個服務產生的消息,根據消息內容和業務邏輯可能會交給後續的某一個服務處理,而不是全部服務處理。比如用戶貸款申請,當前服務計算出用戶信用等級後,需要根據信用等級判斷採用何種貸款方式,或者是拒絕貸款,不同貸款方式和拒絕貸款是不同的服務,這些服務在流程配置的時候,都需要配置為前序服務的後繼服務,但是在運行期根據條件決定將消息分發給具體哪個後繼服務。
實現條件分發在流程配置上和全部分發一樣,所有可能的後繼服務都要配置在流程中。具體實現條件分發有如下三種方式。
根據泛型進行分發
後續服務實現介面的時候聲明不同的泛型類型,前序服務根據業務邏輯構建不同的消息類型,Flower會根據消息類型匹配對應的服務,只有成功匹配,消息才發送給過去。比如:
構建流程
聲明ServiceB接受的消息類型為MessageB
ServiceA
ServiceB是ServiceA的後續服務,ServiceA收到的消息如果是字元串「b」,就會返回消息類型B,這時候框架就會將消息發送給ServiceB,而不會發送給ServiceC。
在消息中指定後繼服務的id進行分發
前序消息實現Condition介面,並指定後繼服務的id,如:
一般說來,服務是可復用的,可復用於不同的流程中,但是在不同的流程中後繼服務可能是不同的,後繼服務的id也是不同的,在服務中寫死後續服務id,顯然不利於服務的復用。解決方案有兩種,一種是在不同的流程中,寫一個專門用於分發的服務,也就是處理業務邏輯的服務並不關心消息的分發,只管返回消息內容,但是其後繼服務是一個專門用來做消息分發的服務,這個服務沒有業務邏輯,僅僅實現Condition介面根據消息內容指定後繼服務。
另一種是使用框架內置服務ConditionService進行消息分發
使用框架內置服務ConditionService進行消息分發
ConditionService是一個通用的消息分發服務,
服務serviceE要將消息根據條件分發給serviceF或者serviceG,流程配置如上,中間加入serviceCondition進行適配。 serviceCondition的服務注冊方法為
com.ly.train.flower.common.service.ConditionService為框架內置服務
這種方式中,依然需要在serviceCondition的前驅服務serviceE中設置返回消息的condition,但是不必設置後續服務的id,只需要設置後續服務的順序號即可。
幾種條件分發的代碼示例參考/flower.sample/src/main/java/com/ly/train/flower/common/sample/condition/Sample.java
消息聚合
對於全部分發的消息分叉而言,通常目的在於使多個服務能夠並行執行,加快處理速度。通常還需要得到這些並行處理的服務的全部結果,進行後續處理。 在Flower中,得到多個並行處理服務的結果消息,稱為消息聚合。實現方式為,在流程中,配置需要聚合的多個消息的後續服務為com.ly.train.flower.common.service.AggregateService,這是一個框架內置服務,負責聚合多個並行服務產生的消息,將其封裝到一個Set對象中返回。 如流程
這里的service5就是一個消息聚合服務,負責聚合並行的service2和service3產生的消息,並把聚合後的Set消息發送給service4. 服務配置如下,service5配置為框架內置服務AggregateService。
service4負責接收處理聚合後的消息,從Set中取出各個消息,分別處理。
消息回復
Flower中的消息全部都是非同步處理,也就是服務之間不會互相阻塞等待,以實現低耦合、無阻塞、高並發的響應式系統。Flower流程調用者發送出請求消息以後,消息在流程中處理,調用者無需阻塞等待處理結果,可以繼續去執行其他的計算任務。
和傳統的命令式編程不同,通常流程的發起調用者並不是流程處理結果的最終接受者,比如對於web開發,流程的發起者通常是一個servlet,但是真正接受處理結果的是用戶端瀏覽器或者App,流程中的服務可以直接發送處理結果給用戶端,而不必通過servlet。也就是調用發起者servlet無需等待流程服務的最終處理結果,將用戶請求發送到流程中後,不必阻塞等待處理,可以立即獲取另一個用戶的請求繼續進行處理。
但是Flower也支持調用者阻塞等待消息處理結果,消息回復模式可以使流程調用者得到流程處理的最終結果消息。可參考代碼示例 /flower.sample/src/main/java/com/ly/train/flower/common/sample/textflow/Sample.java
Flower web開發模式
Flower集成Servlet3的web開發模式
Flower支持Servlet3的非同步模式,請求處理線程在調用Flower流程,並傳入AsyncContext對象後立即釋放。 代碼示例參考/flower.sample/src/main/java/com/ly/train/flower/common/sample/web/async/AsyncServlet.java
開發支持Servlet3的Flower服務,需要實現框架的Service介面,在方法 Object process(T message, ServiceContext context) throws Exception;中,Flower框架會傳入一個Web對象,通過context.getWeb()得到Web對象,用以獲得請求參數和輸出處理響應結果。
Flower集成Spring boot的web開發模式
Flower支持Spring boot開發,在項目中依賴flower.web,實現框架中的Service介面和InitController介面。 初始化@BindController註解需要的參數,在編譯過程中自動由flower.web枚舉@BindController註解, 生成Spring boot需要的Controller。
注意: flower.web利用annotation為Service生成spring boot所需的Controller類。這個生成過程在程序編譯的時候完成,如果IDE環境不支持熱編譯,需要在命令行執行mvn install生成代碼。
代碼示例參考/flower.sample/src/main/java/com/ly/train/flower/common/sample/springboot
使用Flower框架的開發建議
Flower分布式部署架構
開發流程
一. 啟動Flower.center注冊中心
二. 開發Flower Service,啟動業務服務Flower容器,自動向注冊中心注冊服務
三. 開發Flower web網關,啟動Flower網關服務,編排流程
一. 注冊中心
Flower.center基於spring-boot開發,通過打包成fat-jar後通過命令行啟動即可。
Flower注冊中心啟動入口/flower.center/src/main/java/com/ly/train/flower/center/CenterApplication.java Flower注冊中心啟動命令java -jar flower.center-0.1.2.jar
二. 啟動業務Flower容器
Flower部署支持Flower容器和Spring容器,下面的例子基於spring-boot演示
2.1 創建配置文件flower.yml
2.2 配置FlowerFactory
2.3 開發flower服務
2.4 創建啟動類
三. 啟動網關伺服器,編排流程
3.1 創建flower.yml
3.2 配置FlowerFactory
3.3 開發Flower服務
3.4 開發網關Controller
3.5 啟動類
實例項目細節
flower分布式實例 https://github.com/leeyazhou/flower.showcase.git
核心概念
FlowerFactory
使用默認的FlowerFactory
按需創建自己的FlowerFactory,配置文件路徑默認讀取classpath:flower.yml,配置文件內容格式為yaml風格,詳情查看配置信息。
獲取FlowerFactory之後,就可以使用它提供的介面:
FlowRouter流程路由器,創建流程之後,通過FlowerFactory可以創建出對應的路由器,之後便可以進行服務的調用了。
分布式
Flower.yml配置信息
了解關於Flower的內部設計,有助於你更好地利用Flower開發一個反應式系統。
Flower core模塊(進程內流式微服務框架)設計
Flower基於Akka的Actor進行開發,將Service封裝到Actor裡面,Actor收到的消息作為參數傳入Service進行調用,Service的輸出發送給後續Actor作為Service的輸入。
Flower核心類
Flower初始化及調用時序
服務流程初始化
消息流處理
Flower的核心設計不過如此。但是由此延伸出來的應用方法和設計模式卻和Akka有了極大的不同。
分布式流式微服務框架設計
傳統的分布式微服務框架通過遠程調用的方式實現服務的解耦與分布式部署,使得系統開發、維護、服務復用、集群部署更加方便靈活,但是這種微服務依然許多不足之處
流式微服務框架Flower致力於構建一種新的微服務架構體系,使用流式計算的架構思想,以一種更加輕量、更易於設計開發、消息驅動、弱依賴,非同步並發的技術特點開發實現微服務系統
架構
部署模型
Flower將整個應用系統集群統一管理控制,控制中心控制管理集群的所有資源
Agent部署在集群每一台伺服器上,負責載入服務實例,並向控制中心匯報狀態
代碼倉庫負責管理服務的java程序包,程序包用assembly打包
控制中心和Agent基於Akka開發,每個服務包裝一個actor裡面,actor之間負責消息的通信
集群啟動與服務部署時序模型
注冊服務數據結構
服務之間的依賴關系在控制中心編排
4. java 目前市面上比較火的框架有哪些
Java 始終排在第一位,這使它成為有史以來最著名的軟體編程語言之一。及時的更新和新版本發布使它成為一種充滿活力的、有競爭力的編程語言。
2020年最常用的java框架
十大常用框架:
一、SpringMVC
二、Spring
三、Mybatis
四、Dubbo
五、Maven
六、RabbitMQ
七、Log4j
八、Ehcache
九、Redis
十、Shiro
模型(Model )封裝了應用程序的數據和一般他們會組成的POJO。
視圖(View)是負責呈現模型數據和一般它生成的HTML輸出,客戶端的瀏覽器能夠解釋。
控制器(Controller )負責處理用戶的請求,並建立適當的模型,並把它傳遞給視圖渲染。
Spring的web模型 - 視圖 - 控制器(MVC)框架是圍繞著處理所有的HTTP請求和響應的DispatcherServlet的設計。
Authentication 許可權
Caching 緩存
Context passing 內容傳遞
Error handling 錯誤處理
Lazy loading懶載入
Debugging 調試
logging, tracing, profiling and monitoring記錄跟蹤優化校準
Performance optimization性能優化
Persistence 持久化
Resource pooling資源池
Synchronization同步
Transactions 事務
Provider: 暴露服務的服務提供方。
Consumer: 調用遠程服務的服務消費方。
Registry: 服務注冊與發現的注冊中心。
Monitor: 統計服務的調用次調和調用時間的監控中心。
Container: 服務運行容器。
一、SpringMVC
Spring Web MVC是一種基於Java的實現了Web MVC設計模式的請求驅動類型的輕量級Web框架,即使用了MVC架構模式的思想,將web層進行職責解耦,基於請求驅動指的就是使用請求-響應模型,框架的目的就是幫助我們簡化開發,Spring Web MVC也是要簡化我們日常Web開發的。
Spring Web MVC處理請求的流程
具體執行步驟如下:
1、 首先用戶發送請求————>前端控制器,前端控制器根據請求信息(如URL)來決定選擇哪一個頁面控制器進行處理並把請求委託給它,即以前的控制器的控制邏輯部分;圖2-1中的1、2步驟;
2、 頁面控制器接收到請求後,進行功能處理,首先需要收集和綁定請求參數到一個對象,這個對象在Spring Web MVC中叫命令對象,並進行驗證,然後將命令對象委託給業務對象進行處理;處理完畢後返回一個ModelAndView(模型數據和邏輯視圖名);圖2-1中的3、4、5步驟;
3、 前端控制器收回控制權,然後根據返回的邏輯視圖名,選擇相應的視圖進行渲染,並把模型數據傳入以便視圖渲染;圖2-1中的步驟6、7;
4、 前端控制器再次收回控制權,將響應返回給用戶,圖2-1中的步驟8;至此整個結束。
二、Spring
2.1、IOC容器:
IOC容器就是具有依賴注入功能的容器,IOC容器負責實例化、定位、配置應用程序中的對象及建立這些對象間的依賴。應用程序無需直接在代碼中new相關的對象,應用程序由IOC容器進行組裝。在Spring中BeanFactory是IOC容器的實際代表者。
2.2、AOP:
簡單地說,就是將那些與業務無關,卻為業務模塊所共同調用的邏輯或責任封裝起來,便於減少系統的重復代碼,降低模塊間的耦合度,並有利於未來的可操作性和可維護性。AOP代表的是一個橫向的關系
AOP用來封裝橫切關注點,具體可以在下面的場景中使用:
三、Mybatis
MyBatis 是支持普通 sql查詢,存儲過程和高級映射的優秀持久層框架。MyBatis 消除了幾乎所有的JDBC代碼和參數的手工設置以及結果集的檢索。MyBatis 使用簡單的 XML或註解用於配置和原始映射,將介面和 Java 的POJOs(Plain Old Java Objects,普通的 Java對象)映射成資料庫中的記錄。
總體流程:
(1)載入配置並初始化
觸發條件:載入配置文件
將SQL的配置信息載入成為一個個MappedStatement對象(包括了傳入參數映射配置、執行的SQL語句、結果映射配置),存儲在內存中。
(2)接收調用請求
觸發條件:調用Mybatis提供的API
傳入參數:為SQL的ID和傳入參數對象
處理過程:將請求傳遞給下層的請求處理層進行處理。
(3)處理操作請求
觸發條件:API介面層傳遞請求過來
傳入參數:為SQL的ID和傳入參數對象
處理過程:
(A)根據SQL的ID查找對應的MappedStatement對象。
(B)根據傳入參數對象解析MappedStatement對象,得到最終要執行的SQL和執行傳入參數。
©獲取資料庫連接,根據得到的最終SQL語句和執行傳入參數到資料庫執行,並得到執行結果。
(D)根據MappedStatement對象中的結果映射配置對得到的執行結果進行轉換處理,並得到最終的處理結果。
(E)釋放連接資源。
(4)返回處理結果將最終的處理結果返回
MyBatis 最強大的特性之一就是它的動態語句功能。如果您以前有使用JDBC或者類似框架的經歷,您就會明白把SQL語句條件連接在一起是多麼的痛苦,要確保不能忘記空格或者不要在columns列後面省略一個逗號等。動態語句能夠完全解決掉這些痛苦。
四、Dubbo
Dubbo是一個分布式服務框架,致力於提供高性能和透明化的RPC(遠程過程調用協議)遠程服務調用方案,以及SOA服務治理方案。簡單的說,bbo就是個服務框架,如果沒有分布式的需求,其實是不需要用的,只有在分布式的時候,才有bbo這樣的分布式服務框架的需求,並且本質上是個服務調用的東東,說白了就是個遠程服務調用的分布式框架。
1、透明化的遠程方法調用,就像調用本地方法一樣調用遠程方法,只需簡單配置,沒有任何API侵入。
2、軟負載均衡及容錯機制,可在內網替代F5等硬體負載均衡器,降低成本,減少單點。
3、 服務自動注冊與發現,不再需要寫死服務提供方地址,注冊中心基於介面名查詢服務提供者的IP地址,並且能夠平滑添加或刪除服務提供者。
節點角色說明:
五、Maven
Maven這個個項目管理和構建自動化工具,越來越多的開發人員使用它來管理項目中的jar包。但是對於我們程序員來說,我們最關心的是它的項目構建功能。
六、RabbitMQ
消息隊列一般是在項目中,將一些無需即時返回且耗時的操作提取出來,進行了非同步處理,而這種非同步處理的方式大大的節省了伺服器的請求響應時間,從而提高了系統的吞吐量。
RabbitMQ是用Erlang實現的一個高並發高可靠AMQP消息隊列伺服器。
Erlang是一門動態類型的函數式編程語言。對應到Erlang里,每個Actor對應著一個Erlang進程,進程之間通過消息傳遞進行通信。相比共享內存,進程間通過消息傳遞來通信帶來的直接好處就是消除了直接的鎖開銷(不考慮Erlang虛擬機底層實現中的鎖應用)。
AMQP(Advanced Message Queue Protocol)定義了一種消息系統規范。這個規范描述了在一個分布式的系統中各個子系統如何通過消息交互。
七、Log4j
日誌記錄的優先順序,分為OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者您定義的級別。
八、Ehcache
EhCache 是一個純Java的進程內緩存框架,具有快速、精乾等特點,是Hibernate中默認的CacheProvider。Ehcache是一種廣泛使用的開源Java分布式緩存。主要面向通用緩存,Java EE和輕量級容器。它具有內存和磁碟存儲,緩存載入器,緩存擴展,緩存異常處理程序,一個gzip緩存servlet過濾器,支持REST和SOAP api等特點。
優點:
1、 快速
2、 簡單
3、 多種緩存策略
4、緩存數據有兩級:內存和磁碟,因此無需擔心容量問題
5、 緩存數據會在虛擬機重啟的過程中寫入磁碟
6、可以通過RMI、可插入API等方式進行分布式緩存
7、 具有緩存和緩存管理器的偵聽介面
8、支持多緩存管理器實例,以及一個實例的多個緩存區域
9、提供Hibernate的緩存實現
缺點:
1、使用磁碟Cache的時候非常佔用磁碟空間:這是因為DiskCache的演算法簡單,該演算法簡單也導致Cache的效率非常高。它只是對元素直接追加存儲。因此搜索元素的時候非常的快。如果使用DiskCache的,在很頻繁的應用中,很快磁碟會滿。
2、不能保證數據的安全:當突然kill掉java的時候,可能會產生沖突,EhCache的解決方法是如果文件沖突了,則重建cache。這對於Cache數據需要保存的時候可能不利。當然,Cache只是簡單的加速,而不能保證數據的安全。如果想保證數據的存儲安全,可以使用Bekeley DB Java Edition版本。這是個嵌入式資料庫。可以確保存儲安全和空間的利用率。
九、Redis
redis是一個key-value存儲系統。和Memcached類似,它支持存儲的value類型相對更多,包括string(字元串)、list(鏈表)、set(集合)、zset(sorted set –有序集合)和hash(哈希類型)。這些數據類型都支持push/pop、add/remove及取交集並集和差集及更豐富的操作,而且這些操作都是原子性的。在此基礎上,redis支持各種不同方式的排序。與memcached一樣,為了保證效率,數據都是緩存在內存中。區別的是redis會周期性的把更新的數據寫入磁碟或者把修改操作寫入追加的記錄文件,並且在此基礎上實現了master-slave(主從)同步。
Redis資料庫完全在內存中,使用磁碟僅用於持久性。相比許多鍵值數據存儲,Redis擁有一套較為豐富的數據類型。Redis可以將數據復制到任意數量的從伺服器。
1.2、Redis優點:
(1)異常快速:Redis的速度非常快,每秒能執行約11萬集合,每秒約81000+條記錄。
(2)支持豐富的數據類型:Redis支持最大多數開發人員已經知道像列表,集合,有序集合,散列數據類型。這使得它非常容易解決各種各樣的問題,因為我們知道哪些問題是可以處理通過它的數據類型更好。
(3)操作都是原子性:所有Redis操作是原子的,這保證了如果兩個客戶端同時訪問的Redis伺服器將獲得更新後的值。
(4)多功能實用工具:Redis是一個多實用的工具,可以在多個用例如緩存,消息,隊列使用(Redis原生支持發布/訂閱),任何短暫的數據,應用程序,如Web應用程序會話,網頁命中計數等。
1.3、Redis缺點:
(1)單線程
(2)耗內存
十、Shiro
Apache Shiro是Java的一個安全框架,旨在簡化身份驗證和授權。Shiro在JavaSE和JavaEE項目中都可以使用。它主要用來處理身份認證,授權,企業會話管理和加密等。Shiro的具體功能點如下:
(1)身份認證/登錄,驗證用戶是不是擁有相應的身份;
(2)授權,即許可權驗證,驗證某個已認證的用戶是否擁有某個許可權;即判斷用戶是否能做事情,常見的如:驗證某個用戶是否擁有某個角色。或者細粒度的驗證某個用戶對某個資源是否具有某個許可權;
(3)會話管理,即用戶登錄後就是一次會話,在沒有退出之前,它的所有信息都在會話中;會話可以是普通JavaSE環境的,也可以是如Web環境的;
(4)加密,保護數據的安全性,如密碼加密存儲到資料庫,而不是明文存儲;
(5)Web支持,可以非常容易的集成到Web環境;
Caching:緩存,比如用戶登錄後,其用戶信息、擁有的角色/許可權不必每次去查,這樣可以提高效率;
(6)shiro支持多線程應用的並發驗證,即如在一個線程中開啟另一個線程,能把許可權自動傳播過去;
(7)提供測試支持;
(8)允許一個用戶假裝為另一個用戶(如果他們允許)的身份進行訪問;
(9)記住我,這個是非常常見的功能,即一次登錄後,下次再來的話不用登錄了。
文字描述可能並不能讓猿友們完全理解具體功能的意思。下面我們以登錄驗證為例,向猿友們介紹Shiro的使用。至於其他功能點,猿友們用到的時候再去深究其用法也不遲。
十一、設計模式
這個算不上框架,可自行忽略,不過我認為設計模式的思想很有必要了解一下。
思想:
開閉原則:
開閉原則就是說對擴展開放,對修改關閉。在程序需要進行拓展的時候,不能去修改原有的代碼。
針對介面編程,針對介面編程,依賴於抽象而不依賴於具體。
盡量使用合成/聚合的方式,而不是使用繼承。
一個實體應當盡量少的與其他實體之間發生相互作用,使得系統功能模塊相對獨立。
使用多個隔離的介面,比使用單個介面要好。
里氏代換原則:
(1)子類的能力必須大於等於父類,即父類可以使用的方法,子類都可以使用。
(2)返回值也是同樣的道理。假設一個父類方法返回一個List,子類返回一個ArrayList,這當然可以。如果父類方法返回一個ArrayList,子類返回一個List,就說不通了。這里子類返回值的能力是比父類小的。
(3)還有拋出異常的情況。任何子類方法可以聲明拋出父類方法聲明異常的子類。 而不能聲明拋出父類沒有聲明的異常。
5. DWR是什麼
DWR(Direct Web Remoting)是一個WEB遠程調用框架.利用這個框架可以讓AJAX開發變得很簡單.利用DWR可以在客戶端利用JavaScript直接調用服務端的Java方法並返回給JavaScript就好像直接本地客戶端調用一樣(DWR根據Java類來動態生成JavaScrip代碼).它的最新版本DWR0.6添加許多特性如:支持Dom Trees的自動配置,支持Spring(JavaScript遠程調用spring bean),更好瀏覽器支持,還支持一個可選的commons-logging日記操作。
6. php rpc好用嗎,有什麼優缺點php rpc框架哪個好
什麼是RPC框架? 如果用一句話概括RPC就是:遠程調用框架(Remote Procere Call)那什麼是遠程調用?通常我們調用一個php中的方法,比如這樣一個函數方法: localAdd(10, 20),localAdd方法的具體實現要麼是用戶自己定義的,要麼是php庫函數中自帶的,也就說在localAdd方法的代碼實現在本地,它是一個本地調用!遠程調用意思就是:被調用方法的具體實現不在程序運行本地,而是在別的某個遠程地方。
遠程調用原理
比如 A (client) 調用 B (server) 提供的remoteAdd方法:
首先A與B之間建立一個TCP連接;
然後A把需要調用的方法名(這里是remoteAdd)以及方法參數(10, 20)序列化成位元組流發送出去;
B接受A發送過來的位元組流,然後反序列化得到目標方法名,方法參數,接著執行相應的方法調用(可能是localAdd)並把結果30返回;
A接受遠程調用結果,輸出30。
RPC框架就是把我剛才說的這幾點些細節給封裝起來,給用戶暴露簡單友好的API使用。
遠程調用的好處
解耦:當server需要對方法內實現修改時,client完全感知不到,不用做任何變更;這種方式在跨部門,跨公司合作的時候經常用到,並且方法的提供者我們通常稱為:服務的暴露。
RPC與Socket有什麼區別?
通過上面的簡單闡述,好像RPC與Socket 好像啊。都是調用遠程的方法,都是client/server模式,我之前也寫了一篇文章: 細說socket 那他們有啥區別呢?
RPC(遠程過程調用)採用客戶機/伺服器模式實現兩個進程之間相互通信。socket是RPC經常採用的通信手段之一,RPC是在Socket的基礎上實現的,它比socket需要更多的網路和系統資源。除了Socket,RPC還有其他的通信方法,比如:http、操作系統自帶的管道等技術來實現對於遠程程序的調用。微軟的Windows系統中,RPC就是採用命名管道進行通信。
RPC與REST有什麼區別?
通過了解RPC後,我們知道是RPC是client/server模式的,調用遠程的方法,REST也是我們熟悉的一套API調用協議方法,它也是基於client/server模式的,調用遠程的方法的,那他倆又有啥區別呢?
REST API 和 RPC 都是在 Server端 把一個個函數封裝成介面暴露出去,以供 Client端 調用,不過 REST API 是基於HTTP協議的,REST致力於通過http協議中的POST/GET/PUT/DELETE等方法和一個可讀性強的URL來提供一個http請求。而 RPC 則可以不基於 HTTP協議
因此,如果是後端兩種語言互相調用,用 RPC 可以獲得更好的性能(省去了 HTTP 報頭等一系列東西),應該也更容易配置。如果是前端通過 AJAX 調用後端,那麼用 REST API 的形式比較好(因為無論如何也避不開 HTTP 這道坎)。
php中流行的rpc框架有哪些
既然php是世界上最好的語言,那php中流行的RPC框架有哪些呢?
先列舉下: phprpc,yar, thrift, gRPC, swoole, hprose
因為時間和精力有限,不可能一個一個的去學習和使用,我選幾個世面上用的最多的幾個用下吧。因為RPC原理是一樣的,都是Client/Server模式,只是每個框架的使用方式不一樣而已。
7. 作為一個JAVA程序員, 應該掌握哪些知識, 目前, 比較流行的java開發框架有哪些,
java基礎,三大主流資料庫mysql,orcale,sql server;然後是j2ee的相關知識,也就是java開發框架。
Spring Framework 【Java 開源JEE框架】
Spring是一個解決了許多在J2EE開發中常見的問題的強大框架。
Spring提供了管理業務對象的一致方法並且鼓勵了注入對介面編程而不是對類編程的良好習慣。Spring的架構基礎是基於使用JavaBean屬性的
Inversion of
Control容器。然而,這僅僅是完整圖景中的一部分:Spring在使用IoC容器作為構建完關注所有架構層的完整解決方案方面是獨一無二的。
Spring提供了唯一的數據訪問抽象,包括簡單和有效率的JDBC框架,極大的改進了效率並且減少了可能的錯誤。Spring的數據訪問架構還集成了
Hibernate和其他O/R mapping解決方案。Spring還提供了唯一的事務管理抽象,它能夠在各種底層事務管理技術,例如JTA或者
JDBC事務提供一個一致的編程模型。Spring提供了一個用標准Java語言編寫的AOP框架,它給POJOs提供了聲明式的事務管理和其他企業事務
--如果你需要--還能實現你自己的aspects。這個框架足夠強大,使得應用程序能夠拋開EJB的復雜性,同時享受著和傳統EJB相關的關鍵服務。
Spring還提供了可以和IoC容器集成的強大而靈活的MVC Web框架。【SpringIDE:Eclipse平台下一個輔助開發插件】.
WebWork 【Java開源Web開發框架】
WebWork是由OpenSymphony組織開發的,致力於組件化和代碼重用的拉出式MVC模式J2EE
Web框架。WebWork目前最新版本是2.1,現在的WebWork2.x前身是Rickard
Oberg開發的WebWork,但現在WebWork已經被拆分成了Xwork1和WebWork2兩個項目。
Xwork簡潔、靈活功能強大,它是一個標準的Command模式實現,並且完全從web層脫離出來。
Xwork提供了很多核心功能:前端攔截機(interceptor),運行時表單屬性驗證,類型轉換,強大的表達式語言(OGNL – the
Object Graph Notation Language),IoC(Inversion of Control倒置控制)容器等。
WebWork2建立在Xwork之上,處理HTTP的響應和請求。WebWork2使用ServletDispatcher將HTTP請求的變成
Action(業務層Action類),
session(會話)application(應用程序)范圍的映射,request請求參數映射。WebWork2支持多視圖表示,視圖部分可以使用
JSP, Velocity, FreeMarker,
JasperReports,XML等。在WebWork2.2中添加了對AJAX的支持,這支持是構建在DWR與Dojo這兩個框架的基礎之上.
【EclipseWork:用於WebWork輔助開發的一個Eclipse插件】
Struts 【Java開源Web開發框架】
Struts是一個基於Sun
J2EE平台的MVC框架,主要是採用Servlet和JSP技術來實現的。由於Struts能充分滿足應用開發的需求,簡單易用,敏捷迅速,在過去的一年中頗受關注。Struts把Servlet、JSP、自定義標簽和信息資源(message
resources)整合到一個統一的框架中,開發人員利用其進行開發時不用再自己編碼實現全套MVC模式,極大的節省了時間,所以說Struts是一個非常不錯的應用框架。【StrutsIDE:用於Struts輔助開發的一個Eclipse插件】
Hibernate 【Java開源持久層框架】
Hibernate是一個開放源代碼的對象關系映射框架,它對JDBC進行了非常輕量級的對象封裝,使得Java程序員可以隨心所欲的使用對象編程思維來操縱資料庫。
Hibernate可以應用在任何使用JDBC的場合,既可以在Java的客戶端程序實用,也可以在Servlet/JSP的Web應用中使用,最具革命意義的是,Hibernate可以在應用EJB的J2EE架構中取代CMP,完成數據持久化的重任。Eclipse平台下的Hibernate輔助開發工具:【Hibernate
Synchronizer】【MiddlegenIDE】
Quartz 【Java開源調度框架】
Quartz是OpenSymphony開源組織在Job
scheling領域又一個開源項目,它可以與J2EE與J2SE應用程序相結合也可以單獨使用。Quartz可以用來創建簡單或為運行十個,百個,甚至是好幾萬個Jobs這樣復雜的日程序表。Jobs可以做成標準的Java組件或
EJBs。Quartz的最新版本為Quartz 1.5.0。
Velocity 【Java開源模板引擎】
Velocity是一個基於java的模板引擎(template engine)。它允許任何人僅僅簡單的使用模板語言(template
language)來引用由java代碼定義的對象。當Velocity應用於web開發時,界面設計人員可以和java程序開發人員同步開發一個遵循MVC架構的web站點,也就是說,頁面設計人員可以只關注頁面的顯示效果,而由java程序開發人員關注業務邏輯編碼。Velocity將java代碼從web頁面中分離出來,這樣為web站點的長期維護提供了便利,同時也為我們在JSP和PHP之外又提供了一種可選的方案。
Velocity的能力遠不止web站點開發這個領域,例如,它可以從模板(template)產生SQL和PostScript、XML,它也可以被當作一個獨立工具來產生源代碼和報告,或者作為其他系統的集成組件使用。Velocity也可以為Turbine
web開發架構提供模板服務(template
service)。Velocity+Turbine提供一個模板服務的方式允許一個web應用以一個真正的MVC模型進行開發。【VeloEclipse
:Velocity在Eclipse平台下的一個輔助開發插件】
IBATIS 【Java開源持久層框架】
使用ibatis 提供的ORM機制,對業務邏輯實現人員而言,面對的是純粹的Java對象, 這一層與通過Hibernate 實現ORM
而言基本一致,而對於具體的數據操作,Hibernate 會自動生成SQL 語句,而ibatis 則要求開發者編寫具體的SQL
語句。相對Hibernate等 「全自動」ORM機制而言,ibatis
以SQL開發的工作量和資料庫移植性上的讓步,為系統設計提供了更大的自由空間。作為「全自動」ORM 實現的一種有益補充,ibatis 的出現顯
得別具意義。
Compiere ERP&CRM 【Java開源ERP與CRM系統】
Compiere
ERP&CRM為全球范圍內的中小型企業提供綜合型解決方案,覆蓋從客戶管理、供應鏈到財務管理的全部領域,支持多組織、多幣種、多會計模式、多成本計算、多語種、多稅制等國際化特性。易於安裝、易於實施、易於使用。只需要短短幾個小時,您就可以使用申購-采購-發票-付款、報價-訂單-發票-收款、產品與定價、資產管理、客戶關系、供應商關系、員工關系、經營業績分析等強大功能了。
Roller Weblogger 【Java開源Blog博客】
這個weblogging
設計得比較精巧,源代碼是很好的學習資料。它支持weblogging應有的特性如:評論功能,所見即所得HTML編輯,TrackBack,提供頁面模板,RSS
syndication,blogroll管理和提供一個XML-RPC 介面。
Eclipse 【Java開源IDE】
Eclipse平台是IBM向開發源碼社區捐贈的開發框架,它之所以出名並不是因為IBM宣稱投入開發的資金總數
—4千萬美元,而是因為如此巨大的投入所帶來的成果:一個成熟的、精心設計的以及可擴展的體系結構。
XPlanner 【Java開源項目管理】
XPlanner 一個基於Web的XP團隊計劃和跟蹤工具。XP獨特的開發概念如iteration、user
stories等,XPlanner都提供了相對應的的管理工具,XPlanner支持XP開發流程,並解決利用XP思想來開發項目所碰到的問題。
XPlanner特點包括:簡單的模型規劃,虛擬筆記卡(Virtual note cards),iterations、user
stories與工作記錄的追蹤,未完成stories將自動迭代,工作時間追蹤,生成團隊效率,個人工時報表,SOAP界面支持。
HSQLDB 【Java開源開源資料庫】
HSQLDB(Hypersonic SQL)是純Java開發的關系型資料庫,並提供JDBC驅動存取數據。支持ANSI-92 標准
SQL語法。而且他占的空間很小。大約只有160K,擁有快速的資料庫引擎。
Liferay 【Java開源門戶系統】
代表了完整的J2EE應用,使用了Web、EJB以及JMS等技術,特別是其前台界面部分使用Struts
框架技術,基於XML的portlet配置文件可以自由地動態擴展,使用了Web Services來支持一些遠程信息的獲取,使用 Apahce
Lucene實現全文檢索功能。
主要特點:
提供單一登陸介面,多認證模式(LDAP或 SQL);
管理員能通過用戶界面輕松管理用戶,組,角色;
用戶能可以根據需要定製個性化的portal layout;
能夠在主流的J2EE應用伺服器上運行,如JBoss+Jetty/Tomcat,JOnAS;
支 持主流的資料庫,如PostgreSQL,MySQL;
使用了第三放的開源項目,如Hibernate, Lucene, Struts;
支持包括中文在內的多種語言;
採用最先進的技術 Java, EJB, JMS, SOAP, XML;
JetSpeed 【Java開源門戶系統】
Jetspeed是一個開放源代碼的企業信息門戶(EIP)的實現, 使用的技術是Java和XML. 用戶可以使用瀏覽器,
支持WAP協議的手機或者其它的設備訪問Jetspeed架設的信息門戶獲取信息. Jetspeed扮演著信息集中器的角色,
它能夠把信息集中起來並且很容易地提供給用戶.
Jetspeed具有如下的特徵:
即將成為標准化的Java Portlet API
基於模板的布局, 包括JSP和Velocity
通過開放的內容同步技術支持遠程XML 內容交換
定製默認的主頁
使用資料庫進行用戶認證
內存緩存技術, 加快頁面的響應
通 過Rich Site Summary技術, 支持同步內容
和Cocoon, WebMacro, Velocity集成.
Wireless Markup Language (WML) 支持
使用XML格式的配置文件注冊portlet.
完整的 Web Application Archive (WAR) 支持
Web應用程序開發的基礎設施
可以在本地緩 存遠程內容
與Avantgo同步
可移植到所有支持JDK1.2和Servlet 2.2的平台
與 Turbine模塊和服務集成
可以根據用戶, 安裝媒體類型和語言的不同設定, 產生不同的個性化服務
持續化服 務使得所由的portlet能夠容易的存儲每個用戶的狀態, 頁面和portlet
使用皮膚技術使得用戶可以選擇portlet的顏 色和顯示屬性
自定義功能是的管理員可以選擇portlet以及定義個人頁面的布局
在資料庫中存儲PSML
通 過Jetspeed的安全portlets管理用戶, 組,角色和許可權
基於角色對訪問portlet進行控制
JOnAS 【Java開源應用伺服器】
JOnAS是一個開放源代碼的J2EE實現,在ObjectWeb協會中開發。整合了Tomcat或Jetty成為它的Web容器,以確保符合Servlet
2.3和JSP 1.2規范。JOnAS伺服器依賴或實現以下的Java API:JCA、JDBC、JTA
、JMS、JMX、JNDI、JAAS、JavaMail 。
JFox3.0 【Java開源應用伺服器】
JFox 是 Open Source Java EE Application Server,致力於提供輕量級的Java
EE應用伺服器,從3.0開始,JFox提供了一個支持模塊化的MVC框架,以簡化EJB以及Web應用的開發!
如果您正在尋找一個簡單、輕量、高效、完善的Java EE開發平台,那麼JFox正是您需要的。
JFox 3.0 擁有以下特性:
重 新設計的 IoC 微內核,融入 OSGi 模塊化思想
設計成嵌入式架構,能夠和任何 Java Web Server集成部署
支 持 EJB3,JPA規范,支持容器內和容器外兩種方式運行EJB和JPA組件
支持 EJB 發布成Web Service
采 用 JOTM(http://jotm.objectweb.org/)提供事務處理,支持兩階段提交 (2PC)
採用 XAPool(http://forge.objectweb.org/projects/xapool/) 提供 XA
DataSource,支持智能連接池管理
內置 MVC 框架,實現自動Form
Mapping,Validator,Uploading等功能,支持JSP/Velocity/Freemarker頁面引擎,並支持直接在
Action中注入EJB
支持多應用模塊部署,讓中大型應用充分享受模塊化開發帶來的優勢
提供 Manager 管理模塊,可以查看和管理各種運行時參數
提供根據 JFox 特色重寫的 Petstore 應用模塊
EasyJWeb 【Java開源Web開發框架】
EasyJWeb是基於java技術,應用於WEB應用程序快速開發的MVC框架,框架設計構思來源於國內眾多項目實踐,框架充分借簽了當前主要流行的開源Web框架(Struts、JSF、Tapestry
、Webwork),吸取了其優點及精華,利用Velocity作為模板頁面引擎,是一個實現了頁面及代碼完全分離的MVC開發框架。是一個能實現中小型
Web應用系統快速開發的簡易Web框架。
通過EasyJWeb
Tools提供的配套開發工具,可以實現基於EasyJWeb框架的Web應用快速開發,包括常用應用軟體的代碼自生成、資料庫添刪改查(CRUD)代碼生成、自動頁面模版生成、配置文件管理等。
框架特點:
零配文件置支持。以前我們每接觸一個框架,開始總都要被
他的配置文件折騰一番。EasyJWeb實現零配置支持,可以不寫一句配置文件就在框架基礎上構建你的運用。(適合小型網站系統)。
簡 易的模板頁面設計支持:放棄使用jsp,使用簡單Velocity腳本語言作為頁面模板。
頁面程序完全分離:實現顯示頁面與程序邏輯 的完全分離,克服了傳統jsp頁面難於維護的問題。
基於頁面組件的框架。靈活的頁面組件配置,可以直接通過配置文件設置欄位級的事件 組件。
快速開發支持:通過EasyJWeb
Tools,可以自動生成應用軟體模板代碼,定製並管理自己的J2EE代碼模板,代碼生成模板支持最流行的實用Java開發框架(如hibernate、
Spring等)實現快速開發。
Tapestry 【Java開源Web開發框架】
Tapestry是一個開源的基於servlet的應用程序框架,它使用組件對象模型來創建動態的,交互的web應用。一個組件就是任意一個帶有
jwcid屬性的html標記。其中jwc的意思是Java Web
Component。Tapestry使得java代碼與html完全分離,利用這個框架開發大型應用變得輕而易舉。並且開發的應用很容易維護和升級。
Tapestry支持本地化,其錯誤報告也很詳細。Tapestry主要利用javabean和xml技術進行開發。【Spindle:Tapestry
輔助開發Eclipse插件】.
FreeMarker 【Java開源模板引擎】
FreeMarker允許Java
servlet保持圖形設計同應用程序邏輯的分離,這是通過在模板中密封HTML完成的。模板用servlet提供的數據動態地生成
HTML。模板語言是強大的直觀的,編譯器速度快,輸出接近靜態HTML頁面的速度。
【FreeMarker Eclipse Plugin與FreeMarker IDE:Eclipse平台下的輔助開發工具】
Lucene 【Java開源搜索引擎】
Apache
Lucene是一個基於Java全文搜索引擎,利用它可以輕易地為Java軟體加入全文搜尋功能。Lucene的最主要工作是替文件的每一個字作索引,索引讓搜尋的效率比傳統的逐字比較大大提高,Lucen提供一組解讀,過濾,分析文件,編排和使用索引的API,它的強大之處除了高效和簡單外,是最重要的是使使用者可以隨時應自已需要自訂其功能。
iText 【Java開源PDF類庫】
iText是一個能夠快速產生PDF文件的java類庫。iText的java類對於那些要產生包含文本,表格,圖形的只讀文檔是很有用的。它的類庫尤其與java
Servlet有很好的給合。使用iText與PDF能夠使你正確的控制Servlet的輸出。
Groovy 【Java開源動態語言】
Groovy是一種基於JVM的敏捷開發語言,它結合了Python、Ruby和 Smalltalk的許多強大的特性。
Groovy已在WebWork2中的應用。它可以被編譯為標準的Java Bytecode。
OpenCms 【Java開源CMS系統】
OpenCms是一個J2EE的產品,它是用 Java寫成的。它和Tomcat捆綁在一起。但是也能夠使用ATG
Dynamo、WebLogic和WebSphere。OpenCms支持多種RDBMS來保存內容,包括Oracle、SQL
Server、Sybase和mySQL。新版本提供了一個新的模板引擎,JSP支持,一種新的連接管理系統,提高了穩定性。
JUnit 【Java開源測試工具】
JUnit是由 Erich Gamma 和 Kent Beck 編寫的一個回歸測試框架(regression testing
framework)。Junit測試是程序員測試,即所謂白盒測試,因為程序員知道被測試的軟體如何(How)完成功能和完成什麼樣(What)的功能。Junit是一套框架,繼承TestCase類,就可以用Junit進行自動測試了。
BlueJ 【Java開源IDE】
BlueJ是一個專門為入門級教學設計的JavaTM 開發環境。它是由澳大利亞墨爾本Monash大學BlueJ小組設計並開發的。
XWiki 【Java開源Wiki系統】
XWiki是一個強大的Java開源的Wiki引擎。它支持一些受歡迎的特性如:
內 容管理(瀏覽/編輯/預覽/保存),
支持附件,
版本控制,
全文本搜索,
權 限管理
使用Hibernate進行數據存儲,
RSS輸出與顯示外部的RSS feeds,
多 語言支持,
提供XML/RPC的API,
WYSIWYG HTML編輯器,
導出為PDF
Groovy 腳本支持等等....。
EJBCA 【Java開源網路伺服器端組件】
EJBCA是一個全功能的CA系統軟體,它基於J2EE技術,並提供了一個強大的、高性能並基於組件的CA。EJBCA兼具靈活性和平台獨立性,能夠獨立使用,也能和任何J2EE應用程序集成。
JXTA 【Java開源其它項目】
Sun微系統公司公開了旨在建立P2P(Peer to
Peer)通用技術基礎的JXTA計劃。JXTA技術是網路編程和計算的平台,用以解決現代分布計算尤其是點對點(P2P)計算中出現的問題。
JXTA將建立核心的網路計算技術,提供支持在任何平台、任何地方以及任何時間實現P2P計算的一整套簡單、小巧和靈活的機制。JXTA首先將歸納目前
P2P的功能特別,而後建立核心的技術來表達目前的P2P計算的局限性。其重點是創建基本的機制,而具體的策略選擇權則交給應用的開發者。JXTA將充分利用XML、Java等開放技術,使得UNIX操作系統更強大和靈活,比如利用管道(Pipes)傳輸Shell命令實現復雜的計算任務。JXTA支持
P2P應用的基本功能來建立一個P2P系統,還將努力證實這些可以成為建立更高層功能的基礎構造模塊。JXTA架構可以分為三個層面:JXTA核心層、
JXTA業務層和JXTA應用層。
DWR 【Java開源AJAX框架】
DWR(Direct Web
Remoting)是一個WEB遠程調用框架.利用這個框架可以讓AJAX開發變得很簡單.利用DWR可以在客戶端利用JavaScript直接調用服務端的Java方法並返回值給JavaScript就好像直接本地客戶端調用一樣(DWR根據Java類來動態生成JavaScrip代碼).它的最新版本
DWR0.6添加許多特性如:支持Dom Trees的自動配置,支持Spring(JavaScript遠程調用spring
bean),更好瀏覽器支持,還支持一個可選的commons-logging日記操作.
ZK 【Java開源AJAX框架】
ZK是一個Ajax Java Web框架,利用少量代碼就能夠開發出擁有Rich
UI的Web應用。ZK提供基於XUL的標記語言和事件驅動的組件,可以讓你像開發桌面應用程序一樣簡單。支持EL表達式和腳本語言包括:JavaScript、Ruby和Groovy等。支持Annotation及數據綁定。集成Google
Maps、FCKeditor、DOJO以及Timeline。
8. 如何跨進程調用surfaceflinger的方法
Android SurfaceFlinger 詳解 1. SurfaceFlinger 按英文翻譯過來就 Surface 投遞者。 就是把上層所畫的各個 surface 進行處 理然後傳給底層硬體來顯示的一個功能。 2. 下圖比較詳細的闡述了 SurfaceFlinger 所起的作用。 Android 圖形系統中一個重要的概念和線索是 surface。View 及其子類(如 TextView, Button) 要畫在 surface 上。 每個 surface 創建一個 Canvas 對象 (但 屬性時常改變),用來管理 view 在 surface 上的繪圖操作,如畫點畫線。每個 canvas 對象對應一個 bitmap,存儲畫在 surface 上的內容。 每個 Surface 通常對應兩個 buffer,一個 front buffer, 一個 back buffer。 其中,back buffer 就是 canvas 繪圖時對應的 bitmap。因此,繪畫總是在 back buffer 上,需要更新時,則將 back buffer 和 front buffer 互換。 The window is tied to a Surface and the ViewRoot asks the Surface for a Canvas that is then used by the Views to draw onto. After View draw its data to canvas, ViewRoot will call surface.unlockCanvasAndPost(canvas) to schele surfaceFlinger::composeSurfaces() which do the actually display to display panel. SurfaceFlinger handles to transfers drawn data in canvas to surface front buffer or backbuffer Except for SurfaceViews, different views within the same ViewRoot share the same surface. Layer 的概念: 每個 surface 又對應一個 layer, SurfaceFlinger 負責將各個 layer 的 front buffer 合成(composite)繪制到屏幕上。 A Layer is something that can be composited by SurfaceFlinger (should have been called LayerFlinger). There are several types of Layers if you look in the code, in particular the regular ones (Layer.cpp) , they are backed by a Surface, and the LayerBuffer (very badly chosen name) which don't have a backing store, but receive one from their client. . Note that the GGLSurface type, should have been called GGLBuffer Multiple layers are just composited to the final buffer in their Z order. 有幾個對象與 Surface 概念緊密相關: 1. Java Surface (frameworks/base/core/java/android/view/Surface.java) 。 該對象被應用間接調用(通過 SurfaceView, ViewRoot 等), 應用需要創建 surface,(並同時創建 canvas), 將圖形繪制到這個對象上並最終投遞到屏幕 上。 2. C++ Surface (frameworks/base/libs/ui/Surface.cpp。 這個對象被 Java Surface 通過 Jni 調用,實現 Java Surface 的功能 3. ISurface (以及其派生類 BnSurface)。這個對象是應用和 server 之間的接 口。 C++ Surface 創建這個 ISurface (BnSurface) 並發送命令, 如更新 surface 內容到屏幕上。Server 端接受這個命令並執行相應操作。 研究一個 surface 如何創建的關鍵路徑如下: 1. frameworks/base/core/java/android/view/Surface.java Surface::Surface () -- 2. frameworks/base/core/jni/android_view_Surface.cpp -- Surface_init ()。 在這個函數中 SurfaceComposerClient 對象被創建。 3.frameworks/base/libs/ui/SurfaceComposerClient.cpp SurfaceComposerClient::SurfaceComposerClient (). 這個函數非常重要,在這里建立了 client 和 server 之間的橋梁。通過函數 _get_surface_manager() 獲 得 了 一 個 指 向 server 的 IBinder 對 象 ( 具 有 ISurfaceComposer 介面),之後通過這個 IBinder 就可以跨進程訪問 Server 的 功能。接著調用 ISurfaceComposer::createConnection()創建並返回了一個 ISurfaceFlingerClient 的 IBinder。 4. frameworks/base/libs/ui/SurfaceComposerClient.cpp -SurfaceComposerClient::createSurface(). 這 個 函 數 中 , 利 用 前 面 獲 得 的 ISurfaceFlingerClient 的 IBinder,調用其 createSurface 介面。 5.frameworks/base/libs/surfaceflinger/SurfaceFlinger.cpp -BClient::createSurface ()。BClient 由 ISurfaceFlingerClient 派生而來。 6. frameworks/base/libs/surfaceflinger/SurfaceFlinger.cpp -SurfaceFlinger:: createSurface()。這個函數為 Surface 創建一個對應的 Layer。 上述關鍵路徑中,1,2,3,4 運行於 client 進程中,而 5,6 運行與 server 進 程中。server 作為一個 service 提供給 client 訪問。 與圖形相關的代碼主要位於下列目錄: 1、frameworks/base/graphics/java/android/graphics 2、frameworks/base/core/java/android/view 3、frameworks/base/core/java/android/widget 4、frameworks/base/opengl/ 5、frameworks/base/libs/ui 6、frameworks/base/libs/surfaceflinger 7、frameworks/base/core/jni/android/graphics 8、frameworks/base/core/jni/android/opengl 9、frameworks/base/core/jni/android/android_view_*.cpp 10、external/skia 一、下列目錄中的部分代碼: 1、frameworks/base/graphics/java/android/graphics 2、frameworks/base/core/java/android/view 3、frameworks/base/core/java/android/widget android.graphics, android.view 和 android.widget 功能和其他類似的圖形庫 如 Qt/Gtk+差不多, 分別提供基本的圖形原語 (如畫點畫線, 設置圖形上下文等) , 事件機制, 以及開發圖形用戶界面的控制項等。 canvas 用於開發 2D 圖形, Surface 代表一個可供圖形系統繪制的 surface。可在其上繪制 2D 活 3D 圖形。
9. 遠程過程調用與消息傳遞區別
如何在Java中實現遠程方法調用(1)
如何在Java中實現遠程方法調用
經乾、郭鎮、趙偉
一、Java中的遠程方法調用
遠程方法調用(Remote Method Invocation, RMI)是Java1.1引入的分布式對象軟體包,它的出現簡化了在多台機器上的Java應用之間的通信。相比CORBA,RMI功能較弱且只能用於Java系統。
二、實現一個簡單的RMI
要使用RMI,必須構造四個主要的類:遠程對象的本地介面、RMI客戶、遠程對象實現和RMI伺服器。RMI伺服器生成遠程對象實現的一個實例,並用一個特殊的URL注冊它,RMI客戶在遠程伺服器上查找對象,若找到就把它轉換成本地介面類型,然後像一個本地對象一樣使用它。下面是一個簡單的RMI例子,遠程對象只返回一個消息字元串。要使這個例子更有價值,我們需要做的就是完善遠程對象實現類。
1.遠程對象的本地介面類(Rem.Java)
該類僅僅是一個介面,而不是實現,RMI客戶機可以直接使用它,RMI伺服器必須通過一個遠程對象來實現它,並用某個URL注冊它的一個實例。
import Java.rmi.*;
public interface Rem extends Remote { public String getMessage() throws RemoteException;}
本地介面(Rem)必須是公共的,否則客戶機在載入一個實現該介面的遠程對象時就會出錯。此外,它還必須從Java.rmi.Remote繼承而來,介面中的每一個方法都必須拋出遠程異常Java.rmi.RemoteException。
2.RMI客戶類(RemClient.Java)
RMI客戶使用Naming.lookup在指定的遠程主機上查找對象,若找到就把它轉換成本地介面Rem類型,然後像一個本地對象一樣使用它。與CORBA不同之處在於RMI客戶必須知道提供遠程服務主機的URL,這個URL可以通過rmi://host/path或rmi://host:port/path來指定,如果省略埠號,就使用1099。Naming.lookup可能產生三個異常:RemoteException、NotBoundException、MalformedURLException,三個尋常都需要捕獲。RemoteException、Naming和NotBoundException在Java.rmi.*中定義,MalformedURLException在Java.net.*中定義。另外,客戶機將向遠程對象傳遞串列化對象Serializable,所以還應在程序中輸入Java.io.*。
import Java.rmi.*;
import Java.net.*;
import Java.io.*;
public class RemClient {
public static void main(String[] args) {
try {
String host = (args.length > 0) ? args[0] : "localhost"; file://從命令行讀取遠程主機名
file://通過URL在遠程主機上查找對象,並把它轉化為本地介面Rem類型
Rem remObject=(Rem)Naming.lookup("rmi://" + host + "/Rem");
System.out.println(remObject.getMessage()); file://調用遠程對象的方法
} catch(RemoteException re) {System.out.println("RemoteException: " + re);
} catch(NotBoundException nbe) {System.out.println("NotBoundException: " + nbe);
} catch(MalformedURLException mfe){System.out.println("MalformedURLException:"+ mfe);
}}}
3.遠程對象實現類(RemImpl.Java)
這個類真正實現RMI客戶調用的遠程對象,它必須從UnicastRemoteObject繼承,其構造函數應拋出RemoteException異常。
import Java.rmi.*;
import Java.rmi.server.UnicastRemoteObject;
public class RemImpl extends UnicastRemoteObject implements Rem {
public RemImpl() throws RemoteException {} file://構造函數拋出RemoteException異常
public String getMessage() throws RemoteException {
return("Here is a remote message."); }} file://向RMI客戶返回一個消息串
4.RMI伺服器類(RemServer.Java)
該類創建遠程對象實現RemImpl的一個實例,然後用一個特定的URL來注冊它,所謂注冊就是通過Naming.bind或Naming.rebind來將RemImpl實例綁定到URL上。
import Java.rmi.*;
import Java.net.*;
public class RemServer {
public static void main(String[] args) {
try {
RemImpl localObject = new RemImpl(); file://生成遠程對象實現的一個實例
Naming.rebind("rmi:///Rem", localObject); file://將遠程對象實例綁定到rmi:///Rem上
}catch(RemoteException re){System.out.println("RemoteException:"+re);
}catch(MalformedURLException mfe) {System.out.println("MalformedURLException: "+mfe);
}}}
三、編譯和運行
1.如何在Java中實現遠程方法調用(1)
2.如何在Java中實現遠程方法調用(2)
編譯RMI客戶和伺服器,這將自動編譯遠程對象的本地介面和遠程對象實現
Javac RemClient.Java file://自動編譯遠程對象的本地介面Rem.Java
Javac RemServer.Java file://自動編譯遠程對象實現RemImpl.Java
2. 生成客戶承接模塊和伺服器框架
rmic RemImpl
這將構造RemImpl_Stub.class和RemImpl_Skeleton.class。請將Rem.class、RemClient.class和RemImpl_Stub.class拷貝到RMI客戶機,將Rem.class、RemImpl.class 、RemServer.class和RemImpl_Skeleton.class拷貝到RMI伺服器。
3. 啟動RMI注冊
rmiregistry
file://在伺服器上執行。不論有多少個遠程對象,本操作只需做一次
4. 運行
Java RemServer.class
file://啟動RMI伺服器(在伺服器上執行)
Java RemClient.class
file://啟動RMI客戶,將輸出「Here is a remote message.」
10. DTO是什麼
Data Transfer Object(數據傳輸對象)
您正在設計一個分布式應用程序,為了滿足單個客戶端請求,您發現自己對一個遠程介面發出了多個調用,而這些調用所增加的響應時間超出了可接受的程度。
問題
如何保留過程調用介面的簡單語義,而不受遠程通信固有的滯後時間問題的影響?
影響因素
在與遠程對象通信時,請考慮下列需要權衡的因素:
遠程調用(那些必須跨越網路的調用)速度緩慢。雖然許多遠程調用框架可以隱藏進行遠程調用的復雜性,但是它們不能消除發生通信所需的步驟。例如,必須先找到遠程對象位置,而且建立與遠程計算機的連接,然後才能將數據串列化為位元組流,然後可能進行加密,最後才能將其傳輸到遠程計算機。
在考慮網路性能時,必須同時考慮滯後時間和吞吐量。簡單地說,"滯後時間"描述了數據的首位元組到達目的地之前所經過的時間。"吞吐量"描述了在某個時間段(例如 1 秒)內通過網路發送的數據位元組數。在基於 IP 路由的現代網路(例如 Internet)中,滯後時間可以是比吞吐量更大的因素。這意味著,傳輸 10 位元組數據所用的時間可能幾乎等於傳輸 1,000 位元組數據所用的時間。在使用無連接協議(如 HTTP)時,此效果尤其明顯。通常,網路速度越快可以使吞吐量得以增加,但是,要減少滯後時間則會更加困難。
在設計對象介面時,好的做法是將大量信息隱藏在對象內,並提供一組細粒度方法來訪問和操作該信息。"細粒度"意味著每個方法都應該負責單個的、相當小的和基本的功能單位。此方法簡化了編程,並提供了對對象內部的更佳抽象,從而增加了重用的可能性。必須根據以下事實對此進行平衡取捨:使用較細粒度的方法意味著需要調用更多的方法才能執行高級別的任務。通常,在同一進程內調用方法時,這些額外函數調用的開銷是可接受的;但是,在跨進程和網路邊界調用這些方法時,開銷可能變得難以接受。
避免遠程調用中固有的滯後時間問題的最佳方法是進行更少的調用,並讓每個調用傳遞更多的數據。做到這一點的一種方法是,使用長參數列表來聲明遠程方法。這樣,客戶端就可以在單個調用中將更多的信息傳遞給遠程組件。但是,這樣做會使針對此介面的編程容易出錯,因為程序很可能僅按調用語句中的位置來調用外部方法的參數。例如,如果遠程方法接受 10 個字元串參數,則開發人員很容易按錯誤順序傳遞參數。編譯器將無法檢測到這樣的錯誤。
長參數列表無助於從遠程調用向客戶端返回更多的信息,因為大多數的編程語言將方法調用的返回類型限制為單個參數。而巧合的是,在傳輸大多數數據時通常需要返回較多信息。例如,許多用戶介面傳輸少量的信息,卻希望返回大量結果數據。
解決方案
創建一個數據傳輸對象 (DTO),用該對象包含遠程調用所需要的所有數據。修改遠程方法簽名,以便將 DTO 作為單個參數接受,並將單個 DTO 參數返回給客戶端。在調用方應用程序收到 DTO 並將其作為本地對象存儲之後,應用程序可以分別對 DTO 發出一系列單獨的過程調用,而不會引發遠程調用開銷。Martin Fowler 在 Patterns of Enterprise Application Architecture [Fowler03] 中對此模式進行了說明。
下圖顯示客戶端應用程序如何進行一系列遠程調用以檢索客戶名稱的各個元素。
圖 1:沒有 DTO 的遠程調用
DTO 允許遠程對象在單個遠程調用中將整個客戶名稱返回給客戶端。在此示例中,這樣做將使調用次數從 4 次減為 1 次。客戶端進行單個調用,然後在本地與 DTO 交互,而不用進行多次遠程調用(見圖 2)。
圖 2:通過使用 DTO 減少調用次數
DTO 是一組需要跨進程或網路邊界傳輸的聚合數據的簡單容器。它不應該包含業務邏輯,並將其行為限制為諸如內部一致性檢查和基本驗證之類的活動。注意,不要因實現這些方法而導致 DTO 依賴於任何新類。
在設計數據傳輸對象時,您有兩種主要選擇:使用一般集合;或使用顯式的 getter 和 setter 方法創建自定義對象。
一般集合的優點是,只需要一個類,就可以在整個應用程序中滿足任何數據傳輸目的。此外,集合類(例如,簡單數組或散列圖)內置於幾乎所有語言庫中,因此您根本不必編寫新類的代碼。對 DTO 使用集合對象的主要缺點是,客戶端必須按位置序號(在簡單數組的情況下)或元素名稱(在鍵控集合的情況下)訪問集合內的欄位。此外,集合存儲的是同一類型(通常是最一般的 Object 類型)的項目,這可以導致在編譯時無法檢測到的微妙但致命的編碼錯誤。
如果為每個 DTO 創建自定義類,則可以提供與任何其他對象完全一樣的、客戶端應用程序可訪問的強類型對象,這樣的對象可以提供編譯時檢查,並支持代碼編輯器功能(如 Microsoft® IntelliSense® 技術)。主要缺點是,如果應用程序發出許多遠程調用,則您最終可能必須編寫大量類的代碼。
許多方法試圖將這兩種方法的優點結合在一起。第一種方法是代碼生成技術,該技術可以生成脫離現有元數據(如可擴展標記語言 (XML) 架構)的自定義 DTO 類的源代碼。第二種方法是提供更強大的集合,盡管它是一般的集合,但它將關系和數據類型信息與原始數據存儲在一起。Microsoft ADO.NET DataSet 支持這兩種方法(請參閱在 .NET 中使用 DataSet 實現 Data Transfer Object)。
有了 DTO 類以後,需要用數據填充它。大多數情況下,DTO 內的數據來自多個域對象。因為 DTO 沒有行為,因此它不能從域對象提取數據。這是對的,因為如果讓 DTO 不知道域對象,您就可以在不同的上下文中重用 DTO。同樣,您不希望域對象知道 DTO,因為這可能意味著更改 DTO 將要求更改域邏輯中的代碼,這將導致大量維護任務。
最佳的解決方案是使用 Assembler 模式 [Fowler03],該模式可以用業務對象創建 DTO 或者相反。Assembler 是 Mapper 模式的專門實例,在 Patterns of Enterprise Application Architecture [Fowler03] 中也提到過它。
圖 3:使用 Assembler 將數據載入到 DTO 中
Assembler 的關鍵特徵是 DTO 和域對象不相互依賴。這就消除了這兩種對象的相互影響。不利方面是 Assembler 同時依賴於 DTO 和域對象。對這些類的任何更改都可能導致必須更改 Assembler 類。
示例
請參閱在 .NET 中使用 DataSet 實現 Data Transfer Object。
測試考慮事項
DTO 是簡單對象,它不應該包含需要測試的任何業務邏輯。但是,您確實需要測試每個 DTO 的數據聚合。每個 DTO 可能需要測試,也可能不需要,這取決於您的序列化機制。如果序列化是框架的一部分,則只需要測試一個 DTO。如果不是這樣,請使用一般的反射機制,這樣就不需要測試每個 DTO 的序列化。
DTO 還對遠程函數的可測試性有好處。通過使遠程方法的結果能夠在對象實例中使用,可以輕松地將此數據傳遞到測試模塊,或將其與所需結果進行比較。
安全考慮事項
理想情況下,應該先篩選和驗證從不可靠的來源獲得的數據(如來自 Web 頁的用戶輸入),然後將其置於 DTO 中。通過這樣做,就可以認為 DTO 中的數據是相對安全的,從而簡化了將來與 DTO 的交互。
接收 DTO 的進程和關聯用戶的安全憑據也是值得注意的。DTO 通常包含從許多不同來源聚集在一起的大量信息。您是否已授權 DTO 的所有用戶訪問 DTO 所包含的所有信息?確保用戶已得到授權的最佳方法是僅使用用戶安全憑據所允許的特定數據填充 DTO。努力避免讓 DTO 負責自己的安全性。這將增加 DTO 對其他類的依賴數,這意味著必須將這些類部署到使用 DTO 的所有節點。這還會將安全性功能分散到更多類中,從而增大了安全風險,並對靈活性和可維護性產生負面影響。
結果上下文
Data Transfer Object 具有下列優缺點:
優點
減少了遠程調用次數。通過在單個遠程調用中傳輸更多的數據,應用程序可以減少遠程調用次數。
提高了性能。遠程調用可以使應用程序的運行速度大大降低。減少調用次數是提高性能的最佳方法之一。在大多數方案中,傳輸大量數據的遠程調用所用的時間與僅傳輸少量數據的調用所用的時間幾乎相等。
隱藏內部情況。在單個調用中來回傳遞更多的數據,還可以更有效地將遠程應用程序的內部情況隱藏在粗粒度介面的背後。這就是使用 Remote Facade 模式 [Fowler03] 的主要原因。
發現業務對象。在一些情況下,定義 DTO 有助於發現有意義的業務對象。在創建用作 DTO 的自定義類時,您通常會注意到作為一組凝聚性信息而顯示給用戶或另一個系統的元素分組。通常,這些分組用作描述應用程序所處理的業務域的對象的有用原型。
可測試性。將所有參數封裝到可序列化對象中可以提高可測試性。例如,可以從 XML 文件中讀取 DTO,並調用遠程函數以測試它們。同樣,可以輕松地將結果再序列化為 XML 格式,並將 XML 文檔與所需結果進行比較,而不必創建冗長的比較腳本。
缺點
可能需要太多的類。如果選擇了使用強類型的 DTO,則可能必須為每個遠程方法創建一個(如果考慮返回值,則為兩個)DTO。即使在粗粒度介面中,這也可能導致大量的類。編寫如此數量的類的代碼並管理這些類會是很困難的。使用自動代碼生成可以在一定程度上緩解此問題。
增加計算量。如果將伺服器上的一種數據格式轉換為可以跨網路傳輸的位元組流,並在客戶端應用程序內轉換回對象格式,可以帶來相當大的開銷。通常,需要將來自多個源的數據聚合到伺服器上的單個 DTO 中。要提高通過網路進行遠程調用的效率,必須在任一端執行其他計算,才能聚合和串列化信息。
增加編碼工作量。可以用一行代碼完成將參數傳遞到方法的操作。使用 DTO 要求實例化新對象,並為每個參數調用 setters 和 getters。編寫此代碼可能是很乏味的。