squbs - 5. akka HTTP 클 라 이언 트 의 스테로이드 (Steroids)

원본 주소: HTTP 또는 HTTPS 를 사용 하여 다른 서비스 에 액세스
개략squbs-httpclient 프로젝트 는 Akka Http API 를 유지 하면 서 Akka HTTP Host - Level Client - Side API 에 조작 가능 한 부분 을 추 가 했 습 니 다. 다음은 추 가 된 기능 의 목록 입 니 다.
  • Service Discovery: 모든 서비스 발견 체 제 를 삽입 할 수 있 고 문자 식별 자 를 통 해 정지점 (endpoint) 을 분석 할 수 있 습 니 다. 예 를 들 어 paymentserv.
  • Per Client configuration: 모든 클 라 이언 트 가 application.conf 의 기본 값 을 단독으로 덮어 쓸 수 있 도록 합 니 다
  • Metrics: 모든 클 라 이언 트 에 게 상 자 를 열 고 사용 할 수 있 는 Codahale Metrics
  • 를 제공 합 니 다.
  • JMX Beans: JMX Beans 방식 으로 모든 클 라 이언 트 의 설정 노출
  • Circuit Breaker: // TODO In progress

  • 의지 하 다
    build. sbt 또는 scala 구축 파일 에 다음 과 같은 의존 도 를 추가 합 니 다.
    "org.squbs" %% "squbs-httpclient" % squbsVersion
    

    사용법
    squbs - httpclient 프로젝트 는 Akka HTTP API 를 고수 합 니 다.유일한 예외 일 때 호스트 연결 풀 을 만 드 는 동안대신 Http().cachedHostConnectionPool 매개 변수 정의 ClientFlow (선택 가능 한 매개 변수) 를 사용 합 니 다.
    implicit val system = ActorSystem()
    implicit val materializer = ActorMaterializer()
    // construct a pool client flow with context type `Int`
    val poolClientFlow = ClientFlow[Int]("sample") // Only this line is specific to squbs
    
    val responseFuture: Future[(Try[HttpResponse], Int)] =
      Source.single(HttpRequest(uri = "/") -> 42)
        .via(poolClientFlow)
        .runWith(Sink.head)
    

    또한, Akka HTTP Host - Level Client - Side API 와 유사 한 예 ClientFlow 는 JAVA 에서 다음 과 같이 사용 합 니 다.
    final ActorSystem system = ActorSystem.create();
    final ActorMaterializer mat = ActorMaterializer.create(system);
    
    final Flow, Pair, Integer>, HostConnectionPool>
        clientFlow = ClientFlow.create("sample", system, mat);
    
    CompletionStage, Integer>> =
        Source
            .single(Pair.create(request, 42))
            .via(clientFlow)
            .runWith(Sink.head(), mat);
    

    HTTP 모델
    Scala
    다음은 HttpRequest Scala 의 생 성 예 입 니 다. 더 많은 것 은 HTTP Model Scala documentation 을 참조 하 십시오.
    import HttpProtocols._
    import MediaTypes._
    import HttpCharsets._
    val userData = ByteString("abc")
    val authorization = headers.Authorization(BasicHttpCredentials("user", "pass"))
    
    HttpRequest(
      PUT,
      uri = "/user",
      entity = HttpEntity(`text/plain` withCharset `UTF-8`, userData),
      headers = List(authorization),
      protocol = `HTTP/1.0`)
    

    Java
    다음은 HttpRequest 자바 의 생 성 예 입 니 다. Http Model 자바 documentation 을 보십시오.
    import HttpProtocols.*;
    import MediaTypes.*;
    
    Authorization authorization = Authorization.basic("user", "pass");
    HttpRequest complexRequest =
        HttpRequest.PUT("/user")
            .withEntity(HttpEntities.create(ContentTypes.TEXT_PLAIN_UTF8, "abc"))
            .addHeader(authorization)
            .withProtocol(HttpProtocols.HTTP_1_0);
    

    서비스 발견 체인
    풀 을 만 들 때 squbs-httpclient 호스트 이름 / 포트 조합 을 제공 할 필요 가 없습니다.대신 등록 서비스 발견 체인 을 허용 하고 등록 서비스 발견 체 제 를 통 해 string 식별 자 를 통 해 점 (endpoint) 을 분석 할 수 있 습 니 다.예 를 들 어 위의 예 에서 "sample" 클 라 이언 트 가 방문 하고 자 하 는 서비스의 논리 적 이름 입 니 다. 설 정 된 서비스 발견 체인 은 호스트 이름과 포트 를 포함 하 는 터미널 (endpoint) 로 분 석 됩 니 다. 예 를 들 어 http://akka.io:80.
    여기에 두 개의 서로 다른 등록 점 해석 기 는 다음 과 같다.폐쇄 적 인 스타일 은 더욱 치밀 하고 읽 을 수 있 는 코드 를 허용 합 니 다.그러나 이 자 류 는 상 태 를 유지 하고 이 상 태 를 바탕 으로 결정 하 는 능력 을 가지 고 있다.
    Scala
    등록 함수 종류 (String, Env) => Option[Endpoint]:
    EndpointResolverRegistry(system).register("SampleEndpointResolver", { (svcName, env) =>
      svcName match {
        case "sample" => Some(Endpoint("http://akka.io:80"))
        case "google" => Some(Endpoint("http://www.google.com:80"))
        case _ => None
    })
    

    등록 류 계승 EndpointResolver:
    class SampleEndpointResolver extends EndpointResolver {
      override def name: String = "SampleEndpointResolver"
    
      override def resolve(svcName: String, env: Environment): Option[Endpoint] = svcName match {
        case "sample" => Some(Endpoint("http://akka.io:80"))
        case "google" => Some(Endpoint("http://www.google.com:80"))
        case _ => None
      }
    }
    
    // Register EndpointResolver
    EndpointResolverRegistry(system).register(new SampleEndpointResolver)
    

    Java
    등록 BiFunction>:
    EndpointResolverRegistry.get(system).register("SampleEndpointResolver", (svcName, env) -> {
        if ("sample".equals(svcName)) {
            return Optional.of(Endpoint.create("http://akka.io:80"));
        } else if ("google".equals(svcName))
            return Optional.of(Endpoint.create("http://www.google.com:80"));
        } else {
            return Optional.empty();
        }
    });
    
    

    등록 클래스 계승 AbstractEndpointResolver:
    class SampleEndpointResolver extends AbstractEndpointResolver {
        String name() {
            return "SampleEndpointResolver";
        }
    
        Optional resolve(svcName: String, env: Environment) { 
            if ("sample".equals(svcName)) {
            return Optional.of(Endpoint.create("http://akka.io:80"));
        } else if ("google".equals(svcName))
            return Optional.of(Endpoint.create("http://www.google.com:80"));
        } else {
            return Optional.empty();
        }
    }
    
    // Register EndpointResolver
    EndpointResolverRegistry.get(system).register(new SampleEndpointResolver());
    

    너 는 여러 개 EndpointResolver 를 등록 할 수 있다.이 체인 은 등 록 된 역순 에 따라 집행 된다.해석 기 가 되 돌아 오 면 None 설명 할 수 없 음 을 의미 하 며, 다음 해석 기 는 설명 을 시도 합 니 다.설명 한 점 (endpoint) 이 안전 하 다 면 (https) 는 SSLContextEndpoint 에 전달 할 수 있다.
    클 라 이언 트 마다 설정 (Per Client Configuration)
    Akka HTTP Configuration 은 설정 의 기본 값 을 정의 합 니 다.기본 값 을 application.conf 에 다시 쓸 수 있 습 니 다.그러나 이렇게 하면 모든 클 라 이언 트 에 영향 을 줄 수 있다.특정 클 라 이언 트 의 재 작성 을 합 니 다. HostConnectionPool 스 트림 이 생 성 될 때 Akka HTTP 는 HostConnectionPool 스 트림 생 성 기간 에 전달 할 수 있 습 니 다 ConnectionPoolSettings.이것 도 역시 squbs 가 지지한다.
    이 외 에 도 squbs 는 클 라 이언 트 의 특정 재 작성 application.conf 을 허용 합 니 다.클 라 이언 트 이름 을 통 해 type = squbs.httpclient 설정 부분 만 제시 해 야 합 니 다.그리고 이 부분 에서 모든 클 라 이언 트 설정 을 제시 할 수 있 습 니 다.예 를 들 어 만약 에 우리 가 위 "sample" 클 라 이언 트 중의 max-connections 설정 만 다시 쓰 려 면 우 리 는 다음 과 같이 할 수 있다.
    sample {
      type = squbs.httpclient
      
      akka.http.host-connection-pool {
        max-connections = 10
      }
    }
    

    파이프 (파이프라인)
    우 리 는 일반적으로 공용 기초 기능 이나 서로 다른 클 라 이언 트 의 조직 기준 이 필요 하 다.이러한 인 프 라 시설 은 로그, 지표 핸드폰, 추적 요청, 인증 \ 권한 수여, 추적, 쿠키 관리, A / B 테스트 등 을 포함한다.squbs 가 관심 분 리 를 촉진 하기 때문에 이러한 논 리 는 클 라 이언 트 가 아 닌 기본 설정 에 속 합 니 다.squbs pipeline 은 인 프 라 시설 에서 구성 요 소 를 제공 하고 클 라 이언 트 에 설치 할 수 있 으 며 클 라 이언 트 소유 자 는 이런 부분 을 걱정 할 필요 가 없습니다.더 자세 한 것 은 squbs pipeline 을 볼 수 있 습 니 다.
    일반적으로 하나의 pipeline 은 양 방향 흐름 으로 squbs 클 라 이언 트 와 Akka HTTP 층 의 다 리 를 구축 했다.squbs-httpclient 모든 클 라 이언 트 또는 개별 클 라 이언 트 에 전역 양 방향 흐름 (기본 pipeline) 을 등록 할 수 있 습 니 다.특정 클 라 이언 트 pipeline 을 등록 하고 설정 pipeline 설정 합 니 다.defaultPipeline 설정 을 통 해 기본 pipeline 을 열 거나 닫 을 수 있 습 니 다 (지정 되 지 않 으 면 on 로 설정 할 수 있 습 니 다.
    sample {
      type = squbs.httpclient
      pipeline = metricsFlow
      defaultPipeline = on
    }
    

    squbs pipeline 을 참조 하여 pipeline 을 만 드 는 방법 과 기본 pipeline 을 설정 하 는 방법 을 보십시오.
    지표 (Metrics)
    squbs 는 사전 컴 파일 pipeline 지표 집합 을 가지 고 있 으 며, squbs 활성화 템 플 릿 은 이 를 기본 값 으로 설정 합 니 다.따라서 코드 변경 이나 설정 이 필요 하지 않 습 니 다. 모든 squbs http 클 라 이언 트 는 Codahale Metrics 를 수집 하여 사용 할 수 있 습 니 다.기본적으로 JMX 는 다음 과 같은 지 표를 제공 합 니 다.
  • 타이머 요청 (Request Timer)
  • 계수 계량기 요청 (Request Count Meter 요청)
  • 각 http 의 해당 상태 로 분류 되 는 계기: 2xx, 3xx, 4xx, 5xx
  • ClientFlow. 되 돌아 오 는 모든 이상 유형의 계량기
  • JMX Beans
    고장 제거 문 제 는 시각 화 시스템 설정 이 매우 중요 하 다.squbs-httpclient 각 클 라 이언 트 에 JMX bean 을 등록 했다.JMX bean 은 터미널 (endpoint), 호스트 연결 풀 설정 등 모든 설정 을 발표 합 니 다.bean 의 이름 설정 org.squbs.configuration.${system.name}:type=squbs.httpclient,name=$name.따라서 actor 시스템 이름 이 squbs 이 고 클 라 이언 트 이름 이 sample 이면 JMX bean 의 이름 은 org.squbs.configuration.squbs:type=squbs.httpclient,name=sample 입 니 다.
    Circuit Breaker
    // TODO In progress

    좋은 웹페이지 즐겨찾기