一 Eureka服務註冊與發現
1.RestTemplate實現遠端呼叫
如果將一個系統進行拆分後,比如可以將一個電商系統可以拆分成訂單模組,使用者模組,商品模組,分別可以從資料庫中的訂單表,使用者表,商品表中查詢資料,那麼如果根據訂單id查詢訂單記錄時,訂單又需要根據userId查詢使用者資訊,我們就需要在查詢訂單的時候,一併查詢出使用者資訊,我們就需要使用RestTemplate進行跨服務查詢.步驟如下:
- 註冊一個RestTemplate的例項到Spring容器
- 根據RestTemplate物件進行遠端呼叫
1.1 註冊RestTemplate
在配置類中註冊RestTemplate例項
@Bean public RestTemplate restTemplate() { return new RestTemplate(); }
1.2 實現遠端呼叫
通過restTemplate物件的getForObject方法實現遠端呼叫,傳入兩個引數,一個是需要遠端呼叫的url,二是返回的資料型別.
private RestTemplate restTemplate; public Order queryOrderById(Long orderId) { // 1.查詢訂單 Order order = orderMapper.findById(orderId); // 2.利用RestTemplate發起http請求,查詢使用者 // 2.1.url路徑 String url = "http://localhost:8081/user/" + order.getUserId(); // 2.2.傳送http請求,實現遠端呼叫 User user = restTemplate.getForObject(url, User.class); // 3.封裝user到Order order.setUser(user); // 4.返回 return order; }
在此服務呼叫過程中,會有兩個不同的角色
服務提供者:一次業務中,被其它微服務呼叫的服務。(提供介面給其它微服務)
服務消費者:一次業務中,呼叫其它微服務的服務。(呼叫其它微服務提供的介面)
2.Eureka註冊中心
2.1 Eureka兩大元件
- Eureka Server提供服務註冊
- Eureka Client通過註冊中心進行訪問
2.2 搭建eureka-server
建立一個eureka-server的maven工程
2.2.1 引入eureka依賴
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency>
2.2.2 編寫啟動類
@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class, args);
}
}
2.2.3 編寫配置檔案
建立application.yml檔案
server:
port: 10086
spring:
application:
name: eureka-server
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10086/eureka
接下來啟動微服務,然後在瀏覽器就可以訪問: http://127.0.0.1:10086
2.3 服務註冊
如果我們需要將user-service註冊到eureka-server中去,那麼我們只需要引入依賴和修改配置檔案
2.3.1 引入依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
2.3.2 編寫配置檔案
建立application.yml檔案,新增服務名稱,eureka地址
server:
port: 8081
spring:
application:
name: userservice
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10086/eureka
為了模擬一個服務有多個例項的場景,我們可以再建立一個user-service2,修改其埠號為8082,其餘配置和user-service完全一樣.
2.4 服務發現
2.4.1 引入依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
2.4.2 編寫配置檔案
server:
port: 8080
spring:
application:
name: orderservice
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10086/eureka
2.5 服務拉取與負載均衡
最後,我們要去eureka-server中拉取user-service服務的例項列表,並且實現負載均衡。
使用@LoadBalanced註解賦予RestTemplate負載均衡的能力
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
修改服務呼叫的url地址
@Autowired
private RestTemplate restTemplate;
public Order queryOrderById(Long orderId) {
// 1.查詢訂單
Order order = orderMapper.findById(orderId);
// 2.利用RestTemplate發起http請求,查詢使用者
// 2.1.url路徑
String url = "http://userservice/user/" + order.getUserId();
// 2.2.傳送http請求,實現遠端呼叫
User user = restTemplate.getForObject(url, User.class);
// 3.封裝user到Order
order.setUser(user);
// 4.返回
return order;
}
3.Eureka自我保護
Eureka-Client預設30秒會向Eureka-Server傳送一次心跳,證明它還活著,如果Eureka-Server在一定時間內(預設90秒)沒有收到Eureka-Client發來的心跳,那麼Eureka-Server將會把Eureka-Client服務剔除,但是如果Eureka-Server在短時間內丟失大量服務例項心跳,那Eureka-Server會開啟自我保護機制,不會立刻將Eureka-Client服務剔除,而讓其進入自我保護模式,待它再次傳送心跳,該節點便會回到正常.
一句話:某時刻某一個微服務不可用了,Eureka不會立刻清理,依舊會對該微服務的資訊進行儲存