Spring Cloud Zuul 경로 게 이 트 웨 이 및 서비스 필터

6809 단어 java-ee
Zuul 프로필Zuul 의 주요 기능 은 경로 전송 과 필터 이다.경로 기능 은 마이크로 서비스의 일부분 이다. 예 를 들 어 /api/admin Admin 서비스 로 전송 하고 /api/member Member 서비스 로 전송 한다.Zuul 기본 값 과 Ribbon 를 결합 하여 부하 균형 기능 을 실현 했다.
도입 의존pom.xml 에 의존 spring-cloud-starter-netflix-eureka-serverspring-cloud-starter-netflix-zuul 을 주로 첨가 합 니 다.

    org.springframework.cloud
    spring-cloud-starter-netflix-eureka-server


    org.springframework.cloud
    spring-cloud-starter-netflix-zuul

관련 설정application.yml 에 경로 설정 을 주로 추가 합 니 다.
zuul:
  routes:
    api-a:
      path: /api/ribbon/**
      serviceId: hello-spring-cloud-web-admin-ribbon
    api-b:
      path: /api/feign/**
      serviceId: hello-spring-cloud-web-admin-feign

경로 설명:
  • / api / ribbon 으로 시작 하 는 요청 은 모두 spring - cloud - web - admin - ribbon 서비스
  • 에 전달 합 니 다.
  • / api / fegn 으로 시작 하 는 요청 은 모두 spring - cloud - web - admin - feign 서비스
  • 에 전달 합 니 다.Zuul 입구 류 에 Application 주해 오픈 @EnableZuulProxy 기능 추가
    @SpringBootApplication
    @EnableEurekaClient
    @EnableZuulProxy
    public class ZuulApplication {
        public static void main(String[] args) {
            SpringApplication.run(ZuulApplication.class, args);
        }
    }

    게 이 트 웨 이 경로 설정 실패 시 반전
    리 셋 클래스 만 들 기 zuul
    /**
     *    hello-spring-cloud-web-admin-feign       
     */
    @Component
    public class WebAdminFeignFallbackProvider implements FallbackProvider {
    
        @Override
        public String getRoute() {
            // ServiceId,             ,  return "*"   return null
            return "hello-spring-cloud-web-admin-feign";
        }
    
        /**
         *         ,            
         * @param route
         * @param cause
         * @return
         */
        @Override
        public ClientHttpResponse fallbackResponse(String route, Throwable cause) {
            return new ClientHttpResponse() {
                /**
                 *     api        ,                    ,
                 *      api   404,500         
                 *     api               
                 * @return
                 * @throws IOException
                 */
                @Override
                public HttpStatus getStatusCode() throws IOException {
                    return HttpStatus.OK;
                }
    
                @Override
                public int getRawStatusCode() throws IOException {
                    return HttpStatus.OK.value();
                }
    
                @Override
                public String getStatusText() throws IOException {
                    return HttpStatus.OK.getReasonPhrase();
                }
    
                @Override
                public void close() {
    
                }
    
                @Override
                public InputStream getBody() throws IOException {
                    ObjectMapper objectMapper = new ObjectMapper();
                    Map map = new HashMap<>();
                    map.put("status", 200);
                    map.put("message", "    ");
                    return new ByteArrayInputStream(objectMapper.writeValueAsString(map).getBytes("UTF-8"));
                }
    
                @Override
                public HttpHeaders getHeaders() {
                    HttpHeaders headers = new HttpHeaders();
                    //   getBody         
                    headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
                    return headers;
                }
            };
        }
    }

    테스트 경로 접근
    순차 실행 WebAdminFeignFallbackProvider > EurekaApplication > ServiceAdminApplication > WebAdminRibbonApplication > WebAdminFeignApplication 서비스 별
  • 방문: http://localhost:8769/api/rib... 브 라 우 저 표시 ZuulApplication
  • 접근: http://localhost:8769/api/fei... 브 라 우 저 디 스 플레이 port : 8763,message : zuul 는 Zuul 의 경로 기능 설정 이 성공 적 이라는 것 을 설명 합 니 다.

  • Zuul 의 서비스 필터 기능 사용 하기port : 8763,message : zuul 경로 뿐만 아니 라 강력 한 기능 도 많다.예 를 들 어 안전 검증 에 사용 된다.
    서비스 필터 만 들 기
    /**
     * Zuul        
     */
    @Component
    public class LoginFilter extends ZuulFilter {
    
        private static final Logger logger = LoggerFactory.getLogger(LoginFilter.class);
    
        /**
         *       ,               
         * 1. pre:    
         * 2. routing:    
         * 3. post:    
         * 4. error:      
         * @return
         */
        @Override
        public String filterType() {
            return "pre";
        }
    
        /**
         *        
         * @return
         */
        @Override
        public int filterOrder() {
            return 0;
        }
    
        /**
         *         :true/  ,false/   
         * @return
         */
        @Override
        public boolean shouldFilter() {
            return true;
        }
    
        /**
         *           
         * @return
         * @throws ZuulException
         */
        @Override
        public Object run() throws ZuulException {
            RequestContext context = RequestContext.getCurrentContext();
            HttpServletRequest request = context.getRequest();
            String token = request.getParameter("token");
            if (token == null) {
                logger.warn("Token is empty");
                context.setSendZuulResponse(false);
                context.setResponseStatusCode(401);
                try {
                    context.getResponse().getWriter().write("Token is empty");
                } catch (IOException e) {
                }
            } else {
                logger.info("OK");
            }
            return null;
        }
    }

    테스트 필터
  • 방문: http://localhost:8769/api/feign/hi?message=zuul 홈 페이지 표시 Zuul
  • 방문: http://localhost:8769/api/feign/hi?message=zuul&token=1 홈 페이지 표시 Token is empty
  • 글 쓴 이: 펑 초
  • 본 고 는 개인 블 로그 에 첫 발 을 내 디 뎠 다. https://antoniopeng.com/2019/11/16/springcloud/SpringCloudZuul%E8%B7%AF%E7%94%B1%E7%BD%91%E5%85%B3%E5%8F%8A%E6%9C%8D%E5%8A%A1%E8%BF%87%E6%BB%A4/
  • 저작권 성명: 본 블 로그 의 모든 글 은 특별 성명 을 제외 하고 CC BY - NC - SA 4.0 허가 협 의 를 사용한다.전재 하 다
  • 좋은 웹페이지 즐겨찾기