天天看點

跨域及RPC協定、SOA思想1.為什麼會出現跨域?2.什麼是跨域?3.實作跨域的幾種方式5. SOA思想5.3 SOA的主要好處5.4 什麼是可重用的服務?

1.為什麼會出現跨域?

在制定HTML規則時,為了安全的考慮,一個源的腳本(網頁、網站)不能與另一個源的資源進行互動,所有引發了同源政策。

同源:即指在同一個域,就是兩個頁面具有相同的協定、主機和端口号。

同源政策:它是一種約定,它是浏覽器最核心的也是最基本的安全功能,如果缺少了同源政策,則浏覽器的正常功能可能會受到影響。發起請求時,必須滿足 協定://域名:端口都相同(和目前頁面對比)時.滿足同源政策要求.浏覽器可以正确的發起請求,并且解析結果。

跨域及RPC協定、SOA思想1.為什麼會出現跨域?2.什麼是跨域?3.實作跨域的幾種方式5. SOA思想5.3 SOA的主要好處5.4 什麼是可重用的服務?

2.什麼是跨域?

當浏覽器解析ajax時,ajax發起請求的位址如果與目前頁面所在的位址違反同源政策時,則稱之為跨域(請求)。

3.實作跨域的幾種方式

3.1 JSONP

3.1.1 JSONP跨域實作原理

1).利用javascript中的src屬性實作跨域

2).自定義回調函數 function callback(){}

function hello(data){
		alert(data.name);
	}
           

3).将傳回值結果 進行特殊的格式封裝 callback(JSON資料)

3.1.2 jQuery實作JSONP跨域通路

3.1.2.1 編輯HTML頁面

<script type="text/javascript" src="http://manage.com/js/jquery-easyui-1.4.1/jquery.min.js"></script>
<script type="text/javascript">
	$(function(){
		alert("測試通路開始!!!!!")
		//網頁位置: www.jt.com/JSONP.html
		$.ajax({
			url:"http://manage.com/web/testJSONP",
			type:"get",				//jsonp隻能支援get請求  不支援post,因為src支援get
			dataType:"jsonp",       //dataType表示傳回值類型  如果是跨域通路,則必須添加jsonp
			//jsonp: "callback",    //指定參數名稱
			//jsonpCallback: "hello",  //指定回調函數名稱
			success:function (data){   //data經過jQuery封裝傳回就是json串
				alert(data.id);
				alert(data.name);
				//轉化為字元串使用
				//var obj = eval("("+data+")");
				//alert(obj.name);
			}	
		});	
	})
</script>
           

3.1.2.2 編輯JSONPController

@RestController
public class JSONPController {
	/**
	 * url:http://manage.jt.com/web/testJSONP?callback=jQuery111107990405330439474_1595323762313&_=1595323762314
	 * @return JSONPObject 專門負責封裝JSONP的傳回值結果的.
	 * 注意事項:  傳回值結果必須通過特殊的格式封裝    callback(JSON資料)
	 */
	@RequestMapping("/web/testJSONP")
	public JSONPObject jsonp(String callback) {
		//準備傳回資料
		User user = new User();
		user.setId(100L).setPassword("我是密碼");
		return new JSONPObject(callback, user);
	}
}
           

3.1.2.3 JSONP伺服器傳回值

跨域及RPC協定、SOA思想1.為什麼會出現跨域?2.什麼是跨域?3.實作跨域的幾種方式5. SOA思想5.3 SOA的主要好處5.4 什麼是可重用的服務?

3.2 CORS跨域

3.2.1 CORS跨域實作原理

說明:當下的主流的浏覽器天生都支援跨域,通過添加請求頭資訊,将源位址進行辨別,之後發往後端伺服器。

關鍵點: 跨域請求由浏覽器和伺服器共同完成,要求雙方都必須同意跨域才行。但是預設的條件下伺服器端是不允許跨域的,是以必須經過配置才行。

3.2.2 CORS實作跨域

//類似于web項目中使用的web.xml配置檔案
@Configuration
public class CorsConfig implements WebMvcConfigurer{
	
	/**
	 * 配置後端伺服器可以跨域的清單
	 * 參數說明:  addMapping:什麼樣的請求可以進行跨域   /web/**    /aaa/b/c/e/d/d/d
	 *          /*   比對一級目錄
	 *          /**  比對多級目錄   使用最多
	 */
	@Override
	public void addCorsMappings(CorsRegistry registry) {
		
		registry.addMapping("/**")
				.allowedOrigins("*")   //配置源 通配
				.allowedMethods("GET","POST","PUT","DELETE","HEAD") //允許的請求方式
				.allowCredentials(true)		//是否允許攜帶cookie
				.maxAge(1800);				//允許跨域的持續時間
	}
}
           

3.2.3 編輯ajax請求頁面

<script type="text/javascript" src="http://manage.jt.com/js/jquery-easyui-1.4.1/jquery.min.js"></script>
<script type="text/javascript">
	/*$(){}結構必然是jQuery函數類庫導入後才能正确執行*/
	$(function(){			   //正常
		alert("我要進行cors的跨域了!!!!");   //正常
		//利用jQuery發起AJAX請求
		$.get("http://manage.jt.com/web/testCors",function(data){
			alert(data.id);
			alert(data.password);
		})
	})
</script>
           

3.2.4 編輯CorsController

@RestController
public class CorsController {
	@RequestMapping("/web/testCors")
	public User testUser() {
		System.out.println("我執行了業務操作!!!");
		return new User().setId(100L).setPassword("我是cors的傳回值!!!!");
	}
}
           

3.2.5 檢視響應資訊

跨域及RPC協定、SOA思想1.為什麼會出現跨域?2.什麼是跨域?3.實作跨域的幾種方式5. SOA思想5.3 SOA的主要好處5.4 什麼是可重用的服務?

4. RPC遠端過程調用

4.1 什麼是RPC?

RPC(Remote Procedure Call Protocol)是遠端調用過程的簡寫,是一個協定,處于網絡通信協定的第五層:會話層,其下就是TCP/IP協定,在建立在其基礎上的通信會話協定。簡言之,RPC使得程式能夠像通路本地系統資源一樣,去通路遠端系統資源。

跨域及RPC協定、SOA思想1.為什麼會出現跨域?2.什麼是跨域?3.實作跨域的幾種方式5. SOA思想5.3 SOA的主要好處5.4 什麼是可重用的服務?

4.2 RPC架構元件

一個基本的RPC架構裡面應該至少包含以下4個元件:

1、用戶端(Client):服務調用方(服務消費者)

2、用戶端存根(Client Stub):存放服務端位址資訊,将用戶端的請求參數資料資訊打包成網絡消息,再通過網絡傳輸發送給服務端

3、服務端存根(Server Stub):接收用戶端發送過來的請求消息并進行解包,然後再調用本地服務進行處理

4、服務端(Server):服務的真正提供者

跨域及RPC協定、SOA思想1.為什麼會出現跨域?2.什麼是跨域?3.實作跨域的幾種方式5. SOA思想5.3 SOA的主要好處5.4 什麼是可重用的服務?

具體調用過程:

1、服務消費者(client用戶端)通過調用本地服務的方式調用需要消費的服務;

2、用戶端存根(client stub)接收到調用請求後負責将方法、入參等資訊序列化(組裝)成能夠進行網絡傳輸的消息體;

3、用戶端存根(client stub)找到遠端的服務位址,并且将消息通過網絡發送給服務端;

4、服務端存根(server stub)收到消息後進行解碼(反序列化操作);

5、服務端存根(server stub)根據解碼結果調用本地的服務進行相關處理;

6、本地服務執行具體業務邏輯并将處理結果傳回給服務端存根(server stub);

7、服務端存根(server stub)将傳回結果重新打包成消息(序列化)并通過網絡發送至消費方;

8、用戶端存根(client stub)接收到消息,并進行解碼(反序列化);

9、服務消費方得到最終結果;

而RPC架構的實作目标則是将上面的第2-10步完好地封裝起來,也就是把調用、編碼/解碼的過程給封裝起來,讓使用者感覺上像調用本地服務一樣的調用遠端服務。

4.3 RPC實作原理架構圖

跨域及RPC協定、SOA思想1.為什麼會出現跨域?2.什麼是跨域?3.實作跨域的幾種方式5. SOA思想5.3 SOA的主要好處5.4 什麼是可重用的服務?
跨域及RPC協定、SOA思想1.為什麼會出現跨域?2.什麼是跨域?3.實作跨域的幾種方式5. SOA思想5.3 SOA的主要好處5.4 什麼是可重用的服務?

4.4 RPC使用了哪些關鍵技術?

1、動态代理

生成Client Stub(用戶端存根)和Server Stub(服務端存根)的時候需要用到Java動态代理技術,可以使用JDK提供的原生的動态代理機制,也可以使用開源的:CGLib代理,Javassist位元組碼生成技術。

2、序列化和反序列化

在網絡中,所有的資料都将會被轉化為位元組進行傳送,是以為了能夠使參數對象在網絡中進行傳輸,需要對這些參數進行序列化和反序列化操作。

序列化:把對象轉換為位元組序列的過程稱為對象的序列化,也就是編碼的過程。

反序列化:把位元組序列恢複為對象的過程稱為對象的反序列化,也就是解碼的過程。

目前比較高效的開源序列化架構:如Kryo、FastJson和Protobuf等。

3、NIO通信

出于并發性能的考慮,傳統的阻塞式 IO 顯然不太合适,是以我們需要異步的 IO,即 NIO。Java 提供了 NIO 的解決方案,Java 7 也提供了更優秀的 NIO.2 支援。可以選擇Netty或者MINA來解決NIO資料傳輸的問題。

4、服務注冊中心

可選:Redis、Zookeeper、Consul 、Etcd。一般使用ZooKeeper提供服務注冊與發現功能,解決單點故障以及分布式部署的問題(注冊中心)

4.5 RPC的實作基礎

1、需要有非常高效的網絡通信,比如一般選擇Netty作為網絡通信架構;

2、需要有比較高效的序列化架構,比如谷歌的Protobuf序列化架構;

3、可靠的尋址方式(主要是提供服務的發現),比如可以使用Zookeeper來注冊服務等等;

4、如果是帶會話(狀态)的RPC調用,還需要有會話和狀态保持的功能。

4.6 RPC的架構需要解決的問題

1、如何确定用戶端和服務端之間的通信協定?

2、如何更高效地進行網絡通信?

3、服務端提供的服務如何暴露給用戶端?

4、用戶端如何發現這些暴露的服務?

5、如何更高效地對請求對象和響應結果進行序列化和反序列化操作?

參考下篇部落格,Dubbo基礎及原理。

5. SOA思想

SOA(Service-Oriented Architecture),即面向服務的架構。它将應用程式的不同功能單元(稱為服務)進行拆分,并通過這些服務之間定義良好的接口和協定聯系起來。接口是采用中立的方式進行定義的,它應該獨立于實作服務的硬體平台、作業系統和程式設計語言。這使得構件在各種各樣的系統中的服務可以以一種統一和通用的方式進行互動。

跨域及RPC協定、SOA思想1.為什麼會出現跨域?2.什麼是跨域?3.實作跨域的幾種方式5. SOA思想5.3 SOA的主要好處5.4 什麼是可重用的服務?

5.1 什麼是SOA的服務?

所有的服務是自包含的,合乎邏輯。他們就像黑盒子。總之,我們并不需要了解業務服務的内部工作細節。對于外部世界,它隻是一個能夠使用消息互動的黑盒子。例如在“支付網關”業務服務獲得消息“檢查信貸”後會給出輸出:這個客戶的信貸有或沒有。對于“訂單系統”,“支付網關”的服務是一個黑盒子。

5.2 SOA服務的主要特點

A) SOA元件是松耦合的。當我們說松耦合,這意味着每一個服務是自包含單獨存在的邏輯。舉例來說,我們采取了“支付網關”的服務,并将它附加到不同的系統。

B) SOA服務是黑匣子。在SOA中,服務隐藏有内在的複雜性。他們隻使用互動消息,服務接受和發送消息。通過虛拟化一個服務為黑盒子,服務變得更松散的耦合。

C) SOA服務應該是自定義: SOA服務應該能夠自己定義。

D) SOA服務維持在一個清單中: SOA服務保持在一個中央存儲庫。應用程式可以在中央存儲庫中搜尋服務,并調用相應服務。

E) SOA服務可以編排和連結實作一個特定功能: SOA服務可以使用了即插即用的方式。例如,“業務流程”中有兩個服務“安全服務”和“訂單處理服務” 。從它的業務流程可以實作兩種類型:一,您可以先檢查使用者,然後處理訂單,或反之亦然。是的,你猜對了,使用SOA可以松散耦合的方式管理服務之間的工作流。

5.3 SOA的主要好處

SOA有助于建立IT和業務線之間的無縫對接,通過産生更多的 IT靈活性,以支援更大的業務靈活性。您的業務流程變化越來越快以及全球劇烈競争需要SOA能夠提供高的靈活性。 SOA能夠幫助您更好地重用現有的IT投資和服務。 SOA通過定義服務之間良好接口更易于內建。 SOA還提供了業務夥伴,客戶和供應商的服務內建到一個企業的業務流程體系結構模型中。這降低了成本,提高了客戶滿意度。

5.4 什麼是可重用的服務?

服務是一個自主的,可重複使用的,可發現的,無狀态的,有一定粒度的功能,并且是一個複合應用程式或一個組合服務的一部分。

可重複使用的服務通過業務活動辨別,這個業務活動是使用服務規範(設計時合同)描述的。

一個服務限制是,包括安全性,QoS,SLA,使用政策,可以由多個運作時的合同 多個接口(WSDL中的Web服務)以及多個實作(代碼)定義的。

可重複使用的服務應在被管制在其從設計到運作整個企業級生命周期。其重用應通過規範流程來推動,重用應該是可測量的。