日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

无法访问netflix服务_Choerodon 的微服务之路(三):服务注册与发现

發布時間:2023/12/1 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 无法访问netflix服务_Choerodon 的微服务之路(三):服务注册与发现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文是 Choerodon 的微服務之路系列推文第三篇。在上一篇《Choerodon的微服務之路(二):微服務網關》中,介紹了Choerodon 在搭建微服務網關時考慮的一些問題以及兩種常見的微服務網關模式,并且通過代碼介紹了Choerodon 的網關是如何實現的。本篇文章將介紹Choerodon 的注冊中心,通過代碼的形式介紹 Choerodon 微服務框架中,是如何來實現服務注冊和發現的。

▌文章的主要內容包括:

  • 服務注冊/發現
  • 服務注冊表
  • 健康檢查

在上一篇文章的開始,我們提到解決微服務架構中的通信問題,基本只要解決下面三個問題:

  • 服務網絡通信能力
  • 服務間的數據交互格式
  • 服務間如何相互發現與調用

網絡的互通保證了服務之間是可以通信的,通過對JSON 的序列化和反序列化來實現網絡請求中的數據交互。Choerodon 的 API 網關則統一了所有來自客戶端的請求,并將請求路由到具體的后端服務上。然而這里就會有一個疑問,API 網關是如何與后端服務保持通信的,后端服務之間又是如何來進行通信的?當然我們能想到最簡單的方式就是通過 URL + 端口的形式直接訪問(例如:http://127.0.0.1:8080/v1/hello)。

在實際的生產中,我們認為這種方式應該是被避免的。因為 Choerodon 的每個服務實例都部署在 K8S 的不同 pod 中,每一個服務實例的 IP 地址和端口都可以改變。同時服務間相互調用的接口地址如何管理,服務本身集群化后又是如何進行負載均衡。這些都是我們需要考慮的。

為了解決這個問題,自然就想到了微服務架構中的注冊中心。一個注冊中心應該包含下面幾個部分:

  • 服務注冊/發現:服務注冊是微服務啟動時,將自己的信息注冊到注冊中心的過程。服務發現是注冊中心監聽所有可用微服務,查詢列表及其網絡地址。
  • 服務注冊表:用來紀錄各個微服務的信息。
  • 服務檢查:注冊中心使用一定的機制定時檢測已注冊的服務,如果發現某實例長時間無法訪問,就會從服務注冊表中移除該實例。

Choerodon 中服務注冊的過程如下圖所示:

服務注冊/發現

當我們通過接口去調用其他服務時,調用方則需要知道對應服務實例的 IP 地址和端口。對于傳統的應用而言,服務實例的網絡地址是相對不變的,這樣可以通過固定的配置文件來讀取網絡地址,很容易地使用 HTTP/REST 調用另一個服務的接口。

但是在微服務架構中,服務實例的網絡地址是動態分配的。而且當服務進行自動擴展,更新等操作時,服務實例的網絡地址則會經常變化。這樣我們的客戶端則需要一套精確地服務發現機制。

Eureka 是 Netflix 開源的服務發現組件,本身是一個基于 REST 的服務。它包含 Server 和 Client 兩部分。

Eureka Server 用作服務注冊服務器,提供服務發現的能力,當一個服務實例被啟動時,會向 Eureka Server 注冊自己的信息(例如IP、端口、微服務名稱等)。這些信息會被寫到注冊表上;當服務實例終止時,再從注冊表中刪除。這個服務實例的注冊表通過心跳機制動態刷新。這個過程就是服務注冊,當服務實例注冊到注冊中心以后,也就相當于注冊中心發現了服務實例,完成了服務注冊/發現的過程。

閱讀 Spring Cloud Eureka 的源碼可以看到,在 eureka-client-1.6.2.jar 的包中,com.netflix.discovery。 DiscoveryClient 啟動的時候,會初始化一個定時任務,定時的把本地的服務配置信息,即需要注冊到遠端的服務信息自動刷新到注冊服務器上。該類包含了 Eureka Client 向 Eureka Server 注冊的相關方法。

在 DiscoveryClient 類有一個服務注冊的方法 register(),該方法是通過 HTTP 請求向 Eureka Server 注冊。其代碼如下:

boolean register() throws Throwable {logger.info(PREFIX + appPathIdentifier + ": registering service...");EurekaHttpResponse<Void> httpResponse;try {httpResponse = eurekaTransport.registrationClient.register(instanceInfo);} catch (Exception e) {logger.warn("{} - registration failed {}", PREFIX + appPathIdentifier, e.getMessage(), e);throw e;}if (logger.isInfoEnabled()) {logger.info("{} - registration status: {}", PREFIX + appPathIdentifier, httpResponse.getStatusCode());}return httpResponse.getStatusCode() == 204;}

?對于 Choerodon 而言,客戶端依舊采用 Eureka Client,而服務端采用 GoLang 編寫,結合 K8S,通過主動監聽 K8S 下 pod 的啟停,發現服務實例上線,Eureka Client 則通過 HTTP 請求獲取注冊表,來實現服務注冊/發現過程。

注冊中心啟動時,會構造一個 podController,用來監聽pod 的生命周期。代碼如下:

func Run(s *options.ServerRunOptions, stopCh <-chan struct{}) error {... ... podController := controller.NewController(kubeClient, kubeInformerFactory, appRepo)go kubeInformerFactory.Start(stopCh)go podController.Run(instance, stopCh, lockSingle)return registerServer.PrepareRun().Run(appRepo, stopCh) }

?在 http://github.com/choerodon/go-register-server/controller/controller.go 中定義了 Controller,提供了 Run() 方法,該方法會啟動兩個進程,用來監聽環境變量 REGISTER_SERVICE_NAMESPACE 中配置的對應 namespace 中的 pod,然后在 pod 啟動時,將 pod 信息轉化為自定義的服務注冊信息,存儲起來。在 pod 下線時,從存儲中刪除服務信息。其代碼如下:

func (c *Controller) syncHandler(key string, instance chan apps.Instance, lockSingle apps.RefArray) (bool, error) {namespace, name, err := cache.SplitMetaNamespaceKey(key)if err != nil {runtime.HandleError(fmt.Errorf("invalid resource key: %s", key))return true, nil} pod, err := c.podsLister.Pods(namespace).Get(name)if err != nil {if errors.IsNotFound(err) {if ins := c.appRepo.DeleteInstance(key); ins != nil {ins.Status = apps.DOWNif lockSingle[0] > 0 {glog.Info("create down event for ", key)instance <- *ins}}runtime.HandleError(fmt.Errorf("pod '%s' in work queue no longer exists", key))return true, nil} return false, err} _, isContainServiceLabel := pod.Labels[ChoerodonServiceLabel]_, isContainVersionLabel := pod.Labels[ChoerodonVersionLabel]_, isContainPortLabel := pod.Labels[ChoerodonPortLabel] if !isContainServiceLabel || !isContainVersionLabel || !isContainPortLabel {return true, nil} if pod.Status.ContainerStatuses == nil {return true, nil} if container := pod.Status.ContainerStatuses[0]; container.Ready && container.State.Running != nil && len(pod.Spec.Containers) > 0 {if in := convertor.ConvertPod2Instance(pod); c.appRepo.Register(in, key) {ins := *inins.Status = apps.UPif lockSingle[0] > 0 {glog.Info("create up event for ", key)instance <- ins}} } else {if ins := c.appRepo.DeleteInstance(key); ins != nil {ins.Status = apps.DOWNif lockSingle[0] > 0 {glog.Info("create down event for ", key)instance <- *ins}}} return true, nil }

http://github.com/choerodon/go-register-server/eureka/repository/repository 中的 ApplicationRepository 提供了 Register() 方法,該方法手動將服務的信息作為注冊表存儲在注冊中心中。

func (appRepo *ApplicationRepository) Register(instance *apps.Instance, key string) bool {if _, ok := appRepo.namespaceStore.Load(key); ok {return false} else {appRepo.namespaceStore.Store(key, instance.InstanceId)}appRepo.instanceStore.Store(instance.InstanceId, instance)return true }

通過上面的代碼我們可以了解到Choerodon 注冊中心是如何實現服務注冊的。有了注冊中心后,下面我們來介紹下服務發現中的服務注冊表。

服務注冊表

在微服務架構中,服務注冊表是一個很關鍵的系統組件。當服務向注冊中心的其他服務發出請求時,請求調用方需要獲取注冊中心的服務實例,知道所有服務實例的請求地址。

Choerodon 沿用 Spring Cloud Eureka 的模式,由注冊中心保存服務注冊表,同時客戶端緩存一份服務注冊表,每經過一段時間去注冊中心拉取最新的注冊表。

在http://github.com/choerodon/go-register-server/eureka/apps/types 中定義了 Instance 對象,聲明了一個微服務實例包含的字段。代碼如下:

type Instance struct {InstanceId string `xml:"instanceId" json:"instanceId"`HostName string `xml:"hostName" json:"hostName"`App string `xml:"app" json:"app"`IPAddr string `xml:"ipAddr" json:"ipAddr"`Status StatusType `xml:"status" json:"status"`OverriddenStatus StatusType `xml:"overriddenstatus" json:"overriddenstatus"`Port Port `xml:"port" json:"port"`SecurePort Port `xml:"securePort" json:"securePort"`CountryId uint64 `xml:"countryId" json:"countryId"`DataCenterInfo DataCenterInfo `xml:"dataCenterInfo" json:"dataCenterInfo"`LeaseInfo LeaseInfo `xml:"leaseInfo" json:"leaseInfo"`Metadata map[string]string `xml:"metadata" json:"metadata"`HomePageUrl string `xml:"homePageUrl" json:"homePageUrl"`StatusPageUrl string `xml:"statusPageUrl" json:"statusPageUrl"`HealthCheckUrl string `xml:"healthCheckUrl" json:"healthCheckUrl"`VipAddress string `xml:"vipAddress" json:"vipAddress"`SecureVipAddress string `xml:"secureVipAddress" json:"secureVipAddress"`IsCoordinatingDiscoveryServer bool `xml:"isCoordinatingDiscoveryServer" json:"isCoordinatingDiscoveryServer"` LastUpdatedTimestamp uint64 `xml:"lastUpdatedTimestamp" json:"lastUpdatedTimestamp"`LastDirtyTimestamp uint64 `xml:"lastDirtyTimestamp" json:"lastDirtyTimestamp"`ActionType string `xml:"actionType" json:"actionType"` }

客戶端可以通過訪問注冊中心的/eureka/apps 接口獲取對應的注冊表信息。如下所示:

{"name": "iam-service","instance": [{"instanceId": "10.233.73.39:iam-service:8030","hostName": "10.233.73.39","app": "iam-service","ipAddr": "10.233.73.39","status": "UP","overriddenstatus": "UNKNOWN","port": {"@enabled": true,"$": 8030},"securePort": {"@enabled": false,"$": 443},"countryId": 8,"dataCenterInfo": {"name": "MyOwn","@class": "com.netflix.appinfo.InstanceInfo$DefaultDataCenterInfo"},"leaseInfo": {"renewalIntervalInSecs": 10,"durationInSecs": 90,"registrationTimestamp": 1542002980,"lastRenewalTimestamp": 1542002980,"evictionTimestamp": 0,"serviceUpTimestamp": 1542002980},"metadata": {"VERSION": "2018.11.12-113155-master"},"homePageUrl": "http://10.233.73.39:8030/","statusPageUrl": "http://10.233.73.39:8031/info","healthCheckUrl": "http://10.233.73.39:8031/health","vipAddress": "iam-service","secureVipAddress": "iam-service","isCoordinatingDiscoveryServer": true,"lastUpdatedTimestamp": 1542002980,"lastDirtyTimestamp": 1542002980,"actionType": "ADDED"}] }

我們可以在服務注冊表中獲取到所有服務的 IP 地址、端口以及服務的其他信息,通過這些信息,服務直接就可以通過 HTTP 來進行訪問。有了注冊中心和注冊表之后,我們的注冊中心又是如何來確保服務是健康可用的,則需要通過健康檢查機制來實現。

健康檢查

在我們提供了注冊中心以及服務注冊表之后,我們還需要確保我們的服務注冊表中的信息,與服務實際的運行狀態保持一致,需要提供一種機制來保證服務自身是可被訪問的。在Choerodon微服務架構中處理此問題的方法是提供一個健康檢查的端點。當我們通過 HTTP 進行訪問時,如果能夠正常訪問,則應該回復 HTTP 狀態碼200,表示健康。

Spring Boot 提供了默認的健康檢查端口。需要添加spring-boot-starter-actuator 依賴。

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

?訪問 /health 端點后,則會返回如下類似的信息表示服務的狀態。可以看到 HealthEndPoint 給我們提供默認的監控結果,包含磁盤檢測和數據庫檢測等其他信息。

{"status": "UP","diskSpace": {"status": "UP","total": 398458875904,"free": 315106918400,"threshold": 10485760},"db": {"status": "UP","database": "MySQL","hello": 1} }

?但是因為 Choerodon 使用的是 K8S 作為運行環境。我們知道 K8S 提供了 liveness probes 來檢查我們的應用程序。而對于 Eureka Client 而言,服務是通過心跳來告知注冊中心自己是 UP 還是 DOWN的。這樣我們的系統中則會出現兩種檢查機制,則會出現如下幾種情況。

  • K8S 通過,/health 通過
  • K8S 通過,/health 未通過
  • K8S 未通過,/health 通過

第一種情況,當兩種都通過的話,服務是可以被訪問的。

第二種情況,K8S 認為服務是正常運行的,但注冊中心認為服務是不健康的,注冊表中不會記錄該服務,這樣其他服務則不能獲取該服務的注冊信息,也就不會通過接口進行服務調用。則服務間不能正常訪問,如下圖所示:

第三種情況,服務通過心跳告知注冊中心自己是可用的,但是可能因為網絡的原因,K8S 將 pod 標識為不可訪問,這樣當其他服務來請求該服務時,則不可以訪問。這種情況下服務間也是不能正常訪問的。如下圖所示:

同時,當我們配置了管理端口之后,該端點則需要通過管理端口進行訪問。可以再配置文件中添加如下配置來修改管理端口。

management.port: 8081

?當我們開啟管理端口后,這樣會使我們的健康檢查變得更加復雜,健康檢查并不能獲取服務真正的健康狀態。

在這種情況下,Choerodon 使用 K8S 來監聽服務的健康端口,同時需要保證服務的端口與管理端口都能被正常訪問,才算通過健康檢查。可以在部署的 deploy 文件中添加 readinessProbe 參數。

apiVersion: v1 kind: Pod spec:containers:readinessProbe:exec:command:- /bin/sh- -c- curl -s localhost:8081/health --fail && nc -z localhost 8080failureThreshold: 3initialDelaySeconds: 60periodSeconds: 10successThreshold: 1timeoutSeconds: 10

這樣,當我們的服務啟動之后,才會被注冊中心正常的識別。當服務狀態異常時,也可以盡快的從注冊表中移除。

總結

回顧一下這篇文章,我們介紹了 Choerodon 的注冊中心,通過代碼的形式介紹了 Choerodon 微服務框架中,是如何來實現服務注冊和發現的,其中 Spring Cloud 的版本為 Dalston.SR4。具體的代碼可以參見我們的 github 地址(https://github.com/choerodon/go-register-server)。

更多關于微服務系列的文章,點擊藍字可閱讀 ▼

Choerodon的微服務之路(二):微服務網關

Choerodon的微服務之路(一):如何邁出關鍵的第一步

關于Choerodon豬齒魚

Choerodon豬齒魚是一個開源企業服務平臺,是基于Kubernetes的容器編排和管理能力,整合DevOps工具鏈、微服務和移動應用框架,來幫助企業實現敏捷化的應用交付和自動化的運營管理的開源平臺,同時提供IoT、支付、數據、智能洞察、企業應用市場等業務組件,致力幫助企業聚焦于業務,加速數字化轉型。

大家也可以通過以下社區途徑了解豬齒魚的最新動態、產品特性,以及參與社區貢獻:

  • 豬齒魚官網:http://choerodon.io
  • 論壇:http://forum.choerodon.io
  • Github:https://github.com/choerodon

由Choerodon豬齒魚核心團隊創立的 BuildRun(https://gobuildrun.com),基于豬齒魚帶來了多云架構環境下基于視覺的企業級應用創建、集成、部署、生命周期管理和分發的能力。

BuildRun 以云原生的現代化軟件架構來幫助企業提升軟件開發生產力和業務敏捷性,提供多云低代碼應用平臺和多云應用生命周期管理平臺,幫助企業隱藏應用開發和運行時的基礎架構復雜性,讓每個人專注于業務邏輯,促進團隊快速、持續地將想法轉化為真正的商業價值。

團隊在云原生技術和架構(DevOps、持續交付、微服務和容器)應用場景,如企業數字化轉型、企業中臺等方面擁有豐富的經驗,公司客戶包括商業地產、建筑工程、醫藥、家居、汽車配業、大型工業等企業,為您提供最合適的解決方案。

免費注冊試用:https://apps.gobuildrun.com/#/base/register-organization

總結

以上是生活随笔為你收集整理的无法访问netflix服务_Choerodon 的微服务之路(三):服务注册与发现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。