목차
첨부 1: Nacos 서비스 등록 검색 클라이언트 임시 저장소 디렉터리
첨부 3: Java 코드는 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 가이드를 참조하세요.