Spring Cloud中的服務間通訊(RestTemplate和Feign)
阿新 • • 發佈:2018-11-10
大家如果覺得我寫的好,可以關注這個專案,之後我的學習過程中都會把學習筆記放入這個專案中。
https://github.com/IndustriousSnail/learning-notes
Spring Cloud中的服務間通訊(RestTemplate和Feign)
目錄一、服務間通訊簡介
一個系統可以由不同的微服務構成,比如一個電商系統可以由訂單服務、商品服務、使用者服務等共同組成。 這些服務相互獨立,但又相互依賴。由於它們相互依賴,所以需要通過通訊的方式來進行相互呼叫。服務間通訊方式主要由兩種:
- HTTP(SpringCloud)
- RPC(Dubbo)
Spring Cloud中服務間兩種restful呼叫方式:
- RestTemplate
- Feign
二、RestTemplate的使用
假設我們現在在8080埠啟動一個test服務。 我們使用“http://localhost:8080/test”可以訪問得到一段字串。 現在我們需要使用RestTemplate呼叫該服務RestTemplate使用總結了以下三種方式。
第一種方式:
RestTemplate restTemplate = new RestTemplate(); String response = restTemplate.getForObject("http://localhost:8080/test", String.class);
這種方式的弊端很明顯,url是寫死的。沒有用到註冊與發現。如果對方使用叢集,ip地址動態變化,則這邊就相應需要修改。
第二種方式:
@Autowired private LoadBalancerClient loadBalancerClient; public String test(){ RestTemplate restTemplate = new RestTemplate(); ServiceInstance serviceInstance = loadBalancerClient.choose("TEST"); //從Eureka伺服器中找到該服務的地址等資訊。 String response = restTemplate.getForObject("http://"+serviceInstance.getHost()+":"+serviceInstance.getPort()+"/test", String.class); return response; }
第二種方式將url的獲取轉變為從Eureka伺服器中提取。前提條件是將“TEST”註冊到Eureka中。
LoadBalancerClient是Spring Cloud提供的方法。
第三種方式:
第三種方式首先要定義一個類,目的是將RestTemplate配置到Bean中
//將RestTemplate配置到Bean中,方便呼叫和生命週期管理。
@Component
public class RestTemplateConfig {
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
@Autowired
private RestTemplate restTemplate;
public String test(){
//第三種方式,使用Bean配置的形式
String response = restTemplate.getForObject("http://TEST/msg", String.class);
return response;
}
第三種方式將RestTemplate的生命週期交由Spring管理。
在url中不用填寫地址和埠,而是使用服務的名稱代替。
三、客戶端負載均衡器Ribbon
3.1 Ribbon簡介
Ribbon實現軟負載均衡,核心有三點:- 服務發現:發現依賴服務的列表,就是根據服務的名字,把該服務的例項資訊都找出來。
- 服務選擇規則:依據規則策略,從多個服務中,選擇一個有效的服務。
- 服務監聽: 檢測失效的服務
實際對應流程:
- 使用ServerList(服務發現),將服務下的所有例項都拿到。
- 使用ServerListFilter(服務監聽),將不能使用的例項給過濾掉
- 使用IRule(服務選擇規則),從可用的例項中,選擇一個例項。
3.2 更改規則選擇器
Ribbon的所有規則選擇器必須整合IRule介面,預設採用的選擇器為RoundRule,該選擇器會輪訓選擇呼叫。 如果想要修改選擇器,在application.yml中配置即可。配置方式如下:
# 配置負載均衡器的選擇規則,IRule介面。 TEST為要請求服務的名字。
TEST:
ribbon:
# 前面的key是固定寫法,後面的RandomRule是要使用的規則選擇類。該類必須實現IRule介面。
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
上述配置例子是將匹配規則換成了隨機的形式。這樣對於後臺可用的例項,會隨機選擇一個進行呼叫。
四 使用Feign進行服務間通訊
1. 增加依賴<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
2.在Application啟動類上增加註解@EnableFeignClients
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class, args);
}
}
3.新建一個介面,使用該介面進行訪問。
@FeignClient(name="TEST") //name為要訪問的服務的名字
public interface TestClient {
@GetMapping("/test") //要訪問的url
String test(); //呼叫這個方法,即可獲取到相應服務的內容。返回值為對方返回的型別。方法名可以自定義。
}
4.呼叫上述介面進行訪問
@Autowired
private TestClient testClient;
public String test(){
String response = testClient.test();
return response;
}
使用上述方法,就可以進行服務之間的相互呼叫了。
同樣需要各個服務都註冊在Eureka中
Feign的特點:
1.宣告式REST客戶端(偽RPC)
2.採用了基於介面的註解。