Implementing Zuul Filter - TheOpenCloudEngine/uEngine-cloud GitHub Wiki
Zuul ์ dynamic routing ๋ฑ์ ์ํํ ์ ์๋ gateway ์๋น์ค, Routing ๊ธฐ๋ฅ๋ฟ๋ง ์๋๋ผ,
http ์์ฒญ๊ณผ ์๋ต ์ฌ์ด์์ ๋์ํ๋ filter๋ฅผ ์ง์ํจ์ผ๋ก์จ filter ๊ตฌํ๋ด์ฉ์ ๋ฐ๋ผ
๋ ๋ค์ํ ๊ธฐ๋ฅ์ ์ถ๊ฐํ ์ ์๊ณ ์ ์ฒด์ ์ผ๋ก ์ ์ฐํ ์๋น์ค ๊ตฌ์ฑ์ด ๊ฐ๋ฅํ๋ค.
Zuul์ (spring-cloud-netflix reference ๋ฌธ์) ๋ฅผ ๋ณด๋ฉด
filter ๋ฅผ ์ด pre, route, post ๋ก 3๊ฐ์ง๋ก ์ค์ ํ ์ ์๊ฒ ๋์ด์๋ค.
pre filter ๋ request ๊ฐ ๋ค์ด์์๋ ์ฒ์์ ๊ฑธ์ด ๋๋๋ค๋ ์๋ฏธ๋ค.
์์ ๋ฅผ ๋ณด๋ฉด์ ์ดํด๋ณด์.
public class IAMFilter extends ZuulFilter {
@Override
public String filterType() {
return "pre";
}
@Override
public int filterOrder() {
return 1;
}
@Override
public boolean shouldFilter() {
return true;
}
@Override
public Object run() {
RuleService ruleService = ApplicationContextRegistry.getApplicationContext().getBean(RuleService.class);
// do something
//๋ผ์ฐํฐ ์ค์ฝํ
Map<String, String> iamScopes = null;
if (routeValueMap.containsKey("iam-scopes")) {
iamScopes = (Map<String, String>) routeValueMap.get("iam-scopes");
}
// do something
}
๊ตฌํ ๋ด์ฉ์ ์ ์ธ ํ์์ง๋ง ZuulFilter๋ฅผ extends ํ์๊ณ ,
LifeCycle ์ filterType์ "pre", filter์ Order ๋ฅผ ์ค์ ์๊ณ , filter๊ฐ ๋์ํ๋ ๋ถ๋ถ์ด run ์ด๋ค.
์๋๋ filter ๋ฅผ ์ฌ์ฉํ์ฌ custom scope๋ฅผ ๋ง๋๋ ์์ ์ด๋ค.
zuul:
routes:
courses:
path: /courses/**
serviceId: course
stripPrefix: false
# ์ผ๋ฐ ๊ฒ์คํธ ์ ์ ์ ๋ํด์๋ (GET) ํ์ฉ, catalog-order scope ์ ๊ฐ์ง ์ ์ ์ธ ๊ฒฝ์ฐ PUT, PATCH, POST, DELETE ํ์ฉ
iam-scopes:
- guest/GET
- catalog-order/PUT-PATCH-POST-DELETE
์ฐ์ yml ํ์ผ์ zuul ์ ๊ฐ์ ธ์ค๊ฒ ํ๋ ค๋ฉด ์๋์ ๊ฐ์ด ConfigurationProperties ๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
@Service
@ConfigurationProperties(prefix = "zuul")
public class RuleService {
private Map<String, Map> routes;
...
}
์ด๋ฐ์์ผ๋ก ์ค์ ํ์ผ์์ property๊ฐ์ ๋ฐ์์์ ZuulFilter์ run ๋ถ๋ถ์์ ๊ตฌํ์ ํ๋ฉด ๋๋ค.
์ด์ ์ด๋ ๊ฒ ๊ตฌํํ filter๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ์๋์ฒ๋ผ @Bean ์ผ๋ก ๋ฑ๋ก์ ํด์ฃผ๋ฉด ๋๋ค.
public class Application {
...
@Bean
public IAMFilter iamFilter(){
return new IAMFilter();
}
}