apache / apache/servicecomb-java-chassis

spring-boot内嵌tomcat场景下,SpringMVC restcontroller接口内调用cse接口如何传递header(上下文)信息

Open
#4,632 2 comments 0 reactions 0 assignees View on GitHub
Dominant language
Java
Stars
1.9k
Forks
814
Avg merge
8d 23h
Merged PRs (30d)
1

Description

## 场景
集成spring-boot-actuator组件,业务通过curl命令调用actuator/health接口检测服务状态,业务自定义AbstractHealthIndicator里面调用cse的health接口,代码如下:
```java
@Component
public class HealthChecker extends AbstractHealthIndicator {

@Override
protected void doHealthCheck(Health.Builder builder) throws Exception {
RestTemplate restTemplate = RestTemplateBuilder.create();
String result = restTemplate.getForObject("cse://provider/test/health", String.class);
if ("UP".equals(result)) {
builder.up().withDetail("cseState", "UP");
} else {
builder.down().withDetail("cseState", "DOWN");
}
}
}
```
image

curl命令:携带x-cse-context header信息
```shell
curl -ki -H 'x-cse-context: {"x-biz-tenantId": "1002"}' http://localhost:9093/provider/actuator/health
```
## 期望
在provider/test/health 这个cse接口内可以通过handler在invocationcontext中获取到'x-cse-context: {"x-biz-tenantId": "1002"}' 信息。

## 现状
由于actuator组件的endpoint接口是由Spring MVC的DispatchServlet处理的,而cse接口是由RestServlet处理的,这个header信息无法带过来,但是是处于同一条调用链中。
其实,任何restcontroller接口调用cse接口都无法传递header信息, 我们希望在前台设置header上下文,调用rest接口的时候,将这个上下文传递到cse接口中
```java
@RestController("/")
public class HelloController {

@GetMapping("/hello")
public String hello(){
RestTemplate restTemplate = RestTemplateBuilder.create();
return restTemplate.getForObject("cse://provider/test/health", String.class);
}
}

```
image

请问有什么方案?

Contributor guide

No contributing guide indexed for this repository

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.