SpringCloud 분산 (4) 분산 게이트웨이 Zuul 사용 상세 정보

기존 마이크로서비스의 두 가지 부족:
  • 마이크로서비스 체계에서 Eureka Server와 통신하는 마이크로서비스에 대해 서비스 이름을 사용하면 접근할 수 있다.그러나 휴대전화, 웹 사이트 등 외부 방문자들은 여전히 N다중 서버와 상호작용을 해야 하고 그들의 서버 주소, 포트 번호 등을 기억해야 한다.일단 내부에 수정이 발생하면 매우 번거롭고, 때로는 내부 서버가 외부의 직접 방문을 원하지 않는다..
  • 각 업무 시스템의 사람들은 자신이 맡은 서버를 자유롭게 유지할 수 없다
  • 기존의 마이크로서비스는 모두'우리집 대문이 항상 열려 있다'고 해서 권한 검사를 하지 않았다.권한 검사 코드를 모든 마이크로서비스에 쓰면 개발 작업량이 너무 많습니다..

  • zuul은 요청 루트, 로그인 검증 등 기능을 제공하는 API 인터페이스 마이크로서비스다.1. Zuul 서비스 a) 새 Spring 프로젝트를 구축하고 Zuul, Eureka Discovery를 선택합니다.b)****Application은 @EnableZuulProxy를 사용하여 Zuul 기능을 엽니다.c)application.properties에 서버를 추가합니다.port=8888 spring.application.name=apigate eureka.client.serviceUrl.defaultZone=http://127.0.0.1:8080/eureka/
    둘째, 프로필에 zuul을 추가하도록 요청합니다.routes.=요청 경로 형식입니다.예를 들면 주울.routes.restservice1=/restservice1/** 사용자가 요청하면http://127.0.0.1:8888/restservice1/person/getById?id=1rest 서비스 1 서비스의person/get By Id에 접근할 때?id=1. 웹 프로젝트에 스프링을 설정하면.application.name=testweb2, 그러면 다음과 같이 zuul을 설정합니다.routes.testweb2=/web/**http://127.0.0.1:8888/web/test/test1테스트 웹 2 프로젝트의/테스트/테스트 1에 접근합니다.
    우리는 일반적으로rest 서비스1을 주울의 상류(upstream) 서버라고 부른다.주의: "상위 서버"인터페이스 서비스에 인터럽트를 설정하고 인터럽트 시간이 조금만 길면 zuul 쪽에서 시간 초과 오류를 받을 수 있습니다.이렇게 하면 외부 방문자에게http://127.0.0.1:8888접촉하면 돼, 구체적인 어떤 서비스와 직접 통신할 필요가 없어.사이트 내부는 어떻게 Eureka를 통해 자동 확장을 실현하고 대외적으로는 Zuul을 빌려 전방 서버의 자동 확장을 실현할 수 있습니까?이것은 마이크로서비스 구조가 우악스러운 곳이다.순수한 웹 사이트의 스위치를 zuul로 하는 것을 권장하지 않습니다. zuul은 인터페이스 서비스의 스위치만 합니다.웹 사이트의 스위치는nginx를 사용하는 것을 권장합니다.
    3. 요청 필터는 ZuulFilter를 지원하며 요청이 루트되기 전에 권한 검사를 할 수 있습니다.import javax.servlet.http.HttpServletRequest; import com.netflix.zuul.ZuulFilter; import com.netflix.zuul.context.RequestContext; import com.netflix.zuul.exception.ZuulException;
    public class CheckFilter extends ZuulFilter {
    @Override
    public Object run() throws ZuulException {
    	RequestContext ctx = RequestContext.getCurrentContext();
    	HttpServletRequest request =  ctx.getRequest();
    	String token = request.getParameter("token");
    	if(token==null||!token.equals("123"))// token=123 
    	{
    		System.out.println("token ");
    		ctx.setSendZuulResponse(false);// 
    		ctx.setResponseStatusCode(401);// 
    	}
    	return null;
    }
    
    @Override
    public boolean shouldFilter() {
    	return true;
    }
    
    @Override
    public int filterOrder() {
    	return 0;
    }
    
    @Override
    public String filterType() {
    	return "pre";
    }
    

    }
    *** Application에 @Bean CheckFilter filter1 () {return new CheckFilter ();}Zuul 서버와'업스트림 서버'는 두 개의 프로세스, 심지어 두 개의 서버에서 실행되기 때문에 Zuul에서 requeset.setAttribute에서 설정한 값은 업스트림 서버에서 찾을 수 없습니다.ZuulFilter에서 업스트림 서버에 메시지 헤더를 전달할 수 있습니다. RequestContext ctx = RequestContext.getCurrentContext(); HttpServletRequest request = ctx.getRequest(); ctx.addZuulRequestHeader(“X-MyHeader1”, “hello”); 업스트림 서버의 요청 헤더에 X-MyHeader1 값이 표시됩니다.
    ZuulFilter 기타 filterType:pre(요청이 라우팅되기 전에 호출됨);routing (루트 요청 시 호출됨);error: 오류가 발생했을 때 호출합니다.post:routing과 error 필터를 호출합니다.
    postFilter를 작성하여 상위 서버에 보낸 응답을 하위 요청자에게 보내기 전에 메시지 등 처리를 추가합니다:importcom.netflix.zuul.ZuulFilter; import com.netflix.zuul.context.RequestContext; import com.netflix.zuul.exception.ZuulException;
    public class PostFilter extends ZuulFilter {
    @Override
    public Object run() throws ZuulException {
    	RequestContext ctx = RequestContext.getCurrentContext();
    	ctx.addZuulResponseHeader("X-Shit", "6666");
    	return null;
    }
    
    @Override
    public boolean shouldFilter() {
    	return true;
    }
    
    @Override
    public int filterOrder() {
    	return 0;
    }
    
    @Override
    public String filterType() {
    	return "post";
    }
    

    }

    좋은 웹페이지 즐겨찾기