1. 程式人生 > >Spring Cloud開發人員如何解決服務衝突和例項亂竄?

Spring Cloud開發人員如何解決服務衝突和例項亂竄?

一、背景

在我們開發微服務架構系統時,雖然說每個微服務都是孤立的可以單獨開發,但實際上並非如此,要除錯和測試你的服務不僅需要您的微服務啟動和執行,還需要它的上下文服務、依賴的基礎服務等都要執行;但如果你的系統服務數和依賴比較多呢,那就是一個比較棘手的問題!有沒有辦法能提高開發效率呢?

如上圖所示,我們能不能用伺服器把所有的服務都部署起來,然後開發只在本地執行自己所負責開發的服務,因為需要依賴其他服務所以本地啟動的服務也需要註冊到公共的註冊中心裡;

例子中業務服務B有3臺例項註冊到註冊中心裡
分別是:服務上的、開發A與開發B自己本機啟動的

但是這樣做又會出現新的問題:服務會衝突亂竄,意思就是開發A

在debug自己的業務服務B服務的時候可能請求會跳轉到其他人的例項上(伺服器、開發B)

 

二、解決思路

解決這個服務亂竄問題有一個比較優雅的方式就是自定義負載均衡規則,主要實現以下目標:

  1. 普通使用者訪問伺服器上的頁面時,請求的所有路由只調用伺服器上的例項
  2. 開發A訪問時,請求的所有路由優先呼叫開發A本機啟動的例項,如果沒有則呼叫伺服器上的例項
  3. 開發B訪問時同上,請求的所有路由優先呼叫開發B本機啟動的例項,如果沒有則呼叫伺服器上的例項

 

三、具體實現

要實現上面的目標有兩個比較關鍵的問題需要解決

  1. 區分不同使用者的服務例項
  2. 實現自定義負載均衡規則

3.1. 區分不同使用者的服務例項

直接使用註冊中心的元資料(metadata)來區分就可以了

主流的註冊中心都帶有元資料管理
Nacos為例,只需要在配置檔案下新增

spring:
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
        metadata:
          version: zlt

metadata下的version就是我新增的元資料key為version,value為zlt

啟動服務後元資料就會註冊上去,如下圖

經過元資料區分後,目前是下面這個情況

  • 伺服器的例項version為空
  • 開發人員自己本地啟動的例項version
    為唯一標識(自己的名字)

 

3.2. 自定義負載均衡規則

首先在Spring Cloud微服務框架裡實例的負載均衡是由Ribbon負責。
CustomIsolationRule詳細類資訊可檢視:CustomIsolationRule.java

public class CustomIsolationRule extends RoundRobinRule {
    /**
     * 優先根據版本號取例項
     */
    @Override
    public Server choose(ILoadBalancer lb, Object key) {
        if (lb == null) {
            return null;
        }
        String version = LbIsolationContextHolder.getVersion();
        List<Server> targetList = null;
        List<Server> upList = lb.getReachableServers();
        if (StrUtil.isNotEmpty(version)) {
            //取指定版本號的例項
            targetList = upList.stream().filter(
                    server -> version.equals(
                            ((NacosServer) server).getMetadata().get(CommonConstant.METADATA_VERSION)
                    )
            ).collect(Collectors.toList());
        }

        if (CollUtil.isEmpty(targetList)) {
            //只取無版本號的例項
            targetList = upList.stream().filter(
                    server -> {
                        String metadataVersion = ((NacosServer) server).getMetadata().get(CommonConstant.METADATA_VERSION);
                        return StrUtil.isEmpty(metadataVersion);
                    }
            ).collect(Collectors.toList());
        }

        if (CollUtil.isNotEmpty(targetList)) {
            return getServer(targetList);
        }
        return super.choose(lb, key);
    }

    /**
     * 隨機取一個例項
     */
    private Server getServer(List<Server> upList) {
        int nextInt = RandomUtil.randomInt(upList.size());
        return upList.get(nextInt);
    }
}

整合輪詢規則RoundRobinRule來實現,主要的邏輯為

  1. 根據上游輸入的版本號version,有值的話則取服務元資訊version值一樣的例項
  2. 上游的版本號version沒值或者該版本號匹配不到任何服務,則只取服務元資訊version值為空的例項

 
並通過配置開關控制是否開啟自定義負載規則

@Configuration
@ConditionalOnProperty(value = "zlt.ribbon.isolation.enabled", havingValue = "true")
@RibbonClients(defaultConfiguration = {RuleConfigure.class})
public class LbIsolationConfig {

}

 

四、總結

上面提到的區分服務例項和自定義負載規則為整個解決思路的核心點,基本實現了服務例項的隔離,剩下要做的就是上游的version怎樣傳遞呢?,下面我提供兩個思路

  • 開發人員自己啟動前端工程,通過配置引數,統一在前端工程傳遞version
  • 通過postman呼叫介面的時候在header引數中新增

 
參考
https://github.com/Nepxion/Discovery

 
推薦閱讀

  • 日誌排查問題困難?分散式日誌鏈路跟蹤來幫你
  • zuul整合Sentinel最新的閘道器流控元件
  • 阿里註冊中心Nacos生產部署方案
  • Spring Boot自定義配置項在IDE裡面實現自動提示
  • Spring Cloud Zuul的動態路由怎樣做?整合Nacos實現很簡單

 

相關推薦

Spring Cloud開發人員如何解決服務衝突例項

一、背景 在我們開發微服務架構系統時,雖然說每個微服務都是孤立的可以單獨開發,但實際上並非如此,要除錯和測試你的服務不僅需要您的微服務啟動和執行,還需要它的上下文服務、依賴的基礎服務等都要執行;但如果你的系統服務數和依賴比較多呢,那就是一個比較棘手的問題!有沒有辦法能提高開發效率呢? 如上圖所示,我們

Spring Cloud開發人員如何解決服務衝突例項?(IP實現方案)

一、背景 在我上一篇文章《Spring Cloud開發人員如何解決服務衝突和例項亂竄?》中提到使用服務的元資料來實現隔離和路由,有朋友問到能不能直接通過IP來實現?本文就和大家一起來討論一下這個問題   二、可行性分析 要實現通過IP來隔離和路由的話有一個非常關鍵的點需要解決,就是怎樣實現IP可

開發人員如何解決 Spring Cloud 服務衝突例項

作者:zlt2000 原文:https://www.cnblogs.com/zlt2000/p/11459390.html?ut

Spring cloud開發的微服務部署到Linux上內存過高的問題

linux系統服務 內存參數 中間 size 但是 aps 內存占用 style 驗證 【問題描述】   在使用spring cloud過程中一個很嚴重的資源問題就是內存占用過高,而實際上開發測試並沒有很大的量,甚至卻出現了服務無法正常訪問的問題。 【原因分析】 主

【SFA官方翻譯】Spring WebFluxSpring Cloud進行響應式微服務開發

啟用 測試數據 技術 logger 轉發 bic snap uri led 原創 SpringForAll社區 2018-05-18 作者 Spring4all 社區 摘要: 如果你想用Spring的最新和最好的工具開始使用響應式微服務,那麽這篇文章就是

Spring Cloud(七)Hystrix DashboardTurbine服務監控

文章目錄 1 Hystrix Dashboard案例 1.1 增加依賴 1.2 編寫啟動類 1.3 測試 1.4 監控 2 Hystrix Dashboard Turbine案例 2.1 建立Hy

服務Spring Cloud實戰—Eureka Server的簡介高可用性—叢集

Eureka簡介 什麼是Eureka? Eureka是Netflix開源的服務發現元件,本身是一個基於REST的服務。它包含Server和Client兩部分。Spring Cloud將它整合在子專案Spring Cloud Netflix中,從而實現服務的註冊與發現 (注:Eurek

spring-cloud(二)服務的呼叫的方式RibbonFegin

一、特點   在微服務架構中,業務都會被拆分成一個獨立的服務,服務與服務的通訊是基於http restful的。Spring cloud有兩種服務呼叫方式:   1. ribbon+restTemplate   ribbon是一個客戶端可以負載均衡的呼叫方式。   2. fegin   a

Spring cloud開發記憶體佔用過高解決方法

https://blog.csdn.net/wanhuiguizong/article/details/79289986   版權宣告:本文為博主原創文章,轉載請宣告文章來源和原文連結。 https://blog.csdn.net/wanhuiguizong/article/details/79

KubernetesSpring Cloud哪個部署微服務更好?_Kubernetes中文社群

Spring Cloud 和Kubernetes都自稱自己是部署和執行微服務的最好環境,但是它們在本質上和解決不同問題上是有很大差異的。在本文中,我們將看到每個平臺如何幫助交付基於微服務的架構(MSA),它們擅長哪個領域,並且如何兩全其美的使用從而在微服務之旅上獲得成功。 背景 最近我讀了 A

IDEA基於Spring Cloud Netflix(2.1.0RC3)的Spring Cloud Eureka來實現服務治理的微服務架構搭建以及SSM框架的整合——實戰教程

這裡開始spring cloud微服務架構搭建,用的maven還是之前自己的本地安裝的,repository倉庫也是本地的。 在搭建專案框架之前先簡單學習一下spring cloud。 Spring Cloud 簡介        Spring

Spring cloud實戰-Zuul如何動態負載服務發現擴容

Zuul、Fegin、Rebbion、Eureka一條龍 很多人都自然而然把zuul當成nginx那樣來在配置寫死節點配置來。實際上zuul和eureka的是可以完美配合,完全可以基於服務名的註冊和發現,來動態的實現服務的動態負載和動態註冊,從而達到不需要重啟

Spring Cloud 聲明式服務調用 Feign

start etag 結束 value val template ide default true 一、簡介 在上一篇中,我們介紹註冊中心Eureka,但是沒有服務註冊和服務調用,服務註冊和服務調用本來應該在上一章就應該給出例子的,但是我覺得還是和Feign一起講比較好,

Spring Cloud應用程序上下文服務

spring springboot springcloud 配置 bootstrap Spring Boot對於如何使用Spring構建應用程序有一個看法:例如它具有常規配置文件的常規位置,以及用於常見管理和監視任務的端點。Spring Cloud建立在此之上,並添加了一些可能系統中所有組

Spring Cloud - 應用程序上下文服務

外部 posit 優先 如果 eve 並且 tps 指定 enable Spring Boot對於如何使用Spring構建應用程序有一個看法:例如它具有常規配置文件的常規位置,以及用於常見管理和監視任務的端點。Spring Cloud建立在此之上,並添加了一些可能系統中所

Spring Cloud分布式微服務雲架構構建

spring boot spring security spring cloud spring 架構 大型企業分布式微服務雲架構服務組件實現模塊化、微服務化、原子化、灰度發布、持續集成commonservice eurekaNetflix雲端服務發現,一個基於 REST 的服務,用於定位服

Spring Cloud分布式微服務架構圖

spring spring boot spring cloud java 代碼結構 分布式、微服務、雲架構JAVA語言開發、跨平臺、高性能、高可用、安全、服務化、模塊化、組件化、驅動式開發模式從現在開始,我這邊會將近期研發的springcloud微服務雲架構的搭建過程和精髓記錄下來,幫助更

Spring Cloud分布式微服務雲架構簡介

spring spring boot spring cloud java 代碼結構 Spring Cloud是一系列框架的有序集合。利用Spring Boot的開發模式簡化了分布式系統基礎設施的開發,如服務發現、註冊、配置中心、消息總線、負載均衡、斷路器、數據監控等(這裏只簡單的列了一部分

Spring Cloud分布式微服務架構—集成項目簡介

spring spring boot spring cloud java 代碼結構 Spring Cloud集成項目有很多,下面我們列舉一下和Spring Cloud相關的優秀項目,我們的企業架構中用到了很多的優秀項目,說白了,也是站在巨人的肩膀上去整合的。在學習Spring Cloud之

Spring Cloud 分布式微服務雲架構

狀態 計劃 tro 計劃任務 部署 轉移 分布 feign 總線 分布式、微服務、雲架構 JAVA語言開發、跨平臺、高性能、高可用、安全、服務化、模塊化、組件化、驅動式開發模式 commonservice eurekaNetflix 雲端服務發現,一個基