K8S 봄 - 클라우드는 Kubernetes 스프링 클라우드 서비스 검색 응용 프로그램 개발 환경

     정상적인 상황 K8S 마이그레이션 환경에서 그 시간에 우리의 서비스 라인은 원활한 마이그레이션 프로그램을 기반으로합니다. 지배 구조 및 서비스 등록 센터는 원래의 구성 요소를 기반으로합니다. 이러한 또는 K8S 환경에서 스프링 클라우드 애플리케이션으로 등등 원래 레지스트리의 설정 (예 : 유레카 등), 서비스 관리 (hystrix, 리본) 등을 사용합니다. 우리는 새로운 응용 프로그램을 개발할 때, 우리는 서비스 스핑 - 클라우드는 Kubernetes 구성 요소에 의해 발견,로드 밸런싱 우리에게 제공 할 수 그래서 유레카 같은 레지스트리를 제거 할 수 있습니다. 본 논문에서는 두 개의 스프링 클라우드 서비스를 구성하여 등등 서비스,로드 밸런싱 및 발견 어떻게 스프링 클라우드는 Kubernetes 구성 요소를 설명합니다.

첫째, 사용 스프링 구름-는 Kubernetes는 서비스 검색을

    소비자가 전화를 위해, product_infra_service, 외국 FeignClient의 방법으로 인터페이스를 제공합니다 : 그것은 두 서비스, 서비스 제공자를 개발 하였다. 서비스 소비자 : product_infra_consumer. 

첫째, 새로운 Module1의 : 제품 - 서비스 - API - 프라를 다음과 같이 프로젝트 의존성 관련 치어 구성 파일은 다음과 같습니다

    < 의존성 > 
        < 의존성 > 
            < 의 groupId > org.springframework.boot </ 의 groupId > 
            < artifactId를 > 스프링 부팅 스타터 </ artifactId를 > 
        </ 의존성 >

        <! - 서비스 인터페이스 API ->

        <! - 척하기 -> 
        < 의존성 > 
            < 의 groupId > org.springframework.cloud </ 의 groupId > 
            < artifactId를 > 스프링 클라우드 스타터 openfeign </ artifactId를 > 
            < 버전 > 2.1.3.RELEASE </ 버전 > 
        < / 의존성 > 
    </ 의존성 >

 

다음과 같이 인터페이스는 프로젝트에 정의 : 

@FeignClient (이름 = "$ {feign.product-infra.name:product-infra-service}",fallback = PropertyClientFallback. 클래스 )

공용  인터페이스 PropertyClient {

    (@GetMapping 값 = "속성" )
    목록 <문자열> 의 getProperties ();
}

다음과 같이 대체 hystrix 클래스는 정의된다 :

@Component
 공공  클래스 PropertyClientFallback는 구현 PropertyClient을 {

    @보수
    공개 목록 <문자열> 의 getProperties () {
         반환  새로운 ArrayList를 <문자열> ();
    }
}

다음으로, 새로운 서비스 제공 업체의 제품 인프라 서비스 프로젝트는 프로젝트의 PropertyClient 인터페이스를 달성했다. 치어 따라 구성 파일은 다음과 같습니다 :

<의존성>
        <의존성>
            <의 groupId> org.springframework.boot </의 groupId>
            <artifactId를> 스프링 부팅 스타터 </ artifactId를>
        </ 의존성>

        <의존성>
            <의 groupId> org.springframework.boot </의 groupId>
            <artifactId를> 스프링 부팅 선발 테스트 </ artifactId를>
            <분야> 시험 </ 범위>
            <제외>
                <제외>
                    <의 groupId> org.junit.vintage </의 groupId>
                    <artifactId를> JUnit을-빈티지 엔진 </ artifactId를>
                </ 제외>
            </ 제외>
        </ 의존성>
        <! - 서비스 인터페이스 API ->
        <의존성>
            <의 groupId> com.maidao.center.product_infra </의 groupId>
            <artifactId를> 제품 - 인프라 - 서비스 API를 </ artifactId를>
            <버전> 1.0.0-SNAPSHOT </ 버전>
        </ 의존성>
        <의존성>
            <의 groupId> org.springframework.boot </의 groupId>
            <artifactId를> 스프링 부팅 스타터 웹 </ artifactId를>
        </ 의존성>

        <! - SpringBoot 액츄에이터 ->
        <의존성>
            <의 groupId> org.springframework.boot </의 groupId>
            <artifactId를> 스프링 부팅 스타터 액츄에이터 </ artifactId를>
        </ 의존성>
    </ 의존성>

다음과 같이 컨트롤러 클래스는 정의된다 :

@RestController
@RequestMapping
공공  클래스 PropertyController는   구현 PropertyClient을 {

    (@GetMapping "등록 정보" )
     공개 목록 <문자열> () {의 getProperties를
        ArrayList를 <문자열> 속성 = 새로운 ArrayList를 <> ();
        properties.add ( "properties1" );
        properties.add ( "properties2" );
        반환 속성을;
    }

}

전개 K8S 환경을 투영하고 K8S 환경에서 서비스 인스턴스에 관련된 포드에 서비스를 정의하는 거울로 패키징 컴파일 한 후이 예에서 K8S 서비스 이름 제품 적외선 서비스 (어플리케이션 이름과 정의 된 바와 같은)로 정의된다.

 

새로운 소비자 항목 : 제품 적외선 소비자, 치어 따라 구성 파일은 다음과 같습니다 :

 

<의존성>
        <의존성>
            <의 groupId> org.springframework.boot </의 groupId>
            <artifactId를> 스프링 부팅 스타터 </ artifactId를>
        </ 의존성>

        <의존성>
            <의 groupId> org.springframework.boot </의 groupId>
            <artifactId를> 스프링 부팅 선발 테스트 </ artifactId를>
            <분야> 시험 </ 범위>
            <제외>
                <제외>
                    <의 groupId> org.junit.vintage </의 groupId>
                    <artifactId를> JUnit을-빈티지 엔진 </ artifactId를>
                </ 제외>
            </ 제외>
        </ 의존성>


        <의존성>
            <의 groupId> org.springframework.cloud </의 groupId>
            <artifactId를> 스프링 클라우드는 Kubernetes 코어 </ artifactId를>
            <버전> $ {springcloud.kubernetes.version} </ 버전>
        </ 의존성>

        <의존성>
            <의 groupId> org.springframework.cloud </의 groupId>
            <artifactId를> 스프링 클라우드는 Kubernetes 발견 </ artifactId를>
            <버전> $ {springcloud.kubernetes.version} </ 버전>
        </ 의존성>

        <의존성>
            <의 groupId> org.springframework.cloud </의 groupId>
            <artifactId를> 스프링 클라우드 스타터는 Kubernetes 특선 </ artifactId를>
            <버전> $ {springcloud.kubernetes.version} </ 버전>
        </ 의존성>

        <의존성>
            <의 groupId> org.springframework.cloud </의 groupId>
            <artifactId를> 스프링 클라우드 커먼즈 </ artifactId를>
            <버전> $ {springcloud.version} </ 버전>
        </ 의존성>

        <의존성>
            <의 groupId> org.springframework.boot </의 groupId>
            <artifactId를> 스프링 부팅 스타터 웹 </ artifactId를>
            <버전> $ {springcloud.version} </ 버전>
        </ 의존성>

        <의존성>
            <의 groupId> org.springframework.cloud </의 groupId>
            <artifactId를> 스프링 클라우드 스타터 넷플릭스 리본 </ artifactId를>
            <버전> $ {springcloud.version} </ 버전>
        </ 의존성>

        <의존성>
            <의 groupId> org.springframework.cloud </의 groupId>
            <artifactId를> 스프링 클라우드 스타터 넷플릭스 hystrix </ artifactId를>
            <버전> $ {springcloud.version} </ 버전>
        </ 의존성>

        <! - 서비스 인터페이스 API ->
        <의존성>
            <의 groupId> com.maidao.center.product_infra </의 groupId>
            <artifactId를> 제품 - 인프라 - 서비스 API를 </ artifactId를>
            <버전> 1.0.0-SNAPSHOT </ 버전>
        </ 의존성>
    </ 의존성>

 

응용 프로그램 구성은 다음과 같습니다 :
섬기는 사람:
  포트 : 8080



제품 프라를 서비스 :
  리본:
    KubernetesNamespace : $ {네임 스페이스} (K8S 네임 스페이스 구성 이름에 해당하는 자신의 네임 스페이스에 따라 서비스의 실제 배포)
 백엔드 : 리본:  유레카: 사용 가능 : 거짓 고객: 활성화 : 사실 ServerListRefreshInterval : 5000 hystrix : 명령 : BackendCall : 실행 : 절연 : 스레드 : timeoutInMilliseconds : 5000 스레드 : BackendCallThread : coreSize : 5 체하다 : hystrix : 사용 가능 : 사실

새로운 ProductInfraConsumerController 클래스 : 참조 인터페이스 호출 제공자에 의해 PropertyClient을 제공합니다.


@RestController
@RequestMapping
공용 클래스 ProductInfraConcumerController {

@Autowired
개인 PropertyClient propertyClient;

( "등록 정보") @GetMapping
공개 목록을 <문자열> getProductProperties () {

반환 propertyClient.getProperties ();

}

}

당신은 코드가 변경되지 않습니다 볼 수있는 방법으로 통화를 변경하지 않습니다, 소비자에있는 원래의 EurekaClient을 제거 봉사 프로젝트를 호출합니다. 서비스 검색 메커니즘은 사용 봄 - 클라우드는 Kubernetes-발견합니다. 로드 밸런싱 어셈블리는 사용 : 봄 - 클라우드 스타터는 Kubernetes - 리본.

마지막 제품 적외선 소비자가 컴파일 된 이미지로 포장 한 후, K8S 환경을 배포합니다.

마지막 K8S 환경 제품 적외선 소비자의 메소드를 호출하는 명령어 컬 제어기는 서비스 간의 통신 테스트 다음과 같다 :

[루트 @ iZbp174tf9563rykf3bbjjZ ~] # 컬에 http : // 172.30.28.100:8080/properties 

[ " properties1 " , " properties2 " ]

제품 - 인프라 - 서비스 서비스를 해제 요청을 다시 강등 대체 방법을 적용하기 시작 :

[루트 iZbp174tf9563rykf3bbjjZ ~ @] # 컬에 http : // 172.30.28.98:8080/properties 

[]

경우 유레카 레지스트리의 부재에서 볼 수있는, 두 서비스의 정의는 의사 소통을 할 수 있으며, 코드 변경, 의존, 스프링 클라우드 서비스 소비자와 관련된 스프링 클라우드는 Kubernetes 단지 도입 할 필요가 없습니다 -kubernetes 서비스 검색 구성 요소는로드 밸런싱뿐만 아니라 역할을한다.

 

두, 스프링 클라우드는 Kubernetes 서비스 검색 과정

      아래 그림과 같이 스프링 클라우드는 Kubernetes 프레임 워크는 기존 SpringCloud 애플리케이션 아키텍처를 제공하기 위해 주는 Kubernetes를 호출 할 수있는 기능을 제공합니다 :

제품 적외선 서비스를 호출 할 때,도 제품 - 적외선 소비자로부터 알 수있는 바와 같이, 상기 호 서비스 이름 포드 API 서버에있어서, 정보 서비스 이름 FeignClient 조립체 확인-http3 의해 바닥 얻을하면에 대응하는 서비스 정보를 취득 폴링에 의해 정보를 얻을 포드 포드에 요청을 보냅니다. 스프링 클라우드 스타터 kubernetes- 리본 조립체 KubernetesServerList는 리본 loaderbanlancer 조립체 상속 AbstractServerList 및 메소드 SERVERLIST 클래스를 구현 및 제공 K8S API 서버 용량 KubernetesClient로 요청 메시지를 전송한다. 다음과 같이 포드 소스 서비스 이름을 통해 정보를 얻습니다 :

공개 목록 <서버> getUpdatedListOfServers () {
        엔드 포인트 엔드 포인트 =  .namespace! = null이 
                ?  (). inNamespace (.client.endpoints .namespace를)
                        .withName(this.serviceId).get()
                : this.client.endpoints().withName(this.serviceId).get();

        List<Server> result = new ArrayList<Server>();
        if (endpoints != null) {

            if (LOG.isDebugEnabled()) {
                LOG.debug("Found [" + endpoints.getSubsets().size()
                        + "] endpoints in namespace [" + this.namespace + "] for name ["
                        + this.serviceId + "] and portName [" + this.portName + "]");
            }
            for (EndpointSubset subset : endpoints.getSubsets()) {

                if (subset.getPorts().size() == 1) {
                    EndpointPort port = subset.getPorts().get(FIRST);
                    for (EndpointAddress address : subset.getAddresses()) {
                        result.add(new Server(address.getIp(), port.getPort()));
                    }
                }
                else {
                    for (EndpointPort port : subset.getPorts()) {
                        if (Utils.isNullOrEmpty(this.portName)
                                || this.portName.endsWith(port.getName())) {
                            for (EndpointAddress address : subset.getAddresses()) {
                                result.add(new Server(address.getIp(), port.getPort()));
                            }
                        }
                    }
                }
            }
        }
        else {
            LOG.warn("Did not find any endpoints in ribbon in namespace ["
                    + this.namespace + "] for name [" + this.serviceId
                    + "] and portName [" + this.portName + "]");
        }
        return result;
    }

 

추천

출처www.cnblogs.com/justinli/p/spring-cloud-kubernetes.html