微服务中客户端到服务器流程走向大概如下图:
在会员服务中,用Request 获取的IP地址肯定是上一层的网关的IP ,那么,如何获取客户端的真实IP?
首先: 在nginx.config中配置如下
upstream wangguan{
server 127.0.0.1:81;
}
server {
listen 80; #端口号
server_name localhost; #客户端请求地址
location / {
proxy_pass http://wangguan/; #转发地址 ,这里表示转发到网关upstream 那里
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #配置请求头
}
}
下图表示重构了请求头,获取客户端请求的IP 地址
其次:在网关的配置文件.yml中配置
server:
port: 81
spring:
cloud:
nacos:
discovery:
##服务的注册
server-addr: 127.0.0.1:8848
gateway:
locator:
enabled: true
routes:
- id: mayikt-member
uri: lb://mayikt-member
predicates:
- Path=/mayikt-member/**
filters:
- SwaggerHeaderFilter
- StripPrefix=1
x-forwarded:
enabled: false
application:
name: mayikt-gateway
总体流程:客户端访问-->(到nginx)nginx配置请求头并转发至网关-->网关配置注册中心读取地址
在网关中获取IP 地址:
@Component
public class MayiktGatewayFilter implements GlobalFilter {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
// 从我们的nginx 重写请求获取的参数
String sourceIp = exchange.getRequest().getHeaders().getFirst("X-Real-IP");
if (StringUtils.isEmpty(sourceIp)) {
ServerHttpResponse response = exchange.getResponse();
response.setStatusCode(HttpStatus.BAD_REQUEST);
JSONObject jsonObject = new JSONObject();
jsonObject.put("code", "500");
jsonObject.put("msg", "sourceIp is null");
DataBuffer buffer = response.bufferFactory().wrap(jsonObject.toJSONString().getBytes());
return response.writeWith(Mono.just(buffer));
}
// 放行执行转发到我们的服务
return chain.filter(exchange);
}
}
在服务中获取IP
接口配置:
@RequestHeader("X-Real-IP") String sourceIp
解释:X-Real-IP 是在nginx 中配置的,要对应上;
文章内容来自美特教育:www.mayikt.com