jsp調用controller方法_RPC調用_服務注冊與發現

RPC調用_單體架構_SOA架構

系統架構的演變

1 傳統的單體架構

1.1 什么是單體架構

一個歸檔包(例如 war 格式或者 Jar 格式)包含了應用所有功能的應用程序,我們通常稱之 為單體應用。也稱之為單體應用架構,這是一種比較傳統的架構風格。

903ff23387c60e38c181b03fa37645af.png

1.2 單體架構優點

便于開發:只需借助 IDE 的開發,調試功能即可完成 易于測試:只需要通過單元測試或瀏覽器即可完成測試 易于部署:打包成單一可執行 jar 或者 war 包,完成 jar 或者 war 部署即可

1.3 單體架構缺點

復雜性高:整個項目包含的模塊非常多,模塊的邊界模糊,依賴關系不清晰,代碼質量參差 不齊,整個項目非常復雜,修改一個 BUG 都會造成隱含的缺陷。

部署速度逐漸變慢:隨著代碼的增加,構建和部署的時間也會增加。而在單體應用中,每次 功能的變更或缺陷的修復都會導致我們需要重新部署整個應用。

擴展能力受限:單體應用只能作為一個整體進行擴展,無法結合業務模塊的特點進行伸縮。

阻礙技術創新: 單體應用往往使用統一的技術平臺或方案解決所有問題,團隊的每個成員都 必須使用相同的開發語言和架構,想要引入新的框架或技術平臺非常困難。

2SOA 架構(重點理解)

2.1 什么是 SOA 架構

SOA 是 Service-Oriented Architecture 的英文縮寫,就是面向服務的架構。這里的服務可以理 解為 service 層業務服務。將系統拆分為不同的服務單元,通過網絡協議服務單元之間進行 通信。服務單元完成一個特定功能(如:驗證、支付、登錄等等),通過服務單元之間的集成 組成完整的應用程序。

SOA 架構中由兩個重要的角色:

服務提供者(Provider)和服務使用者(Consumer)

ec8f55656fb66b2669a0f08b09f659e9.png

2.2SOA 架構的優點

更易維護:業務服務提供者和業務服務使用者的松散耦合關系。當需求發生變化的時候,不 需要修改提供業務服務的接口,只需要調整業務服務流程或者修改操作即可,整個應用系統 也更容易被維護。

更高的可用性:該特點是在于服務提供者和服務使用者的松散耦合關系上得以發揮與體現。 使用者無須了解提供者的具休實現細節。

更好的伸縮性:依靠業務服務設計、開發和部署等所采用的架構模型實現伸縮性。使得服務 提供者可以互相彼此獨立地進行調整,以滿足新的服務需求。

2.3SOA 架構的缺點

減低了系統的性能

系統之間交互需要使用遠程通信,接口開發增加工作量

3 什么是 RPC 調用

RPC(Remote Procedure Call)—遠程過程調用,它是一種通過網絡從遠程計算機程序上請求 服務,而不需要了解底層網絡技術的協議。請求程序就是一個客戶機,而服務提供程序就是 一個服務器

841aabebe3f5c0baf97b25a9fa506b57.png

4 RPC 的應用場景

支付寶、微信、銀聯等第三方支付接入

bcc8cff561c58e5ad43846ec9bdba859.png

公司內部的不同業務系統,不同技術平臺的整合

cbed26bf3ce0a5f121ff8c9c2f1d24c9.png

5 RPC 的實現方式

RMI:Java 提供的基于 java 平臺 RPC 遠程調用技術,服務消費者和服務提供者是 java 平臺

16c5c8e331ab99ee273f91d818ff6069.png

WEBSERVICE:通過 Http 協議,請求發送 xml 和響應 xml 的 RPC 遠程調用技術,最大的特征使用 xml 進行數據交互,可以實現跨平臺調用。

f45fad3f6df1eec12982b644bc3a2646.png

HttpClient:Http 客戶端工具,Java 程序通過 HttpClient 發送 Http 協議的請求,直接獲得遠程 資源

54a09461169f76cbdb6e49dbbf17927c.png

1d155b7e237e359a6e81aee60323cb23.png

HttpClient 實現 RPC 調用

1、HttpClient 介紹 HTTP 協議可能是現在 Internet 上使用得最多、最重要的協議了,越來越多的 Java 應用程 序需要直接通過 HTTP 協議來訪問網絡資源。 HttpClient 是 Apache Jakarta Common 下的子項目,供高效的、最新的、功能豐富的支持 HTTP 協議的客戶端編程工具包。實現了所有 HTTP 的方法(GET,POST,PUT,HEAD 等)支持 RestFul。

2、服務提供者實現

2.1 業務需求說明

實現:通過用戶系統訪問訂單系統,獲得某個用戶的訂單信息。

ae67dbe744b60ccb1ba129cc34c7ae8d.png

2.2 創建 order-sys 項目

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.bjsxt.provider</groupId><artifactId>order-sys</artifactId><version>0.0.1-SNAPSHOT</version><packaging>war</packaging><properties><!-- spring 依賴 --><spring.version>4.3.18.RELEASE</spring.version><jstl.version>1.2</jstl.version><servlet-api.version>2.5</servlet-api.version><jsp-api.version>2.0</jsp-api.version><jackson.version>2.9.0</jackson.version></properties><dependencies><!-- jsp相關依賴 --><!-- servlet依賴 --><!-- jstl依賴 --><dependency><groupId>jstl</groupId><artifactId>jstl</artifactId><version>${jstl.version}</version></dependency><dependency><groupId>javax.servlet</groupId><artifactId>servlet-api</artifactId><version>${servlet-api.version}</version><scope>provided</scope></dependency><dependency><groupId>javax.servlet</groupId><artifactId>jsp-api</artifactId><version>${jsp-api.version}</version><scope>provided</scope></dependency><!-- springmvc依賴--><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>${spring.version}</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>${jackson.version}</version></dependency></dependencies><build><finalName>order</finalName><plugins><!-- 配置Tomcat插件 --><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.2</version><configuration><path>/order</path><port>7070</port></configuration></plugin></plugins></build>
</project>

2.3 創建 Order 訂單實體類

package com.bjsxt.domain;/**** 訂單的實體類* @author Administrator**/
public class Order {private String id;private Double total;private String date;public String getId() {return id;}public void setId(String id) {this.id = id;}public Double getTotal() {return total;}public void setTotal(Double total) {this.total = total;}public String getDate() {return date;}public void setDate(String date) {this.date = date;}}

3.4 創建 OrderController

package com.bjsxt.controller;import java.util.ArrayList;
import java.util.List;import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;import com.bjsxt.domain.Order;@Controller
public class OrderController {/*** 接收http請求,響應訂單集合* **/@RequestMapping("/loadOrderList")public String loadOrderList(String uid,Model model){Order o1=new Order();o1.setId("111");o1.setTotal(123.0);o1.setDate("2018-10-10");Order o2=new Order();o2.setId("222");o2.setTotal(1232.0);o2.setDate("2018-10-13");Order o3=new Order();o3.setId("333");o3.setTotal(333.0);o3.setDate("2018-10-31");List<Order> list = new ArrayList<>();list.add(o1);list.add(o2);list.add(o3);model.addAttribute("list", list);return "index.jsp";}/*** 接收http請求,響應訂單集合,完成的是異步響應* 將List集合序列化為json串響應* **/@RequestMapping("/loadOrderList02")@ResponseBodypublic List<Order> loadOrderList02(String uid){System.out.println("uid="+uid);Order o1=new Order();o1.setId("111");o1.setTotal(123.0);o1.setDate("2018-10-10");Order o2=new Order();o2.setId("222");o2.setTotal(1232.0);o2.setDate("2018-10-13");Order o3=new Order();o3.setId("333");o3.setTotal(333.0);o3.setDate("2018-10-31");List<Order> list = new ArrayList<>();list.add(o1);list.add(o2);list.add(o3);return list;}
}

2.5 配置 springmvc.xml

<?xml version="1.0" encoding="UTF-8"?>-<beans xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context" xmlns="http://www.springframework.org/schema/beans"><!-- 掃描controller --><context:component-scan base-package="com.bjsxt.controller"/><mvc:annotation-driven/></beans>

2.6 配置 web.xml

 <?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://java.sun.com/xml/ns/javaee"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"version="2.5"><display-name>order</display-name><welcome-file-list><welcome-file>index.html</welcome-file><welcome-file>index.htm</welcome-file><welcome-file>index.jsp</welcome-file><welcome-file>default.html</welcome-file><welcome-file>default.htm</welcome-file><welcome-file>default.jsp</welcome-file></welcome-file-list><servlet-mapping><servlet-name>default</servlet-name><url-pattern>/favicon.ico</url-pattern></servlet-mapping><!-- 以監聽器的方式啟動spring容器 --><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener><!-- 指定spring的配置文件 --><context-param><param-name>contextConfigLocation</param-name><param-value>classpath:applicationContext-*.xml</param-value></context-param><!-- POST請求的亂碼過濾器 --><filter><filter-name>encodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><!-- 指定編碼方式 --><init-param><param-name>encoding</param-name><param-value>utf-8</param-value></init-param></filter><!-- 映射filter --><filter-mapping><filter-name>encodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping><!-- springmvc的servlet --><servlet><servlet-name>springmvc</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><!-- 指定springmvc的配置文件 --><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:springmvc.xml</param-value></init-param><!-- 讓springmvc隨系統啟動而啟動 --><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>springmvc</servlet-name><url-pattern>/</url-pattern></servlet-mapping>
</web-app>

2.7 啟動 order-sys 項目

3 服務消費者實現

3.1 創建 user-sys 項目

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.bjsxt.consumer</groupId><artifactId>user-sys</artifactId><version>0.0.1-SNAPSHOT</version><!-- 添加httpClient依賴 --><dependencies><dependency><groupId>org.apache.httpcomponents</groupId><version>4.3.5</version><artifactId>httpclient</artifactId></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.47</version></dependency></dependencies></project> 

3.2 拷貝 Order 訂單實體類

3.3 創建測試類

package com.sxt.test.client;import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;import org.apache.http.Header;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;import com.alibaba.fastjson.JSON;
import com.sxt.domain.Order;public class TestHttpClient {public static void main(String[] args) throws ClientProtocolException, IOException {/*** 啟動消費者進行服務的消費*///創建NameValuePair對象,封裝發送服務提供者的 信息NameValuePair id = new BasicNameValuePair("uid", "1001");/*NameValuePair id1 = new BasicNameValuePair("uid1", "1001");NameValuePair id2 = new BasicNameValuePair("uid2", "1001");*/List<NameValuePair> list = new ArrayList<>();list.add(id);//發送遠程的http請求的地址String url="http://localhost:7070/order/loadOrderList01";//創建HttpClient客戶端對象HttpClient  client = HttpClients.createDefault();//創建httpPost對象,發送post請求HttpPost post = new HttpPost(url);//封裝請求體post.setEntity(new UrlEncodedFormEntity(list,"UTF-8"));//發送具體的http請求HttpResponse response = client.execute(post);//獲取響應頭消息Header[] headers = response.getAllHeaders();for (Header header : headers) {System.out.println(header.getName()+"-----"+header.getValue());}//獲取服務提供者提供的具體數據HttpEntity entity = response.getEntity();//獲取http的響應體InputStream content = entity.getContent();int length = 0;char [] buf= new char[1024];//將字節流轉換為字符流InputStreamReader is = new InputStreamReader(content);//創建StringBufferStringBuffer sb = new StringBuffer();while((length = is.read(buf))!=-1){sb.append(String.valueOf(buf, 0, length));}System.out.println(sb);//將sb,json字符串轉換為order集合List<Order> list1 = JSON.parseArray(sb.toString(), Order.class);for (Order o :list1 ) {System.out.println(o.getId()+"t"+o.getDate()+"t"+o.getTotal());}}
}

使用 Spring 提供的 restTemplate 完成 Http 服務消費

2RestTemplate 介紹 RestTemplate 是 Spring 提供的用于訪問 Rest 服務的客戶端,RestTemplate 提供了多種便捷訪 問遠程 Http 服務的方法,能夠大大提高客戶端的編寫效率。

3 服務消費者實現

3.1 業務需求說明

實現:通過紅包系統訪問訂單系統,獲得某個用戶的訂單信息,派發紅包.

0dd00e65175d39ae2647aefce544c35a.png

3.2 創建 red-sys 項目

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.bjsxt.red.consumer</groupId><artifactId>red-sys</artifactId><version>0.0.1-SNAPSHOT</version><packaging>war</packaging><properties><!-- spring 依賴 --><spring.version>4.3.18.RELEASE</spring.version><jstl.version>1.2</jstl.version><servlet-api.version>2.5</servlet-api.version><jsp-api.version>2.0</jsp-api.version><jackson.version>2.9.0</jackson.version></properties><dependencies><!-- jsp相關依賴 --><!-- servlet依賴 --><!-- jstl依賴 --><dependency><groupId>jstl</groupId><artifactId>jstl</artifactId><version>${jstl.version}</version></dependency><dependency><groupId>javax.servlet</groupId><artifactId>servlet-api</artifactId><version>${servlet-api.version}</version><scope>provided</scope></dependency><dependency><groupId>javax.servlet</groupId><artifactId>jsp-api</artifactId><version>${jsp-api.version}</version><scope>provided</scope></dependency><!-- springmvc依賴--><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>${spring.version}</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>${jackson.version}</version></dependency></dependencies><build><finalName>red</finalName><plugins><!-- 配置Tomcat插件 --><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.2</version><configuration><path>/red</path><port>8080</port></configuration></plugin></plugins></build>
</project>

3.3 拷貝 Order 訂單實體類

拷貝 order-sys 中的實體類

3.4 創建 RedController 類

package com.sxt.controller;import java.util.Arrays;
import java.util.List;
import java.util.Map.Entry;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.annotation.Order;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.client.RestTemplate;
import org.w3c.dom.Entity;@Controller
public class RedController {//注入由spring提供的RestTemplate對象@Autowiredprivate RestTemplate  restTemplate;/*** 發送遠程的http請求,消費http服務* 獲取訂單的集合*/@RequestMapping("/loadOnList01")@ResponseBodypublic List<Order> loadOrderList01(String  uid){//發送到遠程服務的urlString url = "http://localhost:7070/order/loadOrderList01";//發送到遠程服務的參數MultiValueMap<String, Object> params = new LinkedMultiValueMap<String, Object>();params.add("uid", uid);//通過restTemplate對象發送post請求Order[] orders = restTemplate.postForObject(url, params,Order[].class);//轉換為listreturn Arrays.asList(orders);}@RequestMapping("/loadOnList02")@ResponseBodypublic List<Order> loadOrderList02(String  uid){//發送到遠程服務的urlString url = "http://localhost:7070/order/loadOrderList02";//發送到遠程服務的參數MultiValueMap<String, Object> params = new LinkedMultiValueMap<String, Object>();params.add("uid", uid);//通過restTemplate對象發送post請求ResponseEntity<Order[]> entity = restTemplate.postForEntity(url, params,Order[].class);//get方式//restTemplate.getForEntity(url, responseType, uriVariables);//restTemplate.getForObject(url, params, uriVariables)//獲得響應頭信息HttpHeaders headers = entity.getHeaders();for (Entry<String, List<String>> e :headers.entrySet()) {System.out.println(e.getKey()+e.getValue());	}  //獲取響應狀態碼int statusCode = entity.getStatusCodeValue();System.out.println(statusCode);//獲得遠程服務的響應體Order[] orders = entity.getBody();return Arrays.asList(orders);}
}

3.5 配置 springmvc.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc.xsd"><!-- 掃描controller --><context:component-scan base-package="com.sxt.controller" /><mvc:annotation-driven></mvc:annotation-driven><!-- 實例化RestTemplate對象 --><bean id="restTemplate" class="org.springframework.web.client.RestTemplate"></bean>
</beans>

3.6 配置 web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://java.sun.com/xml/ns/javaee"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"version="2.5"><display-name>red</display-name><welcome-file-list><welcome-file>index.html</welcome-file><welcome-file>index.htm</welcome-file><welcome-file>index.jsp</welcome-file><welcome-file>default.html</welcome-file><welcome-file>default.htm</welcome-file><welcome-file>default.jsp</welcome-file></welcome-file-list><servlet-mapping><servlet-name>default</servlet-name><url-pattern>/favicon.ico</url-pattern></servlet-mapping><!-- 以監聽器的方式啟動spring容器 --><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener><!-- 指定spring的配置文件 --><context-param><param-name>contextConfigLocation</param-name><param-value>classpath:applicationContext-*.xml</param-value></context-param><!-- POST請求的亂碼過濾器 --><filter><filter-name>encodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><!-- 指定編碼方式 --><init-param><param-name>encoding</param-name><param-value>utf-8</param-value></init-param></filter><!-- 映射filter --><filter-mapping><filter-name>encodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping><!-- springmvc的servlet --><servlet><servlet-name>springmvc</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><!-- 指定springmvc的配置文件 --><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:springmvc.xml</param-value></init-param><!-- 讓springmvc隨系統啟動而啟動 --><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>springmvc</servlet-name><url-pattern>/</url-pattern></servlet-mapping>
</web-app>

3.7 啟動 order-sys

3.8 啟動訪問 red-sys


RPC跨域問題

1、Ajax 跨域介紹

跨域,指的是瀏覽器不能執行其他網站的腳本。它是由瀏覽器的同源策略造成的,是瀏覽器 對 JavaScript 施加的安全限制。

6ebb5900c0ba1ace7acb07d7f2d299d9.png

3Ajax 跨域問題

3.1 建立 ajax-origin 項目

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.sxt</groupId><artifactId>ajax-origin</artifactId><version>0.0.1-SNAPSHOT</version><packaging>war</packaging><properties><!-- spring 依賴 --><spring.version>4.3.18.RELEASE</spring.version><jstl.version>1.2</jstl.version><servlet-api.version>2.5</servlet-api.version><jsp-api.version>2.0</jsp-api.version><jackson.version>2.9.0</jackson.version></properties><dependencies><!-- jsp相關依賴 --><!-- servlet依賴 --><!-- jstl依賴 --><dependency><groupId>jstl</groupId><artifactId>jstl</artifactId><version>${jstl.version}</version></dependency><dependency><groupId>javax.servlet</groupId><artifactId>servlet-api</artifactId><version>${servlet-api.version}</version><scope>provided</scope></dependency><dependency><groupId>javax.servlet</groupId><artifactId>jsp-api</artifactId><version>${jsp-api.version}</version><scope>provided</scope></dependency></dependencies><build><finalName>ajax</finalName><plugins><!-- 配置Tomcat插件 --><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.2</version><configuration><path>/ajax</path><port>9090</port></configuration></plugin></plugins></build>
</project>

3.2 發送 Ajax 請求

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
<script type="text/javascript" src="https://code.jquery.com/jquery-1.11.3.js"></script>
<script type="text/javascript">function  sendAjax(){/* $.post("http://localhost:7070/order/loadOrderList02","uid=1234",function(data){alert(data);}); */$.getJSON("http://localhost:7070/order/loadOrderList03?callback=?","uid=1234",function(data){var str = JSON.stringify(data);alert(str);});}function  doCallback(data){//將json對象轉換為字符串var str = JSON.stringify(data);alert(str);}
</script>
</head>
<body><a href="javascript:sendAjax()">sendAjax</a><script src="http://localhost:7070/order/loadOrderList03?uid=9999&callback=doCallback"></script>
</body>
</html>

4Ajax 跨域解決方案

4.1 服務器段解決

服務端設置 response header 中 Access-Control-Allow-Origin 字段 ,服務器段,使用 CORSFilter 過濾器解決跨域問題

通過 CORSFilter 過濾器在服務器端修改 Http 的響應頭 Access-Control-Allow-Origin: * Access-Control-Allow-Origin: http://example.com:8080/

修改 order-sys 項目

(1)添加 CORSFilter 依賴

<dependency><groupId>com.thetransactioncompany</groupId><artifactId>cors-filter</artifactId><version>2.5</version><scope>runtime</scope></dependency>

(2) web.xml 配置 CORSFilter

<filter-name>CORS</filter-name>  <filter-class>com.thetransactioncompany.cors.CORSFilter</filter-class>  <init-param>  <param-name>cors.allowOrigin</param-name>  <param-value>*</param-value>  </init-param>  <init-param>  <param-name>cors.supportedMethods</param-name>  <param-value>GET, POST, HEAD, PUT, DELETE</param-value>  </init-param>  <init-param>  <param-name>cors.supportedHeaders</param-name>  <param-value>Accept, Origin, X-Requested-With, Content-Type, Last-Modified</param-value>  </init-param>  <init-param>  <param-name>cors.exposedHeaders</param-name>  <param-value>Set-Cookie</param-value>  </init-param>  <init-param>  <param-name>cors.supportsCredentials</param-name>  <param-value>true</param-value>  </init-param>  
</filter>  <filter-mapping>  <filter-name>CORS</filter-name>  <url-pattern>/*</url-pattern>  
</filter-mapping>  

4.2 前端 JSONP 解決

利用 script 標簽,不受同源策略的限制,用戶從服務請求數據,服務器返回一個帶有方法和數據 的 js 代碼。

在 js 中,我們直接用 XMLHttpRequest 請求不同域上的數據時,是不可以的。但是,在頁面 上引入不同域上的 js 腳本文件卻是可以的,jsonp 正是利用這個特性來實現的。

例如: <script src="https://code.jquery.com/jquery-1.12.4.js"></script>

從不同域的服務器直接請求 js 代碼,jsonp 就是通過獲得不同域的服務器上的 js 代碼(js 代碼 中包含一個在本地定義的 js 函數和需要獲得數據),來獲得不同域的數據。

3 修改 order-sys 項目

3.1 注釋 web.xml 中 CORSFilter 配置

3.2 添加 fastjson 依賴

<!-- fastjson --><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.47</version></dependency></dependencies>

3.3 修改 OrderController 類

Controller 添加一個接收遠程 ajax 請求的方法,該方法后一個接收回調函數的參數.

   /*** 接收json請求,響應js的字符串到客服端* @param uid* @param callback* @return*/@RequestMapping("/loadOrderList03")@ResponseBodypublic String loadOrderList03(String uid,String callback){Order order1 = new Order();order1.setId("111");order1.setTotal(123.0);order1.setDate("2018-10-01");Order order2 = new Order();order2.setId("222");order2.setTotal(1213.0);order2.setDate("2018-10-21");Order order3 = new Order();order3.setId("333");order3.setTotal(1233.0);order3.setDate("2018-10-31");List<Order> list = new ArrayList<>();list.add(order1);list.add(order2);list.add(order3);//函數名+函數的實參String result = callback+"("+JSON.toJSONString(list)+")";return result;}

3.4 啟動 order-sys 項目

4 修改 ajax-origin 項目 4.1 導入 juqery 函數庫

<script type="text/javascript" src="https://code.jquery.com/jquery-1.11.3.js"></script>

4.2 發送請求

利用<script src="url?callback=doSomething"></script>發送請求

<script src="http://localhost:7070/order/loadOrderList03?uid=9999&callback=doCallback"></script>

4.3 定義 callback 回調函數

function  doCallback(data){//將json對象轉換為字符串var str = JSON.stringify(data);alert(str);}

5jquery 對 jsonp 支持

function  sendAjax(){/* $.post("http://localhost:7070/order/loadOrderList02","uid=1234",function(data){alert(data);}); */$.getJSON("http://localhost:7070/order/loadOrderList03?callback=?","uid=1234",function(data){var str = JSON.stringify(data);alert(str);});}

RPCRMI服務集群部署_消費_服務注冊和發現

目標:理解服務的集群部署

理解服務發現

1.1 服務單機部署

將某個應用服務,部署到一臺服務器,所有服務消費者的并發訪問都發送到一臺服務器.

11f9c420b0a49843f1b39cc32487cd7d.png

在系統業務的發展,不露出相應的問題: 高并發訪問題: 會出現系統資源不夠用(帶寬,cpu,內存)等等 系統的單節點故障: 當單節點服務器出現宕機故障的時候,會出現服務訪問沒法訪問的 問

1.2 服務的集群部署

將某個應用服務部署到,同時部署到 n 個服務器節點,由 n 個服務器節點對外提供相同服務. 同時可以提供備用節點服務器.

e134781121d6406ea1c209a3c4c25919.png

通過集群部署的方式可以解決,服務的高并發訪問和單節點故障問題: 高并發訪問: 通過特定的負載均衡(Load Balance)算法,將并發訪問的請求,分發到不同節點的服務器進行處理,以將每一臺服務器的負載壓力,實現負載均衡。

單節點故障: 當實現服務集群部署的時候,單個服務器節點宕機,可以由其他正常的服務器節點,正 常向外提供服務,不會出現服務的不可訪問問題,實現服務的(HA)高可用

3RMI 模擬服務器集群部署

3.1 發布集群服務

啟動程序三次,每次啟動修改端口號,實現服務的集群部署

3.2RMI 消費集群服務

package com.sxt.app;import java.rmi.Naming;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ThreadLocalRandom;import com.sxt.service.UserService;public class consumerApp {public static void main(String[] args) {List<String> urls = new ArrayList<String>();urls.add("rmi://localhost:7777/rmi");urls.add("rmi://localhost:8888/rmi");urls.add("rmi://localhost:9999/rmi");String url = null;try {while(true){//通過隨機的負載均衡算法,產生隨機的訪問地址int index = ThreadLocalRandom.current().nextInt(urls.size());url = urls.get(index);UserService  service = (UserService)Naming.lookup(url);System.out.println("獲取的遠程服務的代理對象:"+service.getClass().getName());			//通過遠程服務的代理對象代用遠程代理方法String result = service.helloRmi("///"+url+"--------------rmi");System.out.println("result"+result);Thread.sleep(3000);}} catch (Exception e) {urls.remove(url);			e.printStackTrace();}}
}

4、 服務注冊與發現

9c6dd6b49802d81f2642b1461eee7a4a.png

(0)服務容器負責啟動,加載,運行服務提供者。

(1)服務提供者在啟動時,向注冊中心注冊自己提供的服務 URL。

(2)服務消費者在啟動時,向注冊中心訂閱自己所需的服務。

(3)注冊中心返回服務提供者地址列表給消費者,如果有變更,注冊中心將基于長連接推送 變更數據給消費者。

(4)服務消費者,從提供者地址列表中,基于軟負載均衡算法,選一臺提供者進行調用,如 果調用失敗,再選另一臺調用。

讓消費能夠感知到服務提供者的狀態發生了變化(宕機,重啟)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/276856.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/276856.shtml
英文地址,請注明出處:http://en.pswp.cn/news/276856.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

MFC項目實戰(1)文件管理器--準備篇

本程序主要實現如下功能&#xff1a; 程序通過左邊的樹形控件顯示本地計算機中目錄的結構&#xff0c;右邊的列表控件則負責響應樹形控件中選擇的目錄節點并把此節點中的所有項在列表框中顯示出來&#xff0c;列表框支持奇偶行顏色設置&#xff0c;選中顏色設置和熱點顏色設置&…

服務器tomcat配置教程

2018年上學期期末課程設計做了一個留言板&#xff0c;但是我需要把這個Jave Web弄到我的服務器上 首先我們可以安裝jdk tomcat在啟動時&#xff0c;會讀取環境變量的信息&#xff0c;需要一個CATALINA_HOME 與JAVA_HOME的信息 CATALINA_HOME即tomcat的主目錄&#xff0c; JAVA_…

使用tab鍵分割的文章能快速轉換成表格。( )_EXCEL的163種使用技巧集錦-42~62

本文主要講述了EXCEL的163種使用技巧其中20條技巧&#xff0c;待163種使用技巧全部講述完成后&#xff0c;如有需要&#xff0c;各位看官可在評論中留下郵箱&#xff0c;小編會將整理的WORD版發給大家。42. 快速查找工作簿 你可以利用在工作表中的任何文字進行搜尋&#xff0c;…

負載測試工具Ripplet

負載測試工具RippletRipplet的最新版本&#xff1a;0.8bRipplet特征&#xff1a;1&#xff09;基于Apache License 2.0許可證&#xff1b;2&#xff09;軟件程序性能和負載測試工具&#xff1b;3&#xff09;有四個分布式的Java組件&#xff1a;測試注入引擎、服務器/產品監視器…

解決ubuntu中vi不能正常使用方向鍵與退格鍵的問題

方案一&#xff1a; 問題&#xff1a; ubuntu中vi在編輯狀態下方向鍵不能用&#xff0c;還有回格鍵不能刪除等我們平時習慣的一些鍵都不能使用。 解決辦法&#xff1a; 可以安裝vim full版本&#xff0c;在full版本下鍵盤正常&#xff0c;安裝好后同樣使用vi命令。 安裝vim&…

android通過代碼設置鈴聲_第六十四回:Android中UI控件之SeekBar

各位看官們&#xff0c;大家好&#xff0c;上一回中咱們說的是Android中UI控件之ProgressBar的例子&#xff0c;這一回咱們的例子是UI控件之SeekBar。閑話休提&#xff0c;言歸正轉。讓我們一起Talk Android吧&#xff01;看官們&#xff0c;SeekBar通常翻譯為拖動條&#xff0…

轉帖:組策略

1.什么是組策略 注冊表是Windows系統中保存系統軟件和應用軟件配置的數據庫&#xff0c;而隨著Windows功能越來越豐富&#xff0c;注冊表里的配置項目也越來越多&#xff0c;很多配置都可以自定義設置&#xff0c;但這些配置分布在注冊表的各個角落&#xff0c;如果是手工配置&…

SQL中的left outer join,inner join,right outer join用法 (左右內連接)

SQL語句中的left outer join,inner join,right outer join用法left outer joinleft join , right outer joinright join, inner joinjoin.使用關系代數合并數據 1 關系代數 合并數據集合的理論基礎是關系代數&#xff0c;它是由E.F.Codd于1970年提出的。 在關系代數的形式…

利舊IBM X3650m2 安裝esxi5.1提供云桌面(備忘)

上面左邊是我的個人微信&#xff0c;如需進一步溝通&#xff0c;請加微信。 右邊是我的公眾號“Openstack私有云”&#xff0c;如有興趣&#xff0c;請關注。公司有一臺舊服務器&#xff0c;原來的IBM X3650m2 服務器&#xff0c;2物理CPU&#xff0c;24G內存&#xff0c;8塊3…

asp登錄頁面跳轉到注冊頁面_Java 添加頁面跳轉按鈕到PDF文檔

概述當我們在查閱含有大量頁面的PDF時&#xff0c;可通過在頁面上添加跳轉按鈕來實現頁面轉換&#xff0c;以達到節約時間&#xff0c;提高效率的目的。本文將通過Java程序來演示如何給PDF文檔添加頁面跳轉按鈕。通常來說跳轉可分為兩種情況&#xff1a;一是跳轉至特殊頁面(首頁…

和我一起學WCF(6):宿主(Hosting)

WCF所支持的宿主服務: 1.Self-hosting:控制臺應用程序,Windows應用程序,Windows服務,HTTP,TCP,named pipes,MSMQ 2.IIS/ASP.NET 3.Windows Activation Service ServiceHost實例必須進行初始化為服務暴露出端點(endpoint) 每個ServiceHost與指定的服務類型相關聯 核心方法: Open…

.Net FrameWork

.NET Micro Framework白皮書http://download.microsoft.com/download/3/1/9/319f7469-70bd-4e7c-a6cc-e5ad96939af4/net_micro_framework_whitepaper_v_1.0.docWhat is "Type" in managed heap?http://www.cnblogs.com/artech/archive/2007/06/04/769805.html轉載于…

Retrofit+RxJava聯網工具類

在python 進程、線程 (一)中簡單的說過&#xff0c;CPython中的GIL使得同一時刻只能有一個線程運行&#xff0c;即并發執行。并且即使是多核CPU&#xff0c;GIL使得同一個進程中的多個線程也無法映射到多個CPU上運行&#xff0c;這么做最初是為了安全著想&#xff0c;慢慢的也成…

確定最佳聚類數matlab代碼_詳解DBSCAN聚類

使用DBSCAN標識為員工分組照片由Ishan seefromthesky 在 Unsplash拍攝基于密度的噪聲應用空間聚類(DBSCAN)是一種無監督的ML聚類算法。無監督的意思是它不使用預先標記的目標來聚類數據點。聚類是指試圖將相似的數據點分組到人工確定的組或簇中。它可以替代KMeans和層次聚類等流…

Arrays.asList 使用細節

通常初始化后使用如下&#xff0c;但是報錯 UnsupportOperationException.... 根據提示信息&#xff0c;就是調用add()方法時拋出了異常。順著堆棧信息往上找&#xff0c;提示的是AbstractList類的108行出了異常&#xff0c;這一行所在方法的具體實現如下&#xff1a; //108行 …

[分享] 精神崩潰的老鼠

李國棟床上堆著書&#xff0c;每天晚上睡在榻榻米上&#xff0c;讀書讀到凌晨一兩點&#xff0c;讀到兩眼充血&#xff0c;像針扎一樣痛苦&#xff0c;才把書放開。蜷縮到榻榻米上&#xff0c;用繩子把左腿跟一只桌腳綁在一起&#xff0c;熄了燈睡覺。 “這樣一來&#xff0…

(七)整合spring cloud云服務架構 - common-service 項目構建過程

我們將對common-service整個項目進行剖析&#xff0c;將整個構建的流程給記錄下來&#xff0c;讓更多的關注者來參考學習。首先在構建spring cloud的common-service之前&#xff0c;我們需要準備的技術&#xff1a;Maven&#xff08;項目構建&#xff09;、Spring Boot、Spring…

python list元素合并_python list 合并連接字符串的方法

python list 合并連接字符串的方法 更新時間&#xff1a;2013年03月09日 22:02:18 作者&#xff1a; python 列表合并字符串&#xff0c;我們一般會用到字符串的join方法來操作。下面通過代碼的形式&#xff0c;詳細的說下list怎么拼成字符串&#xff1f; 相關文章這篇文章主要…

修改citrix 默認偵聽端口的命令和XML Service端口

修改citrix 默認偵聽端口的命令&#xff1a; 在命令行下輸入icaport /port&#xff1a;2494&#xff0c;或你所想改成的端口 如果輸入 icaport /reset 恢復默認偵聽端口 ctxxmlss /r8080 在citrix的外部客戶端通過web方式登陸時&#xff0c;提示“the alternate address cannot…

spfa算法

1 轉載于:https://www.cnblogs.com/Emcikem/p/11346073.html