简短说明: 我正在尝试使用ZuulProxy来处理实例故障转移但它抛出ZuulException:转发错误,而不是使用工作实例的结果进行响应.
详细说明: 我的设置是一个独立的Eureka服务器,一个ConfigServer,一个ZuulProxy(@EnableZuulProxy)和两个服务实例,所有这些都在Eureka注册.
一切都在运行spring-cloud-starter-parent Angel.SR3
我的服务发现:
@SpringBootApplication
@EnableEurekaServer
public class EurekaServer {
public static void main(String[] args) {
SpringApplication.run(EurekaServer.class, args);
}
}
Run Code Online (Sandbox Code Playgroud)
我的ConfigServer:
@SpringBootApplication
@EnableAutoConfiguration
@EnableConfigServer
@ComponentScan
@EnableDiscoveryClient
public class ConfigserverApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigserverApplication.class, args);
}
}
Run Code Online (Sandbox Code Playgroud)
我的ZuulProxy:
@SpringBootApplication
@EnableAutoConfiguration
@ComponentScan
@EnableDiscoveryClient
@EnableZuulProxy
public class ZuulProxy {
public static void main(String[] args) {
SpringApplication.run(ZuulProxy.class, args);
}
}
Run Code Online (Sandbox Code Playgroud)
该路由规则在zuul:
zuul.ignoredServices=*
zuul.routes.examplems=/example/**
Run Code Online (Sandbox Code Playgroud)
我的服务实例:
@SpringBootApplication
@Configuration
@EnableAutoConfiguration
@EnableDiscoveryClient
@ComponentScan(basePackages = …Run Code Online (Sandbox Code Playgroud) 我一直在github上玩Spring Cloud项目:https://github.com/spring-cloud/spring-cloud-config
但是我遇到了一些问题,让它读取本地属性文件而不是从github中提取属性.即使我删除了对github的所有引用,spring似乎忽略了本地文件.此处发布了类似的问题:Spring-Cloud配置服务器忽略配置属性文件
但我还没有看到任何好的答案.我想知道是否有人能指出我的一个例子?我想在本地设置我的属性,而不是使用任何类型的git repo.我假设有人之前遇到过这种情况,如果有某个例子,我真的很想看到它,这样我才能朝着正确的方向前进.
我想在没有客户端负载均衡器功能区的情况下使用Feign,因为我不想运行需要分发且高度可用的Eureka.相反,具有由Route53管理的内部DNS名称的内部ELB可以正常运行.
提供@FeignClient始终导致的纯URL no loadbalancer found for ..,因此我尝试阻止Feign使用Ribbon:
春云Netflix的自带FeignRibbonClient,用于如果ILoadBalancer从ribbon-loadbalancer存在.但是,如果排除此依赖关系,则会FeignConfiguration被破坏:
Bean creation exception on FactoryBean type check: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'apiVersionClient': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: feign.codec.Decoder org.springframework.cloud.netflix.feign.FeignConfiguration.decoder; nested exception is java.lang.ArrayStoreException: sun.reflect.annotation.TypeNotPresentExceptionProxy
Run Code Online (Sandbox Code Playgroud)
欢迎提示:-)
启动应用程序:
@SpringBootApplication
@EnableZuulProxy
public class ZuulServer {
public static void main(String[] args) {
new SpringApplicationBuilder(ZuulServer.class).web(true).run(args);
}
}
Run Code Online (Sandbox Code Playgroud)
我的YAML文件是这样的:
server:
port:8080
spring:
application:
name: zuul
eureka:
client:
enabled: true
serviceUrl:
defaultZone: http://localhost:8761/eureka/
zuul:
proxy:
route:
springapp: /springapp
Run Code Online (Sandbox Code Playgroud)
我有一个名为springapp的微服务应用程序(在端口8081上),并有一些休息服务.以下是我的客户端UI应用:
<html>
<head>
<title>TODO supply a title</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script type="text/javascript" src="js/libs/jquery/jquery.min.js" ></script>
</head>
<body>
<script type="text/javascript">
$.ajax({
url: 'http://localhost:8080/zuul/springapp/departments',
type: 'GET'
}).done(function (data) {
consoe.log(data);
document.write(data);
});
</script>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
但我得到了一个
XMLHttpRequest cannot load http://localhost:8080/zuul/springapp/departments. No
'Access-Control-Allow-Origin' header is …Run Code Online (Sandbox Code Playgroud) 我正在使用Spring Boot和Spring Cloud(Zuul和Eureka)在单独的docker容器中运行构建微服务,这些容器部署在单独的Amazon EC2实例中.
我有一个简单的REST服务,它向Eureka注册,并已配置Zuul通过在Eureka中查找请求来将请求路由到此服务.

我可以使用boot2docker在Mac上本地运行(即不在Amazon/EC2中),但是当部署在EC2上时,Zuul无法找到服务,并报告"转发错误"(状态500).
在EC2中,一切都配置为在端口80上运行(只是在评估时,我可以通过我们的防火墙轻松访问).我可以在Eureka系统状态页面中看到Zuul和我的服务(尽管没有链接可用!).
客户端配置为使用完整的AWS域名查找Eureka,因此我可以看到他们如何找到Eureka OK.例如
client:
serviceUrl:
defaultZone: http://ec2-XX-XX-XX-XX.ap-southeast-2.compute.amazonaws.com:80/eureka/,http://ec2-YY-YY-YY-YY.ap-southeast-2.compute.amazonaws.com:80/eureka/
Run Code Online (Sandbox Code Playgroud)
但是,客户似乎正在使用其内部docker IP地址进行注册(基于Eureka系统状态链接).
edgeserver链接指向http://172.17.0.2/info 试用服务链接指向http://172.17.0.3/info
我猜这是不正确的,其他EC2实例不知道到达这个地址.
我已经阅读了这个页面https://github.com/Netflix/eureka/wiki/Configuring-Eureka-in-AWS-Cloud,建议使用AWS EC2弹性IP地址,但我希望我不必这样做.
我也看到目前有关于这个主题的讨论,https://github.com/spring-cloud/spring-cloud-netflix/issues/432
有没有人设法让这种类型的设置工作,如果是这样,他们是如何配置Eureka属性的?
zookeeper与spring cloud配置服务器有什么区别?它们都将配置存储在服务器中并使其可供客户端使用.
应该何时使用另一个?
我有一个AWS lambda RequestHandler类,由AWS直接调用.最终我需要使用Spring Boot,因为我需要它能够从Spring Cloud配置服务器检索数据.
问题是如果我从我自己的开发环境本地运行代码但是在AWS上部署时无法注入配置值,则代码可以工作.
@Configuration
@EnableAutoConfiguration
@ComponentScan("my.package")
public class MyClass implements com.amazonaws.services.lambda.runtime.RequestHandler<I, O> {
public O handleRequest(I input, Context context) {
ApplicationContext applicationContext = new SpringApplicationBuilder()
.main(getClass())
.showBanner(false)
.web(false)
.sources(getClass())
.addCommandLineProperties(false)
.build()
.run();
log.info(applicationContext.getBean(SomeConfigClass.class).foo);
// prints cloud-injected value when running from local dev env
//
// prints "${path.to.value}" literal when running from AWS
// even though Spring Boot starts successfully without errors
}
}
@Configuration
public class SomeConfigClass { …Run Code Online (Sandbox Code Playgroud) 我使用docker compose来运行我所有的微服务.对于每项服务,我给它一个简短的主机名.
version: '2'
services:
config:
image: springbox-config-server
restart: always
ports:
- "8890:8890"
discovery:
image: springbox-eureka
restart: always
ports:
- "8763:8763"
Run Code Online (Sandbox Code Playgroud)
因此,在我的微服务中,我必须使用其短主机名来定位配置服务器.
spring:
application:
name: myservice
cloud:
config:
uri: http://config:8890
fail-fast: true
Run Code Online (Sandbox Code Playgroud)
但是,当我在没有docker的IDE中本地运行它们时,无法解析短主机名.
所以我正在寻找一种解决方案,根据我的环境定位不同的配置服务器.
我快速浏览了Feign的源代码,我发现Feign使用JDK HttpUrlConnection发出HTTP请求,并在请求完成时关闭它而不使用连接池.我怀疑这种方式的效率.然后我读了Spring的文档,RestTemplate它说RestTemplate可以切换到Apache Http Client或OKHttp来发送HTTP请求:
注意:默认情况下,RestTemplate依赖于标准JDK工具来建立HTTP连接.您可以通过HttpAccessor.setRequestFactory(org.springframework.http.client.ClientHttpRequestFactory)属性切换到使用不同的HTTP库,例如Apache HttpComponents,Netty和OkHttp.
这是否意味着RestTemplate在性能方面优于Feign?
我正在尝试使用spring MVC和spring boot框架开发一个spring cloud微服务.和Eureka服务器,Zuul,Ribbon,hystrix和Turbine用于春天云.我已经开发了一个微服务并且只实现了hystrix仪表板.我可以使用hystrix仪表板.现在我正在实施更多服务.因此,我选择涡轮机进行监控聚合.但它没有获得仪表板.我在单独的弹簧启动项目中实施了涡轮机.
我的pom.xml包含,
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-turbine</artifactId>
</dependency>
Run Code Online (Sandbox Code Playgroud)
而我的主要课程包含,
@SpringBootApplication
@EnableHystrixDashboard
@EnableCircuitBreaker
@EnableTurbine
public class ZTurbineClientApplication {
public static void main(String[] args) {
SpringApplication.run(ZTurbineClientApplication.class, args);
}
}
Run Code Online (Sandbox Code Playgroud)
我的Turbine项目application.properties文件包含,
server.port=8085
spring.application.name=espace-Turbine
eureka.client.serviceUrl.defaultZone=http://localhost:8071/eureka/
eureka.client.register-with-eureka=true
eureka.client.fetch-registry=true
turbine:
aggregator:
clusterConfig: APPCLUSTER
app-config: espaceService1,espaceService2
instanceUrlSuffix.APPCLUSTER: /hystrix.stream
Run Code Online (Sandbox Code Playgroud)
和我以前的第一个服务的application.properties文件一样
eureka.client.serviceUrl.defaultZone=http://localhost:8071/eureka/
eureka.client.register-with-eureka=true
eureka.client.fetch-registry=true
spring.application.name=espaceService1
server.port=8080
eureka:
instance:
prefer-ip-address: true
leaseRenewalIntervalInSeconds: 3
leaseExpirationDurationInSeconds: 3
metadata-map:
cluster: APPCLUSTER
Run Code Online (Sandbox Code Playgroud)
第二个服务的应用程序属性文件包含,
eureka.client.serviceUrl.defaultZone=http://localhost:8071/eureka/
eureka.client.register-with-eureka=true
eureka.client.fetch-registry=true
spring.application.name=espaceService2
server.port=8081
eureka:
instance:
prefer-ip-address: …Run Code Online (Sandbox Code Playgroud) spring-cloud ×10
spring ×6
java ×4
spring-boot ×2
aws-lambda ×1
cloud ×1
config ×1
docker ×1
netflix-zuul ×1
turbine ×1