天天看點

Spring Cloud Alibaba 之 Nacos 服務注冊與發現

服務注冊與發現,服務發現主要用于實作各個微服務執行個體的自動化注冊與發現,是微服務治理的核心,學習 Spring Cloud Alibaba,首先要了解架構中的服務注冊和發現元件——Nacos。

一、Spring Cloud 服務注冊和發現元件

1.Spring Cloud Eureka 閉源風波

在Spring Cloud的子項目中,Spring Cloud Netflix提供了Eureka來實作服務的發現功能,Eureka的服務發現包含兩大元件:服務端發現元件(EurekaServer)和用戶端發現元件(Eureka Client)。Eureka的服務發現機制如圖所示。

Spring Cloud Alibaba 之 Nacos 服務注冊與發現

當用戶端服務通過注解等方式嵌入到程式的代碼中運作時,用戶端發現元件就會向注冊中心注冊自身提供的服務,并周期性地發送心跳來更新服務,如果連續三次心跳都不能夠發現服務,那麼Eureka就會将這個服務節點從服務系統資料庫中移除。各個服務之間會通過注冊中心的注冊資訊以Rest方式來實作調用,并且可以直接通過服務名進行調用。

2012年,Netflix 将 Euerka 開源,Euerka 在 Spring Cloud 中廣泛應用,但是2018年6月, Netflix 宣布 Euerka 2.0 閉源,目前社群中內建的都是1.0版本,閉源之後,服務發現選擇哪個元件,答案就是 Nacos。

2.阿裡巴巴開源 Nacos

阿裡巴巴官方給Nacos的定位是「一個更易于建構雲原生應用的動态服務發現、配置管理和服務管理平台」。Nacos支援的功能包括服務發現,內建配置中心,和服務資料管理。

二、Nacos本地安裝和啟動

可以通過源碼和發行包兩種方式來擷取 Nacos,下面我們下載下傳源碼并且建構。

從 Github 上下載下傳源碼并編譯

git clone https://github.com/alibaba/nacos.git
cd nacos/
mvn -Prelease-nacos clean install -U  
ls -al distribution/target/

// change the $version to your actual path
cd distribution/target/nacos-server-$version/nacos/bin           

啟動Nacos服務

Linux/Unix/Mac系統

啟動指令(standalone代表着單機模式運作,非叢集模式):

sh startup.sh -m standalone           

Windows系統

啟動指令:

`

cmd startup.cmd

或者輕按兩下startup.cmd運作檔案

應用啟動之後,通路

http://127.0.0.1:8848/nacos/

,Nacos0.8 版本已經支援簡單登入功能,預設使用者名/密碼為: nacos/nacos。

Spring Cloud Alibaba 之 Nacos 服務注冊與發現

三、內建 Spring Cloud 服務發現

如果你還不是很熟悉 Spring Cloud 項目的建立,可以先看一下前面這篇博文,。

最新的版本關系檢視

版本說明Wiki

建立服務提供者

1.建立 Spring Boot 工程,命名為 nacos-spring-cloud,在中添加 Nocos 的依賴,注意:版本 0.2.x.RELEASE 對應的是 Spring Boot 2.x 版本,版本 0.1.x.RELEASE 對應的是 Spring Boot 1.x 版本。

<dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
                <version>0.2.2.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>com.alibaba.nacos</groupId>
                <artifactId>nacos-client</artifactId>
                <version>1.1.0</version>
            </dependency>
        </dependencies>
    </dependencyManagement>           

2.添加一個子產品,nacos-spring-cloud-provider,作為 服務提供者,Pom檔案配置如下

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

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>com.alibaba.nacos</groupId>
                    <artifactId>nacos-client</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>com.alibaba.nacos</groupId>
            <artifactId>nacos-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-validator</artifactId>
            <version>5.1.0.Final</version>
        </dependency>
    </dependencies>           

3.建立啟動類,在啟動類中添加一個Restful類型的方法,作為服務實作。

@SpringBootApplication
@EnableDiscoveryClient
@RestController
public class NacosProviderApplication {

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

    @RequestMapping(value = "/hello/{string}", method = RequestMethod.GET)
    public String echo(@PathVariable String string) {
        return "Hello " + string;
    }
}
           

4.修改配置檔案,注冊到 Nacos 控制台。

server.port=8070
spring.application.name=service-provider
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848           

5.啟動工程,檢視 Nacos 控制台。

Spring Cloud Alibaba 之 Nacos 服務注冊與發現

建立服務消費者

1.添加一個新 module,nacos-spring-cloud-consumer,作為服務消費者。

2.在啟動類中添加一個Restful類型的方法,Pom檔案依賴如下:

<properties>
        <spring-cloud-openfeign.version>2.0.0.RELEASE</spring-cloud-openfeign.version>
        <spring-cloud-netflix.version>2.0.0.RELEASE</spring-cloud-netflix.version>
    </properties>

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

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
            <version>${spring-cloud-netflix.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
            <version>${spring-cloud-openfeign.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>com.alibaba.nacos</groupId>
                    <artifactId>nacos-client</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>com.alibaba.nacos</groupId>
            <artifactId>nacos-client</artifactId>
        </dependency>
    </dependencies>           

3.建立啟動類和測試方法,來調用提供者的服務。

@SpringBootApplication
@EnableDiscoveryClient
public class NacosConsumerApplication {

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

    @LoadBalanced
    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }

}           

通過RestTemplate調用服務:

@RestController
public class TestController {

    @Autowired
    private RestTemplate restTemplate;

    @RequestMapping(value = "/hello/{str}", method = RequestMethod.GET)
    public String echo(@PathVariable String str) {
        return restTemplate.getForObject("http://service-provider/hello/" + str, String.class);
    }
}           

4.修改配置檔案,訂閱服務

server.port=8080
spring.application.name=service-consumer
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848           
Spring Cloud Alibaba 之 Nacos 服務注冊與發現

6.測試服務調用,正常傳回。

Spring Cloud Alibaba 之 Nacos 服務注冊與發現

四、總結

這個小教程用一個簡單的示例,搭建了基于Nacos的 Spring Cloud 服務發現,可以看到 Nacos 的控制台還有配置管理的功能,下一節會學習 Nacos 的配置管理。