SpringCloud Alibaba —— Nacos 服務註冊

前文

SpringCloud 簡介

SpringCloud 版本選型

SpringCloud 工程構建

SpringCloud —— Eureka 註冊中心

SpringCloud —— Eureka 集羣

SpringCloud —— 服務註冊進 Eureka 集羣

SpringCloud —— Eureka 自我保護

SpringCloud —— SpringCloud Consul 實現服務註冊中心

SpringCloud —— 三個註冊中心的異同點

SpringCloud —— Ribbon

SpringCloud —— Ribbon 負載均衡算法

SpringCloud —— OpenFeign

SpringCloud —— Hystrix 簡介

SpringCloud —— Hystrix 斷路器

SpringCloud —— HystrixDashboard 服務監控

SpringCloud —— Gateway 網關

SpringCloud —— Config 配置中心

SpringCloud —— Sleuth 分佈式請求鏈路跟蹤

Nacos 是什麼?

一個更易於構建雲原生應用的動態服務發現、配置管理和服務管理平臺

簡單地說:Nacos 就是註冊中心 + 配置中心的結合

等價於 Nacos = Eureka + Config + Bus

Nacos 能幹嘛?

  • 替代 Eureka 做服務註冊中心

  • 替代 Config 做服務配置中心

各種註冊中心比較

服務註冊發現框架 CAP 模型 控制檯管理 社區活躍度
Eureka AP 支持 低(2.X 版本閉源)
Zookeeper CP 不支持
Consul CP 支持
Nacos AP 支持

Nacos 下載啓動

Nacos 的下載地址 https://github.com/alibaba/nacos/releases

下載之後解壓打開 bin 目錄,雙擊 startup.cmd 即可啓動 Nacos
在這裏插入圖片描述
啓動之後會出現 Nacos 的字樣
在這裏插入圖片描述

Nacos 訪問

啓動之後訪問 http://localhost:8848/nacos 即可訪問 Nacos 控制檯,但是需要先登錄,用戶名和密碼默認都爲 nacos
在這裏插入圖片描述
登錄之後即可跳轉到控制檯
在這裏插入圖片描述

Nacos 作爲服務註冊中心演示

官方文檔

官方文檔地址 https://spring.io/projects/spring-cloud-alibaba#learn ,目前當前最新的版本是 2.1.0
在這裏插入圖片描述
這是 SpringCloud Alibaba 的一個依賴

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
            <version>2.1.0.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

在這裏插入圖片描述

基於 Nacos 的服務提供者

新建 Module

在這裏插入圖片描述

POM

這裏需要添加兩個 POM ,一個是父 POM ,一個是本 POM(當然,如果你只有一個微服務的話那就都添加到一個 POM 就行了)


父 POM 中需要添加以下依賴

<!--spring cloud alibaba 2.1.0.RELEASE-->
<dependency>
	<groupId>com.alibaba.cloud</groupId>
	<artifactId>spring-cloud-alibaba-dependencies</artifactId>
	<version>2.1.0.RELEASE</version>
	<type>pom</type>
	<scope>import</scope>
</dependency>

本 POM(如果你只是想測試 Nacos 服務註冊的話直接添加 Nacos 的依賴就行了)

<dependencies>

    <!-- SpringCloud Alibaba Nacos-->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>

    <!-- SpringBoot整合Web組件 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    <!--日常通用jar包配置-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <scope>runtime</scope>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>cn.hutool</groupId>
        <artifactId>hutool-all</artifactId>
        <version>RELEASE</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>cn.hutool</groupId>
        <artifactId>hutool-all</artifactId>
        <version>RELEASE</version>
        <scope>test</scope>
    </dependency>
</dependencies>

主要是這個依賴
在這裏插入圖片描述

application.yml

server:
  port: 9001

spring:
  application:
    name: nacos-payment-provider
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 # 配置地址

# 監控端點全部打開
management:
  endpoints:
    web:
      exposure:
        include: '*'

啓動類

記得加上 @EnableDiscoveryClient 註解

package com.java.springcloud;

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

/**
 * @author Woo_home
 * @create 2020/5/20 11:28
 */

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

業務類

簡單返回字符串就行

package com.java.springcloud.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author Woo_home
 * @create 2020/5/20 11:29
 */

@RestController
public class PaymentController {

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

    @GetMapping(value = "/payment/nacos/{id}")
    public String getPayment(@PathVariable("id") Integer id) {
        return "Nacos register, serverPort: " + serverPort + "\t id: " + id;
    }
}

測試

運行啓動類
在這裏插入圖片描述
在這裏插入圖片描述
刷新一下 Nacos 的控制檯界面,點擊服務列表選項,可以發現我們的服務已經註冊進來了(這跟 Eureka 是類似的,這裏也不多說了),集羣數量爲 1,實例數爲 1 等等
在這裏插入圖片描述
我們點擊一下詳情
在這裏插入圖片描述
點擊詳情選項可以詳細地查看服務信息
在這裏插入圖片描述
更多操作這裏就不一一展示了,感興趣的朋友可以自己玩下


如果你想拒絕這個服務註冊,你還可以點擊刪除操作
在這裏插入圖片描述

新建模塊 9002(與 9001 一樣的服務提供者)

與模塊 9001 一樣即可(依賴,配置,代碼都是一樣即可)


啓動 9001 和 9002
在這裏插入圖片描述

刷新一下 Nacos 控制檯,可以發現,現在已經有兩個服務了,實例數爲 2
在這裏插入圖片描述
也可以點擊詳情進去看下
在這裏插入圖片描述

基於 Nacos 的服務消費者

新建 Module

在這裏插入圖片描述

POM

老規矩,主要是 nacos 的依賴,其它根據需要添加

<dependencies>

    <!-- SpringCloud Alibaba Nacos-->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>

    <!-- SpringBoot整合Web組件 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    <!--日常通用jar包配置-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <scope>runtime</scope>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>cn.hutool</groupId>
        <artifactId>hutool-all</artifactId>
        <version>RELEASE</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>cn.hutool</groupId>
        <artifactId>hutool-all</artifactId>
        <version>RELEASE</version>
        <scope>test</scope>
    </dependency>
</dependencies>

application.yml

server:
  port: 83

spring:
  application:
    name: nacos-order-consumer
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 # 配置地址

# 消費者將要去訪問的微服務名稱(註冊成功進 Nacos 的微服務提供者)
service-url:
  nacos-user-service: http://nacos-payment-provider

啓動類

跟前兩個模塊的啓動類是一樣的

package com.java.springcloud;

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

/**
 * @author Woo_home
 * @create 2020/5/20 12:26
 */

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

配置類

配置類很簡單,只需要聲明一個 bean 就行了,爲什麼要這個 bean,等會兒會說

package com.java.springcloud.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

/**
 * @author Woo_home
 * @create 2020/5/20 12:28
 */

@Configuration
public class ApplicationContextConfig {

    @Bean
    public RestTemplate getRestTemplate() {
        return new RestTemplate();
    }
}

業務類

package com.java.springcloud.controller;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import javax.annotation.Resource;

/**
 * @author Woo_home
 * @create 2020/5/20 12:29
 */

@RestController
@Slf4j
public class OrderNacosController {

    @Resource // 寫成 @Autowrie 也行,隨你喜歡
    private RestTemplate restTemplate;

    @Value("${service-url.nacos-user-service}")
    private String serverURL;

    @GetMapping(value = "/consumer/payment/nacos/{id}")
    public String paymentInfo(@PathVariable("id") Long id) {
        return restTemplate.getForObject(serverURL + "/payment/nacos/" + id, String.class);
    }

}

測試

啓動三個微服務
在這裏插入圖片描述
刷新一下 Nacos 控制檯,現在已經成功註冊三個服務了(兩個服務提供者,一個服務消費者)
在這裏插入圖片描述
訪問 http://localhost:83/consumer/payment/nacos/13 測試一下,報錯了。。。
在這裏插入圖片描述
原因是我們沒有在 RestTemplate 加上 @LoadBalanced 註解,加上就行了
在這裏插入圖片描述
添加 @LoadBalanced 註解之後啓動服務,再次訪問 http://localhost:83/consumer/payment/nacos/13 測試下,現在返回的是 9002 端口的服務
在這裏插入圖片描述
再次刷新一下,現在返回的是 9001 端口的微服務
在這裏插入圖片描述

爲什麼 Nacos 自帶負載均衡?

學過 Ribbon 的朋友會發現(沒學過也沒關係,這裏有文章可以看下 SpringCloud —— Ribbon),這不是負載均衡麼?是的,這是 Nacos 自帶的負載均衡,爲什麼 Nacos 會自帶負載均衡呢?因爲 spring-cloud-starter-alibaba-nacos-discovery 依賴裏面添加了 Ribbon 的依賴,也可以說 Nacos 整合了 Ribbon,所以 Nacos 就默認支持了負載均衡
在這裏插入圖片描述

完整代碼已上傳至碼雲 代碼下載地址
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章