第七篇 nacos 注册中心

上篇我们练习了基于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:8000spring.cloud.nacos.discovery.namespace=9403ddc2-f9b1-4220-b22c-3572ddaf9c6bspring.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和yamlspring.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:8000spring.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 在服务集群中,可以做一下简单的控制措施:

但是我们一般会使用更专业的流控组件来控制,更详细的以后再细说。这里的简单控制可以自行测试一下,不在赘述。

 

 

↓扫码关注不迷路,更多操作持续更新中↓

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值