3

我正在重写一个 Spring MVC 系统。

该系统很简单: [Gateway<->Backend Services<->Databases],其中 Gateway 是一个控制器,仅用于身份验证并将请求转发到后端服务。

后端服务将重构为微服务。我将使用 Eureka 服务为他们每个人进行注册。所以最终架构将是:[网关 <-> Eureka <-> 后端微服务 <-> 数据库]。网关将从 Eureka 服务器查找注册表并调用微服务。

但是,Gateway 不是 Spring Boot 应用程序(不会被重写为 Spring Boot),因此我不相信 Spring 的 eureka 特性(@EnableEurekaClient、DiscoveryClient 等)可以像示例那样轻松采用。实际上我尝试将 eureka 客户端注释添加到网关的控制器,这导致我的应用程序崩溃。

此外, Gateway 中还需要Ribbon来实现客户端负载平衡。但同样的担忧与上述相同。

//11月1日更新, 我已经搭建了一个Eureka server和一个client,都是用spring boot写的。我将这两个应用程序用于我的 Spring MVC 测试。服务器和客户端运行良好。

服务器的配置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 Boot 项目,所以我将示例复制到我的项目中,只是为了测试它是否可以连接到 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

Ribbon ( https://github.com/Netflix/ribbon ) 和 Eureka ( https://github.com/Netflix/eureka ) 可以在没有 Spring 的情况下工作(这就是它们最初的开发方式),但你会需要付出更多的努力来配置所有内容以满足您的需求。

于 2016-10-29T12:21:07.553 回答
1

Spring 中对 Ribbon 和 Eureka 的支持是 Spring Cloud 项目(和 mvn group id)的一部分,而不是 Spring Boot。我不认为引导是强制性的。Ribbon 和 Eureka 本身由 Netflix 提供。

对于功能区,您无论如何都需要定义自己的@LoadBalanced RestTemplate @Bean。只要依赖项具有 spring cloud eureka 并且您的类是 @Configuration 类,@EnableDiscoveryClient 就应该可以工作。

简短的回答是 - 为什么不尝试快速测试?:)。

于 2016-10-29T13:12:08.640 回答