1. 程式人生 > >第二篇:SpringCloud 構建微服務系統之服務註冊和發現(nacos)

第二篇:SpringCloud 構建微服務系統之服務註冊和發現(nacos)

上一篇我們學習了一下consul在soringcloud中的使用。今天要給大家介紹的阿里巴巴中介軟體團隊出品的Nacos來作為新一代的服務管理中介軟體。
首先學習Nacos之前,我們應該看看Nacos的官網,對它有一個初步的認識。

1. Nacos 官網 (https://nacos.io

在這裡插入圖片描述

2 Nacos簡介

Nacos 致力於幫助您發現、配置和管理微服務。Nacos 提供了一組簡單易用的特性集,幫助您快速實現動態服務發現、服務配置、服務元資料及流量管理。

Nacos 幫助您更敏捷和容易地構建、交付和管理微服務平臺。 Nacos 是構建以“服務”為中心的現代應用架構 (例如微服務正規化、雲原生正規化) 的服務基礎設施。

3.Nocos基本架構及概念

在這裡插入圖片描述

  • 服務 (Service)

服務是指一個或一組軟體功能(例如特定資訊的檢索或一組操作的執行),其目的是不同的客戶端可以為不同的目的重用(例如通過跨程序的網路呼叫)。Nacos 支援主流的服務生態,如 Kubernetes Service、gRPC|Dubbo RPC Service 或者 Spring Cloud RESTful Service.

  • 服務註冊中心 (Service Registry)

服務註冊中心,它是服務,其例項及元資料的資料庫。服務例項在啟動時註冊到服務登錄檔,並在關閉時登出。服務和路由器的客戶端查詢服務登錄檔以查詢服務的可用例項。服務註冊中心可能會呼叫服務例項的健康檢查 API 來驗證它是否能夠處理請求。

  • 服務元資料 (Service Metadata)

服務元資料是指包括服務端點(endpoints)、服務標籤、服務版本號、服務例項權重、路由規則、安全策略等描述服務的資料

  • 服務提供方 (Service Provider)

是指提供可複用和可呼叫服務的應用方

  • 服務消費方 (Service Consumer)

是指會發起對某個服務呼叫的應用方

  • 配置 (Configuration)

在系統開發過程中通常會將一些需要變更的引數、變數等從程式碼中分離出來獨立管理,以獨立的配置檔案的形式存在。目的是讓靜態的系統工件或者交付物(如 WAR,JAR 包等)更好地和實際的物理執行環境進行適配。配置管理一般包含在系統部署的過程中,由系統管理員或者運維人員完成這個步驟。配置變更是調整系統執行時的行為的有效手段之一。

  • 配置管理 (Configuration Management)

在資料中心中,系統中所有配置的編輯、儲存、分發、變更管理、歷史版本管理、變更審計等所有與配置相關的活動統稱為配置管理。

  • 名字服務 (Naming Service)

提供分散式系統中所有物件(Object)、實體(Entity)的“名字”到關聯的元資料之間的對映管理服務,例如 ServiceName -> Endpoints Info, Distributed Lock Name -> Lock Owner/Status Info, DNS Domain Name -> IP List, 服務發現和 DNS 就是名字服務的2大場景。

  • 配置服務 (Configuration Service)

在服務或者應用執行過程中,提供動態配置或者元資料以及配置管理的服務提供者

4. Nocos 安裝與啟動

4.1.預備環境準備

Nacos 依賴 Java 環境來執行。如果您是從程式碼開始構建並執行Nacos,還需要為此配置 Maven環境,請確保是在以下版本環境中安裝使用:

64 bit OS,支援 Linux/Unix/Mac/Windows,推薦選用 Linux/Unix/Mac。
64 bit JDK 1.8+;下載 & 配置。
Maven 3.2.x+;下載 & 配置。

4.2.下載原始碼或者安裝包

你可以通過原始碼和發行包兩種方式來獲取 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-server-$version.zip 包。

unzip nacos-server-$version.zip 或者 tar -xvf nacos-server-$version.tar.gz
cd nacos/bin

4.3.啟動伺服器

Linux/Unix/Mac
啟動命令(standalone代表著單機模式執行,非叢集模式):

sh startup.sh -m standalone

Windows
啟動命令:

cmd startup.cmd

或者雙擊startup.cmd執行檔案。
在這裡插入圖片描述

啟動成功之後,在瀏覽器開啟 http://localhost:8848/nacos/

在這裡插入圖片描述
這樣的一個控制檯就啟動成功了。

注意:我們今天主要是要學習nacos作為服務註冊中心的案例。

5. 服務註冊與發現

5.1服務註冊

curl -X PUT 'http://127.0.0.1:8848/nacos/v1/ns/instance?serviceName=nacos.naming.serviceName&ip=20.18.7.10&port=8080'

5.2服務發現

curl -X GET 'http://127.0.0.1:8848/nacos/v1/ns/instances?serviceName=nacos.naming.serviceName'

6. Nacos 服務提供者

6.1建立一個專案:spring-cloud-nacos-provider

引入依賴

<?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>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.1.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.lidong</groupId>
    <artifactId>spring-cloud-nacos-producer</artifactId>
    <version>1.0.0</version>
    <name>spring-cloud-nacos-producer</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Greenwich.RC2</spring-cloud.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <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>
            <version>0.2.1.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <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>
    </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>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

    <repositories>
        <repository>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <url>https://repo.spring.io/milestone</url>
        </repository>
    </repositories>

</project>


對配置檔案做一個簡單的介紹,我們使用的是最新版的springboot2.1.1,springcloud.Greenwich.RC2版本。
其中:

spring-boot-starter-actuator   健康檢查依賴於此包。
spring-cloud-starter-alibaba-nacos-discovery   Spring Cloud nacos 的服務發現支援。

6.2 提供者新增配置(application.yml)

server:
  port: 9005 #提供者的埠
spring:
  application:
    name: spring-cloud-nacos-producer
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848

management:
  endpoints:
    web:
      exposure:
        include: '*'

nacos的地址和埠號預設是127.0.0.1:8848 ,如果沒有配置hosts,預設的地址localhost,nacos服務會佔用8848埠
server.port :9005 服務的提供者的埠
spring.application.name 是指註冊到 nacos 的服務名稱,後期客戶端會根據這個名稱來進行服務呼叫。
spring.application.cloud.nacos.discovery.server-addr: 127.0.0.1:8848

6.3 修改啟動類

新增 @EnableDiscoveryClient 註解,開啟服務發現支援。

package com.lidong.provider;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

/**
 * 開啟服務發現
 */
@EnableDiscoveryClient
@SpringBootApplication
public class SpringCloudLidongProviderApplication {

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

}

6.4新建服務

新建 NacosProducerController,提供 sayHello 介面, 返回一個hello—>字串。

package com.lidong.provider.service;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * 建立服務
 */
@RestController
public class NacosProducerController {

   
    @Value("${server.port}")
    private Integer port;

    /**
     * 服務介面
     * @param name
     * @return
     */
    @RequestMapping("/hello")
    public String sayHello(@RequestParam("name")String name) {
        return "hello ---> "+name+" port -->"+port;
    }
}

啟動專案:

Wed Dec 26 11:55:40 CST 2018 [email protected] JM.Log:INFO Init JM logger with Slf4jLoggerFactory success, [email protected]
Wed Dec 26 11:55:40 CST 2018 [email protected] JM.Log:INFO Log root path: C:\Users\vip\logs\
Wed Dec 26 11:55:40 CST 2018 [email protected] JM.Log:INFO Set nacos log path: C:\Users\vip\logs\nacos
2018-12-26 11:55:40.842  INFO 22252 --- [           main] o.s.c.a.n.registry.NacosServiceRegistry  : nacos registry, spring-cloud-nacos-producer 192.168.10.116:9005 register finished

服務提供者釋出成功。
這時候,我們在控制檯會發現服務列表中有一個名字為spring-cloud-nacos-producer的服務
在這裡插入圖片描述

點選詳情會發現服務的詳細資訊
在這裡插入圖片描述

7. Nacos 服務消費者

7.1建立一個專案:spring-cloud-nacos-consumer

引入依賴

<?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>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.1.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.lidong</groupId>
    <artifactId>spring-cloud-nacos--consumer</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>spring-cloud-nacos--consumer</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Greenwich.RC2</spring-cloud.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            <version>0.2.1.RELEASE</version>
        </dependency>
        <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-netflix-ribbon</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>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

    <repositories>
        <repository>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <url>https://repo.spring.io/milestone</url>
        </repository>
    </repositories>

</project>


7.2 消費者新增配置(application.yml)

server:
  port: 9006 #提供者的埠
spring:
  application:
    name: spring-cloud-nacos-consumer
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848

management:
  endpoints:
    web:
      exposure:
        include: '*'

nacos的地址和埠號預設是 127.0.0.1:8848 ,如果沒有配置hosts,預設的地址localhost,nacos服務會佔用8848介面
server.port :9006 服務的消費者的埠
spring.application.cloud.nacos.discovery.server-addr: 127.0.0.1:8848

7.3配置啟動類

package com.lidong.consumer;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;


@SpringBootApplication
@EnableDiscoveryClient
public class SpringCloudNacosConsumerApplication {



    @Autowired
    private RestTemplateBuilder builder;

    @Bean
    @LoadBalanced  // 新增負載均衡支援,很簡單,只需要在RestTemplate上新增@LoadBalanced註解,那麼RestTemplate即具有負載均衡的功能,如果不加@LoadBalanced註解的話,會報java.net.UnknownHostException:springboot-h2異常,此時無法通過註冊到Eureka Server上的服務名來呼叫服務,因為RestTemplate是無法從服務名對映到ip:port的,對映的功能是由LoadBalancerClient來實現的。
    public RestTemplate restTemplate() {
        return builder.build();
    }


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

}

7.4建立消費服務

package com.lidong.consumer.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

/**
 * 建立服務的消費者
 */
@RestController
public class ConsumerController {

    private static final String SERVICE_NAME = "service-producer";

    @Autowired
    private DiscoveryClient discoveryClient;

    /**
     * 獲取所有服務
     */
    @RequestMapping("/services")
    public Object services() {
        return discoveryClient.getInstances(SERVICE_NAME);
    }

    /**
     * 消費服務
     */
    @RequestMapping("/callSayHello")
    public String services(@RequestParam("name") String name) {
        ServiceInstance serviceInstance = (ServiceInstance) discoveryClient.getInstances(SERVICE_NAME);
        String callServiceResult = new RestTemplate().getForObject(serviceInstance.getUri().toString() + "/hello", String.class);
        System.out.println(callServiceResult);
        return callServiceResult;
    }
}

http://localhost:9006/services

獲取服務列表的結果

[{"serviceId":"spring-cloud-nacos-producer","host":"192.168.10.116","port":9005,"secure":false,"metadata":{"cluster":"DEFAULT","instanceId":"192.168.10.116#9005#DEFAULT#spring-cloud-nacos-producer","healthy":"true","weight":"1.0"},"uri":"http://192.168.10.116:9005","scheme":null,"instanceId":null}]

測試請求的url
http://localhost:9006/callSayHello?name=9006
消費的結果

hello ---> 9006 port -->9005

到這裡Nacos作為註冊中心來註冊服務和發現服務的流程就已經完成。這只是個簡單入門,深入學習請關照nacos官方資訊。

原始碼地址
https://download.csdn.net/download/u010046908/10877868