RestyPass, 고성능 HTTP 호출 클 라 이언 트 라 이브 러 리

RestyPass
고성능 Restful 서 비 스 는 클 라 이언 트 라 이브 러 리 를 호출 하여 Spring MVC 주 해 를 완전히 호 환 합 니 다. 인터페이스 와 주 해 를 바탕 으로 자동 프 록 시 클 라 이언 트 HTTP 요청 을 지원 합 니 다. 서비스 발견, 부하 균형, 자동 퓨즈, 강등, 재 시도, 흐름 제한 을 지원 합 니 다.Feign + Hystrix + Ribbon + ApacheHttpClient 를 덮어 쓰 는 기능
HOME
spring cloud / spring boot 와 조합 하여 사용 할 수 있 고 마이크로 서비스 구조 가 쉽게 정착 할 수 있 도록 도와 주 며 서비스 간 의 마지막 킬로미터 호출 문 제 를 해결 할 수 있 습 니 다.Github 주소:https://github.com/darren-fu/RestyPass 코드 클 라 우 드 주소:https://gitee.com/darren-fu/RestyPass
대비 SpringCloud 기술 창고: Feign + Hystrix + Ribbon + ApacheHttpClient
  • Http 연결 풀 의 성능 이 향상 되 었 고, Resty Pass 는 Netty 기반 AsyncHttpClient 연결 풀 을 사용 하여 성능 테스트 가 ApacheHttpClient 보다 30% 높 았 다.
  • 대상 생 성 을 줄 이 고 Feign + Hystrix + Ribbon + ApacheHttpClient, 여러 라 이브 러 리 조합 으로 완전한 http 클 라 이언 트 호출 요청 을 완 료 했 습 니 다. 하나의 호출 체인 에 불필요 한 대상 을 많이 만 들 었 습 니 다.
  • 스 레 드 전환 을 줄 입 니 다. 예 를 들 어 Hystrix, ApacheHttpClient 에는 모두 자신의 스 레 드 탱크 가 있 습 니 다. 요청 의 완성 은 여러 번 의 스 레 드 전환 을 거 쳐 성능 을 소모 합 니 다.
  • 설정 하기 쉽 습 니 다. Resty Pass 는 각 인터페이스 요청 을 설명 하 는 방식 으로 설정 합 니 다.한편, Feign + Hystrix + Ribbon + ApacheHttpClient 를 사용 하면 모든 라 이브 러 리 에 자신의 설정 항목 이 있 고 설정 이 많 으 며 충돌 이 발생 하기 쉬 우 므 로 직접 실천 하 는 것 은 쉽 지 않 은 일이 다.
  • 실시 간 으로 설정 을 업데이트 하고 Resty Pass 는 실시 간 으로 일부 설정 을 업데이트 하 는 것 을 지원 합 니 다. 예 를 들 어 실시 간 으로 등급 을 낮 추 는 서 비 스 를 닫 거나 사용 하고 실시 간 으로 서 비 스 를 중단 / 복원 하 며 입도 가 인터페이스 급 까지 정확 합 니 다.
  • 개발 이 용이 하고 대부분의 핵심 인터페이스의 사용자 정의 실현 을 자 유 롭 게 개발 할 수 있 으 며 직접 주입 하면 사용 할 수 있다 (Spring 용기).
  • 필 터 를 지원 하고 필 터 를 사용자 정의 하여 주입 할 수 있 습 니 다
  • 흐름 제한 지원
  • 예제 (demo [호출 자] + demo - server side [서버])
    클 라 이언 트 코드
  • spring cloud 서 비 스 를 사용 하면 Resty Pass 는 spring 의 서비스 발견 방식 을 자동 으로 사용 합 니 다.
  • 그렇지 않 으 면 기본적으로 resty - server. yaml 를 읽 어서 서비스 인 스 턴 스 를 가 져 옵 니 다
  • 다른 발견 서비스 방식 을 사용자 정의 하여 ServerContext 인 터 페 이 스 를 실현 하고 주입 하면 된다
  • //   @EnableRestyPass    RestyPass
    @SpringBootApplication
    @EnableRestyPass(basePackages = {"com.github.df"})
    @RestController
    //@EnableDiscoveryClient
    public class TestClientApplication {
        public static void main(String[] args) {
            SpringApplication.run(TestClientApplication.class, args);
        }
    
        @Autowired
        private ProxyService proxyService;
    
        @RequestMapping(value = "nothing")
        public String callNothing() {
            proxyService.getNothing();
            return "OK";
        }
    }
    

    클 라 이언 트 서비스
    
    //                 
    //RestyService      
    @RestyService(serviceName = "server",
            fallbackEnabled = true,
            fallbackClass = ProxyServiceImpl.class,
            forceBreakEnabled = false,
            circuitBreakEnabled = false,
            loadBalancer = RandomLoadBalancer.NAME,
            retry = 1,
            requestTimeout = 10000,
            limit = 1000 //  
    )
    @RequestMapping(value = "/resty")
    public interface ProxyService extends ApplicationService {
        
        // RestyMethod        
        //     
        @RestyMethod(retry = 2,
                fallbackEnabled = "false",
                circuitBreakEnabled = "false",
                forceBreakEnabled = "false",
                limit = 10)
        @RequestMapping(value = "/get_nothing", method = RequestMethod.GET, headers = "Client=RestyProxy", params = "Param1=val1")
        void getNothing();
           
        //  spring mvc  
        @RestyMethod()
        @RequestMapping(value = "/get_age/{name}", method = RequestMethod.GET)
        Response getAge(@RequestParam("id") Long id, @PathVariable(value = "name") String name, @RequestHeader(value="TOKEN") String token);
    
    
        //       : Future>     ,  
        @RestyMethod
        @RequestMapping(value = "/get_status", method = RequestMethod.GET)
        String getStatus(RestyFuture future);
    
        //       : Future>     
        @RestyMethod
        @RequestMapping(value = "/get_user", method = RequestMethod.GET)
        Future getUser();
        
        
    }
    
    

    서비스 실례 정의
  • SC 자동 서비스 발견, Yml 설정 등 다양한 방식 을 지원 합 니 다.
  • 인터페이스 ServerContext 사용자 정의 서비스 발견 메커니즘 (예 를 들 어 다 중 등록 센터)
  • 실현 가능
    # resty-server.yaml
    servers:
      - serviceName: server
        instances:
          - host: localhost
            port: 9201
          - host: localhost
            port: 9202
    

    서버 코드
    
    @RestController
    @RequestMapping("/resty")
    public class TestController {
        @RequestMapping(value = "/get_nothing", method = RequestMethod.GET)
        public void nothing() {
            System.out.println("############nothing");
        }
      }
    

    핵심 인터페이스
  • Resty Command: 한 번 의 모든 정 보 를 포함 합 니 다.
  • Resty CommandExecutor: command 실행 기, 실행 결 과 를 되 돌려 줍 니 다.
  • ServerContext: 서비스 인 스 턴 스 용기 로 서비스 발견 과 업 데 이 트 를 책임 집 니 다.
  • LoadBalancer: 부하 이퀄 라이저, 인터페이스 실현 또는 추상 류 계승 은 원 하 는 LB 를 쉽게 실현 할 수 있 으 며 Resty Service 에서 설정 하고 사용 하기 쉽다
  • CommandFilter: command 필터
  • FallbackExecutor: 강등 서비스 클래스 실행 기.

  • 설정 및 주입
    자신의 실현 류 를 주입 하여 특수 한 수 요 를 실현 하 다.
    @Configuration
    public class RestyPassConfig {
    
        @Bean
        public FallbackExecutor fallbackExecutor() {
            return new RestyFallbackExecutor();
        }
    
        @Bean
        public ServerContext serverContext() {
            return new ConfigurableServerContext();
        }
    
        @SuppressWarnings("SpringJavaAutowiringInspection")
        @Bean
        public CommandExecutor commandExecutor(RestyCommandContext commandContext) {
            return new RestyCommandExecutor(commandContext);
        }
    
        @Bean
        public CommandFilter CustomCommandFilter() {
            return new CustomCommandFilter();
        }
    
    
        private static class CustomCommandFilter implements CommandFilter {
            @Override
            public int order() {
                return 0;
            }
    
            @Override
            public boolean shouldFilter(RestyCommand restyCommand) {
                return true;
            }
    
            @Override
            public CommandFilterType getFilterType() {
                return CommandFilterType.BEFOR_EXECUTE;
            }
    
            @Override
            public void before(RestyCommand restyCommand) throws FilterException {
    
                System.out.println("custom command filter");
            }
    
            @Override
            public void after(RestyCommand restyCommand, Object result) {
    
            }
    
            @Override
            public void error(RestyCommand restyCommand, RestyException ex) {
    
            }
        }
    
    }
    
    
    

    도입 jar
    
    
        com.github.darren-fu
        resty-pass
        1.3.0
    
    

    좋은 웹페이지 즐겨찾기