服務的提供者和消費者
服務之間可以透過Spring提供的RestTemplate來進行http請求去請求另一個Springboot的專案,這就叫做服務間的遠端呼叫。
當一個服務透過遠端呼叫去呼叫另一個服務時,被呼叫的服務就叫做服務的提供者,呼叫服務的服務就叫做服務的消費者。
一個服務可以既是服務的提供者也是服務的消費者。
1、服務呼叫關係
- 服務提供者:暴露介面給其它微服務呼叫
- 服務消費者:呼叫其它微服務提供的介面
- 提供者和消費者的角色其實是相對的
Eureka註冊中心
-
遠端呼叫的問題
-
eureka原理
-
搭建eurekaServer
-
服務註冊
-
服務發現
eureka的作用
- 消費者該如何獲取服務提供者的具體資訊
- 服務提供者啟動時向eureka註冊自己的資訊
- eureka儲存這些資訊
- 消費者根據服務名稱向eureka拉取提供者資訊
- 如果有多個服務提供者,消費者該如何選擇
- 服務消費者利用負載均衡演算法,從服務列表中挑選一個
- 消費者如何感知服務提供者健康狀態
- 服務提供者會每隔30s向EurekaServer傳送心跳請求,報告健康狀態
- eureka會更新記錄服務列表資訊,心跳不正常會被剔除
- 消費者就可以拉取到最新的資訊
在eureka架構中,微服務角色有兩類:
- EurekaServer:服務端、註冊中心
- 記錄服務資訊
- 心跳監控
- EurekaClient:客戶端
- provider:服務提供者
- 註冊自己的資訊到EurekaServer中
- 每隔30S向EurekaServer傳送心跳
- consumer:服務消費者
- 根據服務名稱從EurekaServer拉取服務列表
- 基於服務列表做負載均衡,選中一個微服務後發起遠端呼叫
- provider:服務提供者
EurekaServer服務註冊
- 建立eureka服務端
父工程引入對應版本的springcloud依賴
springboot 3.1.5對應
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>2022.0.4</version>
<type>pom</type>
<scope>import</scope>
</dependency>
引入eureka服務端依賴
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
啟動eureka服務,在啟動類上新增@EnableEurekaServer註解
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
配置檔案中配置服務名稱-地址-服務埠
spring:
application:
name: eureka-server #微服務名稱
server:
port: 10086 #服務埠
eureka:
client:
service-url: #eureka地址資訊 eureka自己也是一個微服務,也會被註冊到eureka中 為了做eureka叢集
defaultZone: http://127.0.0.1:10086/eureka
eureka服務端自己也會被註冊到eureka服務中
然後就可以訪問http://127.0.0.1:10086進入eureka註冊中心了
- 服務註冊
確保父工程成功引入cloud依賴後引入eureka服務端依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
在配置檔案中配置eureka服務名稱和地址即可
server:
port: 8081
spring:
application:
name: cloud-user
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10086/eureka
- 服務發現
引入依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
配置地址
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10086/eureka
給RestTemplate新增上@LoadBalanced註解,實現同一服務多個地址的負載均衡呼叫
//RestTemplate spring提供的遠端呼叫模組 允許傳送http請求
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
使用RestTemplate不透過具體的ip地址而是透過服務名稱遠端呼叫實現查詢
@Autowired
RestTemplate restTemplate;
@GetMapping("/order/all/{id}")
public ordersUser getAllById(@PathVariable("id") Integer id){
String str1 = "http://cloud-order/order/"+id;
orders od = restTemplate.getForObject(str1, orders.class);
String str = "http://cloud-user/user/"+od.getOrderuserid();
user forObject = restTemplate.getForObject(str, user.class);
ordersUser ordersUser = new ordersUser();
ordersUser.setOrderid(od.getOrderid());
ordersUser.setUser(forObject);
ordersUser.setOrdername(od.getOrdername());
ordersUser.setOrderaddress(od.getOrderaddress());
ordersUser.setOrderprice(od.getOrderprice());
ordersUser.setOrdernumber(od.getOrdernumber());
return ordersUser;
}