2. 스프링 클라우드: Nacos 등록 센터 + OpenFeign + Loadbalancer

목차

개요

소스 코드 프로젝트 구조

프로젝트 글로벌 pom.xml

결제 모듈(예: 결제 서비스)

 주문 모듈(예: 주문 서비스)

시작 및 검증

 결제 서비스 시작

 주문 서비스 시작

나코스 보기

통화 확인

첨부 1: Nacos 서비스 등록 검색 클라이언트 임시 저장소 디렉터리

첨부 2: Nacos 격리 3계층 개념

첨부 3: Java 코드는 Nacos 등록 센터와 상호 작용합니다.

첨부 4: curl을 통한 open API 호출 

Nacos의 서비스에 따라 인스턴스를 나열합니다.

Nacos에서 인스턴스 정보를 얻습니다.

Nacos 인스턴스 게시/수정(URL의 메타데이터 형식은 JSON이 아님):


개요

  • 서비스 제공자: 결제
  • 서비스 소비자 : 주문 서비스(결제 서비스 호출 필요)
  • 위의 모든 항목은 하나의 프로젝트에 있지만 서로 다른 모듈에 속합니다.
  • nacos 서버가 설치되고 시작되었습니다.

소스 코드 프로젝트 구조

  ---- 프로젝트

      ∟ 결제 [모듈]

      ∟ 주문 [모듈]

      ∟ pom.xml [글로벌 pom 파일]

프로젝트 글로벌 pom.xml

글로벌 pom.xml을 통해 각 모듈에 필요한 종속 정보 구성

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.6.6</version>
        <relativePath/>
    </parent>

    <modules>
        <module>payment</module>
        <module>order</module>
    </modules>

    <groupId>com.example</groupId>
    <artifactId>myproject-global-pom</artifactId>
    <version>0.0.1-DEFAULT</version>
    <packaging>pom</packaging>
    <description>This is my project global pom config</description>
    <properties>
        <java.version>1.8</java.version>
        <springcloud.version>3.1.5</springcloud.version>
        <springcloudalibaba.version>2021.0.4.0</springcloudalibaba.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            <version>${springcloudalibaba.version}</version>
            <exclusions>
                <exclusion>
                    <groupId>com.alibaba.nacos</groupId>
                    <artifactId>nacos-client</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <dependency>
            <groupId>com.alibaba.nacos</groupId>
            <artifactId>nacos-client</artifactId>
            <version>1.4.5</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
            <version>${springcloud.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-loadbalancer</artifactId>
            <version>${springcloud.version}</version>
        </dependency>
        
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

결제 모듈(예: 결제 서비스)

결제 모듈의 pom.xml 파일은 다음과 같습니다.

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>myproject-global-pom</artifactId>
        <groupId>com.example</groupId>
        <version>0.0.1-DEFAULT</version>
        <relativePath>../pom.xml</relativePath>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>payment</artifactId>
    <version>0.2.2-SNAPSHOT</version>
</project>

결제 모듈의 application.properties 구성 파일

#本服务的默认监听端口
server.port=8080

spring.application.name=payment

#Nacos注册中心服务端的地址和端口(形式ip:port,ip:port,...) 在启动时,会向多个地址都发起注册
spring.cloud.nacos.discovery.server-addr=39.100.80.168:8848

#如定义了此属性,则nacos取此名作为服务名,否则取spring.application.name作为默认服务名
spring.cloud.nacos.discovery.service=paymentService

 springcloud에서 nacos 클라이언트의 추가 구성 항목을 보려면 nacos 공식 웹사이트(Nacos Starter에 대한 추가 구성 정보)를 방문하십시오. https://github.com/alibaba/spring-cloud-alibaba/wiki/Nacos-discovery

package=com.example.payment에서 @EnableDiscoveryClient 주석을 SpringBoot 기본 클래스인 PaymentApplication.class에 추가합니다. 서비스 등록 검색 메커니즘을 활성화합니다.

@SpringBootApplication
@EnableDiscoveryClient
public class PaymentApplication {
    public static void main(String[] args) {
        SpringApplication.run(PaymentApplication.class, args);
    }
}

자금 지불 논리를 시뮬레이트할 새 컨트롤러를 만듭니다. 다음과 같이 package=com.example.payment.contronller 아래에 새 클래스를 추가합니다.

@RestController
public class PaymentController {
    @Value("${server.port}")
    private int myport;

    @GetMapping("/dopay/{orderid}")
    public ResponseEntity<String> paylogic(@PathVariable("orderid") Long orderid) {
        return ResponseEntity.ok("支付服务successful! orderid=" + orderid + ", 支付成功。 支付服务的端口为port=" + myport );
    }
}

 주문 모듈(예: 주문 서비스)

주문 모듈의 pom.xml 파일은 다음과 같습니다.

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>myproject-global-pom</artifactId>
        <groupId>com.example</groupId>
        <version>0.0.1-DEFAULT</version>
        <relativePath>../pom.xml</relativePath>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>order</artifactId>
    <version>1.0-SNAPSHOT</version>
</project>

주문 모듈의 application.properties 구성 파일

#本服务的默认监听端口
server.port=4444

spring.application.name=customerOrder

#Nacos服务端的地址和端口(形式ip:port,ip:port,...)
spring.cloud.nacos.discovery.server-addr=39.100.80.168:8848

#如定义了此属性,则nacos取此名作为服务名,否则取spring.application.name作为默认服务名
spring.cloud.nacos.discovery.service=orderService

#向Nacos注册时,本服务对外暴露的IP地址 (若不配置,则从本机上的网卡自动选择作为对外暴露的IP)
#spring.cloud.nacos.discovery.ip=x.x.x.x

springcloud에서 nacos 클라이언트의 추가 구성 항목을 보려면 nacos 공식 웹사이트(Nacos Starter에 대한 추가 구성 정보)를 방문하십시오. https://github.com/alibaba/spring-cloud-alibaba/wiki/Nacos-discovery

package=com.example.order에서 서비스 등록 검색 메커니즘과 OpenFeign 클라이언트를 각각 활성화하기 위해 SpringBoot 기본 클래스 OrderApplication.class에 두 개의 주석이 추가됩니다.

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class OrderApplication {
    public static void main(String[] args) {
        SpringApplication.run(OrderApplication.class, args);
    }
}

 openFeign 클라이언트 인터페이스를 정의합니다(package=com.example.order.feignclients). 인터페이스를 정의하기만 하면 되며 수동으로 구현할 필요가 없습니다.

@FeignClient(value = "paymentService")    // Feign客户端制定目标服务的名字(根据此名字从注册中心订阅具体的服务实例信息)
public interface IPaymentServiceClient {

    @GetMapping("/dopay/{payid}")  // 目标服务(服务提供方)的内具体的调用URL路径
    public ResponseEntity<String> dodopay(@PathVariable("payid") Long payid);
}

주문 처리를 시뮬레이트할 새 컨트롤러를 만듭니다. 다음과 같이 package=com.example.order.contronller 아래에 새 클래스를 추가합니다.

@RestController
public class OrderController {

    @Autowired
    private IPaymentServiceClient paymentServiceClient;

    @GetMapping("/consumer/{orderid}")
    public ResponseEntity<String> consumerFeign( @PathVariable("orderid") Long orderid) {
        return ResponseEntity.ok ("调用订单模拟服务完成。 订单orderid:" + orderid + ",   调用返回的Body:" + paymentServiceClient.dodopay(orderid).getBody() );
    }
}

시작 및 검증

Maven에서 결제 및 주문 모듈을 각각 패키징한 다음 시작합니다.

 결제 서비스 시작

   두 개의 결제 인스턴스를 시작하고 서비스 포트는 각각 8888 및 9999입니다.

 java -jar payment-0.2.2-SNAPSHOT.jar --server.port=8888

 java -jar payment-0.2.2-SNAPSHOT.jar --server.port=9999

 주문 서비스 시작

java -jar order-1.0-SNAPSHOT.jar

나코스 보기

  이것은 Nacos에서 가져온 것으로 paymentService와 orderService에 두 가지 서비스가 있음을 알 수 있습니다. 여기서 paymentService에는 두 개의 인스턴스가 있습니다.

통화 확인

curl http://localhost:4444/consumer/66

호출 결과는 다음과 같으며, 두 개의 paymentService 인스턴스가 교대로 서비스를 제공하도록 교대로 학습된 것을 확인할 수 있습니다. 이는 기본적으로 RR 라운드 로빈 알고리즘을 사용하는 openFeign에 대해 spring could loadbalance 구성 요소를 사용하는 것입니다.

 

추가로: springboot가 시작될 때 디버그 로그를 활성화하도록 --logging.level.root=DEBUG 속성을  구성하면 openfeign이 호출될 때 http 프로토콜의 특정 속성을 찾을 수 있습니다. -살아있습니다.

첨부 1: Nacos 서비스 등록 검색 클라이언트 임시 저장소 디렉터리

  • Nacos 클라이언트는 Nacos 서버에서 검색한 서비스 및 인스턴스 목록 정보를 로컬 클라이언트에 임시로 저장합니다(서비스 및 인스턴스가 변경되면 클라이언트 로컬에 자동 업데이트됨).
  • Nacos 클라이언트가 임시로 로컬에 저장되는 디렉토리는 다음과 같습니다. $HOME/nacos/naming/ ($HOME은 클라이언트 애플리케이션이 사용자를 시작하는 HOME 경로입니다.)
     

첨부 2: Nacos 격리 3계층 개념

아래 그림과 같이:

  • 네임스페이스: 리소스를 완전히 격리하는 데 사용할 수 있으며, 다른 네임스페이스 아래의 구성 구성 리소스는 공유되지 않으며 서비스는 상호 운용할 수 없습니다(찾을 수 없음). 다중 테넌트 격리는 네임스페이스를 통해 달성할 수 있습니다.
  • group: 리소스 그룹화에 사용할 수 있습니다. 동일한 네임스페이스에서 서로 다른 그룹의 구성 구성 리소스가 공유되지 않으며 서비스가 상호 운용되지 않습니다(찾을 수 없음). 그룹을 통해 다른 환경을 격리할 수 있습니다.
  • cluster_name: 서비스 인스턴스가 상주하는 클러스터를 구분합니다. 동일한 네임스페이스와 동일한 그룹에서 서로 다른 클러스터의 서비스는 상호 운용 가능(상호 액세스 가능)합니다. 서비스가 실행되는 서로 다른 클러스터 또는 데이터 센터는 서로 다른 클러스터로 식별할 수 있습니다. 이 개념은 서비스 등록 검색에 존재하지만 구성 구성에는 존재하지 않습니다.

참고 1: 등록 센터와 구성 센터의 그룹은 서로 다르며 각각 자체 관리가 있습니다.

참고 2: 위 레이어 설정의 경우 동일한 서비스 인스턴스에 대해 Nacos 등록 센터 및 구성 센터에서 서로 다른 그룹을 구성할 수 있습니다. 즉, 동일한 서비스가 Nacos에서 구성을 가져올 때 group=A로 선언하고 Nacos에 서비스를 등록할 때 group=B로 선언하는 것이 허용됩니다.
 

첨부 3: Java 코드는 Nacos 등록 센터와 상호 작용합니다.
 

      a. Springboot Bean 방식을 사용하지 않고 다음과 같은 방식으로 Nacos 서버에 직접 접속합니다.

NamingService namingService = NacosFactory.createNamingService(serverAddrList);

namingService.getAllInstances("serviceName");
namingService.getAllInstances("serviceName", "groupName");
namingService.getAllInstances(......);
namingService.shutDown();


...... ConfigService 类似,省略 ......

       b. Springboot Bean에 있는 경우 자동 주입을 통해 NamingService 객체를 얻습니다.

    @Autowired
    NacosServiceManager nacosServiceManager;

    @Autowired
    NacosConfigManager nacosConfigManager;

 
 
...... 省略 ......
     NamingService namingService = nacosServiceManager.getNamingService();
     ConfigService configService = nacosConfigManager.getConfigService();
...... 然后使用该对象操作(省略)......
 

첨부 4: curl을 통한 open API 호출 

Nacos의 서비스에 따라 인스턴스를 나열합니다.

curl -X GET http://39.100.80.168:8848/nacos/v1/ns/instance/list?serviceName=paymentService

반환 결과:

{"name":"DEFAULT_GROUP@@paymentServicecurl","groupName":"DEFAULT_GROUP","clusters":"","cacheMillis":10000,"hosts":[],"lastRefTime":1686204572768,"checksum": "","allIPs":false,"reachProtectionThreshold":false,"valid":true}{"name":"DEFAULT_GROUP@@paymentService","groupName":"DEFAULT_GROUP","clusters":"","cacheMillis ":10000,"hosts":[{"ip":"192.168.163.1","port":8080,"weight":0.8,"healthy":true,"enabled":true,"ephemeral":true, "clusterName":"BJ","serviceName":"DEFAULT_GROUP@@paymentService","metadata":{"my.key2":"value2","gjs.canhandle.vCustomerDistribution":"value1"},"instanceHeartBeatInterval":5000,"instanceHeartBeatTimeOut":15000,"ipDeleteTimeout":30000}],"lastRefTime":1686204572823,"checksum": "","allIPs":false,"reachProtectionThreshold":false,"valid":true}

Nacos에서 인스턴스 정보를 얻습니다.

curl -X GET "http://39.100.80.168:8848/nacos/v1/ns/instance/?serviceName=paymentService&ip=192.168.163.1&port=8080&clusterName=BJ"

반환 결과:

{"service":"DEFAULT_GROUP@@paymentService","ip":"192.168.163.1","port":8080,"clusterName":"BJ","weight":0.8,"healthy":true,"instanceId ":null,"metadata":{"my.key2":"value2","gjs.canhandle.vCustomerDistribution":"value1"}}

 

Nacos 인스턴스 게시/수정(URL의 메타데이터 형식은 JSON이 아님):

curl -X PUT "http://39.100.80.168:8848/nacos/v1/ns/instance/?serviceName=paymentService&ip=192.168.163.1&port=8080&clusterName=BJ&metadata=my.key2=newvalue44,bb.xx=44,yyy=455555"

반환 결과:

좋아요

Nacos에서 인스턴스 정보를 얻으려면 다시 전화하십시오.

{"service":"DEFAULT_GROUP@@paymentService","ip":"192.168.163.1","port":8080,"clusterName":"BJ","weight":1.0,"healthy":true,"instanceId ":null,"metadata":{"yyy":"455555","my.key2":"newvalue44","gjs.canhandle.vCustomerDistribution":"value1","bb.xx":"44"}}

 

자세한 API 작업은 Nacos 공식 웹사이트 Open API 가이드를 참조하세요.

추천

출처blog.csdn.net/zyplanke/article/details/120849248