标签: spring-cloud

Spring/Eureka/Feign - FeignClient设置Content-Type标题到application/x-www-form-urlencoded

当我使用FeignClient它时,它设置Content-Typeapplication/x-www-form-urlencoded而不是application/json;charset=UTF-8.

如果我使用a RestTemplate发送相同的消息,则消息头Content-Type正确设置为application/json;charset=UTF-8.

无论是FeignClientRestTemplate正在使用Eureka的服务发现,并通过我调试服务器接收HTTP消息发现了这个问题.

服务器端的控制器如下所示:

@RestController
@RequestMapping("/site/alarm")
public class SiteAlarmController {
    @RequestMapping(method = RequestMethod.POST)
    @ResponseBody
    public ResponseEntity<RaiseAlarmResponseDto> raiseAlarm(@RequestBody RaiseSiteAlarmRequestDto requestDto) {
        ...
    }
Run Code Online (Sandbox Code Playgroud)

FeignClient在电话报警的服务接口看起来是这样的:

@FeignClient("alarm-service")
public interface AlarmFeignService {
    @RequestMapping(method = RequestMethod.POST, value = "/site/alarm")
    RaiseAlarmResponseDto raiseAlarm(@RequestBody RaiseSiteAlarmRequestDto requestDto);
}
Run Code Online (Sandbox Code Playgroud)

来自的HTTP消息头FeignClient是:

Accept: */*
Cache-Control: no-cache
Pragma: no-cache
User-Agent: Java/1.7.0_60
Host: smit005s-MacBook-Pro.local:9120
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 323 …
Run Code Online (Sandbox Code Playgroud)

spring-boot spring-cloud netflix-feign netflix-eureka

1
推荐指数
1
解决办法
2万
查看次数

将伪装和功能区日志重定向到 log4j2

我目前使用带有 log4j2 的 spring cloud netflix。log4j2 配置来自类路径中的 xml。当我运行应用程序时,我看到 feign 和功能区日志没有被重定向到配置中指定的记录器。我已经配置日志com.netflix.ribbon在登录包调试水平。

但是,为 spring 配置的日志正确重定向到指定的 appender,而ribbon 和 feign 则没有。

我将 gradle 与 spring-boot-starter-logging 忽略并添加了 spring-boot-starter-log4j2 作为我的构建的一部分。

我看到feign有一种我们可以配置 slf4j 的方法,但是由于我们使用注释驱动的 feign 支持,我无法将 feign 配置为使用 slf4j 进行日志记录。

任何帮助表示赞赏。

我的 log4j2.xml 看起来有点像

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
    <Properties>
        <Property name="log-path">logs</Property>
        <Property name="log-fileName">test</Property>
    </Properties>

    <Appenders>
        <Console name="console-log" target="SYSTEM_OUT">
            <PatternLayout pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n" />
        </Console>

        <RollingFile name="trace-log" fileName="${log-path}/${log-fileName}-trace.log" filePattern="${log-path}/${log-fileName}_trace-%d{yyyy-MM-dd}.log">
            <PatternLayout pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} …
Run Code Online (Sandbox Code Playgroud)

netflix log4j2 spring-boot spring-cloud netflix-feign

1
推荐指数
1
解决办法
5672
查看次数

1
推荐指数
1
解决办法
3747
查看次数

spring cloud config searchPaths

我正在考虑通过 Spring Cloud Config 实现 12factor 方法来外部化配置,但无法按预期使用 searchPaths 使通配符工作。

文档http://cloud.spring.io/spring-cloud-config/spring-cloud-config.html#_spring_cloud_config_server提到可以在 searchPaths 变量中使用通配符 {application}、{label}、{profile},以便“您可以隔离路径中的目录,并选择对您有意义的策略(例如每个应用程序的子目录,或每个配置文件的子目录)。

我希望有一个 git repo,每个配置文件都有子目录(然后是每个应用程序,或者每个应用程序的子目录(然后是配置文件)。

例如

    spring:
      cloud:
        config:
          server:
            git:
              uri: https://stash.xxx.com.au/scm/xxx/config
              searchPaths: {application}
or
              searchPaths: {profile}
or
              searchPaths: {application}/{profile}
Run Code Online (Sandbox Code Playgroud)

但是,当我在搜索路径中使用任何通配符 {application} 或 {profile} 时,它在 git repo 中找不到数据,或者连接选项根本无法启动。

有没有人有我可以参考的工作示例?干杯罗伊

spring-boot spring-cloud

1
推荐指数
2
解决办法
8935
查看次数

Spring Cloud Logging 的最佳方法是什么?

我在 AWS 上将 Spring Boot 应用程序作为 Systemd 服务运行。结果,所有日志消息与 Linux 日志消息一起转到 system.log,这使得日志难以阅读。

什么是不淹没 system.log 并为每个应用程序/微服务保留单独日志的最佳方法?是 Log4j 2 吗?你能推荐替代品吗?

logging log4j2 spring-cloud

1
推荐指数
1
解决办法
4266
查看次数

Spring Cloud AWS SQS删除策略

我们有一个SQS侦听器,例如:

@MessageMapping("queueName")
void listen(String message) { ... }
Run Code Online (Sandbox Code Playgroud)

此队列具有配置有关联的死信队列的重新驱动策略。

问题是默认的Spring Cloud AWS实施是在轮询消息时删除消息,并在内部进行3次重试以进行处理,然后失败。

我可以看到有一个带有ALWAYS和ON_SUCCESS值的SqsMessageDeletionPolicy枚举。我在任何文档中都找不到如何更改该队列的QueueAttributes以更改此行为。

有谁知道吗

amazon-sqs aws-sdk spring-cloud

1
推荐指数
2
解决办法
1366
查看次数

Spring Cloud端口号,使选择更加智能

我正在运行带有Eureka服务器的Spring Cloud,我想让我的应用程序根据使用的端口和给定的范围选择端口。

例如,我希望我的第一个实例从端口8010开始,第二个实例从8011等开始。

在application.properties中,您可以设置一个随机端口(server.port=0),可以设置一个静态端口(server.port=8080),但是我想知道如何使spring在一个范围内设置一个随机端口,或者根据使用的端口选择一个端口。

例如,类似这样的方法将起作用:

server.port.random=8080-8090
Run Code Online (Sandbox Code Playgroud)

但这显然不存在。

我也知道可以添加一些逻辑,例如,我曾经使用过:

eureka.instance.instance-id=${spring.application.name}:${random.int}
Run Code Online (Sandbox Code Playgroud)

但是我不知道如何使两个数字之间的随机性起作用。此外,随机变量仍有可能连续两次设置相同的端口,从而使服务器无法启动实例。

有没有一种方法可以在Spring application.properties中动态设置端口?

java spring spring-boot spring-cloud spring-cloud-netflix

1
推荐指数
1
解决办法
970
查看次数

springboot找不到feignclient

错误信息如下:

***************************
APPLICATION FAILED TO START
***************************

Description:

Field helloAgent in com.example.client.controller.Hello required a bean of 
type 'com.example.common.agent.HelloAgent' that could not be found.

Action:

Consider defining a bean of type 'com.example.common.agent.HelloAgent' in 
your configuration.
Run Code Online (Sandbox Code Playgroud)

项目结构:

模块:test-client作为feignclient调用者。

模块:测试服务器作为feignclient接口的实现。

模块:test-common将所有feignclient放在一起。

常见测试:

package com.example.common.agent;
@FeignClient("hello")
public interface HelloAgent {
    @GetMapping("/hello")
    String hello(@RequestParam String msg);
}
Run Code Online (Sandbox Code Playgroud)

测试服务器:(工作正常)

package com.example.server.controller;

@RestController
public class Hello implements HelloAgent {
    @Override
    public String hello(@RequestParam String msg) {
        System.out.println("get " + msg);
        return "Hi " + msg;
    }
} …
Run Code Online (Sandbox Code Playgroud)

spring-boot spring-cloud spring-cloud-feign

1
推荐指数
1
解决办法
2827
查看次数

未调用 Spring FeignClient 回退但进入异常

我在尝试基于文档的 feignclient 回退时遇到问题。

假设 myFeignClient 无法连接到 myFeign

@FeignClient(name = "myFeign", fallback = MyFeignClientFallback.class)
public interface MyFeignClient {
    @PostMapping(“/test")
    Object test(@RequestParam(“param1") String param1);
}
Run Code Online (Sandbox Code Playgroud)

我的后备类是这样的:

@Component
public class MyFeignClientFallback implements MyFeignClient {
    public Object test(@RequestParam(“param1”) String param1) {

        return “Error";
    }

}
Run Code Online (Sandbox Code Playgroud)

它没有调用回退方法,而是彻底失败:

2018-05-07 15:19:48.052 错误 41592 --- [nio-8081-exec-6] oaccC[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] 在上下文中路径[]抛出异常[请求处理失败;嵌套异常是 java.lang.RuntimeException: com.netflix.client.ClientException: Load balancer does not have available server for client: myFeign] 具有根本原因

com.netflix.client.ClientException:负载均衡器没有客户端可用的服务器:myFeign

我已经让我的假客户工作了。当我遇到这个问题时,我正在尝试使用 Hystrix 的想法。

我是否错误地使用了它或我错过了什么?

java spring-boot spring-cloud

1
推荐指数
1
解决办法
7238
查看次数

serviceId 的 Zuul 路由不起作用

我在不同的帖子上遇到过类似的问题,但它们对我来说毫无用处(没有答案或没有有用的答案)。我将在这里描述所有细节,希望得到帮助。

我用的是java8,spring boot 2.0.3,spring cloud元素基于Finchley.RELEASE版本。

在我的测试微服务应用程序中,我有下一个服务:config-serverdiscovery-service (Eureka)、edge-service (zuul)、card-service。所有服务在开始时从configuration-server加载它们自己的配置。服务启动没有问题。

card-service - 在开始时获取随机端口。这是将 zuul 路由配置为 calendar-service by 的原因serviceId

zuul:
  debug:
    request: true
  routes:
    card-service:
        path: /card-service/**
        serviceId: card-service
        stripPrefix: true
Run Code Online (Sandbox Code Playgroud)

使用发现服务客户端,我检测到下一个注册的服务["edge-server", "card-service"]。所以zuul路由使用相同的serviceId( card-service)。服务名称是正确的,因为它在card-service app 中是相同的bootstrap.yml

spring:
  application:
    name: card-service
Run Code Online (Sandbox Code Playgroud)

我使用直接访问card-service

http://localhost:59496/card-service/api/cards

http://localhost:59496/api/cards

(我为它配置了相同的结果)。- 工作正常。

我的 Zuul(边缘服务器8765端口上启动)所以我希望通过

http://localhost:8765/card-service/api/cards

给出相同的结果。但结果是空的。检查边缘服务器日志:

No handler mapping found for [/card-service/api/cards] …
Run Code Online (Sandbox Code Playgroud)

routing spring service-discovery spring-cloud netflix-zuul

1
推荐指数
1
解决办法
5538
查看次数