jsp调用controller方法_RPC调用_服务注册与发现
RPC調(diào)用_單體架構(gòu)_SOA架構(gòu)
系統(tǒng)架構(gòu)的演變
1 傳統(tǒng)的單體架構(gòu)
1.1 什么是單體架構(gòu)
一個歸檔包(例如 war 格式或者 Jar 格式)包含了應用所有功能的應用程序,我們通常稱之 為單體應用。也稱之為單體應用架構(gòu),這是一種比較傳統(tǒng)的架構(gòu)風格。
1.2 單體架構(gòu)優(yōu)點
便于開發(fā):只需借助 IDE 的開發(fā),調(diào)試功能即可完成 易于測試:只需要通過單元測試或瀏覽器即可完成測試 易于部署:打包成單一可執(zhí)行 jar 或者 war 包,完成 jar 或者 war 部署即可
1.3 單體架構(gòu)缺點
復雜性高:整個項目包含的模塊非常多,模塊的邊界模糊,依賴關(guān)系不清晰,代碼質(zhì)量參差 不齊,整個項目非常復雜,修改一個 BUG 都會造成隱含的缺陷。
部署速度逐漸變慢:隨著代碼的增加,構(gòu)建和部署的時間也會增加。而在單體應用中,每次 功能的變更或缺陷的修復都會導致我們需要重新部署整個應用。
擴展能力受限:單體應用只能作為一個整體進行擴展,無法結(jié)合業(yè)務模塊的特點進行伸縮。
阻礙技術(shù)創(chuàng)新: 單體應用往往使用統(tǒng)一的技術(shù)平臺或方案解決所有問題,團隊的每個成員都 必須使用相同的開發(fā)語言和架構(gòu),想要引入新的框架或技術(shù)平臺非常困難。
2SOA 架構(gòu)(重點理解)
2.1 什么是 SOA 架構(gòu)
SOA 是 Service-Oriented Architecture 的英文縮寫,就是面向服務的架構(gòu)。這里的服務可以理 解為 service 層業(yè)務服務。將系統(tǒng)拆分為不同的服務單元,通過網(wǎng)絡(luò)協(xié)議服務單元之間進行 通信。服務單元完成一個特定功能(如:驗證、支付、登錄等等),通過服務單元之間的集成 組成完整的應用程序。
SOA 架構(gòu)中由兩個重要的角色:
服務提供者(Provider)和服務使用者(Consumer)
2.2SOA 架構(gòu)的優(yōu)點
更易維護:業(yè)務服務提供者和業(yè)務服務使用者的松散耦合關(guān)系。當需求發(fā)生變化的時候,不 需要修改提供業(yè)務服務的接口,只需要調(diào)整業(yè)務服務流程或者修改操作即可,整個應用系統(tǒng) 也更容易被維護。
更高的可用性:該特點是在于服務提供者和服務使用者的松散耦合關(guān)系上得以發(fā)揮與體現(xiàn)。 使用者無須了解提供者的具休實現(xiàn)細節(jié)。
更好的伸縮性:依靠業(yè)務服務設(shè)計、開發(fā)和部署等所采用的架構(gòu)模型實現(xiàn)伸縮性。使得服務 提供者可以互相彼此獨立地進行調(diào)整,以滿足新的服務需求。
2.3SOA 架構(gòu)的缺點
減低了系統(tǒng)的性能
系統(tǒng)之間交互需要使用遠程通信,接口開發(fā)增加工作量
3 什么是 RPC 調(diào)用
RPC(Remote Procedure Call)—遠程過程調(diào)用,它是一種通過網(wǎng)絡(luò)從遠程計算機程序上請求 服務,而不需要了解底層網(wǎng)絡(luò)技術(shù)的協(xié)議。請求程序就是一個客戶機,而服務提供程序就是 一個服務器
4 RPC 的應用場景
支付寶、微信、銀聯(lián)等第三方支付接入
公司內(nèi)部的不同業(yè)務系統(tǒng),不同技術(shù)平臺的整合
5 RPC 的實現(xiàn)方式
RMI:Java 提供的基于 java 平臺 RPC 遠程調(diào)用技術(shù),服務消費者和服務提供者是 java 平臺
WEBSERVICE:通過 Http 協(xié)議,請求發(fā)送 xml 和響應 xml 的 RPC 遠程調(diào)用技術(shù),最大的特征使用 xml 進行數(shù)據(jù)交互,可以實現(xiàn)跨平臺調(diào)用。
HttpClient:Http 客戶端工具,Java 程序通過 HttpClient 發(fā)送 Http 協(xié)議的請求,直接獲得遠程 資源
HttpClient 實現(xiàn) RPC 調(diào)用
1、HttpClient 介紹 HTTP 協(xié)議可能是現(xiàn)在 Internet 上使用得最多、最重要的協(xié)議了,越來越多的 Java 應用程 序需要直接通過 HTTP 協(xié)議來訪問網(wǎng)絡(luò)資源。 HttpClient 是 Apache Jakarta Common 下的子項目,供高效的、最新的、功能豐富的支持 HTTP 協(xié)議的客戶端編程工具包。實現(xiàn)了所有 HTTP 的方法(GET,POST,PUT,HEAD 等)支持 RestFul。
2、服務提供者實現(xiàn)
2.1 業(yè)務需求說明
實現(xiàn):通過用戶系統(tǒng)訪問訂單系統(tǒng),獲得某個用戶的訂單信息。
2.2 創(chuàng)建 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相關(guān)依賴 --><!-- 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 創(chuàng)建 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 創(chuàng)建 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><!-- 以監(jiān)聽器的方式啟動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隨系統(tǒng)啟動而啟動 --><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 服務消費者實現(xiàn)
3.1 創(chuàng)建 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 創(chuàng)建測試類
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 {/*** 啟動消費者進行服務的消費*///創(chuàng)建NameValuePair對象,封裝發(fā)送服務提供者的 信息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);//發(fā)送遠程的http請求的地址String url="http://localhost:7070/order/loadOrderList01";//創(chuàng)建HttpClient客戶端對象HttpClient client = HttpClients.createDefault();//創(chuàng)建httpPost對象,發(fā)送post請求HttpPost post = new HttpPost(url);//封裝請求體post.setEntity(new UrlEncodedFormEntity(list,"UTF-8"));//發(fā)送具體的http請求HttpResponse response = client.execute(post);//獲取響應頭消息Header[] headers = response.getAllHeaders();for (Header header : headers) {System.out.println(header.getName()+"-----"+header.getValue());}//獲取服務提供者提供的具體數(shù)據(jù)HttpEntity entity = response.getEntity();//獲取http的響應體InputStream content = entity.getContent();int length = 0;char [] buf= new char[1024];//將字節(jié)流轉(zhuǎn)換為字符流InputStreamReader is = new InputStreamReader(content);//創(chuàng)建StringBufferStringBuffer sb = new StringBuffer();while((length = is.read(buf))!=-1){sb.append(String.valueOf(buf, 0, length));}System.out.println(sb);//將sb,json字符串轉(zhuǎn)換為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 服務消費者實現(xiàn)
3.1 業(yè)務需求說明
實現(xiàn):通過紅包系統(tǒng)訪問訂單系統(tǒng),獲得某個用戶的訂單信息,派發(fā)紅包.
3.2 創(chuàng)建 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相關(guān)依賴 --><!-- 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 創(chuàng)建 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;/*** 發(fā)送遠程的http請求,消費http服務* 獲取訂單的集合*/@RequestMapping("/loadOnList01")@ResponseBodypublic List<Order> loadOrderList01(String uid){//發(fā)送到遠程服務的urlString url = "http://localhost:7070/order/loadOrderList01";//發(fā)送到遠程服務的參數(shù)MultiValueMap<String, Object> params = new LinkedMultiValueMap<String, Object>();params.add("uid", uid);//通過restTemplate對象發(fā)送post請求Order[] orders = restTemplate.postForObject(url, params,Order[].class);//轉(zhuǎn)換為listreturn Arrays.asList(orders);}@RequestMapping("/loadOnList02")@ResponseBodypublic List<Order> loadOrderList02(String uid){//發(fā)送到遠程服務的urlString url = "http://localhost:7070/order/loadOrderList02";//發(fā)送到遠程服務的參數(shù)MultiValueMap<String, Object> params = new LinkedMultiValueMap<String, Object>();params.add("uid", uid);//通過restTemplate對象發(fā)送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()); } //獲取響應狀態(tài)碼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><!-- 以監(jiān)聽器的方式啟動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隨系統(tǒng)啟動而啟動 --><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 跨域介紹
跨域,指的是瀏覽器不能執(zhí)行其他網(wǎng)站的腳本。它是由瀏覽器的同源策略造成的,是瀏覽器 對 JavaScript 施加的安全限制。
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相關(guān)依賴 --><!-- 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 發(fā)送 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對象轉(zhuǎn)換為字符串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 服務器段解決
服務端設(shè)置 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 標簽,不受同源策略的限制,用戶從服務請求數(shù)據(jù),服務器返回一個帶有方法和數(shù)據(jù) 的 js 代碼。
在 js 中,我們直接用 XMLHttpRequest 請求不同域上的數(shù)據(jù)時,是不可以的。但是,在頁面 上引入不同域上的 js 腳本文件卻是可以的,jsonp 正是利用這個特性來實現(xiàn)的。
例如: <script src="https://code.jquery.com/jquery-1.12.4.js"></script>
從不同域的服務器直接請求 js 代碼,jsonp 就是通過獲得不同域的服務器上的 js 代碼(js 代碼 中包含一個在本地定義的 js 函數(shù)和需要獲得數(shù)據(jù)),來獲得不同域的數(shù)據(jù)。
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 請求的方法,該方法后一個接收回調(diào)函數(shù)的參數(shù).
/*** 接收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);//函數(shù)名+函數(shù)的實參String result = callback+"("+JSON.toJSONString(list)+")";return result;}3.4 啟動 order-sys 項目
4 修改 ajax-origin 項目 4.1 導入 juqery 函數(shù)庫
<script type="text/javascript" src="https://code.jquery.com/jquery-1.11.3.js"></script>4.2 發(fā)送請求
利用<script src="url?callback=doSomething"></script>發(fā)送請求
<script src="http://localhost:7070/order/loadOrderList03?uid=9999&callback=doCallback"></script>4.3 定義 callback 回調(diào)函數(shù)
function doCallback(data){//將json對象轉(zhuǎn)換為字符串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服務集群部署_消費_服務注冊和發(fā)現(xiàn)
目標:理解服務的集群部署
理解服務發(fā)現(xiàn)
1.1 服務單機部署
將某個應用服務,部署到一臺服務器,所有服務消費者的并發(fā)訪問都發(fā)送到一臺服務器.
在系統(tǒng)業(yè)務的發(fā)展,不露出相應的問題: 高并發(fā)訪問題: 會出現(xiàn)系統(tǒng)資源不夠用(帶寬,cpu,內(nèi)存)等等 系統(tǒng)的單節(jié)點故障: 當單節(jié)點服務器出現(xiàn)宕機故障的時候,會出現(xiàn)服務訪問沒法訪問的 問
1.2 服務的集群部署
將某個應用服務部署到,同時部署到 n 個服務器節(jié)點,由 n 個服務器節(jié)點對外提供相同服務. 同時可以提供備用節(jié)點服務器.
通過集群部署的方式可以解決,服務的高并發(fā)訪問和單節(jié)點故障問題: 高并發(fā)訪問: 通過特定的負載均衡(Load Balance)算法,將并發(fā)訪問的請求,分發(fā)到不同節(jié)點的服務器進行處理,以將每一臺服務器的負載壓力,實現(xiàn)負載均衡。
單節(jié)點故障: 當實現(xiàn)服務集群部署的時候,單個服務器節(jié)點宕機,可以由其他正常的服務器節(jié)點,正 常向外提供服務,不會出現(xiàn)服務的不可訪問問題,實現(xiàn)服務的(HA)高可用
3RMI 模擬服務器集群部署
3.1 發(fā)布集群服務
啟動程序三次,每次啟動修改端口號,實現(xiàn)服務的集群部署
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){//通過隨機的負載均衡算法,產(chǎn)生隨機的訪問地址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、 服務注冊與發(fā)現(xiàn)
(0)服務容器負責啟動,加載,運行服務提供者。
(1)服務提供者在啟動時,向注冊中心注冊自己提供的服務 URL。
(2)服務消費者在啟動時,向注冊中心訂閱自己所需的服務。
(3)注冊中心返回服務提供者地址列表給消費者,如果有變更,注冊中心將基于長連接推送 變更數(shù)據(jù)給消費者。
(4)服務消費者,從提供者地址列表中,基于軟負載均衡算法,選一臺提供者進行調(diào)用,如 果調(diào)用失敗,再選另一臺調(diào)用。
讓消費能夠感知到服務提供者的狀態(tài)發(fā)生了變化(宕機,重啟)
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的jsp调用controller方法_RPC调用_服务注册与发现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于DNF的多媒体包NPK文件的那些事儿
- 下一篇: int x = 0x13 c语言,200