Dubbo - 서비스 호출 라우팅 규칙

6097 단어 dubbo

Dubbo - 서비스 호출 라우팅 규칙


루트 규칙은dubbo 서비스가 호출하는 목표 서버를 결정합니다. 조건 루트 규칙과 스크립트 루트 규칙으로 나뉘며 확장 가능을 지원합니다.

라우팅 규칙 쓰기


등록 센터에 라우팅 규칙을 작성하는 작업은 일반적으로 모니터링 센터 또는 관리 센터 페이지에서 수행됩니다.
RegistryFactory registryFactory = ExtensionLoader.getExtensionLoader(RegistryFactory.class).getAdaptiveExtension();
Registry registry = registryFactory.getRegistry(URL.valueOf("zookeeper://10.20.153.10:2181"));
registry.register(URL.valueOf("condition://0.0.0.0/com.foo.BarService?category=routers&dynamic=false&rule=" + URL.encode("host = 10.20.153.10 => host = 10.20.153.11")));

다음을 수행합니다.
  • condition://는 루트 규칙의 유형을 나타내고 조건 루트 규칙과 스크립트 루트 규칙을 지원합니다. 확장 가능, 필수..
  • 0.0.0.0은 모든 IP 주소에 대해 적용됨을 나타냅니다. 특정 IP에 대해서만 적용을 받으려면 구체적인 IP를 입력하고 필수로..
  • com.foo.BarService는 지정된 서비스에만 적용되며 필수..
  • group=foo는 지정한 서비스에 대한 지정한 그룹이 효력이 발생하고 설정하지 않은 그룹에 대한 지정한 서비스가 효력이 발생한다는 것을 표시하지 않습니다
  • version=1.0 지정한 서비스에 대한 지정version이 효력이 발생하고 설정하지 않은 버전에 대한 지정한 서비스가 효력이 발생한다는 것을 표시하지 않습니다
  • category=routers는 이 데이터가 동적 설정 형식이며 반드시 입력해야 한다고 표시합니다
  • dynamic=false는 이 데이터는 지속적인 데이터로 등록자가 탈퇴할 때 데이터는 여전히 등록센터에 저장되어 반드시 기입해야 한다고 표시한다
  • enabled=true 덮어쓰기 규칙이 적용되는지 확인하지 않아도 됩니다. 기본값은 적용됩니다
  • force=false 루트 결과가 비어 있을 때 강제 실행 여부, 강제 실행하지 않으면 루트 결과가 비어 있는 루트 규칙은 자동으로 효력을 상실합니다. 채우지 않아도 됩니다. 기본값은false입니다
  • runtime =false는 호출할 때마다 루트 규칙을 실행하는지 여부입니다. 그렇지 않으면 공급자 주소 목록이 변경될 때만 미리 실행하고 결과를 캐시합니다. 호출할 때 캐시에서 루트 결과를 직접 가져옵니다.매개 변수 루트를 사용하면true로 설정해야 합니다. 설정이 호출의 성능에 영향을 미칠 수 있습니다. 채우지 않으면 안 됩니다. 기본값은false입니다
  • priority=1 루트 규칙의 우선순위, 정렬에 사용, 우선순위가 클수록 앞에서 실행, 채우지 않음, 부족은 0..
  • rule=URL.encode ("host = 10.20.153.10 = > host = 10.20.153.11") 는 라우팅 규칙의 내용을 나타냅니다

  • 조건 라우팅 규칙


    조건 표현식 기반 루트 규칙, 예를 들어:host=10.20.153.10=>host=10.20.153.11
    규칙:
  • => 이전의 소비자 일치 조건, 모든 매개 변수와 소비자의 URL을 비교하여 소비자가 일치 조건을 만족시킬 때 이 소비자에게 뒤의 필터 규칙을 집행한다
  • =>이후 공급자 주소 목록의 필터링 조건, 모든 매개 변수와 공급자의 URL을 비교하여 소비자는 최종적으로 필터링 후의 주소 목록만 받습니다..
  • 일치하는 조건이 비어 있으면 모든 소비자에게 적용됩니다. 예를 들어 =>host!=10.20.153.11
  • 필터 조건이 비어 있으면 접근이 금지됩니다. 예를 들어:host=10.20.153.10 =>

  • 표현식:


    매개변수 지원:

  • 서비스 호출 정보, 예를 들어method,argument 등은 파라미터 루트를 지원하지 않습니다
  • URL 자체의 필드, 예를 들어:protocol,host,port 등
  • URL의 모든 매개 변수, 예를 들어 응용 프로그램, organization 등

  • 조건 지원:

  • 등호 ='매칭'을 나타낸다. 예를 들어:host=10.20.153.10
  • 부등호!일치하지 않음을 나타냅니다. 예를 들어:host!=10.20.153.10

  • 값 지원:

  • 쉼표로 여러 개의 값을 구분한다. 예를 들어:host!=10.20.153.10,10.20.153.11
  • 별표*로 끝납니다. 예를 들어:host!=10.20.*
  • 달러표 $로 시작하여 소비자 파라미터를 인용하는 것을 나타낸다. 예를 들어:host=$host

  • 예:

  • 프리젠테이션 제외: = > host!=172.22.3.91
  • 화이트리스트 [3]:host!10.20.153.10,10.20.153.11 =>
  • 블랙리스트:host=10.20.153.10,10.20.153.11=>
  • 서비스는 응용 프로그램에 하숙되어 일부 기계만 노출되어 전체 집단이 끊어지는 것을 방지합니다. =>host=172.32.1*, 172.22.3.2*
  • 중요한 응용 프로그램에 추가 기계를 제공합니다: application!=kylin => host != 172.22.3.95,172.22.3.96
  • 읽기와 쓰기 분리:method=find*,list*,get*,is*=>host=172.22.3.941722.3.95172.22.3.22.3.96method!=find*,list*,get*,is* => host = 172.22.3.97,172.22.3.98
  • 전면 백그라운드 분리: application = bops = > host = 172.2.3.91172.2.3.92172.2.2.3.93 application!=bops => host = 172.22.3.94,172.22.3.95,172.22.3.96
  • 서로 다른 기관실 네트워크를 격리:host!=172.22.3.* => host != 172.22.3.*
  • 공급자와 소비자는 같은 집단에 배치되어 있으며, 본 컴퓨터는 본 컴퓨터의 서비스에만 접근합니다. =>host=$host

  • 스크립트 라우팅 규칙


    스크립트 루트 규칙[4]은 JDK 스크립트 엔진의 모든 스크립트를 지원합니다. 예를 들어javascript, jruby,groovy 등입니다. type=javascript 파라미터를 통해 스크립트 형식을 설정하고 javascript가 부족합니다.
    "script://0.0.0.0/com.foo.BarService?category=routers&dynamic=false&rule=" + URL.encode("(function route(invokers) { ... } (invokers))")
    

    스크립트 엔진 기반 라우팅 규칙(예:
    (function route(invokers) {
        var result = new java.util.ArrayList(invokers.size());
        for (i = 0; i < invokers.size(); i ++) {
            if ("10.20.153.10".equals(invokers.get(i).getUrl().getHost())) {
                result.add(invokers.get(i));
            }
        }
        return result;
    } (invokers)); //  
    

    태그 라우팅 규칙


    태그 루트 규칙은 조립 태그 루트 (TagRouter) 를 선택한 후 dubbo 호출을 사용하면 요청한 태그에 따라 태그에 대응하는 서비스 제공자를 지능적으로 선택하여 호출할 수 있습니다.

    서비스 제공자

  • 어플리케이션 어셈블 라우터에 주기: @Bean public ApplicationConfig applicationConfig () {ApplicationConfig applicationConfig = new ApplicationConfig (), applicationConfig.setName ("provider-book"), applicationConfig.setQosEnable (false),/instruct tag router Map parameters = new HashMap(<>), parameters.put (Constants.ROUTER) _KEY, "tag"), applicationConfig.setParameters(parameters); return applicationConfig; }
  • 응용 프로그램에 구체적인 탭을 설정합니다. @Bean public ProviderConfig providerConfig () {ProviderConfig providerConfig = new ProviderConfig ();providerConfig.setTag ("red");return providerConfig;}

  • 응용 프로그램이 tag 속성을 어셈블하지 않았거나 서비스 제공자가 tag 속성을 설정하지 않았으면 기본 응용 프로그램으로 여겨질 것입니다. 이 기본 응용 프로그램은provider와 일치하지 않을 때 강등 방안으로 사용됩니다.

    서비스 소비자

    RpcContext.getContext().setAttachment(Constants.REQUEST_TAG_KEY,"red");
    

    요청 라벨의 역할 영역은 매번invocation입니다. attachment를 사용하여 요청 라벨을 전달합니다. attachment에 저장된 값은 완전한 원격 호출에서 계속 전달됩니다. 이러한 특성 때문에 우리는 호출을 시작할 때 한 줄의 디코딩 설정을 통해 라벨의 지속적인 전달을 할 수 있습니다.
    현재 하드코딩 방식만 RequestTag 설정을 지원합니다.RpcContext는 라인이 연결되어 있고 우아하게 TagRouter 기능을 사용하고 있으며, servlet 필터(웹 환경에서), 또는 맞춤형 SPI 필터를 통해requestTag를 설정하는 것을 권장합니다.

    규칙 설명

  • request.tag=red 시 tag=red의provider를 우선적으로 선택하십시오.그룹에 요청 표시에 대응하는 서비스가 존재하지 않으면, 요청 tag=null의provider, 즉 기본provider를 강등할 수 있습니다
  • request.tag=null 시 tag=null의provider만 일치합니다.그룹에 사용할 수 있는 서비스가 존재하더라도 tag가 일치하지 않으면 호출할 수 없습니다. 규칙 1과 달리 라벨을 가진 요청은 라벨이 없는 서비스에 접근할 수 있지만, 라벨을 휴대하지 않거나 다른 종류의 라벨을 휴대하지 않는 요청은 다른 라벨을 가진 서비스에 접근할 수 없습니다
  • 좋은 웹페이지 즐겨찾기