3

Spring MVC システムを書き直しています。

このシステムは、単純に [Gateway<->Backend Services<->Databases]のようなものです。ここで、Gateway は単に認証とリクエストをバックエンド サービスに転送するためのコントローラーです。

バックエンド サービスはマイクロ サービスにリファクタリングされます。Eureka サービスを使用して、それぞれの登録を行います。したがって、最終的にアーキテクチャは[ゲートウェイ <-> Eureka <-> バックエンド マイクロサービス <-> データベース] になります。Gateway は Eureka サーバーからレジストリを検索し、マイクロ サービスを呼び出します。

ただし、Gateway は Spring Boot アプリケーションではありません (Spring Boot として書き直されることはありません)。そのため、Spring の eureka 機能 (@EnableEurekaClient 、DiscoveryClient など) を例のように簡単に採用できるとは思いません。実際に、ゲートウェイのコントローラーに eureka クライアント アノテーションを追加しようとしたところ、アプリケーションが崩壊しました。

さらに、クライアント側の負荷分散のために Gateway にリボンが必要です。しかし、上記と同じ懸念があります。

//11 月 1 日に更新 。Eureka サーバーとクライアントをセットアップしました。どちらも Spring Boot で記述されています。Spring MVC のテストには、これら 2 つのアプリケーションを使用しています。サーバーとクライアントは正常に動作しています。

サーバーの構成 application.propertiesは次のとおりです

server.port=8761

spring.application.name=service-itself

eureka.client.service-url.default-zone=http://localhost:8761/eureka/
eureka.client.register-with-eureka=true
eureka.client.fetch-registry=false

logging.level.com.netflix.eureka=OFF
logging.level.com.netflix.discovery=OFF

クライアントは以下の通りです: application.yml

spring:
  application:
    name: say-hello

server:
  port: 8090

eureka:
  client:
    service-url:
      defaultZone: http://${eureka.host:localhost}:${eureka.port:8761}/eureka/

Eureka ダッシュボード localhost:8761 にアクセスすると、クライアントが登録されていることがわかります。

Spring MVC ゲートウェイは Spring ブート プロジェクトではないため、Eureka サーバーに接続して登録済みの「say-hello」クライアントのインスタンスを取得できるかどうかをテストするためだけに、例をプロジェクトにコピーしました。残念ながら、サンプル クラスの 76 行目に出力されている「eureka から対話するサンプル サービスのインスタンスを取得できません」というメッセージでは、そうすることができません。

これは、ゲートウェイのクラスパスに配置された eureka-client.properties です。Client クラスが設定ファイルを読み込んでいることが確認できました。

eureka.name=gatewayEurekaClient
eureka.vipAddress=say-hello
eureka.port=8761
eureka.preferSameZone=true
eureka.preferSameZone=true
eureka.shouldUseDns=false
eureka.serviceUrl.default=http://localhost:8761/eureka
eureka.serviceUrl.defaultZone=http://localhost:8761/eureka

また、これはnew DiscoveryClient(applicationInfoManager, clientConfig);時のデバッグ情報です。実行中です

instanceInfo    InstanceInfo  (id=234)  
    actionType  null    
    appGroupName    "UNKNOWN" (id=246)  
    appName "GATEWAYEUREKACLIENT" (id=247)  
    asgName null    
    countryId   1   
    dataCenterInfo  PropertiesInstanceConfig$1  (id=248)    
    healthCheckExplicitUrl  null    
    healthCheckRelativeUrl  "/healthcheck" (id=253) 
    healthCheckSecureExplicitUrl    null    
    healthCheckUrl  "http://A156N7AB89AXNZQ:8761/healthcheck" (id=254)  
    homePageUrl "http://A156N7AB89AXNZQ:8761/" (id=255) 
    hostName    "A156N7AB89AXNZQ" (id=256)  
    instanceId  "A156N7AB89AXNZQ" (id=256)  
    ipAddr  "10.209.66.64" (id=257) 
    isCoordinatingDiscoveryServer   Boolean  (id=258)   
    isInstanceInfoDirty false   
    isSecurePortEnabled false   
    isUnsecurePortEnabled   true    
    lastDirtyTimestamp  Long  (id=260)  
    lastUpdatedTimestamp    Long  (id=263)  
    leaseInfo   LeaseInfo  (id=264) 
    metadata    ConcurrentHashMap<K,V>  (id=266)    
    overriddenstatus    InstanceInfo$InstanceStatus  (id=267)   
    port    8761    
    secureHealthCheckUrl    null    
    securePort  443 
    secureVipAddress    null    
    secureVipAddressUnresolved  null    
    sid "na" (id=270)   
    status  InstanceInfo$InstanceStatus  (id=271)   
    statusPageExplicitUrl   null    
    statusPageRelativeUrl   "/Status" (id=272)  
    statusPageUrl   "http://A156N7AB89AXNZQ:8761/Status" (id=273)   
    version "unknown" (id=274)  
    vipAddress  "say-hello" (id=275)    
    vipAddressUnresolved    "say-hello" (id=275)    

アイデアが不足しています。誰でもこの問題に手を貸してもらえますか?

4

2 に答える 2

3

リボン ( https://github.com/Netflix/ribbon ) と Eureka ( https://github.com/Netflix/eureka ) は、Spring がなくても機能します (それが最初に開発された方法です)。ニーズに合わせてすべてを構成するためにもう少し努力する必要があります。

于 2016-10-29T12:21:07.553 に答える
1

Spring でのリボンとユーレカのサポートは、Spring Boot ではなく、Spring Cloud プロジェクト (および mvn グループ ID) の一部です。ブートは必須ではないと思います。リボンとエウレカ自体は Netflix によって提供されます。

リボンの場合、とにかく独自の @LoadBalanced RestTemplate @Bean を定義する必要があります。@EnableDiscoveryClient は、依存関係に spring cloud eureka があり、クラスが @Configuration クラスである限り機能するはずです。

簡単な答えは - 簡単なテストを試してみませんか? :)。

于 2016-10-29T13:12:08.640 に答える