服務注冊中心 Eureka
Spring Cloud Eureka 是 Netflix 公司開發(fā)的注冊發(fā)現(xiàn)組件,本身是一個基于 REST 的服務。提供注冊與發(fā)現(xiàn),同時還提供了負載均衡、故障轉移等能力。
Eureka 有 3 個角色
- 服務中心(Eureka Server):服務器端。它提供服務的注冊和發(fā)現(xiàn)功能,即實現(xiàn)服務的治理。
- 服務提供者(Service Provider):服務提供者。它將自身服務注冊到 服務中心,以便 服務消費者 能夠通過服務器提供的服務清單(服務注冊列表)來調用它。
- 服務消費者(Service Consumer):服務消費者。它從 服務中心 獲取已注冊的服務列表,從而消費服務。
Eureka 是 AP 架構(可用性和分區(qū)容錯性),Zookeeper 是 CP 架構(一致性和分區(qū)容錯性)。Eueka 優(yōu)先保證服務的可用性,Zookeeper 在 Master 節(jié)點因為網(wǎng)絡故障與其他節(jié)點失去聯(lián)系時,剩余節(jié)點選取 leader 的時間太長,這就導致在選舉期間注冊服務癱瘓。
1. 搭建單機Eureka注冊中心
首先需要創(chuàng)建一個 spring-cloud 工程,刪除 src 目錄,然后在 pom.xml 文件中加入以下依賴:
<!-- 統(tǒng)一管理jar包版本 -->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<spring-cloud.version>2021.0.0</spring-cloud.version>
<spring-boot.version>2.6.3</spring-boot.version>
</properties>
<!-- 子模塊繼承之后,提供作用:鎖定版本,子modlue不用寫groupId和version -->
<dependencyManagement>
<dependencies>
<!--spring boot 2.6.3-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--spring cloud 2021.0.0-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
創(chuàng)建 eureka-server-7001 模塊,然后在 pom.xml 文件中加入以下依賴:
<!-- 服務注冊發(fā)現(xiàn)Eureka-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
寫 application.yaml 配置文件,具體如下:
server:
port: 7001
eureka:
instance:
# eureka服務端的實例名字
hostname: localhost
client:
# 是否將自己注冊到eureka server
register-with-eureka: false
# 是否從eureka server獲取注冊的服務信息
fetch-registry: false
# 設置與eureka server交互的地址
service-url:
defalutZone: http://${eureka.instance.hostname}:${server.port}/eureka/
最后在啟動類上加上 @EnableEurekaServer 注解即可
@EnableEurekaServer
啟動訪問 localhost:7001 即可訪問到 Eureka 注冊中心的界面。
2. 創(chuàng)建服務提供者與服務消費者
創(chuàng)建服務提供者 provider-8001 和服務消費者 consumer-80 模塊,然后在 pom.xml 文件中加入以下依賴:
<!-- 引入Eureka 客戶端依賴 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
服務提供者和消費者的依賴是一樣的,都是 eureka-client。
寫 application.yaml 配置文件,具體如下:
server:
port: 8001
spring:
application:
name: cloud-provider-8001
eureka:
client:
# eureka服務地址
service-url:
defaultZone: http://localhost:7001/eureka/
server:
port: 80
spring:
application:
name: cloud-consumer-80
eureka:
client:
service-url:
defaultZone: http://localhost:7001/eureka/
最后在啟動類上面加 @EnableEurekaClient 注解即可。
@EnableEurekaClient
先啟動 Eureka 注冊中心,然后在分別啟動服務提供者和服務消費者,即可在 Eureka 服務注冊中心看到相關信息。
3. Eureka 注冊中心界面說明
訪問上面我們搭建的注冊中心(localhost:7001),界面如下:
其中最重要的是中間服務信息的那一欄,實例的狀態(tài)有以下幾種:
- UP:服務正常運行,特殊情況當進入自我保護模式,所有的服務依然是 UP 狀態(tài),所以需要做好熔斷重試等容錯機制應對災難性網(wǎng)絡出錯情況
- OUT_OF_SERVICE:不再提供服務,其他的 Eureka Client 將調用不到該服務,一般有人為的調用接口設置的,如:強制下線。
- UNKNOWN:未知狀態(tài)
- STARTING:表示服務正在啟動中
- DOWN:表示服務已經(jīng)宕機,無法繼續(xù)提供服務
4. 服務自保和服務剔除機制
服務自保機制(Service Self-Preservation Mechanism):是指 Eureka Server 中的一種機制,用于保護在 Eureka 注冊中心上注冊的微服務實例免受意外刪除的影響。當微服務實例在心跳超時時間內沒有發(fā)送心跳信號給 Eureka Server 時,Eureka Server 不會立即將其從服務注冊表中刪除,而是認為該實例可能處于網(wǎng)絡故障等臨時異常情況,會將其保留在注冊表中,提供一定的自我保護,防止誤刪健康的實例。這樣可以避免因網(wǎng)絡抖動、服務器負載或其他臨時問題導致服務實例被誤刪,從而提高服務的穩(wěn)定性和可用性。
服務剔除機制(Service Eviction Mechanism):與服務自保相對應,是指當服務實例連續(xù)長時間未發(fā)送心跳信號、或注冊中心發(fā)現(xiàn)某個服務實例心跳連續(xù)失敗的次數(shù)超過一定閾值時,Eureka Server 會將該服務實例從服務注冊表中剔除。通過服務剔除機制,可以排除不健康、異?;蚬收蠣顟B(tài)的服務實例,防止其他服務繼續(xù)調用故障的實例,減少錯誤的傳播范圍,提高系統(tǒng)的穩(wěn)定性。
Eureka 中的服務自保機制是為了保護健康、可能出現(xiàn)臨時異常的服務實例免受誤刪的影響,而服務剔除機制則是為了及時剔除不健康、長時間未發(fā)送心跳或心跳連續(xù)失敗的服務實例,保障整個服務治理系統(tǒng)的正常運行。這兩個機制的存在都是為了提高服務的可靠性和穩(wěn)定性。
服務自保是默認開啟的,可以使用以下配置來關閉,在 Eureka Server 的 application.yaml 配置文件中加入以下配置:
eureka:
server:
# 參數(shù)來關閉保護機制,已確保注冊中心可以將不可用的實例正確剔除,默認為true
enable-self-preservation: false
5. Actuator 微服務信息完善
SpringCloud 體系里的服務實體向 Eureka 注冊時,注冊名默認是 IP名:應用名:應用端口名。
我們可以通過 actuator 來修改完善注冊名,在服務提供者或消費者的 pom.xml 文件中加入以下配置:
<!-- actuator監(jiān)控信息完善 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
然后在 application.yaml 配置文件中加入以下配置:
eureka:
instance:
# 實例名稱
instance-id: cloud-consumer01-80
6. 服務注冊發(fā)現(xiàn) Discovery
注冊進入 Eureka 里面的微服務,可以通過服務發(fā)現(xiàn)來獲取該服務的信息。
在服務提供者模塊controller類,具體如下:
@Slf4j
@RestController
@RequestMapping("/provider")
public class ProviderController {
@Autowired
private DiscoveryClient discoveryClient;
@GetMapping("/discovery")
public Object discovery() {
// 獲取所有微服務信息
List<String> services = discoveryClient.getServices();
for (String service : services) {
log.info("service:={}", service);
}
return this.discoveryClient;
}
/**
* 供消費者調用
*/
@GetMapping("/index")
public String getMsg() {
return "success";
}
}
RestTemplate 是從 Spring3.0 開始支持的一個 HTTP 請求工具,它提供了常見的REST請求方案的模版,例如 GET 請求、POST 請求、PUT 請求、DELETE 請求以及一些通用的請求執(zhí)行方法 exchange() 以及 execute()。
在服務消費者模塊中添加配置類,具體如下:
@Configuration
public class CloudConfig {
@LoadBalanced
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
最后在服務消費者模塊添加對應調用方法,具體如下:文章來源:http://www.zghlxwxcb.cn/news/detail-666681.html
@RestController
@RequestMapping("/consumer")
public class ConsumerController {
@Autowired
private RestTemplate restTemplate;
@GetMapping("/index")
public String index() {
// 遠程微服務調用地址: 微服務名稱
String host = "http://cloud-provider-8001";
// 具體URL
String url = "/provider/index";
// 發(fā)起遠程調用
// getForObject: 返回響應體中數(shù)據(jù)轉化成的對象, 可以理解為json
// getForEntity: 返回的是ResponseEntity的對象包含了一些重要的信息
return restTemplate.getForObject(host + url, String.class);
}
}
瀏覽器訪問:http://localhost:80/consumer/index 地址,即出現(xiàn)在服務提供者模塊中返回的 “success” 字符串。文章來源地址http://www.zghlxwxcb.cn/news/detail-666681.html
到了這里,關于服務注冊中心 Eureka的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!