理解nacos 服务治理(注册中心)、Nacos简介、下载与配置持久化到Mysql

197 阅读5分钟

Nacos简介

什么是Nacos
Nacos致力于帮助您发现、配置和管理微服务。Nacos提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流且管理。
Nacos帮助您更敏捷和容易地构建、交付和管理微服务平台。Nacos是构建以“服务’‘为中心的现代应用架构(例如微服务范式、云原生范式)的服务基础设施。

Nacos全景图
一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。很明显,是阿里巴巴旗下来源为了解决动态服务发现、配置管理和服务管理的组件。
在这里插入图片描述

理解nacos 服务治理(注册中心)

在这里插入图片描述

注册中心

nacos 服务治理 也称注册中心、也叫服务发现

官方的解释是

服务发现及管理
动态服务发现对以服务为中心的(例如微服务和云原生)应用架构方式非常关键。Nacos支持DNS-Based和RPC-Based(Dubbo、gRPC)模式的服务发现。Nacos也提供实时健康检查,以防止将请求发往不健康的主机或服务实例。借助Nacos,您可以更容易地为您的服务实现断路器。

发现和管理微服务,nacos也具有配置中心的功能,但本文主要强调注册中心的功能

Nacos = 服务注册中心 + 服务配置中心 = Eureka + Spring Cloud Config + Spring Cloud Bus + Kafka/RabbitMQ
如官方图所示
在这里插入图片描述

服务提供者------服务注册----》注册中心
服务消费者------服务发现-----》注册中心
服务消费者-------服务调用-----》服务提供者

服务注册:每个服务单元向注册中心登记自己提供服务非常小信息
服务发现:服务调用方向服务注册中心,并获取所有服务实例清单,实现对具体服务实例的访问

常用注册中心 Zookeeper(doubble推荐)

Eureka(自带的建立可以直接采用idea–》—》spring initializr—》 Cloud Discovery - Eureka Server)
Consul
Nacos

Nacos = eureka+config
既可以做注册发现,还加上配置

依赖文件中同时配置注册中心、配置中心

 <!--注册中心客户端-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!--配置中心客户端-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>

服务发现的搭建(SpringBoot框架搭建nacos)

1、添加依赖

<dependency>
    <groupId>com.alibaba.boot</groupId>
    <artifactId>nacos-discovery-spring-boot-starter</artifactId>
    <version>${latest.version}</version>
</dependency>

2、在 application.properties 中配置 Nacos server 的地址:

nacos.discovery.server-addr=127.0.0.1:8848

3、SpringBoot启动类

@SpringBootApplication
public class NacosDiscoveryApplication {

    public static void main(String[] args) {
        SpringApplication.run(NacosDiscoveryApplication.class, args);
    }
}

4、使用 @NacosInjected 注入 Nacos 的 NamingService 实例(核心)

Nacos对于服务注册和发现的支持是通过NamingService接口来实现的,对应的实现类是NacosNamingService。

nacos作为注册中心客户端的接口就是namingService,即名字服务。

需要写的代码,这一步骤,只需要这些

@Controller
@RequestMapping("discovery")
public class DiscoveryController {

    @NacosInjected
    private NamingService namingService;

    @RequestMapping(value = "/get", method = GET)
    @ResponseBody
    public List<Instance> get(@RequestParam String serviceName) throws NacosException {
        return namingService.getAllInstances(serviceName);
    }
}

==============下面的为分析

使用 @NacosInjected 注入 Nacos 的 NamingService 实例:

    @NacosInjected
    private NamingService namingService;

服务消费方通过

namingService.getAllInstances(serviceName)

来实现服务发现,主动拉取服务。

public List<Instance> getAllInstances(String serviceName, String groupName, List<String> clusters, boolean subscribe) throws NacosException {
 
    ServiceInfo serviceInfo;
    if (subscribe) { // 是否订阅了服务
        // 从缓存或注册中心获取服务信息
        serviceInfo = hostReactor.getServiceInfo(NamingUtils.getGroupedName(serviceName, groupName), StringUtils.join(clusters, ","));
    } else {
        // 直接从注册中心获取服务
        // getServiceInfoDirectlyFromServer方法很简单,直接调用serverProxy.queryList(下面会讲)获取服务,
        serviceInfo = hostReactor.getServiceInfoDirectlyFromServer(NamingUtils.getGroupedName(serviceName, groupName), StringUtils.join(clusters, ","));
    }
    List<Instance> list;
    if (serviceInfo == null || CollectionUtils.isEmpty(list = serviceInfo.getHosts())) {
        return new ArrayList<Instance>();
    }
    return list;
}

=================分析结束

5、测试

再次访问 curl http://localhost:8080/discovery/get?serviceName=example,此时看到以上内容,那么nacos服务发现就测试成功了。

[
  {
    "instanceId": "127.0.0.1-8080-DEFAULT-example",
    "ip": "127.0.0.1",
    "port": 8080,
    "weight": 1.0,
    "healthy": true,
    "cluster": {
      "serviceName": null,
      "name": "",
      "healthChecker": {
        "type": "TCP"
      },
      "defaultPort": 80,
      "defaultCheckPort": 80,
      "useIPPort4Check": true,
      "metadata": {}
    },
    "service": null,
    "metadata": {}
  }
]

服务发现的搭建(SpringCloud框架搭建nacos)

1、添加依赖

discovery就是nacos发现的意思。

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    <version>${latest.version}</version>
</dependency>

2、在 application.properties 中配置 Nacos server 的地址:(服务提供者)

server.port=8070
spring.application.name=service-provider

spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848

server.port是服务端口,spring.application.name则是dataId拼接组成的一部分

3、使用@EnableDiscoveryClient 开启服务注册发现功能(服务提供者)

NacosProviderApplication 功能是启动该服务提供者,并且带了Hello Nacos Discovery测试实例,来测试它是服务提供者,并且启动成功了,正常使用

@SpringBootApplication
@EnableDiscoveryClient
public class NacosProviderApplication {

	public static void main(String[] args) {
		SpringApplication.run(NacosProviderApplication.class, args);
	}

	@RestController
	class DemoController {
		@RequestMapping(value = "/echo/{string}", method = RequestMethod.GET)
		public String echo(@PathVariable String string) {
			return "Hello Nacos Discovery " + string;
		}
	}
}

4、在 application.properties 中配置 Nacos server 的地址:(服务消费者)

server.port=8080
spring.application.name=service-consumer

spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848

5、使用@EnableDiscoveryClient 开启服务注册发现功能(服务消费者)

给 RestTemplate 实例添加 @LoadBalanced 注解,开启 @LoadBalanced 与 Ribbon 的集成。( Ribbon 本地负载均衡,在调用微服务接口的时候,会在注册中心上获取注册信息服务列表后缓存到JVM 本地,从而在本地实现RPC远程 服务调用技术。)(Ribbon是Netflix开发的客户端负载均衡器,为Ribbon配置服务提供者地址列表后,Ribbon就可以基于某种负载均衡策略算法,自动地帮助服务消费者去请求提供者。Ribbon默认为我们提供了很多负载均衡算法,例如轮询、随机等,我们也可以实现自定义负载均衡算法)

服务消费者执行http://localhost:8080/echo/2050**,因为8080端口是消费者服务的端口,请求到RestTemplate的getForObject方法,自动拼接参数**http://service-provider/echo/2050**,然后请求到服务提供者去了,输出Hello Nacos Discovery 加上2050传过来的,那么就是Hello Nacos Discovery 2050**

@SpringBootApplication
@EnableDiscoveryClient
public class NacosConsumerApplication {

    @LoadBalanced
    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }

    public static void main(String[] args) {
        SpringApplication.run(NacosConsumerApplication.class, args);
    }

    @RestController
    public class TestController {

        private final RestTemplate restTemplate;

        @Autowired
        public TestController(RestTemplate restTemplate) {this.restTemplate = restTemplate;}

        @RequestMapping(value = "/echo/{str}", method = RequestMethod.GET)
        public String echo(@PathVariable String str) {
            return restTemplate.getForObject("http://service-provider/echo/" + str, String.class);
        }
    }
}

6、测试

启动 ProviderApplication 和 ConsumerApplication ,调用 http://localhost:8080/echo/2050,返回内容为 Hello Nacos Discovery 2050。

下载与配置持久化到Mysql

实现

Nacos官方文档:

nacos.io/zh-cn/docs/…

Nacos下载地址:

github.com/alibaba/nac…

选择指定的稳定版本进行下载,这里是Windows,所以选择zip包进行下载

在这里插入图片描述

下载完成在解压到磁盘某目录

Nacos持久化

防止 Nacos 宕机或重启后数据丢失,Nacos 支持将数据统一持久化到数据库 Mysql(在不配置Nacos持久化到Mysql时,

默认 Nacos 内置了一个嵌入式数据库derby,将一些数据保存到了内置的数据库上,多台 Nacos 就会出现多个内置数据库)。

连接要进行Nacos持久化的Mysql数据库,新建数据库nacos_config

为什么叫nacos_config这个数据库名,因为上面解压之后的Nacos中的conf目录下的nacos-mysql.sql文件中

在这里插入图片描述

其默认的数据库名就是nacos_config

在这里插入图片描述

新建完数据库之后在此数据库中执行上面的nacos-mysql.sql文件,实现数据库的初始化。

然后再回到Nacos解压目录下的conf目录下的application.properties

在这里插入图片描述

将上面这段打开持久化Mysql的代码去掉注释,并将连接到的数据库的url和用户名密码改为自己的。

启动Nacos

然后再回到上面解压目录后的bin目录下

在这里插入图片描述

这里的startup.cmd和shtudown.cmd就是在Windows下的启动好关闭命令,但是如果直接双击的话会报错。

这是因为这里Nacos没有配置集群模式,而是使用的单机模式,所以编辑startup.cmd,

将MODE修改为standalone

在这里插入图片描述

默认MODE的值是"cluster"

所以在走下面的逻辑时会走集群模式的逻辑

编辑之后,双击startup.cmd

在这里插入图片描述

然后打开浏览器访问

http://localhost:8848/nacos/

在这里插入图片描述

默认用户名密码都是nacos

登录成功后

在这里插入图片描述

本文使用 文章同步助手 同步