[SpringBoot, Nacos+Dubbo 통합] 엔터프라이즈급 프로젝트는 RPC 원격 호출을 실현하기 위해 마이크로서비스 구성 요소를 통합합니다.

1. 수요

증가하는 비즈니스 요구에 따라 각 프로젝트는 초기에 독립적으로 개발되었으며 프런트 엔드와 백엔드가 분리되어 있지만 각 프로젝트는 서로 간섭하지 않습니다. 나중에 특정 요구 사항으로 인해 여러 프로젝트의 데이터를 서로 인터리브하여 가져와야 합니다.

초기 아이디어는 여러 데이터 소스를 통합하는 것이었습니다.

데이터베이스 DBa, DBb, DBc에 해당하는 A, B, C 세 개의 프로젝트가 있는데, 이제 A 프로젝트는 DBa와 DBc 데이터베이스를 동시에 운영해야 합니다.

이때 RPC 프레임워크를 호출하는 것이 이상적이다.

환경/버전

IDEA2022.3.2
java11
SpringBoot 2.7.12-SNAPSHOT
Nacos 2.2.2

참고: SpringBoot3.x 이상을 사용하는 경우 jdk17 이상을 사용해야 합니다. 그렇지 않으면 오류가 시작됩니다.

둘, 주의

2.1 RPC란?

RPC의 전체 이름은 원격 프로시저 호출이며 원격 프로시저 호출로 번역됩니다. 서로 다른 프로세스 또는 컴퓨터 간에 통신하는 데 사용되는 컴퓨터 네트워크 통신 프로토콜로, 로컬 메서드인 것처럼 원격 메서드를 호출할 수 있습니다.

다른 컴퓨터에서 함수나 메서드를 호출해야 하는 응용 프로그램이 있다고 가정하면 일반적으로 네트워크 프로그래밍을 통해 수동으로 요청을 보내고 응답을 받아야 합니다. RPC를 사용하면 로컬 함수를 호출하는 것처럼 원격 함수를 직접 호출할 수 있으므로 네트워크 프로그래밍의 복잡성이 단순해집니다.

특히 RPC 통신 과정에서 호출자는 로컬 메서드를 호출하는 것처럼 원격 서버에 요청을 보내고 요청에는 호출할 메서드 이름과 매개 변수 목록이 포함됩니다. 요청을 받은 후 원격 서버는 요청을 구문 분석하고 해당 메서드를 호출하며 실행 결과를 호출자에게 반환합니다. 호출자가 응답을 받은 후 로컬 함수처럼 결과를 처리할 수 있습니다.

평신도의 관점에서 RPC는 원격 상대방에게 당신이 통화 중일 때 해야 할 일을 알려주고 상대방이 완료 후 결과를 알려주는 것과 같습니다. 이렇게 하면 스스로 작업을 완료할 필요가 없으며, 이 과정에서 완료해야 할 작업과 결과에만 신경을 쓰면 되고 구체적인 구현 방법에 신경을 쓸 필요가 없습니다.

RPC는 마이크로 서비스 아키텍처의 서비스 호출, Hadoop의 원격 프로시저 호출 등과 같은 분산 시스템에서 널리 사용됩니다. 분산 시스템을 보다 단순하고 유연하며 확장 가능하게 만들 수 있습니다.

2.2 더보란?

배경
Dubbo의 탄생 배경은 2011년으로 거슬러 올라갑니다. 당시 Alibaba의 내부 분산 아키텍처 및 서비스 거버넌스는 상대적으로 성숙했습니다. 도전이 되었고 엄청난 도전이 되었습니다. 이러한 맥락에서 Dubbo가 탄생했습니다.

Dubbo는 원래 Alibaba의 내부 분산 시스템을 위한 고성능의 안정적이고 확장 가능한 RPC 프레임워크를 제공하여 Alibaba가 분산 서비스 아키텍처를 보다 잘 구축하고 서비스 거버넌스를 구현하는 것을 목표로 Alibaba의 엔지니어가 제안하고 개발했습니다.

나중에 Dubbo가 점차 성숙해지면서 Alibaba 내에서 널리 사용됨에 따라 Alibaba는 이를 소스로 공개하기로 결정하고 2011년 말에 첫 번째 버전을 공식적으로 출시한 후 2012년과 2015년, 2019년에 버전 2.0과 2.5를 출시했습니다. 버전 2.7을 출시했습니다. Dubbo의 오픈 소스와 지속적인 업데이트 및 반복은 점점 더 많은 사용자와 개발자의 참여를 유도했으며 점차 Java 생태계에서 가장 인기 있는 RPC 프레임워크 중 하나가 되었습니다.

오늘날 Dubbo는 Alibaba, Huawei, Netease 및 기타 기업의 분산 시스템에서 널리 사용되고 있으며 국내외 주요 인터넷 회사 및 커뮤니티에서 널리 인정되고 지원되었습니다.

2018년 11월 Apache Dubbo는 Apache의 최상위 프로젝트가 되었으며, 이는 Dubbo가 매우 성숙하고 고품질이며 활발한 커뮤니티 오픈 소스 프로젝트로 발전했음을 의미합니다. Dubbo의 추가로 분산 시스템 분야에서 Apache의 입지가 더욱 강화되었으며 분산 시스템의 개발 및 홍보에 크게 기여했습니다.

효과

Dubbo는 주로 세 가지 핵심 모듈을 포함합니다.

제공자(서비스 제공자): 서비스를 노출하는 애플리케이션 및 서비스 제공 방법.

소비자(서비스 소비자): 원격 서비스를 호출하는 애플리케이션 및 서비스를 소비하는 방법입니다.

레지스트리(Service Registry): 서비스 등록 및 검색을 위한 관리 센터입니다.

Dubbo 프레임워크의 워크플로는 다음과 같습니다.

1. 서비스 제공자는 등록 센터에서 제공하는 서비스를 시작하고 등록합니다.

2. 서비스 소비자는 자신이 필요로 하는 서비스를 시작하고 등록 센터에 가입합니다.

3. 등록 센터는 이용 가능한 서비스 목록을 서비스 소비자에게 반환합니다.

4. 서비스 소비자가 원격 서비스를 호출합니다.

5. 원격 서비스 공급자는 요청에 응답하고 서비스 소비자에게 결과를 반환합니다.

6. 서비스 소비자는 응답을 받고 통화를 완료합니다.

2.3 나코스란?

Nacos는 클라우드 네이티브 개념을 기반으로 구축된 동적 서비스 검색, 구성 관리 및 서비스 거버넌스 플랫폼으로, 2018년 Alibaba 오픈 소스 팀에서 오픈 소스화했습니다. 주로 분산 시스템에서 서비스 등록, 검색, 구성 관리 및 DNS 서비스 문제를 해결합니다.

Nacos는 다음과 같은 핵심 기능을 제공합니다.

1. 서비스 등록 및 검색: Nacos는 서비스 공급자가 서비스를 자동으로 등록하고 서비스 인스턴스의 상태를 Nacos Server에 보고하도록 도울 수 있으며 서비스 소비자는 Nacos를 통해 사용 가능한 서비스 인스턴스를 쿼리할 수 있습니다.

2. 구성 관리: Nacos는 중앙 집중식 구성 관리 기능을 제공하며 동적 구성, 버전 관리, 그레이스케일 릴리스 및 모니터링과 같은 기능을 지원하며 분산 시스템에서 구성 정보를 쉽게 관리할 수 있습니다.

3. 서비스 라우팅 및 로드 밸런싱: Nacos는 서비스 공급자와 소비자 간의 트래픽 관리, 라우팅 규칙의 동적 업데이트 및 여러 로드 밸런싱 전략을 지원합니다.

4. DNS 서비스: Nacos는 DNS 서비스 제공을 지원하고 DNS를 사용하여 다른 서비스 검색 구성 요소 없이도 서비스를 검색할 수 있습니다.


알림: Dubbo 공식 웹사이트의 기본 등록 센터는 Zookeeper이며 이 기사에서 사용된 등록 센터는 Nacos입니다.

3. 일반적인 SpringBoot 프로젝트 통합 마이크로서비스 컴포넌트 구성표(저자가 두 종류를 제공함)

옵션 1(권장)

저자( 요구 사항 참조 )와 같은 프로젝트는 처음부터 마이크로서비스 아키텍처를 선택하는 것이 아니라 개발로 인해 마이크로서비스 구성 요소를 사용하도록 진화했습니다. 이 부분만 보세요. 그렇지 않으면 옵션 2를 참조하십시오.

1. maven 종속 항목 가져오기(소비자와 공급자는 동일함)

		<!--nacos-->
        <dependency>
            <groupId>com.alibaba.nacos</groupId>
            <artifactId>nacos-client</artifactId>
            <version>2.2.2</version>
        </dependency>
        <!-- dubbo -->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>3.2.0-beta.6</version>
        </dependency>

스타트업 클래스에 주석 @EnableDubbo 추가
여기에 이미지 설명 삽입

2. application.yml 파일 구성(소비자)

server:
  port: 8102
spring:
  cloud:
    nacos:
      server-addr: localhost:8848
dubbo:
  consumer:
    check: false
  application:
    name: dubbo-springboot-demo-consumer
  protocol:
    name: dubbo
    # 设置为-1表示自动配置可用端口
    port: -1
  registry:
    address: nacos://127.0.0.1:8848

application.yml 파일 구성(제공자)

server:
  port: 8105
spring:
  cloud:
    nacos:
      server-addr: localhost:8848
dubbo:
  application:
    name: dubbo-springboot-demo-provider
  protocol:
    name: dubbo
    port: -1
  registry:
    address: nacos://127.0.0.1:8848
    

3. 통합 인터페이스 클래스(소비자와 공급자의 패키지 이름이 동일해야 하므로 패키지 이름에 주의)

package com.example.astar.component;

public interface DemoService {
    
    

    String sayHello(String name);
}

4. 공급자 인터페이스(인터페이스에 @DubboService 주석 추가)

package com.example.astar.service.Impl;

import com.example.astar.component.DemoService;// 注意包名
import org.apache.dubbo.config.annotation.DubboService;

@DubboService
public class AstarServiceImpl implements DemoService {
    
    

    private static int flag = 0;

    @Override
    public String sayHello(String name) {
    
    
        String message = "你好啊! " + name + " =========》 " + flag++;
        return message;
    }
}

5. 소비자 호출 인터페이스

package com.example.astar.controller;

import com.example.astar.component.DemoService;//注意包名
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/user")
public class UserController {
    
    

    @DubboReference
    private DemoService demoService;

    @GetMapping("/1")
    public String hello() {
    
    

        String result = demoService.sayHello("Astar");
        String re = "Receive result ======> " + result;
        System.out.println(re);
        return re;
    }
}

6. 통화 성공

이 두 프로젝트(소비자와 제공자)를 시작하세요. 소비자가 check: false로 구성되어 있으므로 먼저 시작되는 프로젝트는 괜찮습니다. 소비자의 포트는 8102입니다. 방문합시다

http://로컬호스트:8102/사용자/1

아래 참조
여기에 이미지 설명 삽입

친절한 팁:

DemoService의 정규화된 패키지 이름은 import com.example.astar.component.DemoService이며 이는 소비자와 공급자 간의 브리지가 동일한 인터페이스에서 온다는 것을 의미합니다. 클래스를 달성하려면 프로젝트에서 정확히 동일한 인터페이스를 만들어야 합니다. 상관없어. 공급자와 소비자 인터페이스의 패키지 이름이 다른 경우 호출이 실패합니다.

인간적으로 말하자면, 두 프로젝트가 동일한 파일 아래에 있지 않더라도 동일한 클래스를 사용하는 것이 어떻게 가능할 수 있습니까? 여기서 클래스 자체와 패키지 이름이 동일하다면 Dubbo는 이를 동일하게 간주합니다.

옵션 II

이 솔루션은 초기에 마이크로 서비스의 프레임워크를 사용하기로 결정한 프로젝트를 기반으로 하며, 일반적으로 다음과 같이 여러 하위 모듈로 나눌 것입니다.

여기에 이미지 설명 삽입

인터페이스 모듈

여기에 이미지 설명 삽입
단계에 대해 이야기하기에는 너무 게을러서 첫 번째 솔루션과 거의 동일하며 차이점은 공용 모듈 인터페이스를 가져오는 것입니다.
소비자와 공급자에 하위 모듈을 추가하기만 하면 됩니다.

        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-samples-spring-boot-interface</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

알림: 포장할 때 하위 모듈의 가져온 부분이 함께 포장됩니다. 걱정하지 마십시오. 정상적으로 사용할 수 있으며 나머지는 변경되지 않습니다.


광활한 사람의 바다는 갈 길이 멀고
수련에 집중해야만 아름다워 질 수 있습니다.
한 걸음 한 걸음 꾸준히 나아가
꽃이 피기를 기다리면 진실이 보입니다.

행복한 개발!

추천

출처blog.csdn.net/qq_43813351/article/details/130560596