SpringCloud快速入門學(xué)習(xí)(一)之服務(wù)注冊與發(fā)現(xiàn)——Netflix Eureka

前言

在這篇文章介紹并記錄如何搭建一個(gè)單節(jié)點(diǎn)Eureka以及高可用的Eureka服務(wù)。

根據(jù)springcloud官方文檔描述

Spring Cloud為開發(fā)人員提供了一些工具來快速構(gòu)建分布式系統(tǒng)中的一些常見模式(例如配置管理、服務(wù)發(fā)現(xiàn)、斷路器、智能路由、微代理、控制總線、一次性令牌、全局鎖、領(lǐng)導(dǎo)層選舉、分布式會(huì)話、群集狀態(tài))。分布式系統(tǒng)的協(xié)調(diào)導(dǎo)致了鍋爐板模式,使用Spring Cloud開發(fā)人員可以快速建立實(shí)現(xiàn)這些模式的服務(wù)和應(yīng)用程序。它們在任何分布式環(huán)境中都能很好地工作,包括開發(fā)人員自己的筆記本電腦、裸機(jī)數(shù)據(jù)中心和云計(jì)算(Cloud Foundry)等托管平臺(tái)。

微服務(wù)架構(gòu)

微服務(wù)架構(gòu)是一種將單個(gè)應(yīng)用程序拆分多個(gè)單個(gè)應(yīng)用組成的服務(wù),每個(gè)服務(wù)為獨(dú)立的業(yè)務(wù)開發(fā)獨(dú)立部署,分布式管理。

SpringCloud Eureka

服務(wù)發(fā)現(xiàn)是基于微服務(wù)架構(gòu)的關(guān)鍵原則之一。嘗試手動(dòng)配置每個(gè)客戶機(jī)或某種形式的約定可能很難做到,而且可能很脆弱。Eureka是Netflix服務(wù)發(fā)現(xiàn)服務(wù)器和客戶端。服務(wù)器可以配置和部署為高度可用,每個(gè)服務(wù)器將注冊服務(wù)的狀態(tài)復(fù)制到其他服務(wù)器。

Eureka主要由兩個(gè)組件組成
Eureka服務(wù)器

注解 @EnableEurekaServer
Eureka服務(wù)端用作服務(wù)注冊中心。支持集群部署。

Eureka客戶端。

@EnableDiscoveryClient
Eureka客戶端是一個(gè)java客戶端,用來處理服務(wù)注冊與發(fā)現(xiàn)。

在應(yīng)用啟動(dòng)時(shí),Eureka客戶端向服務(wù)端注冊自己的服務(wù)信息,同時(shí)將服務(wù)端的服務(wù)信息緩存到本地。客戶端會(huì)和服務(wù)端周期性的進(jìn)行心跳交互,以更新服務(wù)租約和服務(wù)信息。

注解@EnableEurekaClient上和@EnableDiscoveryClient

@EnableEurekaClient有@EnableDiscoveryClient的功能,其實(shí)@EnableEurekaClient注解就是一種方便使用eureka的注解而已,可以說使用其他的注冊中心后,都可以使用@EnableDiscoveryClient注解。

一、搭建單節(jié)點(diǎn)應(yīng)用
1.1 需要搭建的工程

父工程:用來管理springcloud版本,采用的是Greenwich.SR5,springboot為2.1.12版本。
子工程:用來注冊Eureka服務(wù)
子工程:用來發(fā)現(xiàn)Eureka服務(wù)
目錄為
創(chuàng)建maven工程Spring-cloud-parent
~~mi-eureka(父工程右鍵 new--》Module)
~~mi-user(同上)

1.1.1 父工程只需要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>

    <groupId>com.mi</groupId>
    <artifactId>Spring-Coud-Example</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>
    <modules>
        <module>mi-eureka</module>
        <module>mi-user</module>
    </modules>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.12.RELEASE</version>
    </parent>

    <properties>
        <spring-cloud.version>Greenwich.SR5</spring-cloud.version>
    </properties>
    
    <dependencies>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.16.18</version>
        </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>

    <repositories>
        <repository>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <url>https://repo.spring.io/milestone</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>
</project>
1.2 創(chuàng)建eureka注冊服務(wù) 子工程配置及依賴
1.2.1 子工程目錄
image.png
1.2.2 配置EurekaServer
@EnableEurekaServer
@SpringBootApplication
public class EurekaApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaApplication.class, args);
    }
}
1.2.3 配置application.yml
spring:
  application:
    name: mi-eureka
server:
  port: 8000
eureka:
  instance:
    hostname: localhost
  client:
    fetch-registry: false
    register-with-eureka: false    #因?yàn)樽约壕褪欠?wù)中心    所以不需要注冊
    service-url:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
1.2.4 配置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">

    <!-- 指定父pom, 在父pom中配置子模塊的公共依賴 -->
    <parent>
        <artifactId>Spring-Coud-Example</artifactId>
        <groupId>com.mi</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <packaging>jar</packaging>
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.mi</groupId>
    <artifactId>mi-eureka</artifactId>
    <version>1.0-SNAPSHOT</version>
    <!-- 模塊名及描述信息 -->
    <name>mi-eureka</name>
    <description>Spring Cloud Eureka</description>

    <!-- eureka server: 提供服務(wù)發(fā)現(xiàn)與服務(wù)注冊 -->
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
    </dependencies>
    <!--
    SpringBoot的Maven插件, 能夠以Maven的方式為應(yīng)用提供SpringBoot的支持,可以將
    SpringBoot應(yīng)用打包為可執(zhí)行的jar或war文件, 然后以通常的方式運(yùn)行SpringBoot應(yīng)用
 -->
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>
1.2.5 啟動(dòng) EurekaApplication

啟動(dòng)服務(wù)并訪問地址:localhost:8000

image.png
1.3 創(chuàng)建user服務(wù)發(fā)現(xiàn)子工程配置及依賴

工程包目錄結(jié)構(gòu)同上

1.3.1 配置DiscoveryClient
@EnableDiscoveryClient
@SpringBootApplication
public class UserApplication {
    public static void main(String[] args) {
        SpringApplication.run(UserApplication.class, args);
    }
}
1.3.2 配置application.yml

使用的ORM 是基于hibernate的JPA。

server:
  port: 9001
  servlet:
    context-path: /mi-user
spring:
  application:
    name: user
  jpa:
    show-sql: true
    hibernate:
      ddl-auto: none
    properties:
      hibernate.format_sql: true
    open-in-view: false
    database-platform: org.hibernate.dialect.MySQL5Dialect
  datasource:
      driver-class-name: com.mysql.jdbc.Driver
      username: root
      password: 123456
      url: jdbc:mysql://127.0.0.1:3306/scloud?characterEncoding=utf-8&useSSL=false
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8000/eureka/
1.3.3 配置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>mi-user</artifactId>
        <groupId>com.mi</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.mi</groupId>
    <artifactId>user-server</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>

    <dependencies>
        <!-- 引入 Web 功能 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--
            Eureka 客戶端, 客戶端向 Eureka Server 注冊的時(shí)候會(huì)提供一系列的元數(shù)據(jù)信息, 例如: 主機(jī), 端口, 健康檢查url等
            Eureka Server 接受每個(gè)客戶端發(fā)送的心跳信息, 如果在某個(gè)配置的超時(shí)時(shí)間內(nèi)未接收到心跳信息, 實(shí)例會(huì)被從注冊列表中移除
        -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        
        <!-- Java Persistence API, ORM 規(guī)范 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>

        <!-- 數(shù)據(jù)庫連接 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <!-- MySQL 驅(qū)動(dòng), 注意, 這個(gè)需要與 MySQL 版本對(duì)應(yīng) -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.12</version>
            <scope>runtime</scope>
        </dependency>
        <!-- apache 提供的一些工具類 -->
        <dependency>
            <groupId>commons-codec</groupId>
            <artifactId>commons-codec</artifactId>
            <version>1.9</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-test</artifactId>
        </dependency>
    </dependencies>

    <!--
       SpringBoot的Maven插件, 能夠以Maven的方式為應(yīng)用提供SpringBoot的支持,可以將
       SpringBoot應(yīng)用打包為可執(zhí)行的jar或war文件, 然后以通常的方式運(yùn)行SpringBoot應(yīng)用
    -->
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>
1.3.4 啟動(dòng) UserApplication

啟動(dòng)服務(wù)并訪問地址:localhost:9001
對(duì)于紅色的字體,只是在檢查服務(wù)的安全,可以不用理會(huì)


image.png

二、搭建高可用Eureka服務(wù)

2.1 在Eureka 工程y#ml 上 添加多個(gè)服務(wù)

注釋之前的

#spring:
#  application:
#    name: mi-eureka
#server:
#  port: 8000
#eureka:
#  instance:
#    hostname: localhost
#  client:
#    fetch-registry: false
#    register-with-eureka: false    #因?yàn)樽约壕褪欠?wù)中心    所以不需要注冊
#    service-url:
#      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

---
spring:
  application:
    name: mi-eureka
  profiles: server1
server:
  port: 8000
eureka:
  instance:
    hostname: server1
    prefer-ip-address: false
  client:
    service-url:
      defaultZone: http://server2:8001/eureka/,http://server3:8002/eureka/

---
spring:
  application:
    name: mi-eureka
  profiles: server2
server:
  port: 8001
eureka:
  instance:
    hostname: server2
    prefer-ip-address: false
  client:
    service-url:
      defaultZone: http://server1:8000/eureka/,http://server3:8002/eureka/

---
spring:
  application:
    name: mi-eureka
  profiles: server3
server:
  port: 8002
eureka:
  instance:
    hostname: server3
    prefer-ip-address: false
  client:
    service-url:
      defaultZone: http://server1:8000/eureka/,http://server2:8001/eureka/
2.2 對(duì)項(xiàng)目進(jìn)行打包

在父工程目錄下進(jìn)行打包命令

mvn clean package -Dmaven.test.skip=true -U
打包成jar包

2.3 修改本地hostname

在此之前修改本地的hostname,以免服務(wù)名重復(fù)沖突。
演示 win 10
在 C:\Windows\System32\drivers\etc下的hosts文件,進(jìn)行編輯,添加如下

微服務(wù) 本地發(fā)現(xiàn)

127.0.0.1 server1
127.0.0.1 server2
127.0.0.1 server3

2.4 打開3個(gè)cmd窗口,到打包jar下的目輸入命令

在此演示是方法項(xiàng)目錄是生成的target下的jar包


image.png

三個(gè)cmd窗口依次輸入

java -jar mi-eureka-1.0-SNAPSHOT.jar --spring.profiles.active=server1

java -jar mi-eureka-1.0-SNAPSHOT.jar --spring.profiles.active=server2

java -jar mi-eureka-1.0-SNAPSHOT.jar --spring.profiles.active=server3

2.5 訪問地址端口

訪問 localhost:8000


image.png
3 總結(jié)
  • @EnableEurekaServer @EnableEurekaClient
  • 心跳檢測、健康檢查、負(fù)載均衡等功能
  • Eureka的高可用,生產(chǎn)上建議至少兩臺(tái)以上
  • 分布式系統(tǒng)中、服務(wù)注冊中心是最重要的基本部分

以上就是本篇文的內(nèi)容,覺得不錯(cuò)就給個(gè)贊唄。
后為持續(xù)更新記錄。

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

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

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