什么是Eureka
??Eureka是SpringCloud的注冊(cè)中心,在分布式系統(tǒng)中是最重要的基礎(chǔ)部分。
注冊(cè)中心的重要性
??1.服務(wù)發(fā)現(xiàn)
??2.負(fù)載均衡
分布式中為什么需要服務(wù)發(fā)現(xiàn)
??如下圖所示,沒有注冊(cè)中心的時(shí)候,節(jié)點(diǎn)之間通信,都必須要知道對(duì)端的IP和端口,如果節(jié)點(diǎn)數(shù)量少還好,但是如果節(jié)點(diǎn)成千上萬,就非常難維護(hù)了,而且我們也知道節(jié)點(diǎn)也有可能會(huì)出現(xiàn)掛掉的情況,如果節(jié)點(diǎn)掛掉了,怎么避免連接到失效的節(jié)點(diǎn)上這也是注冊(cè)中心需要解決的問題。

??有了注冊(cè)中心后,如下圖所示,如果A要調(diào)用B,B有多個(gè)實(shí)例,那么實(shí)例每啟動(dòng)一個(gè)都會(huì)到注冊(cè)中心去報(bào)到,這個(gè)時(shí)候,A想調(diào)用B,直接到注冊(cè)中心去拿地址就可以了。其實(shí)注冊(cè)中心有點(diǎn)像老鴇,你去醉月樓的時(shí)候不可能直接站在里面說,如花在哪里,花魁在哪里,你第一時(shí)間接觸到的就是老鴇,然后老鴇告訴你XX在哪里,XXX在哪里,就是這么個(gè)意思~~

那么有了服務(wù)發(fā)現(xiàn),那么我可以想一想,A調(diào)用B可以怎么調(diào)用?第一種是客戶端的發(fā)現(xiàn)方式,即A從注冊(cè)中心拿到了一堆B的名單,然后從名單中自己選擇一個(gè),可以使用輪詢、hash等等,然后去訪問B。第二種服務(wù)發(fā)現(xiàn)方式是服務(wù)端發(fā)現(xiàn)方式:如下圖所示,就是通過一個(gè)代理幫你找到一個(gè)地址,然后告訴A去調(diào)用

思考
??1.客戶端調(diào)用方式的優(yōu)點(diǎn):客戶端知道所有的調(diào)用地址。缺點(diǎn):要自
己寫代碼去選擇地址調(diào)用
??2.服務(wù)端調(diào)用方式的優(yōu)點(diǎn):不用自己寫代碼了。缺點(diǎn):要調(diào)用的服務(wù)地址對(duì)我們來說是透明的
??3.如果讓我們做一個(gè)注冊(cè)中心,注冊(cè)中心僅僅支持Java語(yǔ)言可行嗎?當(dāng)然是不行的,因?yàn)槲⒎?wù)的特點(diǎn)是異構(gòu)性,何為異構(gòu),就是不同的語(yǔ)言,不同的數(shù)據(jù)庫(kù)類型。所以SpringCloud采用了Rest的調(diào)用方式,可以讓非Java語(yǔ)言的客戶端注冊(cè)到Eureka上面來。比如node.js就使用eureka-js-client來注冊(cè)到Eureka上面來。
Eureka 服務(wù)端配置
1.Java代碼
@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class, args);
}
}
2.POM文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.eureka</groupId>
<artifactId>eureka</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>eureka</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Greenwich.SR1</spring-cloud.version>
</properties>
<dependencies>
<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-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<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>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
3.配置文件
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka,http://localhost:8762/eureka
register-with-eureka: false
server:
enable-self-preservation: false
spring:
application:
name: eureka
server:
port: 8761
Eureka 客戶端配置
1.Java代碼
@SpringBootApplication
@EnableDiscoveryClient
public class ClientApplication {
public static void main(String[] args) {
SpringApplication.run(ClientApplication.class, args);
}
}
2.POM文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.eureka</groupId>
<artifactId>client</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>client</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Greenwich.SR1</spring-cloud.version>
</properties>
<dependencies>
<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>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<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>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
3.配置文件
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka,http://localhost:8762/eureka,http://localhost:8763/eureka
instance:
hostname: zzm
spring:
application:
name: client
注意事項(xiàng):
??1.eureka client一定要添加web依賴,否則無法注冊(cè)上去,這是一個(gè)很隱蔽的坑。
??2.然后這里我采用了多個(gè)Eureka服務(wù)端,為了保證其高可用性
??3.instance.hostname的配置可以讓我們?cè)趀urekaserver控制界面點(diǎn)擊對(duì)應(yīng)的服務(wù)項(xiàng)時(shí),可以跳轉(zhuǎn)到我們想去的地方
Eureka總結(jié)
??1.需要Server和Client,Server用于保存服務(wù)的注冊(cè)信息和client進(jìn)行通信,client用于注冊(cè)自己的服務(wù),或者到server端獲取要調(diào)用的服務(wù)的地址,并保持與server的心跳信息
??2.Eureka具有心跳檢測(cè)機(jī)制、健康檢查、負(fù)載均衡等功能
??3.Eureka具有高可用性,在生產(chǎn)上我們盡可能要部署兩臺(tái)以上
??4.這是我最后要講的一句話,為什么要寫在這里,主要是不想讓大家略過這篇文章,Eureka在SpringBoot 2.0之后就已經(jīng)不再維護(hù)了,但是它是我們理解注冊(cè)中心的一個(gè)很好的框架,現(xiàn)階段比較流行的就是Consul這個(gè)東西了,我會(huì)在后面的文章中給大家分享Consul。