Spring Cloud(一)服務(wù)的注冊(cè)與發(fā)現(xiàn)(Eureka)

2021-02-19 14:41 更新

Spring Cloud是一個(gè)基于Spring Boot實(shí)現(xiàn)的云應(yīng)用開(kāi)發(fā)工具,它為基于JVM的云應(yīng)用開(kāi)發(fā)中涉及的配置管理、服務(wù)發(fā)現(xiàn)、斷路器、智能路由、微代理、控制總線、全局鎖、決策競(jìng)選、分布式會(huì)話和集群狀態(tài)管理等操作提供了一種簡(jiǎn)單的開(kāi)發(fā)方式。

Spring Cloud簡(jiǎn)介

Spring Cloud包含了多個(gè)子項(xiàng)目(針對(duì)分布式系統(tǒng)中涉及的多個(gè)不同開(kāi)源產(chǎn)品),比如:Spring Cloud Config、Spring Cloud Netflix、Spring Cloud CloudFoundry、Spring Cloud AWS、Spring Cloud Security、Spring Cloud Commons、Spring Cloud Zookeeper、Spring Cloud CLI等項(xiàng)目。

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

微服務(wù)(Microservices Architecture)是一種架構(gòu)風(fēng)格,一個(gè)大型復(fù)雜軟件應(yīng)用由一個(gè)或多個(gè)微服務(wù)組成。系統(tǒng)中的各個(gè)微服務(wù)可被獨(dú)立部署,各個(gè)微服務(wù)之間是松耦合的。每個(gè)微服務(wù)僅關(guān)注于完成一件任務(wù)并很好地完成該任務(wù)。在所有情況下,每個(gè)任務(wù)代表著一個(gè)小的業(yè)務(wù)能力。

微服務(wù)的概念源于2014年3月Martin Fowler所寫的章“Microservices”http://martinfowler.com/articles/microservices.html

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

微服務(wù)架構(gòu)的核心思想是,一個(gè)應(yīng)用是由多個(gè)小的、相互獨(dú)立的、微服務(wù)組成,這些服務(wù)運(yùn)行在自己的進(jìn)程中,開(kāi)發(fā)和發(fā)布都沒(méi)有依賴。不同服務(wù)通過(guò)一些輕量級(jí)交互機(jī)制來(lái)通信,例如 RPC、HTTP 等,服務(wù)可獨(dú)立擴(kuò)展伸縮,每個(gè)服務(wù)定義了明確的邊界,不同的服務(wù)甚至可以采用不同的編程語(yǔ)言來(lái)實(shí)現(xiàn),由獨(dú)立的團(tuán)隊(duì)來(lái)維護(hù)。簡(jiǎn)單的來(lái)說(shuō),一個(gè)系統(tǒng)的不同模塊轉(zhuǎn)變成不同的服務(wù)!而且服務(wù)可以使用不同的技術(shù)加以實(shí)現(xiàn)!

微服務(wù)設(shè)計(jì)

那我們?cè)谖⒎?wù)中應(yīng)該怎樣設(shè)計(jì)呢。以下是微服務(wù)的設(shè)計(jì)指南:

  • 職責(zé)單一原則(Single Responsibility Principle):把某一個(gè)微服務(wù)的功能聚焦在特定業(yè)務(wù)或者有限的范圍內(nèi)會(huì)有助于敏捷開(kāi)發(fā)和服務(wù)的發(fā)布。
  • 設(shè)計(jì)階段就需要把業(yè)務(wù)范圍進(jìn)行界定。
  • 需要關(guān)心微服務(wù)的業(yè)務(wù)范圍,而不是服務(wù)的數(shù)量和規(guī)模盡量小。數(shù)量和規(guī)模需要依照業(yè)務(wù)功能而定。
  • 于SOA不同,某個(gè)微服務(wù)的功能、操作和消息協(xié)議盡量簡(jiǎn)單。
  • 項(xiàng)目初期把服務(wù)的范圍制定相對(duì)寬泛,隨著深入,進(jìn)一步重構(gòu)服務(wù),細(xì)分微服務(wù)是個(gè)很好的做法。

關(guān)于微服務(wù)架構(gòu)的取舍

  • 在合適的項(xiàng)目,合適的團(tuán)隊(duì),采用微服務(wù)架構(gòu)收益會(huì)大于成本。
  • 微服務(wù)架構(gòu)有很多吸引人的地方,但在擁抱微服務(wù)之前,也需要認(rèn)清它所帶來(lái)的挑戰(zhàn)。
  • 需要避免為了“微服務(wù)”而“微服務(wù)”。
  • 微服務(wù)架構(gòu)引入策略 – 對(duì)傳統(tǒng)企業(yè)而言,開(kāi)始時(shí)可以考慮引入部分合適的微服務(wù)架構(gòu)原則對(duì)已有系統(tǒng)進(jìn)行改造或新建微服務(wù)應(yīng)用,逐步探索及積累微服務(wù)架構(gòu)經(jīng)驗(yàn),而非全盤實(shí)施微服務(wù)架構(gòu)。

更多關(guān)于微服務(wù)架構(gòu)內(nèi)容-請(qǐng)參考我的另一篇文章:《什什么是微服務(wù)架構(gòu)?》

服務(wù)治理

由于Spring Cloud為服務(wù)治理做了一層抽象接口,所以在Spring Cloud應(yīng)用中可以支持多種不同的服務(wù)治理框架,比如:Netflix Eureka、Consul、Zookeeper。在Spring Cloud服務(wù)治理抽象層的作用下,我們可以無(wú)縫地切換服務(wù)治理實(shí)現(xiàn),并且不影響任何其他的服務(wù)注冊(cè)、服務(wù)發(fā)現(xiàn)、服務(wù)調(diào)用等邏輯。

Spring Cloud Eureka

Spring Cloud Eureka來(lái)實(shí)現(xiàn)服務(wù)治理。

Spring Cloud Eureka是Spring Cloud Netflix項(xiàng)目下的服務(wù)治理模塊。而Spring Cloud Netflix項(xiàng)目是Spring Cloud的子項(xiàng)目之一,主要內(nèi)容是對(duì)Netflix公司一系列開(kāi)源產(chǎn)品的包裝,它為Spring Boot應(yīng)用提供了自配置的Netflix OSS整合。通過(guò)一些簡(jiǎn)單的注解,開(kāi)發(fā)者就可以快速的在應(yīng)用中配置一下常用模塊并構(gòu)建龐大的分布式系統(tǒng)。它主要提供的模塊包括:服務(wù)發(fā)現(xiàn)(Eureka),斷路器(Hystrix),智能路由(Zuul),客戶端負(fù)載均衡(Ribbon)等。

Eureka Server

提供服務(wù)注冊(cè)和發(fā)現(xiàn)

添加依賴

在項(xiàng)目 spring-cloud-eureka-service pom.xml中引入需要的依賴內(nèi)容:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>

開(kāi)啟服務(wù)注冊(cè)

通過(guò) @EnableEurekaServer 注解啟動(dòng)一個(gè)服務(wù)注冊(cè)中心提供給其他應(yīng)用進(jìn)行對(duì)話,這個(gè)注解需要在springboot工程的啟動(dòng)application類上加

package io.ymq.example.eureka.server;


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


@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {


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

添加配置

在默認(rèn)設(shè)置下,該服務(wù)注冊(cè)中心也會(huì)將自己作為客戶端來(lái)嘗試注冊(cè)它自己,所以我們需要禁用它的客戶端注冊(cè)行為,只需要在application.yml配置文件中增加如下信息:

registerWithEureka: false
fetchRegistry: false

完整配置

server:
  port: 8761


eureka:
  instance:
    hostname: localhost
  client:
    registerWithEureka: false
    fetchRegistry: false
    serviceUrl:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

訪問(wèn)服務(wù)

啟動(dòng)工程后,訪問(wèn):http://localhost:8761/

可以看到下面的頁(yè)面,其中還沒(méi)有發(fā)現(xiàn)任何服務(wù)。

 System Status

Service Provider

  • 服務(wù)提供方
  • 將自身服務(wù)注冊(cè)到 Eureka 注冊(cè)中心,從而使服務(wù)消費(fèi)方能夠找到

添加依賴

在項(xiàng)目 spring-cloud-eureka-provider pom.xml中引入需要的依賴內(nèi)容:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>

開(kāi)啟服務(wù)注冊(cè)

在應(yīng)用主類中通過(guò)加上 @EnableEurekaClient,但只有Eureka 可用,你也可以使用@EnableDiscoveryClient。需要配置才能找到Eureka注冊(cè)中心服務(wù)器

package io.ymq.example.eureka.provider;


import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;


@SpringBootApplication
@EnableEurekaClient
@RestController
public class EurekaProviderApplication {


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


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

添加配置

需要配置才能找到Eureka服務(wù)器。例:

完整配置

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/


spring:
  application:
    name: eureka-provider


server:
  port: 8081

其中defaultZone是一個(gè)魔術(shù)字符串后備值,為任何不表示首選項(xiàng)的客戶端提供服務(wù)URL(即它是有用的默認(rèn)值)。 通過(guò)spring.application.name屬性,我們可以指定微服務(wù)的名稱后續(xù)在調(diào)用的時(shí)候只需要使用該名稱就可以進(jìn)行服務(wù)的訪問(wèn)

訪問(wèn)服務(wù)

啟動(dòng)該工程后,再次訪問(wèn)啟動(dòng)工程后:http://localhost:8761/

可以如下圖內(nèi)容,我們定義的服務(wù)被成功注冊(cè)了。

 DS Replicas

源碼下載

GitHub:https://github.com/souyunku/spring-cloud-examples/tree/master/spring-cloud-eureka

碼云:https://gitee.com/souyunku/spring-cloud-examples/tree/master/spring-cloud-eureka

Contact

  • 作者:鵬磊
  • 出處:http://www.souyunku.com
  • Email:admin@souyunku.com
  • 版權(quán)歸作者所有,轉(zhuǎn)載請(qǐng)注明出處
  • Wechat:關(guān)注公眾號(hào),搜云庫(kù)技術(shù)團(tuán)隊(duì),專注于開(kāi)發(fā)技術(shù)的研究與知識(shí)分享

    關(guān)注公眾號(hào)-搜云庫(kù)

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)