java架構之路-(微服務專題)nacos集群精講實戰


上次回顧:

  上次博客,我們主要說了微服務的發展歷程和nacos集群單機的搭建,單機需要-m standalone啟動,集群建議使用nginx做一下反向代理,自行保證mysql和ngxin的高可用。

本次定位:

  一、nacos的內部概念

  二、nacos的基本使用

  三、為下次ribbon組件做准備

nacos的內部概念

  上次我們搭建好了nacos集群,這次我們就在那個集群基礎上來繼續說,上次我們只說到了服務如何注冊到我們的nacos,但是調用還沒說,這次我們來說說各種調用吧(調用的負載均衡算法在ribbon去說)。

  ①.調用,我們先來一個最簡單的調用,用戶系統去調用訂單系統,查詢訂單。

   建立兩個springboot項目,加入注冊中心配置。配置上次博客說過了,這里就不再贅述了,在訂單服務內寫一個方法。

@RestController
public class OrderController {

    @GetMapping("/getOrderData")
    public String getOrderData(){
        return "獲得訂單服務的數據";
    }


    @GetMapping("/getOrderData-B")
    public String getOrderDataB(){
        return "獲得訂單服務的數據B";
    }
}

  我就簡單寫一個了,能獲取到下面的字符串也說明調用時可以的。

  在用戶服務中,編寫config配置。

@Configuration
public class ClientConfig {

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

  開始調用啦

@RestController
public class UserController {

    @Autowired
    private RestTemplate restTemplate;

    @Autowired
    private DiscoveryClient discoveryClient;

    @GetMapping("/getOrder")
    public String getOrderData(){
        List<ServiceInstance> orderInfo = discoveryClient.getInstances("nacos-order");
        if(null == orderInfo || orderInfo.isEmpty()) {
            return "用戶微服務沒有對應的實例可用";
        }
      
        String targetUri = orderInfo.get(0).getUri().toString();

        String forObject = restTemplate.getForObject(targetUri + "/getOrderData", String.class);
        System.out.println("forObject = " + forObject);

        return forObject;
    }
}

  就這樣,最簡單的調用也就可以實現了。(沒有任何負載均衡算法,我直接get(0)了)。

  ②.namespace

  這里我們來看看什么是namespace,如果我們開發,測試環境共用一個nacos,必定我們的接口地址也是不同,而且你在開發過程中,也是不建議隨意配置測試環境的,這時我們就應該用namespace來隔離我們的空間。

  打開我們的nacos的頁面,點擊命名空間,新建,輸入信息即可。

   我們再來看一下代碼實現,如何實現隔離的。

  首先在配置文件中添加namespace配置。namespace:命名空間ID

spring:
  application:
    name: nacos-order cloud: nacos: discovery: server-addr: 192.168.138.119:8848 namespace: 0610f97e-c25d-4f49-bfb8-b340e3584b82 server: port: 8888

   訂單服務的配置為開發環境,用戶服務配置為測試環境的,我們來運行一下代碼,理論上應該調用不通的,我們來看一下結果。

  現實如此無法調用,也就做到了我們的隔離環境。如果不寫namespace,默認是public命名空間。

  ③.group

  group分組,也是用來隔離的,打個比方啊,加入我們的用戶服務,訂單服務,倉儲服務和物流服務四個服務,訂單服務中有一個接口叫getData,倉儲服務中也有一個接口叫getData,我們的用戶服務只想調用到我們的訂單服務的getData,不想調用到倉儲服務的getData,這時我們可以用group分組來隔離。

   我們來看一下配置吧。只需要加入group:分組名稱即可,nacos客戶端不需要任何設置,這里需要注意的是你的父類項目依賴,2.1.0.RELEASE版本是沒有group的,也無法設置group(反正我沒找到什么好辦法)。需要改配置為2.1.1.RELEASE

<!--spring cloud alibaba依賴-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-alibaba-dependencies</artifactId>
    <version>2.1.1.RELEASE</version>
    <type>pom</type>
    <scope>import</scope>
</dependency>
spring:
  application:
    name: nacos-order cloud: nacos: discovery: server-addr: 192.168.138.119:8848 namespace: 0610f97e-c25d-4f49-bfb8-b340e3584b82  group: pay server: port: 8888

  ④.還有一個概念是service服務集群,什么意思呢?先上個圖。

   就是什么呢,我們現在有兩組集群,一個是北京的訂單服務集群,一個是北京的用戶服務集群,還有一個上海的訂單服務集群,我們希望北京的用戶集群,優先去調用北京的訂單系統,上海的優先調用上海的集群服務。並不希望我們跨地區遠程調用(如果組內實在沒有服務了,也可以調用,但是優先考慮同一集群的)。配置文件如下所示

spring:
  application:
    name: nacos-order cloud: nacos: discovery: server-addr: 192.168.138.119:8848 namespace: 0610f97e-c25d-4f49-bfb8-b340e3584b82 group: pay  cluster-name: BJ-cluster server: port: 8888

  ⑤.再就是版本了,也是我知道的最后一個了,比如我們要進行灰度發布了,我們有100台服務集群,但是這次新功能很重要,不能一次性全部更新,我們選擇灰度發布,我們選出5台服務作為新版發布的,我們定義為V2,內部接口時不兼容的,所以我們只能要5台新用戶服務去調用5台訂單服務,原有的95台用戶服務還是繼續調用那95台訂單服務,我們定義為V1。

  我們來看一下代碼配置

spring:
  application:
    name: nacos-order
  cloud:
    nacos:

      discovery:
        server-addr: 192.168.138.119:8848
        namespace: 0610f97e-c25d-4f49-bfb8-b340e3584b82
        group: namespace-one
        cluster-name: BJ-cluster
        metadata: version: v1
server:
  port: 8888

  劇透一下,nacos是用map來進行隔離的,大致結構式Map<namespace,Map<group::serviceName,Service>>,也是我們為什么cluster-name和版本為什么做不到完全隔離,后面的源碼博客會說詳細說這個問題的。

總結:

  這次我們主要說了nacos的使用,原理?原理還沒說,等到我們的源碼帶着說一下吧,不難,就是一個心跳的問題。nacos要知道namespace、group、cluster-name、版本主要是用來做什么的,什么時候我們該選擇什么。下次我們來說一下Ribbon,也就是我們服務直接調用的一個插件。

 

最進弄了一個公眾號,小菜技術,歡迎大家的加入

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM