我正在使用Spring云Brixton.RC2,与Zuul和Eureka一起使用.
我有一个网关服务@EnableZuulProxy和book-service一个status方法.通过配置,我可以status通过休眠一段规定的时间来模拟方法的工作.
Zuul路线很简单
zuul.routes.foos.path=/foos/**
zuul.routes.foos.serviceId=reservation-service
Run Code Online (Sandbox Code Playgroud)
我运行了两个实例book-service.当我将休眠时间设置为低于Hystrix超时阈值(1000毫秒)时,我可以看到请求同时发送到图书服务的两个实例.这很好用.
据我所知,如果Hystrix命令失败,Ribbon应该可以在另一台服务器上重试该命令.这应该使故障对客户端透明.
我阅读了Ribbon配置并在Zuul中添加了以下配置:
zuul.routes.reservation-service.retryable=true //not sure which one to try
zuul.routes.foos.retryable=true //not sure which one to try
ribbon.MaxAutoRetries=0 // I don't want to retry on the same host, I also tried with 1 it doesn't work either
ribbon.MaxAutoRetriesNextServer=2
ribbon.OkToRetryOnAllOperations=true
Run Code Online (Sandbox Code Playgroud)
现在我更新配置,以便只有一个服务睡眠时间超过1秒,这意味着我有一个健康服务,一个健康服务.
当我调用网关时,调用会发送到两个实例,一半调用返回500.在网关中,我看到Hystrix超时:
com.netflix.zuul.exception.ZuulException: Forwarding error
[...]
Caused by: com.netflix.hystrix.exception.HystrixRuntimeException: reservation-service timed-out and no fallback available.
[...]
Caused by: java.util.concurrent.TimeoutException: null
Run Code Online (Sandbox Code Playgroud)
为什么Ribbon不会在另一个实例上重试调用?
我在这里想念什么吗?
hystrix spring-cloud netflix-zuul netflix-ribbon spring-cloud-netflix
我试图最终在 Spring Cloud Netflix、Kubernetes 和 Swarm 之间进行选择来构建我们的微服务环境。他们都非常酷,做一些选择是非常困难的。我会稍微描述一下我想要解决的问题。我找不到任何使用 Kubernetes 或 Swarm 设计 Api Gateway(不是简单的负载均衡器)的最佳方法,这就是我想使用 Zuul 的原因。但是从另一方面来说,Api 网关必须使用服务发现,在 Kubernetes 或 Swarm 的情况下,它将被嵌入到管弦乐队中。有了 Kubernetes,我可以使用它的 Spring Cloud 集成,但是这样我将在 Kubernetes 内部进行服务器端发现和客户端发现。我认为这是矫枉过正。我想知道是否有人对他们有一些经验以及对此有任何建议。谢谢。
kubernetes microservices docker-swarm netflix-zuul spring-cloud-netflix
我正在编写的微服务需要与我们平台中的其他微服务进行通信.在那次尝试中,我们的理想解决方案是Spring Cloud Netflix Feign,实现了一个@FeignClient.
但是,当我尝试以下时,我正面临以下例外@Autowired ReviewProvider:
例外(原因)
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.springframework.cloud.netflix.feign.FeignContext' available
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:353)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:351)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:340)
at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1093)
at org.springframework.cloud.netflix.feign.FeignClientFactoryBean.getObject(FeignClientFactoryBean.java:155)
at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:168)
Run Code Online (Sandbox Code Playgroud)
ReviewProvider.java
@FeignClient("http://metadata-reviews")
public interface ReviewProvider {
@RequestMapping(path = "sessions", method = POST)
ReviewSessionDTO createSession();
}
Run Code Online (Sandbox Code Playgroud)
ReviewProvider.java
@RunWith(SpringRunner.class)
@ActiveProfiles(INTEGRATION)
@ContextConfiguration(classes = AppEntry.class)
@AutoConfigureTestDatabase(replace = Replace.NONE)
@DataJpaTest
public class ReviewProviderTest {
@Autowired
private ReviewProvider provider;
private Class<? extends ReviewProvider> providerClass;
@Before
public void setup() {
providerClass = …Run Code Online (Sandbox Code Playgroud) java spring-boot spring-cloud-feign feign spring-cloud-netflix
我试过WebClient用LoadBalancerExchangeFilterFunction:
WebClient 配置:
@Bean
public WebClient myWebClient(final LoadBalancerExchangeFilterFunction lbFunction) {
return WebClient.builder()
.filter(lbFunction)
.defaultHeader(ACCEPT, APPLICATION_JSON_VALUE)
.defaultHeader(CONTENT_ENCODING, APPLICATION_JSON_VALUE)
.build();
}
Run Code Online (Sandbox Code Playgroud)
然后我注意到对底层服务的调用没有正确地进行负载平衡 - 每个实例上的RPS存在恒定的差异.
然后我试着回去RestTemplate.它工作正常.
配置RestTemplate:
private static final int CONNECT_TIMEOUT_MILLIS = 18 * DateTimeConstants.MILLIS_PER_SECOND;
private static final int READ_TIMEOUT_MILLIS = 18 * DateTimeConstants.MILLIS_PER_SECOND;
@LoadBalanced
@Bean
public RestTemplate restTemplateSearch(final RestTemplateBuilder restTemplateBuilder) {
return restTemplateBuilder
.errorHandler(errorHandlerSearch())
.requestFactory(this::bufferedClientHttpRequestFactory)
.build();
}
private ClientHttpRequestFactory bufferedClientHttpRequestFactory() {
final SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();
requestFactory.setConnectTimeout(CONNECT_TIMEOUT_MILLIS);
requestFactory.setReadTimeout(READ_TIMEOUT_MILLIS);
return new BufferingClientHttpRequestFactory(requestFactory);
} …Run Code Online (Sandbox Code Playgroud) load-balancing resttemplate spring-cloud spring-cloud-netflix spring-webflux
我遇到了需要为第三方API定义一次性@FeignClient的场景.在这个客户端中,我想使用与我的@Primary不同的自定义Jackson ObjectMapper.我知道可以覆盖spring的feign配置默认值,但是我不清楚如何只是通过这个特定的客户端简单地覆盖ObjectMapper.
我研究 spring cloud eureka,cloud 并且它们工作得很好。但是在eureka服务中添加了安全性后,却遇到了一些错误。
所有代码和错误细节都在https://github.com/keryhu/eureka-security
eureka 服务 application.yml
security:
user:
name: user
password: password
eureka:
client:
registerWithEureka: false
fetchRegistry: false
server:
wait-time-in-ms-when-sync-empty: 0
Run Code Online (Sandbox Code Playgroud)
和 config-service application.java
@SpringBootApplication
@EnableConfigServer
@EnableDiscoveryClient
Run Code Online (Sandbox Code Playgroud)
配置服务应用程序.yml
eureka:
client:
registry-fetch-interval-seconds: 5
serviceUrl:
defaultZone: http://user:password@${domain.name:localhost}:8761/eureka/
spring:
cloud:
config:
server:
git:
uri: https://github.com/spring-cloud-samples/config-repo
basedir: target/config
Run Code Online (Sandbox Code Playgroud)
启动config-service后有错误导出:
2016-04-10 11:22:39.402 ERROR 80526 --- [get_localhost-3] c.n.e.cluster.ReplicationTaskProcessor : Batch update failure with HTTP status code 401; discarding 1 replication tasks
2016-04-10 11:22:39.402 WARN 80526 --- [get_localhost-3] c.n.eureka.util.batcher.TaskExecutors : Discarding 1 tasks …Run Code Online (Sandbox Code Playgroud) spring spring-security spring-cloud netflix-eureka spring-cloud-netflix
这是我的Feign界面
@FeignClient(
name="mpi",
url="${mpi.url}",
configuration = FeignSimpleEncoderConfig.class
)
public interface MpiClient {
@RequestMapping(method = RequestMethod.POST)
public ResponseEntity<String> getPAReq(@QueryMap Map<String, String> queryMap
);
}
Run Code Online (Sandbox Code Playgroud)
和我的自定义配置
public class FeignSimpleEncoderConfig {
public static final int FIVE_SECONDS = 5000;
@Bean
public Logger.Level feignLogger() {
return Logger.Level.FULL;
}
@Bean
public Request.Options options() {
return new Request.Options(FIVE_SECONDS, FIVE_SECONDS);
}
@Bean
@Scope("prototype")
public Feign.Builder feignBuilder() {
return Feign.builder()
.encoder(new FormEncoder());
}
}
Run Code Online (Sandbox Code Playgroud)
如果我发送这样的请求,我会看到我的请求发送Content-Type:application / json; charset = UTF-8。但是如果我设置内容类型
consumes = "application/x-www-form-urlencoded"
Run Code Online (Sandbox Code Playgroud)
我收到此错误消息
feign.codec.EncodeException: Could not write request: …Run Code Online (Sandbox Code Playgroud) 我正在使用Spring云平台开发微服务,其中service1调用多个其他微服务,例如service2,service3,service 4等.这些服务可以并行调用,service1将聚合结果.我可以使用Spring cloud feign(http://cloud.spring.io/spring-cloud-static/Dalston.SR1/#spring-cloud-feign)生成rest客户端并异步调用服务,还是应该使用Spring 4 AsyncRestTemplate异步调用服务?
我有一个spring cloud配置服务器并将其打包为docker镜像,然后我也有spring cloud eureka服务器也打包为docker镜像。
当我使用docker compose运行两者时,出现以下错误。
discovery-service_1 | 2017-06-24 15:36:12.059 INFO 5 --- [ main] c.c.c.ConfigServicePropertySourceLocator : Fetching config from server at: http://config-service:9001
discovery-service_1 | 2017-06-24 15:36:12.997 WARN 5 --- [ main] c.c.c.ConfigServicePropertySourceLocator : Could not locate PropertySource: I/O error on GET request for "http://config-service:9001/cls-discovery-service/default": Connection refused (Connection refused); nested exception is java.net.ConnectException: Connection refused (Connection refused)
尽管配置服务已启动并成功运行,但是由于某种原因,发现服务仍然找不到它。
这里使用的Docker撰写文件是这个
version: '2'
services:
config-service:
image: cloudsea/cls-config-service
ports:
- 9001:9001
expose:
- "9001"
discovery-service:
image: cloudsea/cls-discovery-service
depends_on:
- config-service
environment:
CLOUD_SEA_CONFIG_SERVER_URI: http://config-service:9001 …
spring-boot spring-cloud docker-compose spring-cloud-netflix spring-cloud-config
Spring Boot Cloud Disovery 问题,Windows 10 上 docker 升级后 Eureka 主机名的问题。(注意:docker 不托管 spring 服务,只是 mariadb、rabbitmq 和 zipkin)
概括
一切正常,直到今天的 docker 更新,在 docker 升级之后
Eureka 返回“host.docker.internal”作为我的开发箱的主机名(托管 spring boot 云服务的机器)
这一直工作正常,直到今天 Windows 10 上的 docker 升级。
关于这一点的任何指导?
- - - - - - - - - - - - - - - 细节 - - - - - - - - - - ---------
”
---------------- spring …
spring docker spring-boot netflix-eureka spring-cloud-netflix
spring-cloud ×5
spring ×4
spring-boot ×3
feign ×2
netflix-zuul ×2
docker ×1
docker-swarm ×1
hystrix ×1
java ×1
kubernetes ×1
resttemplate ×1
spring-mvc ×1