[微服務(wù)系列] 2. 服務(wù)治理--Eureka

一、服務(wù)治理

所謂服務(wù)治理就是用來(lái)實(shí)現(xiàn)各個(gè)微服務(wù)實(shí)例的自動(dòng)化注冊(cè)于發(fā)現(xiàn)。當(dāng)多個(gè)微服務(wù)互相調(diào)用時(shí),就需要維護(hù)一個(gè)靜態(tài)的配置文件,來(lái)說(shuō)明各自所承擔(dān)的服務(wù)內(nèi)容、地址、端口等信息,其他服務(wù)調(diào)用時(shí),就需要去查詢(xún)這個(gè)配置文件,以獲取服務(wù)。但是隨著業(yè)務(wù)的發(fā)展,系統(tǒng)功能越發(fā)變得復(fù)雜,之前的靜態(tài)配置文件維護(hù)起來(lái)也越發(fā)的耗費(fèi)精力時(shí)間,并且由于需求的不管變更,使得服務(wù)的命名、地址都會(huì)發(fā)生變化,所以為了解決這樣的問(wèn)題,在微服務(wù)架構(gòu)中,會(huì)使用服務(wù)治理來(lái)注冊(cè)和發(fā)現(xiàn)微服務(wù)中的實(shí)例,并進(jìn)行統(tǒng)一的管理。

二、服務(wù)的注冊(cè)與發(fā)現(xiàn)

1. 服務(wù)注冊(cè)于發(fā)現(xiàn).png

關(guān)系調(diào)用說(shuō)明:

  • 服務(wù)生產(chǎn)者啟動(dòng)時(shí),向服務(wù)注冊(cè)中心注冊(cè)自己提供的服務(wù)
  • 服務(wù)消費(fèi)者啟動(dòng)時(shí),在服務(wù)注冊(cè)中心訂閱自己所需要的服務(wù)
  • 注冊(cè)中心返回服務(wù)提供者的地址信息個(gè)消費(fèi)者
  • 消費(fèi)者從提供者中調(diào)用服務(wù)

三、Eureka

Eureka是Spring Cloud Netflix微服務(wù)套件中的一部分,可以與Springboot構(gòu)建的微服務(wù)很容易的整合起來(lái)。
Eureka包含了服務(wù)器端和客戶(hù)端組件。服務(wù)器端,也被稱(chēng)作是服務(wù)注冊(cè)中心,用于提供服務(wù)的注冊(cè)與發(fā)現(xiàn)。Eureka支持高可用的配置,當(dāng)集群中有分片出現(xiàn)故障時(shí),Eureka就會(huì)轉(zhuǎn)入自動(dòng)保護(hù)模式,它允許分片故障期間繼續(xù)提供服務(wù)的發(fā)現(xiàn)和注冊(cè),當(dāng)故障分片恢復(fù)正常時(shí),集群中其他分片會(huì)把他們的狀態(tài)再次同步回來(lái)。
客戶(hù)端組件包含服務(wù)消費(fèi)者與服務(wù)生產(chǎn)者。在應(yīng)用程序運(yùn)行時(shí),Eureka客戶(hù)端向注冊(cè)中心注冊(cè)自身提供的服務(wù)并周期性的發(fā)送心跳來(lái)更新它的服務(wù)租約。同時(shí)也可以從服務(wù)端查詢(xún)當(dāng)前注冊(cè)的服務(wù)信息并把他們緩存到本地并周期性的刷新服務(wù)狀態(tài)。

四、使用Eureka進(jìn)行服務(wù)治理

1. 搭建服務(wù)注冊(cè)中心

單獨(dú)創(chuàng)建一個(gè)Springboot項(xiàng)目,并添加如下的依賴(lài)

<dependencies>
  <!--添加Eureka服務(wù)器端依賴(lài)-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka-server</artifactId>
        </dependency>
</dependencies>

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

在Springboot項(xiàng)目中的main入口,添加@EnableEurekaServer注解,來(lái)開(kāi)啟服務(wù)注冊(cè)中心

@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {

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

在默認(rèn)情況下,服務(wù)注冊(cè)中心也會(huì)把自己當(dāng)做是一個(gè)服務(wù),將自己注冊(cè)進(jìn)服務(wù)注冊(cè)中心,所以我們可以通過(guò)配置來(lái)禁用他的客戶(hù)端注冊(cè)行為,在application.properties中添加如下配置:

server.port=3333

eureka.instance.hostname=localhost
#不要向注冊(cè)中心注冊(cè)自己
eureka.client.register-with-eureka=false
#禁止檢索服務(wù)
eureka.client.fetch-registry=false
eureka.client.service-url.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka

啟動(dòng)應(yīng)用,并訪問(wèn)http://localhost:3333/即可看到Eureka信息面板,如下:

2. Eureka信息面板.png

從上圖看到,在"Instances currently registered with Eureka"信息中,沒(méi)有一個(gè)實(shí)例,說(shuō)明目前還沒(méi)有服務(wù)注冊(cè)。

2. 注冊(cè)服務(wù)

基于文章[微服務(wù)系列] 微服務(wù)構(gòu)建框架--Spring Boot中構(gòu)建的第一個(gè)Springboot項(xiàng)目,來(lái)進(jìn)行改造。首先在pom文件中添加Eureka客戶(hù)端相關(guān)的依賴(lài):

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

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

在之前的TestRestful方法中添加如下代碼,將org.springframework.cloud.client.discovery.DiscoveryClient;對(duì)象注入,并且在日志中打印出與服務(wù)相關(guān)的一些信息。

@RestController
public class TestRestful {

    private final Logger logger=Logger.getLogger(getClass());

    @Autowired
    private DiscoveryClient client;

    @RequestMapping(value = "/hello",method = RequestMethod.GET)
    public String home(){
        ServiceInstance instance=client.getLocalServiceInstance();
        logger.info("serviceId"+instance.getServiceId()+"host:post="+instance.getHost()+":"+instance.getPort());
        return "hello spring";
    }
}

在主類(lèi)上添加@EnableEurekaClient注解以實(shí)現(xiàn)Eureka中的DiscoveryClient實(shí)現(xiàn)。

@EnableEurekaClient
@SpringBootApplication
public class SpringbootdemoApplication {

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

最后在配置文件application.yml中配置與服務(wù)相關(guān)的一些基本信息,如服務(wù)名、注冊(cè)中心地址(即上一節(jié)中設(shè)置的注冊(cè)中心地址http://localhost:3333/eureka)

#  設(shè)置服務(wù)名
spring:
  application:
    name: hello-service
#  設(shè)置注冊(cè)中心地址
eureka:
  client:
    service-url:
      defaultZone: http://localhost:3333/eureka
3. 測(cè)試
  1. 啟動(dòng)注冊(cè)中心服務(wù)
  2. 啟動(dòng)springbootdemo項(xiàng)目,可以看到如下的信息,說(shuō)明此服務(wù)已經(jīng)注冊(cè)在了注冊(cè)中心
3 服務(wù)啟動(dòng)日志.png

同時(shí)訪問(wèn)http://localhost:3333/可以在Instances currently registered with Eureka中看到已經(jīng)有一個(gè)服務(wù)注冊(cè)了進(jìn)來(lái),并且名稱(chēng)為HELLO-SERVICE的服務(wù)

4 服務(wù)啟動(dòng).png
  1. 訪問(wèn)http://localhost:8088/hello可以在控制臺(tái)中看到如下日志信息:
5 日志.png

五、 小結(jié)

在本章中,主要介紹在微服務(wù)中服務(wù)治理的基本概念,通過(guò)簡(jiǎn)單的實(shí)踐,搭建單節(jié)點(diǎn)服務(wù)注冊(cè)中心,并實(shí)現(xiàn)了服務(wù)的注冊(cè),了解服務(wù)治理的基本工作流程。

最后編輯于
?著作權(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)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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