<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>hello world</title>
        <link>https://velog.io/</link>
        <description>2020.07.01~</description>
        <lastBuildDate>Sun, 10 Sep 2023 10:40:46 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>hello world</title>
            <url>https://velog.velcdn.com/images/positivechange_/profile/3cad78b6-d9c5-49ab-b87b-80ca7bf39f82/image.jpg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. hello world. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/positivechange_" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[Sec.2 API Gateway Service]]></title>
            <link>https://velog.io/@positivechange_/Sec.2-API-Gateway-Service</link>
            <guid>https://velog.io/@positivechange_/Sec.2-API-Gateway-Service</guid>
            <pubDate>Sun, 10 Sep 2023 10:40:46 GMT</pubDate>
            <description><![CDATA[<p>마이크로서비스(first-service) 생성</p>
<ul>
<li><p>controller</p>
<pre><code class="language-java">@Slf4j
@RestController
@RequestMapping(&quot;/first-service&quot;)
public class FirstServiceController {

@GetMapping(&quot;/welcome&quot;)
public String welcome(){
  return &quot;welcome to the first service!&quot;;
}

@GetMapping(&quot;/message&quot;)
public String message(@RequestHeader(&quot;first-request&quot;) String header) {
  log.info(header);
  return &quot;Hello World in the first service.&quot;;
}
</code></pre>
</li>
</ul>
<p>}</p>
<pre><code>- application.yml
```yaml
server:
    port: 8081

spring:
  application:
    name: my-first-service

eureka:
  client:
    register-with-eureka: false
    fetch-registry: false</code></pre><p><img src="https://velog.velcdn.com/images/positivechange_/post/c3df44c3-8410-48bc-8c7b-142764ca4f9c/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/positivechange_/post/61a4972e-3842-4342-bfab-92c14dbe2918/image.png" alt=""></p>
<hr>
<p>게이트웨이(apigateway-service) 생성</p>
<ul>
<li>application.yml<pre><code class="language-yaml">server:
port: 8000
</code></pre>
</li>
</ul>
<p>eureka:
  client:
    fetch-registry: false
    register-with-eureka: false
    service-url:
      defaultZone: <a href="http://localhost:8761/eureka">http://localhost:8761/eureka</a></p>
<p>spring:
  application:
    name: gateway-service
  cloud:
    gateway:
      routes:
        - id: first-service
          uri: <a href="http://localhost:8081">http://localhost:8081</a>
          predicates:
            - Path=/first-service/**
          filters:
            - AddRequestHeader=first-request, first-request-header2
            - AddResponseHeader=first-response, first-response-header2</p>
<pre><code>![](https://velog.velcdn.com/images/positivechange_/post/21325561-851a-45b8-9a4e-d18473aba63a/image.png)

![](https://velog.velcdn.com/images/positivechange_/post/a03e46e6-b9a8-40c4-b5c8-e228905b2978/image.png)필터에서 Request Header값을 &quot;first-request-header2&quot;로 주고 있어서 에러가 발생하지 않는다.
![](https://velog.velcdn.com/images/positivechange_/post/7feefbff-878e-491a-bf6e-33ac7e21637f/image.png)

### 게이트웨이(apigateway-service)에 필터적용하기
### 1) Custom Filter

- Custom Filter 생성
```java
@Slf4j
@Component
public class CustomFilter extends AbstractGatewayFilterFactory&lt;CustomFilter.Config&gt; {

  @Override
  public GatewayFilter apply(Config config) {
    //Custom pre-filter
    return (exchange, chain) -&gt; {
      ServerHttpRequest request = exchange.getRequest();
      ServerHttpResponse response = exchange.getResponse();

      log.info(&quot;Custom pre-filter: request id -&gt; {}&quot;, request.getId());

      //Custom post-filter
      return chain.filter(exchange).then(Mono.fromRunnable(() -&gt; {
        log.info(&quot;Custom post-filter: response status code -&gt; {}&quot;, response.getStatusCode());
      }));

    };
  }

  public static class Config {
    //put the configuration properties
  }

  public CustomFilter(){
    super(Config.class);
  }

}</code></pre><ul>
<li>application.yml 파일에 CustomFilter 추가<pre><code class="language-yml">spring:
application:
  name: gateway-service
cloud:
  gateway:
    routes:
      - id: first-service
        uri: http://localhost:8081
        predicates:
          - Path=/first-service/**
        filters:
#            - AddRequestHeader=first-request, first-request-header2
#            - AddResponseHeader=first-response, first-response-header2
          - CustomFilter</code></pre>
<img src="https://velog.velcdn.com/images/positivechange_/post/41d3ba35-376f-4ece-b616-e2a978cb4596/image.png" alt=""></li>
</ul>
<p><img src="https://velog.velcdn.com/images/positivechange_/post/67fab20c-e382-44e6-b6ae-5526be64984b/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/positivechange_/post/39e59235-ca28-4217-b18c-0a6733e506f8/image.png" alt="게이트웨이(apigateway-service)에 찍힌 로그 확인"></p>
<h3 id="2-global-filter">2) Global Filter</h3>
<ul>
<li><p>Global Filter 생성</p>
<pre><code class="language-java">@Slf4j
@Component
public class GlobalFilter extends AbstractGatewayFilterFactory&lt;GlobalFilter.Config&gt; {

@Override
public GatewayFilter apply(GlobalFilter.Config config) {

  return (exchange, chain) -&gt; {
    ServerHttpRequest request = exchange.getRequest();
    ServerHttpResponse response = exchange.getResponse();

    log.info(&quot;Global filter baseMessage: {}&quot;, config.getBaseMessage());

    if(config.isPreLogger())
      log.info(&quot;Global filter starts! request id -&gt; {}&quot;, request.getId());

    return chain.filter(exchange).then(Mono.fromRunnable(() -&gt; {
      if(config.isPostLogger())
        log.info(&quot;Global filter ends! response status code -&gt; {}&quot;, response.getStatusCode());
    }));

  };
}

@Data
public static class Config {
  //put the configuration properties
  String baseMessage;
  boolean preLogger;
  private boolean postLogger;
}

public GlobalFilter(){
  super(Config.class);
}
</code></pre>
</li>
</ul>
<p>}</p>
<pre><code>- application.yml 파일에 default-filters 추가
```yaml
spring:
  application:
    name: gateway-service
  cloud:
    gateway:
      default-filters:
        - name: GlobalFilter
          args: #Config클래스 properties
            baseMessage: Spring Cloud Gateway GlobalFilter
            preLogger: true
            postLogger: true
      routes:
        - id: first-service
          uri: http://localhost:8081
          predicates:
            - Path=/first-service/**
          filters:
#            - AddRequestHeader=first-request, first-request-header2
#            - AddResponseHeader=first-response, first-response-header2
            - CustomFilter</code></pre><p><img src="https://velog.velcdn.com/images/positivechange_/post/0747ca58-daf4-4bff-84c9-a64d4eed89ad/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/positivechange_/post/3d712c14-9f73-4207-a352-608695028649/image.png" alt="게이트웨이(apigateway-service)에 찍힌 로그 확인"></p>
<h3 id="3-logging-filter">3) Logging Filter</h3>
<ul>
<li><p>Logging Filter 생성</p>
<pre><code class="language-java">@Slf4j
@Component
public class LoggingFilter extends AbstractGatewayFilterFactory&lt;LoggingFilter.Config&gt; {

@Override
public GatewayFilter apply(Config config) {
  return (exchange, chain) -&gt; {
    ServerHttpRequest request = exchange.getRequest();
    ServerHttpResponse response = exchange.getResponse();

    log.info(&quot;Logging filter: baseMessage -&gt; {}&quot;, config.getBaseMessage());

    if(config.isPreLogger())
      log.info(&quot;Logging pre-filter: request uri -&gt; {}&quot;, request.getURI());

    return chain.filter(exchange).then(Mono.fromRunnable(() -&gt; {
      if(config.isPostLogger())
        log.info(&quot;Logging post-filter: response status code -&gt; {}&quot;, response.getStatusCode());
    }));

  };
}

@Data
public static class Config {
  //put the configuration properties
  String baseMessage;
  boolean preLogger;
  private boolean postLogger;
}

public LoggingFilter(){
  super(Config.class);
}
</code></pre>
</li>
</ul>
<p>}</p>
<pre><code>- application.yml 파일에 LoggingFilter 추가
```yaml
spring:
  application:
    name: gateway-service
  cloud:
    gateway:
      default-filters:
        - name: GlobalFilter
          args: #Config클래스 properties
            baseMessage: Spring Cloud Gateway GlobalFilter
            preLogger: true
            postLogger: true
      routes:
        - id: first-service
          uri: http://localhost:8081
          predicates:
            - Path=/first-service/**
          filters:
#            - AddRequestHeader=first-request, first-request-header2
#            - AddResponseHeader=first-response, first-response-header2
            - name: CustomFilter
            - name: LoggingFilter
              args:
                baseMessage: Hi there!
                preLogger: true
                postLogger: true</code></pre><p><img src="https://velog.velcdn.com/images/positivechange_/post/63ef2258-416f-4f58-bb20-b63af43fedd4/image.png" alt="게이트웨이(apigateway-service)에 찍힌 로그 확인"></p>
]]></description>
        </item>
    </channel>
</rss>