溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

怎樣使用Spring Cloud搭建服務(wù)注冊(cè)中心

發(fā)布時(shí)間:2021-11-10 15:41:19 來源:億速云 閱讀:138 作者:柒染 欄目:大數(shù)據(jù)

怎樣使用Spring Cloud搭建服務(wù)注冊(cè)中心,相信很多沒有經(jīng)驗(yàn)的人對(duì)此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個(gè)問題。

與dubbo不同的是,Spring Cloud是一個(gè)一站式分布式框架,Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智能路由,微代理,控制總線)。分布式系統(tǒng)的協(xié)調(diào)導(dǎo)致了樣板模式, 使用Spring Cloud開發(fā)人員可以快速地支持實(shí)現(xiàn)這些模式的服務(wù)和應(yīng)用程序。他們將在任何分布式環(huán)境中運(yùn)行良好,包括開發(fā)人員自己的筆記本電腦,裸機(jī)數(shù)據(jù)中心,以及Cloud Foundry等托管平臺(tái)。那么今天我希望通過一個(gè)簡(jiǎn)單的案例帶小伙伴們來了解下Spring Cloud。

OK,那么本文我主要想介紹下在Spring Cloud中使用Eureka搭建一個(gè)服務(wù)注冊(cè)中心,然后再向其中注冊(cè)服務(wù)。由于Spring Cloud是在Spring Boot的基礎(chǔ)上構(gòu)建分布式服務(wù)的,所以閱讀本文需要有一點(diǎn)Spring Boot的知識(shí)儲(chǔ)備。
OK,那么上面所提到的是閱讀本文所需要具備的基礎(chǔ)知識(shí),在此基礎(chǔ)之上我們來看看怎么樣利用Spring Cloud中的Eureka來搭建服務(wù)注冊(cè)中心。

首先我要說的是Spring Cloud并不是一個(gè)東西,和Hadoop類似,Spring Cloud也包含了許多個(gè)子項(xiàng)目,我們今天要看的Eureka只是其中的一個(gè)子項(xiàng)目,Eureka的功能有點(diǎn)類似于我們之前寫過的zookeeper,它是一個(gè)服務(wù)治理組件,包含了服務(wù)注冊(cè)中心、服務(wù)注冊(cè)與發(fā)現(xiàn)機(jī)制。其他的組件我們這里先不做介紹,后面的系列文章都會(huì)一一提及到。

OK,廢話說了一籮筐,上代碼吧。 

創(chuàng)建服務(wù)注冊(cè)中心

創(chuàng)建一個(gè)普通的Spring Boot工程

首先我們需要?jiǎng)?chuàng)建一個(gè)普通的Spring Boot工程,命名為eureka-server,普通到什么程度呢?就是一個(gè)starter都不需要添加,創(chuàng)建成功之后就只引用了一個(gè)父starter。

添加Eureka依賴

工程創(chuàng)建成功之后,向pom.xml文件中添加eureka-server的依賴,目前eureka的穩(wěn)定版本是Dalston.SR3,添加完依賴之后,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>org.sang</groupId>
    <artifactId>eureka-server</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>eureka-server</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.6.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

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

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka-server</artifactId>
        </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>Dalston.SR3</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

那么這里依賴的添加我主要參考了Eureka官網(wǎng)的 http://projects.spring.io/spring-cloud/。

啟動(dòng)一個(gè)服務(wù)注冊(cè)中心

啟動(dòng)一個(gè)服務(wù)注冊(cè)中心的方式很簡(jiǎn)單,就是在Spring Boot的入口類上添加一個(gè)@EnableEurekaServer注解,如下:

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

配置服務(wù)注冊(cè)中心

最后我們?cè)僮鲆稽c(diǎn)簡(jiǎn)單的配置就可以了,配置就寫在Spring Boot的配置文件application.properties中,寫法如下:

server.port=1111
eureka.instance.hostname=localhost
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
eureka.client.service-url.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/

OK,那么關(guān)于這幾行注釋,我說如下幾點(diǎn):

1.server.port=1111表示設(shè)置該服務(wù)注冊(cè)中心的端口號(hào)
2.eureka.instance.hostname=localhost表示設(shè)置該服務(wù)注冊(cè)中心的hostname
3.eureka.client.register-with-eureka=false,由于我們目前創(chuàng)建的應(yīng)用是一個(gè)服務(wù)注冊(cè)中心,而不是普通的應(yīng)用,默認(rèn)情況下,這個(gè)應(yīng)用會(huì)向注冊(cè)中心(也是它自己)注冊(cè)它自己,設(shè)置為false表示禁止這種默認(rèn)行為
4.eureka.client.fetch-registry=false,表示不去檢索其他的服務(wù),因?yàn)榉?wù)注冊(cè)中心本身的職責(zé)就是維護(hù)服務(wù)實(shí)例,它也不需要去檢索其他服務(wù)

測(cè)試

OK,做完這一切之后,我們就可以啟動(dòng)這一個(gè)Spring Boot 服務(wù),服務(wù)啟動(dòng)成功之后,在瀏覽器中輸入:http://localhost:1111就能夠看到如下頁面:

怎樣使用Spring Cloud搭建服務(wù)注冊(cè)中心  

OK,看到上面這個(gè)頁面之后,表示你的服務(wù)注冊(cè)中心已經(jīng)搭建好了。

小結(jié)

我們之前專門有一篇博客介紹如何在Linux上安裝zookeeper【Linux上安裝Zookeeper以及一些注意事項(xiàng)】,但是對(duì)于Eureka卻不存在這樣的問題,因?yàn)镋ureka中的服務(wù)注冊(cè)中心實(shí)際上是一個(gè)Spring Boot工程,而Spring Boot工程我們知道可以直接打成一個(gè)jar包,然后java -jar命令就可以運(yùn)行,不管Windows還是Linux上,運(yùn)行方式都是一致的。

注冊(cè)服務(wù)提供者

OK,那么現(xiàn)在服務(wù)注冊(cè)中心有了之后,我們可以考慮向這個(gè)服務(wù)注冊(cè)中心注冊(cè)一個(gè)服務(wù)提供者了。

創(chuàng)建一個(gè)新的Spring Boot工程

還是創(chuàng)建一個(gè)Spring Boot工程,這次創(chuàng)建比之前創(chuàng)建多一個(gè)步驟,在創(chuàng)建的時(shí)候選中web的starter,我們來創(chuàng)建一個(gè)web工程,在IntelliJ IDEA中創(chuàng)建的時(shí)候選中web,如下:

怎樣使用Spring Cloud搭建服務(wù)注冊(cè)中心  

添加Eureka依賴

在創(chuàng)建好的工程中,我們需要添加Eureka依賴,添加方式如下:

<?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>org.sang</groupId>
    <artifactId>provider</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>
    <name>provider</name>
    <description>Demo project for Spring Boot</description>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.6.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <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>Dalston.SR3</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

創(chuàng)建應(yīng)用的入口

這是一個(gè)web工程,所以我們添加一個(gè)Controller,在該Controller中提供一個(gè)訪問入口,如下:

@RestController
public class HelloController {
    private final Logger logger = Logger.getLogger(getClass());
    @Autowired
    private DiscoveryClient client;

    @RequestMapping(value = "/hello", method = RequestMethod.GET)
    public String index() {
        List<ServiceInstance> instances = client.getInstances("hello-service");
        for (int i = 0; i < instances.size(); i++) {
            logger.info("/hello,host:" + instances.get(i).getHost() + ",service_id:" + instances.get(i).getServiceId());
        }
        return "Hello World";
    }
}

這里創(chuàng)建服務(wù)之后,在日志中將服務(wù)相關(guān)的信息打印出來。

激活Eureka中的DiscoveryClient

在Spring Boot的入口函數(shù)處,通過添加@EnableDiscoveryClient注解來激活Eureka中的DiscoveryClient實(shí)現(xiàn)(因?yàn)槲覀冊(cè)贖elloController中注入了DiscoveryClient)。

@EnableDiscoveryClient
@SpringBootApplication
public class ProviderApplication {

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

配置服務(wù)名稱和注冊(cè)中心地址

最后的最后,我們?cè)赼pplication.properties文件中配置一下服務(wù)名和注冊(cè)中心地址即可,如下:

spring.application.name=hello-service
eureka.client.service-url.defaultZone=http://localhost:1111/eureka

這兩行代碼的含義很簡(jiǎn)單,我就不多說了。

測(cè)試

做完這一切之后,我們就可以來測(cè)試了,直接運(yùn)行這個(gè)Spring Boot工程,運(yùn)行成功之后,我們刷新剛才的http://localhost:1111,就可以看到有一個(gè)服務(wù)已經(jīng)注冊(cè)成功了。如下:
怎樣使用Spring Cloud搭建服務(wù)注冊(cè)中心  

同時(shí),我們查看這個(gè)服務(wù)提供者運(yùn)行日志,也可以看到服務(wù)的信息,如下:

怎樣使用Spring Cloud搭建服務(wù)注冊(cè)中心  

OK,如此之后,我們一個(gè)服務(wù)注冊(cè)中心就搭建成功了,同時(shí)也有一個(gè)服務(wù)提供者成功的注冊(cè)了。但是這樣還有一個(gè)小問題,那就是我們這里是一個(gè)單節(jié)點(diǎn)的服務(wù)注冊(cè)中心,一旦發(fā)生了故障整個(gè)服務(wù)就癱瘓了,所以在實(shí)際應(yīng)用中,我們需要搭建高可用注冊(cè)中心。

看完上述內(nèi)容,你們掌握怎樣使用Spring Cloud搭建服務(wù)注冊(cè)中心的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI