1、在拆分出來的各個服務中,A服務可能要調用B服務的接口,而此時,兩個服務相對是獨立的,不能直接調用,故需要在A服務中發起Http請求到B服務中拿取數據做后續處理,問題就是如何在Java代碼中發起http請求呢,springcloud提供了解決方案:RestTemplate
2、使用方法:
1、在spring容器中注冊一個RestTemplate組件,在啟動類或者有@SpringBootConfiguration注解的類中注冊即
/** * @author chencan */ @SpringBootConfiguration public class RestTemplateBean { @Bean public RestTemplate restTemplate(){ return new RestTemplate(); } }
2、在需要發請求的地方注入RestTemplate實例,調用get或者post類型的請求獲取數據即可
@RestController @RequestMapping("order") public class OrderController { @Autowired private OrderService orderService; @Resource private RestTemplate restTemplate; @GetMapping("{orderId}") public Order queryOrderByUserId(@PathVariable("orderId") Long orderId) { // 根據id查詢訂單並返回
Order order = orderService.queryOrderById(orderId); //定義請求的路徑
String url = "http://127.0.0.1:8081/user/"+order.getUserId(); //發送get請求
User user = restTemplate.getForObject(url, User.class); order.setUser(user); return order; } }
3、提供者與消費者
在服務調用關系中,會有兩個不同的角色:
服務提供者:一次業務中,被其它微服務調用的服務。(提供接口給其它微服務)
服務消費者:一次業務中,調用其它微服務的服務。(調用其它微服務提供的接口)
但是,服務提供者與服務消費者的角色並不是絕對的,而是相對於業務而言。
如果服務A調用了服務B,而服務B又調用了服務C,服務B的角色是什么?
-
對於A調用B的業務而言:A是服務消費者,B是服務提供者
-
對於B調用C的業務而言:B是服務消費者,C是服務提供者
因此,服務B既可以是服務提供者,也可以是服務消費者。
惡補小知識:GET與POST區別
HTTP 定義了與服務器交互的不同方法,最基本的方法是 GET 和 POST(Ajax開發,關心的只有GET請求和POST請求)
GET與POST方法有以下區別:
(1) 在客戶端,Get方式在通過URL提交數據,數據在URL中可以看到;POST方式,數據放置在HTML HEADER內提交
(2) GET方式提交的數據最多只能有1024字節,而POST則沒有此限制
(3) 安全性問題。正如在(1)中提到,使用 Get 的時候,參數會顯示在地址欄上,而 Post 不會。所以,如果這些數據是中文數據而且是非敏感數據,那么使用 get;如果用戶輸入的數據不是中文字符而且包含敏感數據,那么還是使用 post為好
拋出問題:
1、GET和POST是什么?HTTP協議中的兩種發送請求的方法。
2、HTTP是什么?HTTP是基於TCP/IP的關於數據如何在萬維網中如何通信的協議。
3、HTTP的底層是TCP/IP。所以GET和POST的底層也是TCP/IP,也就是說,GET/POST都是TCP鏈接。GET和POST能做的事情是一樣一樣的。你要給GET加上request body,給POST帶上url參數,技術上是完全行的通的。
4、GET和POST還有一個重大區別,簡單的說:
GET產生一個TCP數據包;POST產生兩個TCP數據包。
5、對於GET方式的請求,瀏覽器會把http header和data一並發送出去,服務器響應200(返回數據);
6、而對於POST,瀏覽器先發送header,服務器響應100 continue,瀏覽器再發送data,服務器響應200 ok(返回數據)。
也就是說,GET只需要汽車跑一趟就把貨送到了,而POST得跑兩趟,第一趟,先去和服務器打個招呼“嗨,我等下要送一批貨來,你們打開門迎接我”,然后再回頭把貨送過去。
因為POST需要兩步,時間上消耗的要多一點,看起來GET比POST更有效。因此Yahoo團隊有推薦用GET替換POST來優化網站性能。但這是一個坑!跳入需謹慎。為什么?
① GET與POST都有自己的語義,不能隨便混用。
②據研究,在網絡環境好的情況下,發一次包的時間和發兩次包的時間差別基本可以無視。而在網絡環境差的情況下,兩次包的TCP在驗證數據包完整性上,有非常大的優點。
③並不是所有瀏覽器都會在POST中發送兩次包,Firefox就只發送一次。