Spring Cloud(二):Eureka 服務註冊中心

前言

服務治理

隨着業務的發展,微服務應用也隨之增長,這些服務的管理和治理會愈來愈難,而且集羣規模、服務位置、服務命名都會發生變化,手動維護的方式極易發生錯誤或是命名衝突等問題。而服務治理正是爲了解決這個問題,服務治理是微服務架構中最爲核心和基礎的模塊,它主要實現各個微服務實例的 自動化註冊和發現

服務註冊

在服務治理框架中,都會構建一個或多個服務註冊中心。

每一個服務模塊向註冊中心登記本身所提供的服務,將主機host、端口號、版本號、通訊協議等一些附加信息告知註冊中心,註冊中心按服務名分類組織服務清單。java

服務註冊中心還須要以心跳的方式去監測清單中的服務是否可用,若不可用須要從服務清單中剔除,達到排除故障服務的效果。node

服務發現

服務間調用再也不經過指定具體實例地址來實現,而是經過向服務名發起請求調用實現。

服務調用方須要先從服務註冊中心獲取全部服務的實例清單,才能實現對具體服務實例的訪問。git

服務調用方在發起調用時,會以某種策略取出一個具體的服務實例進行服務調用(客戶端負載均衡)。github

在生產環境中爲了考慮性能等因素,不會採用每次都向服務註冊中心獲取服務的方式,而且不一樣的應用場景在緩存和服務剔除等機制上也會採用不一樣的實現策略。spring

Spring Cloud Eureka

Spring Cloud Eureka 是基於 Netflix Eureka 來實現服務註冊和發現的。它主要包括兩個組件:windows

  • Eureka Server(服務端):服務註冊中心,支持高可用配置,依託於強一致性提供良好的服務實例可用性,服務註冊中心之間能夠經過異步模式互相複製各自的狀態。
  • Eureka Client(客戶端):處理服務的註冊與發現,客戶端能夠經過註解和參數配置的方式實現註冊與發現,客戶端向註冊中心註冊自身提供的服務並週期性地發送心跳來更新它的服務租約,Eureka客戶端從服務端查詢當前註冊的服務信息並把它們緩存到本地並週期性的刷新服務狀態。

Eureka 基礎架構緩存

  • 服務註冊中心(Eureka Server):服務端,提供服務註冊和發現功能。
  • 服務提供者(Service Provider):提供服務的應用,將本身提供的服務註冊到 Eureka Server,供其餘應用發現。
  • 服務消費者(Service Consumer):消費者應用從 Eureka Server 獲取服務列表,從而調用對應的服務(ribbon或者feign)。

基礎架構圖

架構

快速搭建服務註冊中心(Eureka Server)

1. 建立 Spring Boot 項目,添加依賴

<properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Hoxton.RELEASE</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>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </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>

2. @EnableEurekaServer 註解啓動服務註冊中心

@SpringBootApplication
@EnableEurekaServer
public class SpringCloudEurekaServerApplication {

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

}

3. 配置文件 application.properties

server.port=9999
#eureka
eureka.instance.hostname=127.0.0.1
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
eureka.client.serviceUrl.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/
  • eureka.client.register-with-eureka:當前應用爲服務註冊中心,因此設置爲false,表明不向註冊中心註冊本身。
  • eureka.client.fetch-registry:註冊中心的職責主要是維護服務實例,因此設置爲false,表明不去檢索當前應用的服務。
  • eureka.client.serviceUrl.defaultZone:用於與 Eureka Server 交互的地址,註冊服務和發現服務都須要依賴這個地址。

4.啓動應用,訪問:http://127.0.0.1:9999/

能夠看到 Eureka 的信息面板,其中 Instances currently registered with Eureka 中列表顯示 No instances available,說明該註冊中心尚未註冊任何服務。
app

服務提供者(Service Provider)

1. 建立 Spring Boot 項目,添加依賴

<properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Hoxton.RELEASE</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-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </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>

2. @EnableDiscoveryClient 註解啓動 Eureka 客戶端

@SpringBootApplication
//@EnableEurekaClient  該註解在採用eureka做爲註冊中心時使用,場景較爲單一
@EnableDiscoveryClient //場景更爲普遍
public class SpringCloudEurekaServiceApplication {

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

}

@EnableEurekaClient@EnableDiscoveryClient 在當前示例中使用效果好是同樣的,@EnableEurekaClient 註解在採用eureka做爲註冊中心時使用,場景較爲單一,@EnableDiscoveryClient 場景更爲普遍。負載均衡

3. 配置文件 application.properties

server.port=8888
spring.application.name=spring-cloud-eureka-service
#info 應用信息
info.app.name=spring-cloud-eureka-service
info.app.version=v1.0.0
info.app.description=spring-cloud-eureka-service
#eureka
eureka.instance.hostname=127.0.0.1
#每隔5s心跳一次,證實本服務還活着
eureka.instance.lease-renewal-interval-in-seconds=5
#本服務10s內沒有心跳,就將該服務從服務端剔除
eureka.instance.lease-expiration-duration-in-seconds=10
eureka.client.serviceUrl.defaultZone=http://127.0.0.1:9999/eureka/
  • eureka.instance.lease-renewal-interval-in-seconds:設置心跳間隔秒數
  • eureka.instance.lease-expiration-duration-in-seconds:設置秒數內無意跳,則剔除服務

4. 啓動應用,訪問:http://127.0.0.1:9999/

在服務註冊中心的控制檯中咱們能夠看到以下輸出,說明服務被註冊成功了。

c.n.e.registry.AbstractInstanceRegistry  : Registered instance SPRING-CLOUD-EUREKA-SERVICE/192.168.101.201:spring-cloud-eureka-service:8888 with status UP (replication=false)

而在 Eureka 的信息面板上,在 Instances currently registered with Eureka 列表中一樣能夠看到服務的註冊信息。以下圖:

高可用註冊中心(集羣)

上面介紹了單節點模式的服務註冊中心,不過在實際生產環境中,一般不會採用這種模式。在分佈式系統中,服務註冊中心是很是重要的組成部分,若是是單節點模式,發生故障的話將會是毀滅性的災害。因此爲了維護服務的高可用性,一般採用集羣的解決方案。

Eureka 的服務治理設計中,全部的節點既是服務提供方,也是服務消費方,服務註冊中心也不例外。Eureka 經過互相註冊服務的方式,以實現服務清單的互相同步,達到高可用的效果。

雙節點註冊中心

  1. 搭建服務註冊中心 A,配置文件以下:
server.port=9991
spring.application.name=eureka-server
spring.profiles.active=nodea
#eureka
eureka.instance.hostname=nodea
#設置微服務調用地址爲IP優先(缺省爲false)
#eureka.instance.prefer-ip-address=true
eureka.client.serviceUrl.defaultZone=http://nodeb:9992/eureka/
  1. 搭建服務註冊中心 B,配置文件以下:
server.port=9992
spring.application.name=eureka-server
spring.profiles.active=nodeb
#eureka
eureka.instance.hostname=nodeb
#設置微服務調用地址爲IP優先(缺省爲false)
#eureka.instance.prefer-ip-address=true
eureka.client.serviceUrl.defaultZone=http://nodea:9991/eureka/
  1. 在 /etc/hosts(windows系統路徑爲 C:WindowsSystem32driversetchosts) 文件中添加 nodea 和 nodeb 的轉換,以下:
127.0.0.1 nodea
127.0.0.1 nodeb
  1. 啓動兩個項目,分別訪問http://nodea:9991/http://nodeb:9992/,咱們能夠看到兩個節點都已經被註冊,以下圖所示:

  1. 搭建完多節點服務註冊中心以後,服務提供者也須要作一些簡單的配置,以上面的服務提供者爲例,修改以下:
eureka.client.serviceUrl.defaultZone=http://nodea:9991/eureka/,http://nodeb:9992/eureka/

啓動項目後,訪問兩個服務註冊中心,咱們看到服務被註冊到這兩個節點內。

  1. 這時咱們關閉服務註冊中心節點 A,咱們能夠看到服務註冊中心節點 B 依然能夠提供服務,而節點 A 從 available-replicas(能夠分片) 變爲 unavailable-replicas(不可用分片)。

服務消費者(Service Consumer)

使用 Ribbon 調用服務

1. pom 相關依賴配置
<properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Hoxton.RELEASE</spring-cloud.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
        </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>
2. 配置文件 application.properties
spring.application.name=spring-cloud-ribbon-consumer
server.port=8081
eureka.client.serviceUrl.defaultZone=http://nodea:9991/eureka/,http://nodeb:9992/eureka/
3. 啓動類配置

經過 @EnableDiscoveryClient 註解將應用註冊爲 Eureka 客戶端,得到服務發現能力。

建立 RestTemplate 的 Spring Bean 實例用來調用服務。

經過 @LoadBalanced 註解來開啓客戶端的負載均衡。

@SpringBootApplication
@EnableDiscoveryClient
public class SpringCloudRibbonConsumerApplication {

    @Bean
    @LoadBalanced
    RestTemplate restTemplate(){
        return new RestTemplate();
    }
    
    public static void main(String[] args) {
        SpringApplication.run(SpringCloudRibbonConsumerApplication.class, args);
    }

}
4. ConsumerController 來實現服務調用
@RestController
public class ConsumerController {

    @Autowired
    RestTemplate restTemplate;
    
    @RequestMapping("/test")
    public String test() {
        return restTemplate.getForEntity("http://spring-cloud-eureka-service/test", String.class).getBody();
    }
}

spring-cloud-eureka-service 爲服務註冊中心的應用名稱,大小寫都可。

使用 Feign 調用服務

1. pom 相關依賴配置
<properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Hoxton.RELEASE</spring-cloud.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </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>
2. 配置文件 application.properties
spring.application.name=spring-cloud-feign-consumer
server.port=8080
eureka.client.serviceUrl.defaultZone=http://nodea:9991/eureka/,http://nodeb:9992/eureka/
3. 啓動類配置

經過 @EnableDiscoveryClient 註解將應用註冊爲 Eureka 客戶端,得到服務發現能力。

經過 @EnableFeignClients 註解來啓用feign進行遠程調用。

@SpringBootApplication
@EnableDiscoveryClient//啓用服務註冊與發現
@EnableFeignClients//啓用feign進行遠程調用
public class SpringCloudFeignConsumerApplication {

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

}
4. 實現服務調用接口
@FeignClient(name = "spring-cloud-eureka-service")
public interface TestService {

    @RequestMapping("/test")
    public String test();
}

spring-cloud-eureka-service 爲服務註冊中心的應用名稱,大小寫都可。

此接口中的方法和遠程服務中contoller中的方法名和參數需保持一致。

5. ConsumerController 來實現服務調用
@RestController
public class ConsumerController {

    @Autowired
    private TestService testService;
    
    @RequestMapping("/test")
    public String test() {
        return testService.test();
    }
}

示例代碼

github

碼雲

非特殊說明,本文版權歸 朝霧輕寒 全部,轉載請註明出處.

原文標題:Spring Cloud(二):Eureka 服務註冊中心

原文地址: https://www.zwqh.top/article/info/28

若是文章有不足的地方,歡迎提點建議,後續會完善~

若是文章對您有幫助,請給我點個贊哦~

關注下個人公衆號,文章持續更新中...

相關文章
相關標籤/搜索