SpringCloud微服務(wù)Eureka

什么是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。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容