Eureka入門教程

Eureka入門教程

? 一如碼農(nóng)深似海,今朝有酒今朝醉。入坑已經(jīng)五年多了,人總有所堅持,立個flag,想把spring、springboot、springcloud從入門教程到源碼分析,希望能對于讀者有用,ekko寫文章喜歡詳盡,源代碼有點多,不喜勿噴。


環(huán)境搭建

  • IDEA(個人推薦,功能強大不多說)、其次Spring Tools 4,工作這么多年,很大牛用這工具,也是不錯的選擇;其次eclipse。
  • jdk1.8環(huán)境。(google或者百度)
  • maven(gradle少部分公司用,暫不介紹,當(dāng)然,gradle更強大)

版本

參考官方https://spring.io/projects/spring-cloud

spring cloud版本 springboot版本
Hoxton 2.2.x
Greenwich 2.1.x
Finchley 2.0.x
Edgware 1.5.x
Dalston 1.5.x

我選擇spring cloud Hoxton.SR4、springboot版本2.2.5.RELEASE。(如果是公司項目建議用老版本,原因無它,坑少網(wǎng)上解決辦法多)。


父級pom.xml文件

<?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>

    <groupId>com.duoduo</groupId>
    <artifactId>duoduo-parent</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>pom</packaging>

    <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>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Hoxton.SR4</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.2.5.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

        </dependencies>
    </dependencyManagement>



    <build>
        <finalName>duoduo-parent</finalName>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
            </resource>
        </resources>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-resources-plugin</artifactId>
                <configuration>
                    <delimiters>
                        <delimit>$</delimit>
                    </delimiters>
                </configuration>
            </plugin>
        </plugins>
    </build>

    <modules>
        <module>duoduo-eureka</module>
        <module>duoduo-provider-service</module>
    </modules>
</project>

duoduo-eureka子項目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">
    <parent>
        <artifactId>duoduo-parent</artifactId>
        <groupId>com.duoduo</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>duoduo-eureka</artifactId>

    <dependencies>

        <!--eureka-server服務(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-devtools</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>


        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>
    </dependencies>
</project>

eureka啟動類

package com.duoduo.cloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

/**
 * @author ekko
 * eureka啟動類
 */
@SpringBootApplication
@EnableEurekaServer
public class ServerApplication {

    public static void main(String[] args) {
        SpringApplication.run(ServerApplication.class,args);
              // 官方文檔,編譯報錯,編譯報錯,可以使用下面代碼,個人還是喜歡上面那行代碼,啟動
              //new SpringApplicationBuilder(ServerApplication.class)
                .web(true).run(args);
      //new SpringApplicationBuilder(ServerApplication.class)
                .web(WebApplicationType.SERVLET).run(args);
      

    }

}

application.yml文件

server:
  port: 8761  #端口

eureka:
  instance:
    hostname: localhost #eureka服務(wù)端的實例名稱
  client:
    registerWithEureka: false #false表示不向注冊中心注冊自己。
    fetchRegistry: false #false表示自己端就是注冊中心,我的職責(zé)就是維護(hù)服務(wù)實例,并不需要去檢索服務(wù)
    serviceUrl:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ #設(shè)置與Eureka Server交互的地址查詢服務(wù)和注冊服務(wù)都需要依賴這個地址。

ServerApplication方法啟動

2020-05-23 14:49:39.025  INFO 8031 --- [      Thread-17] c.n.e.r.PeerAwareInstanceRegistryImpl    : Renew threshold is: 1
2020-05-23 14:49:39.025  INFO 8031 --- [      Thread-17] c.n.e.r.PeerAwareInstanceRegistryImpl    : Changing status to UP
2020-05-23 14:49:39.042  INFO 8031 --- [      Thread-17] e.s.EurekaServerInitializerConfiguration : Started Eureka Server
2020-05-23 14:49:39.112  INFO 8031 --- [  restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8761 (http) with context path ''
2020-05-23 14:49:39.114  INFO 8031 --- [  restartedMain] .s.c.n.e.s.EurekaAutoServiceRegistration : Updating port to 8761

控制臺顯示以上信息說明,eureka服務(wù)端啟動成功??梢栽L問http://localhost:8761/。


duoduo-provider-service 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">
    <parent>
        <artifactId>duoduo-parent</artifactId>
        <groupId>com.duoduo</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>duoduo-provider-service</artifactId>

    <dependencies>
        <!--eureka-server服務(wù)端 -->
        <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-actuator</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>
    </dependencies>
</project>

啟動類

package com.duoduo.cloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author ekko 不需要添加@EnableEurekaClient,后續(xù)有說明
 * eureka啟動類
 */
@SpringBootApplication
@RestController
public class ServiceApplication {

    public static void main(String[] args) {
        SpringApplication.run(ServiceApplication.class,args);
    }

    @RequestMapping("/")
    public String home() {
        return "Hello world";
    }

}

application.yml

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/
spring:
  application:
    name: DUODUO-PROVIDER-SERVICE # 項目服務(wù)名,如果不寫服務(wù)名,默認(rèn)服務(wù)名UNKNOWN

啟動ServiceApplication方法。在訪問http://localhost:8761/,會發(fā)現(xiàn)eureka控制臺Instances currently registered with Eureka多了一個DUODUO-PROVIDER-SERVICE的服務(wù)。

可能遇到問題

  • eureka自我保護(hù)機制(不用看到控制臺保紅就認(rèn)為eureka出問題了)

    不知道廣大讀者有沒有了解過CAP模型,eureka是典型AP模型,這里提一句題外話,zookeeper是典型的CP模型,在eureka server運行期間,會統(tǒng)計客戶端心跳的比例,15分鐘是否超過85%,超過則把會把實例注冊信息保護(hù)起來。再說一嘴zookeeper,在zk集群中,網(wǎng)絡(luò)出現(xiàn)問題,zk重新選舉leader,需要耗費不少的時間,這個期間,不可以zk注冊服務(wù),而eureka不同,可以繼續(xù)注冊。原因說這么多,面試官經(jīng)常會問zk、eureka的區(qū)別。這就是這道題的痛點吧。


github地址

https://github.com/itekko/duoduo-parent.git

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

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