当我尝试通过Zuul网关访问服务meeting
时,Zuul无法将请求转发到相应的服务。我面临以下错误:
- nettflix.zuul.exception.ZuulException:转发错误
- 原因:com.netflix.client.ClientException:负载均衡器没有可用的服务器用于客户端:会议
让我共享用于服务,尤里卡和zuul网关的application.yml。
EurekaClient:
Application.yml
server:
port: 8761
eureka:
instance:
hostname: localhost
lease-renewal-interval-in-seconds: 300
client:
register-with-eureka: false
fetch-registry: true
serviceUrl:
defaultZone: http://localhost:8761/eureka/
ZuulGateWay:
application.yml
server:
port: 8085
spring:
application:
name: gatekeeper
zuul:
routes:
meeting: /meeting/**
serviceId: meeting
ribbon:
eureka:
enabled: false
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
ZuulGateWay: SpringBootApplication
package com.sagarp.gatekeeper;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
@SpringBootApplication
@EnableEurekaClient
@EnableZuulProxy
public class MeetingApplication {
public static void main(String[] args) {
SpringApplication.run(MeetingApplication.class, args);
}
}
我的服务班级(会议): Application.yml
server:
port: 0
spring:
application:
name: meeting
datasource:
url: jdbc:mysql://localhost:3306/sagarp?useSSL=false
username: myUserName
password: myPassWord
jpa:
properties:
hibernate:
dialect: org.hibernate.dialect.MySQL5InnoDBDialect
hibernate:
ddl-auto: update
eureka:
client:
registerWithEureka: true
fetchRegistry: true
serviceUrl:
defaultZone: http://localhost:8761/eureka/
instance:
lease-renewal-interval-in-seconds: 5
我的服务班级(会议): SpringBootApplication
package com.sagarp;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
@SpringBootApplication
@EnableEurekaClient
public class MeetingApplication {
public static void main(String[] args) {
SpringApplication.run(MeetingApplication.class, args);
}
}
如您所见,该配置确保eureka客户端发现了我的所有服务。
在eureka控制台中,我已经验证了相同的内容,zuul gateway
和my service(meeting)
都可见。
为获得更好的视图,您可以访问我的git repo。 https://github.com/sagar-patro/demo-microservices
任何帮助都是非常有益的
答案 0 :(得分:8)
ribbon:
eureka:
enabled: false
Spring Cloud Netflix Zuul 使用 Netflix的Ribbon 执行客户端负载平衡,默认情况下,执行 Ribbon >将 Netflix Eureka 用于服务发现。您正在跳过服务发现,因此已将ribbon.eureka.enabled
设置为false
。由于丝带现在无法使用 Eureka 查找服务,因此您必须为meeting
服务指定一个URL:
meeting:
ribbon:
listOfServers: localhost:8080
我会让你更清楚。
您目前在gatekeeper
项目中使用的依赖项org.springframework.cloud:spring-cloud-starter-netflix-zuul
具有多个编译依赖项:
com.netflix.zuul:zuul-core
org.springframework.boot:spring-boot-starter-web
org.springframework.boot:spring-boot-starter-actuator
org.springframework.cloud:spring-cloud-netflix-zuul
org.springframework.cloud:spring-cloud-starter
org.springframework.cloud:pring-cloud-starter-netflix-hystrix
org.springframework.cloud:spring-cloud-starter-netflix-ribbon
org.springframework.cloud:spring-cloud-starter-netflix-archaius
如您所见,它由com.netflix.zuul:zuul-core
模块周围聚集的许多组件组成(包括用于实例发现的Eureka和用于路由的Ribbon):
在启动gatekeeper
应用程序时,将应用默认的ZuulProxyAutoConfiguration
配置。它导入功能区配置类:
@Configuration
@Import({ RibbonCommandFactoryConfiguration.RestClientRibbonConfiguration.class,
RibbonCommandFactoryConfiguration.OkHttpRibbonConfiguration.class,
RibbonCommandFactoryConfiguration.HttpClientRibbonConfiguration.class,
HttpClientConfiguration.class })
@ConditionalOnBean(ZuulProxyMarkerConfiguration.Marker.class)
public class ZuulProxyAutoConfiguration extends ZuulServerAutoConfiguration { ... }
HttpClientRibbonConfiguration
依次初始化RibbonLoadBalancingHttpClient
,它负责您看到的错误消息。
RibbonLoadBalancingHttpClient
默认使用ZoneAwareLoadBalancer
包中的com.netflix.ribbon:ribbon-loadbalancer
:
默认情况下,使用Ribbon上的
ZoneAwareLoadBalancer
进行Zuul负载均衡。该算法是发现中可用实例的轮循机制,并通过可用性区域成功跟踪来恢复弹性。负载均衡器将保留每个区域的统计信息,并且如果故障率高于可配置的阈值,则会删除该区域。如果要使用自己的自定义负载均衡器,则可以为该Ribbon客户端名称空间设置
NFLoadBalancerClassName
属性,或覆盖getLoadBalancerClass()
中的DefaultClientChannelManager
方法。请注意,您的班级应扩展DynamicServerListLoadBalancer
。
它说明Zuul将路由和负载平衡工作委托给Ribbon组件,并证明您实际上在gatekeeper
项目中使用Ribbon。
除非您选择其他负载均衡器,否则应选择我的原始答案。
希望对您有所帮助。