上篇我们练习了基于SpringBoot的Nacos 配置中心功能,这篇我们将探索nacos作为注册中心的使用。
在测试过程中,发现SpringBoot和Spring Cloud 项目两者的引用方式和配置项都是不一致的,所以请大家使用时注意。
Spring Boot 下注册中心的配置
在上节我们搭建的项目nacos-client中直接添加配置:
pom.xml中 添加:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2.1.2.RELEASE</version>
</dependency>
bootstrap.properties中添加
#注册中心地址
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8000
spring.cloud.nacos.discovery.namespace=9403ddc2-f9b1-4220-b22c-3572ddaf9c6b
spring.cloud.nacos.discovery.group=TEST_GROUP
我们在添加配置项时,可以看到有很多参数可以控制,这里我们先不具体介绍,更多参数信息可参考官网:https://nacos.io/zh-cn/docs/system-configurations.html
启动类添加@EnableDiscoveryClient注解:
启动项目:
启动前服务列表中是没有任何节点的:
启动日志:
2020-05-17 23:28:59.200 INFO 22564 --- [ main] com.alibaba.nacos.client.naming : [BEAT] adding beat: {"cluster":"DEFAULT","ip":"192.168.19.1","metadata":{"preserved.register.source":"SPRING_CLOUD"},"period":5000,"port":8001,"scheduled":false,"serviceName":"TEST_GROUP@@nacos-test","stopped":false,"weight":1.0} to beat map.
2020-05-17 23:28:59.265 INFO 22564 --- [ main] com.alibaba.nacos.client.naming : [REGISTER-SERVICE] 9403ddc2-f9b1-4220-b22c-3572ddaf9c6b registering service TEST_GROUP@@nacos-test with instance: {"clusterName":"DEFAULT","enabled":true,"ephemeral":true,"healthy":true,"instanceHeartBeatInterval":5000,"instanceHeartBeatTimeOut":15000,"ip":"192.168.19.1","ipDeleteTimeout":30000,"metadata":{"preserved.register.source":"SPRING_CLOUD"},"port":8001,"weight":1.0}
2020-05-17 23:28:59.308 INFO 22564 --- [ main] c.a.c.n.registry.NacosServiceRegistry : nacos registry, TEST_GROUP nacos-test 192.168.19.1:8001 register finished
这段日志包含了我们的注册信息,此时再次查看服务列表:
点击详情,可以看到我们注册的TEST_GROUP分组。
创建测试类:
package com.tolerance.nacosclient.controller;
import com.alibaba.nacos.api.exception.NacosException;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
@RequestMapping("/discovery")
public class DiscoveryController {
@RequestMapping("/test")
@ResponseBody
public String test() throws NacosException {
System.out.println("============");
return " INTER DiscoveryController test ";
}
}
访问测试类:http://localhost:8002/discovery/get
到此,服务注册配置完成,下面我们创建环境进行验证测试:
我们开始创建测试环境,环境信息:
一个主服务,我们请求该服务,该服务通过nacos中心调用接口提供的服务集群,集群由两个服务组成,其中一个用Spring Boot项目,也就是我们刚刚搭建好的,另一个相同的服务使用Spring Cloud 来创建,创建过程不在详细叙述,测试配置如下:
搭建主服务nacos-caller
配置测试项:
端口:8001
连接nacos配置中心:http://localhost:8000
使用命名空间:nacosTest
使用分组:CALLER-GROUP
nacos配置文件:nacos-caller.properties
项目配置文件:pom.xml , bootstrap.properties
<?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>com.tolerance</groupId>
<artifactId>tolerance</artifactId>
<version>1.0.0</version>
</parent>
<groupId>com.tolerance</groupId>
<artifactId>nacos-caller</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>nacos-caller</name>
<description>Demo project for Spring Boot</description>
<properties>
<nacos.version>1.2.1</nacos.version>
</properties>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>2.1.2.RELEASE</version>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2.1.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
</project>
#配置中心地址
spring.cloud.nacos.config.server-addr=localhost:8000
#读取文件类型,支持properties和yaml
spring.cloud.nacos.config.file-extension=properties
#读取文件的名称前缀,默认是spring.application.name的值
spring.cloud.nacos.config.prefix=nacos-caller
#读取文件所在的命名空间 命名空间的ID,目前不支持名称
spring.cloud.nacos.config.namespace=9403ddc2-f9b1-4220-b22c-3572ddaf9c6b
#读取文件所在的分组
spring.cloud.nacos.config.group=CALLER-GROUP
#构成 Nacos 配置管理 dataId字段的一部分 完整命名规则为:${prefix}-${spring.profile.active}.${file-extension}
spring.application.name=nacos-caller
#服务发现配置开始
#注册中心地址
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8000
spring.cloud.nacos.discovery.namespace=9403ddc2-f9b1-4220-b22c-3572ddaf9c6b
#服务分组
spring.cloud.nacos.discovery.group=NACOS-CLIENT-GROUP
#服务名称
spring.cloud.nacos.discovery.service=nacos-server
添加测试类:TestController.java
package com.tolerance.nacoscaller.controller;
import com.sun.org.apache.bcel.internal.generic.RET;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
@RestController
@RequestMapping("/test")
@RefreshScope
public class TestController {
@Value("${server.port}")
private String port;
@Value("${spring.application.name}")
private String applicationName;
@Value("${GroupEnv}")
private String groupEnv;
@Autowired
private RestTemplate restTemplate;
private String url = "http://nacos-client/test/getENV";
@RequestMapping("/getENV")
public String getENV() {
System.out.println("applicationName======"+applicationName);
System.out.println("groupEnv======"+groupEnv);
System.out.println("port======"+port);
return restTemplate.getForObject(url,String.class);
// return applicationName+"--"+groupEnv+"--"+port;
}
}
启动类 NacosCallerApplication.java:
package com.tolerance.nacoscaller;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
@SpringBootApplication
@EnableDiscoveryClient
public class NacosCallerApplication {
public static void main(String[] args) {
SpringApplication.run(NacosCallerApplication.class, args);
}
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
此时nacos 配置中心截图:
主服务我们定义为调用者,这里也需要进行注册。
注意,注册的分组名称,必须与服务注册的分组名称一直,只有在相同分组的服务,才能通过服务名称相互调用(也可能使我还没找到不同分组下的调用方式)
搭建注册服务nacos-spring-client
配置测试项:
端口:8002
连接nacos配置中心:http://localhost:8000
使用命名空间:nacosTest
使用分组:SPRING-CLIENT-GROUP
nacos配置文件:nacos-spring-client.properties
项目配置文件:pom.xml , bootstrap.properties
添加测试类:TestController.java
启动类添加注解:@EnableDiscoveryClient
#配置中心地址
spring.cloud.nacos.config.server-addr=localhost:8000
#读取文件类型,支持properties和yaml
spring.cloud.nacos.config.file-extension=properties
#读取文件的名称前缀,默认是spring.application.name的值
spring.cloud.nacos.config.prefix=nacos-cloud-client
#读取文件所在的命名空间 命名空间的ID,目前不支持名称
spring.cloud.nacos.config.namespace=9403ddc2-f9b1-4220-b22c-3572ddaf9c6b
#读取文件所在的分组
spring.cloud.nacos.config.group=CLOUD-CLIENT-GROUP
#构成 Nacos 配置管理 dataId字段的一部分 完整命名规则为:${prefix}-${spring.profile.active}.${file-extension}
spring.application.name=nacos-cloud-client
#服务发现配置开始
#注册中心地址
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8000
spring.cloud.nacos.discovery.namespace=9403ddc2-f9b1-4220-b22c-3572ddaf9c6b
#服务分组
spring.cloud.nacos.discovery.group=NACOS-CLIENT-GROUP
#服务名称
spring.cloud.nacos.discovery.service=nacos-client
<?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>com.tolerance</groupId>
<artifactId>tolerance</artifactId>
<version>1.0.0</version>
</parent>
<groupId>com.tolerance</groupId>
<artifactId>nacos-spring-client</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>nacos-spring-client</name>
<description>Demo project for Spring Boot</description>
<properties>
<nacos.version>1.2.1</nacos.version>
</properties>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>2.1.2.RELEASE</version>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2.1.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
</project>
package com.tolerance.nacosspringclient.controller;
import com.alibaba.nacos.api.annotation.NacosInjected;
import com.alibaba.nacos.api.exception.NacosException;
import com.alibaba.nacos.api.naming.NamingService;
import com.alibaba.nacos.api.naming.pojo.Instance;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
@RequestMapping("/test")
@RefreshScope
public class TestController {
@Value("${server.port}")
private String port;
@Value("${spring.application.name}")
private String applicationName;
@Value("${GroupEnv}")
private String groupEnv;
@NacosInjected
private NamingService namingService;
@RequestMapping("/getENV")
public String getENV() {
System.out.println("applicationName======"+applicationName);
System.out.println("groupEnv======"+groupEnv);
System.out.println("port======"+port);
return applicationName+"--"+groupEnv+"--"+port;
}
@RequestMapping(value = "/getnamingService")
@ResponseBody
public List<Instance> getnamingService(@RequestParam String serviceName) throws NacosException {
System.out.println("serviceName======"+serviceName);
return namingService.getAllInstances(serviceName);
}
}
启动项目访问:http://localhost:8002/test/getENV
此时nacos配置中心:
搭建注册服务nacos-cloud-client
配置测试项:
端口:8003
连接nacos配置中心:http://localhost:8000
使用命名空间:nacosTest
使用分组:CLOUD-CLIENT-GROUP
nacos配置文件:nacos-cloud-client.properties
项目配置文件:pom.xml , bootstrap.properties
添加测试类:TestController.java
启动类添加注解:@EnableDiscoveryClient
<?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>com.tolerance</groupId>
<artifactId>tolerance</artifactId>
<version>1.0.0</version>
</parent>
<groupId>com.tolerance</groupId>
<artifactId>nacos-cloud-client</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>nacos-cloud-client</name>
<description>Demo project for Spring Boot</description>
<properties>
<nacos.version>1.2.1</nacos.version>
</properties>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>2.1.2.RELEASE</version>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2.1.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
</project>
package com.tolerance.nacoscloudclient.controller;
import com.alibaba.nacos.api.annotation.NacosInjected;
import com.alibaba.nacos.api.exception.NacosException;
import com.alibaba.nacos.api.naming.NamingService;
import com.alibaba.nacos.api.naming.pojo.Instance;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
@RequestMapping("/test")
@RefreshScope
public class TestController {
@Value("${server.port}")
private String port;
@Value("${spring.application.name}")
private String applicationName;
@Value("${GroupEnv}")
private String groupEnv;
@NacosInjected
private NamingService namingService;
@RequestMapping("/getENV")
public String getENV() {
System.out.println("applicationName======"+applicationName);
System.out.println("groupEnv======"+groupEnv);
System.out.println("port======"+port);
return applicationName+"--"+groupEnv+"--"+port;
}
@RequestMapping(value = "/getnamingService")
@ResponseBody
public List<Instance> getnamingService(@RequestParam String serviceName) throws NacosException {
System.out.println("serviceName======"+serviceName);
return namingService.getAllInstances(serviceName);
}
}
此时nacos中配置:
启动项目访问:http://localhost:8003/test/getENV
到现在三个服务搭建完毕,我们看下nacos中服务注册结果:
两个服务注册名字均为nacos-client,分组NACOS-CLIENT-GROUP,实例数是2,点击详情可以看到两个端口的实例:
点击下线可下线服务,点击编辑可配置权重:
开始模拟服务调用:
启动主服务和两个接口服务,启动完成时nacos服务列表:
我们调用主服务接口,通过接口请求nacos-client的注册服务:http://localhost:8001/test/getENV
可以发现,调用结果在不停地变化,说明真正处理的服务的在不停地交替变化。此时已完成三个微服务之间的通信。
Nacos 在服务集群中,可以做一下简单的控制措施:
但是我们一般会使用更专业的流控组件来控制,更详细的以后再细说。这里的简单控制可以自行测试一下,不在赘述。
↓扫码关注不迷路,更多操作持续更新中↓