??個(gè)人主頁(yè): ?? 葉落閑庭
??我的專(zhuān)欄:??
c語(yǔ)言
數(shù)據(jù)結(jié)構(gòu)
javaEE
操作系統(tǒng)
Redis
石可破也,而不可奪堅(jiān);丹可磨也,而不可奪赤。
一、Eureka原理分析
1.1 服務(wù)調(diào)用出現(xiàn)的問(wèn)題
當(dāng)有兩個(gè)服務(wù),第一個(gè)服務(wù)需要遠(yuǎn)程調(diào)用第二個(gè)服務(wù),采用的方式是發(fā)起一次HTTP請(qǐng)求,在之前的代碼中是將服務(wù)提供者的ip和端口號(hào)硬編碼到服務(wù)發(fā)起者中,采用這種方式會(huì)出現(xiàn)一些問(wèn)題,在開(kāi)發(fā)時(shí),會(huì)有開(kāi)發(fā)環(huán)境、測(cè)試環(huán)境、生產(chǎn)環(huán)境等,每次環(huán)境的變更可能會(huì)使服務(wù)的地址發(fā)生改變,采用硬編碼就需要在環(huán)境發(fā)生變化時(shí)修改硬編碼,然后重新編譯打包,這樣會(huì)很麻煩,同時(shí),為了處理并發(fā)等問(wèn)題,服務(wù)提供者可能會(huì)是一個(gè)集群,集群中每個(gè)服務(wù)提供者都有自己的地址,這樣由于服務(wù)消費(fèi)者的硬編碼,將無(wú)法準(zhǔn)確的得到想要的服務(wù)。
1.2 Eureka的作用
- 服務(wù)消費(fèi)者該如何獲取服務(wù)提供者的地址信息?
- 如果有多個(gè)服務(wù)提供者,消費(fèi)者該如何選擇?
- 消費(fèi)者如何得知服務(wù)提供者的健康狀態(tài)?
eureka中有一個(gè)eureka-server(注冊(cè)中心)和作為eureka-client(eureka客戶(hù)端)的服務(wù)消費(fèi)者和服務(wù)提供者,其中服務(wù)提供者在啟動(dòng)時(shí)會(huì)把自己的信息注冊(cè)給eureka-server,每一個(gè)服務(wù)啟動(dòng)時(shí)都會(huì)進(jìn)行注冊(cè)操作,此時(shí),若有服務(wù)消費(fèi)者想要獲取一個(gè)服務(wù),就可以從eureka注冊(cè)中心中找,服務(wù)消費(fèi)者將自己需要的服務(wù)發(fā)給注冊(cè)中心,注冊(cè)中心就會(huì)返回對(duì)應(yīng)的服務(wù)信息,但服務(wù)提供者可能是一個(gè)集群,那么注冊(cè)中心返回的結(jié)果可能是多個(gè),這時(shí)可以采用負(fù)載均衡的算法挑出一個(gè),然后發(fā)起遠(yuǎn)程調(diào)用的請(qǐng)求。
每個(gè)服務(wù)每隔30s都會(huì)向eureka-server(注冊(cè)中心)發(fā)送一次心跳,表示當(dāng)前服務(wù)正常運(yùn)行,當(dāng)eureka-server(注冊(cè)中心)超過(guò)規(guī)定時(shí)間沒(méi)有收到一個(gè)服務(wù)的心跳,會(huì)自動(dòng)將這個(gè)服務(wù)移除,說(shuō)明這個(gè)服務(wù)運(yùn)行出現(xiàn)了問(wèn)題。
二、 搭建Eureka
2.1 創(chuàng)建項(xiàng)目
在現(xiàn)有項(xiàng)目中創(chuàng)建名為eureka-server(可以自定義名稱(chēng))的子模塊
- 選擇Maven:
- 在pom.xml中添加Eureka的依賴(lài),添加SpringBoot的啟動(dòng)依賴(lài)
<dependencies>
<!--eureka服務(wù)端-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
2.2 編寫(xiě)啟動(dòng)類(lèi),添加@EnableEurekaServer注解
@EnableEurekaServer
@SpringBootApplication
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class,args);
}
}
2.3 添加application.yml的配置文件
server:
port: 10086
spring:
application:
name: eurekaserver # eureka服務(wù)名稱(chēng)
eureka:
client:
service-url: # eureka地址信息
defaultZone: http://localhost:10086/eureka
2.4 注冊(cè)服務(wù)到Eureka
- 將一個(gè)服務(wù)注冊(cè)到EurekaServer步驟如下:
2.4.1 在服務(wù)項(xiàng)目中引入eureka客戶(hù)端依賴(lài)
<!--eureka客戶(hù)端依賴(lài)-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
2.4.2 配置application.yml文件的信息
spring:
datasource:
url: jdbc:mysql://localhost:3306/cloud_user?useSSL=false
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver
application:
name: userservice # user服務(wù)的服務(wù)名稱(chēng)
eureka:
client:
service-url: #eureka地址信息
defaultZone: http://localhost:10086/eureka
2.4.3 模擬多實(shí)例部署
- 在idea中選擇一個(gè)部署好Eureka的模塊,右鍵選擇Copy Configuration
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-726709.html
- 自定義一個(gè)名字:
- 配置與原模塊不同的端口號(hào),點(diǎn)擊Environment,在VM options中修改端口
-Dserver.port=新端口號(hào)
:
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-726709.html
2.5 服務(wù)發(fā)現(xiàn)
2.5.1 在order-service完成服務(wù)拉取
- 服務(wù)拉取是基于服務(wù)名稱(chēng)獲取服務(wù)列表,然后在對(duì)服務(wù)列表做負(fù)載均衡
- 修改OrderService的代碼,修改訪問(wèn)的url路徑,用服務(wù)名代替ip、端口:
//2.利用RestTemplate發(fā)起http請(qǐng)求,查詢(xún)用戶(hù)
String url = "http://userservice/user/" + order.getUserId();
2.5.2 在order-service頂目的啟動(dòng)類(lèi)Orderapplication中的RestTemplate添加負(fù)載均衡注解
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
到了這里,關(guān)于【SpringCloud】Eureka原理分析、搭建Eureka服務(wù)、服務(wù)注冊(cè)、服務(wù)發(fā)現(xiàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!