文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

这篇 Nacos 使用详解,可以收藏一下

2024-12-02 02:54

关注

什么是微服务

在了解Nacos之前,我们先来了解一下,什么是微服务?在2014年的时候,一位叫Martin Fowler(马丁·福勒 )的大神,提出了微服务的概念,定义:微服务是由单一应用程序构成的小小服务,拥有独立的进程和轻量化处理,服务依据业务功能设计,用全自动的方式进行部署,能够和其他服务使用HTTP API 进行通信,同时服务会使用最小的规模进行集中管理,服务可以用不同的编程语言与数据库等组件实现。

架构的演变

记得小农刚工作的时候,那时候的服务大多是单体应用,可能完善一点的,会部署集群,就是一个完整的项目部署多台机器,那么随着互联网的发展,网站应用的承载量和规模也在不断的扩大,从而导致我们的系统架构也在不断的进行变化,从互联网早期到如今,系统架构大体经历了(单体 ——> 垂直——>分布式——>SOA——>微服务),如下图所示:

1、单体架构

在最开始的时候,大多数服务都是单体架构,就是把所有的功能点集中在一个项目(应用)里面,统一开发部署,这种开发、部署以及维护成本都比较低。

2、垂直应用架构

所谓的垂直应用架构,就是从单体应用变成多个应用,用来提升效率,比如供应链系统可以拆分为:商品系统、订单系统、履约系统、门户系统、采购系统等等。

3、分布式系统

随着业务的增加,在垂直应用架构中冗余的代码越来越多,需要将冗余的代码抽离出来,统一做成单独的业务层进行处理,变成一个单独的服务,控制层调用不用的业务层服务完成不同的业务功能。具体可以理解为一个项目拆分成表现层和服务层两个部分,服务层实现业务逻辑,表现层处理页面交互。

4、SOA架构

分布式系统中的缺点就是其调用复杂,当我们的服务越来越多或者当某一个服务压力过大需要进行水平拓展和负载均衡,对于资源的调度和治理就需要用到SOA(Service Oriented Architecture)为核心来解决,治理中心还可以帮助我们解决服务之间协议不同的问题。

5、微服务架构

微服务架构在某种程序上来说是SOA架构往下发展的下一步,它更加强服务的“彻底拆分”,目的就是提高效率,微服务架构中,每个服务必须独立部署同时互不影响,微服务架构更加轻巧、轻量级。

微服务架构与SOA架构的不同之处

  1. 微服务架构处理更精细,某个模块只处理对应的功能,让专业的人做专业的事。
  2. 每个服务都独立部署,服务之间互相不影响。
  3. 在SOA架构中可能会数据库存储发生共享,而微服务强调每个服务都是独立数据库,保证每个服务之间的连接互不影响。
  4. 微服务项目架构比SOA架构更适合互联网公司(迅捷开发、更效率的版本迭代、更细粒度)。

微服务在生活中的体验

都说艺术来源于生活,那么技术也同样来自于生活!请举例说明例如:我们去撸串的时候,一般只有一两个人,集收银、招待、厨师于一体,而当我们去酒店的时候,会有专门的接待服务员、收银员、厨师、洗碗工等等,让专业的人做专业的事!

微服务的好处在于,能够将服务进行原子化拆分,独立进行打包、部署和升级,能够保证微服务之间清晰的任务划分,有利于扩展,但是微服务分布式系统开发的技术成本比较高,比如要考虑容错、分布式锁、分布式事务等等,复杂性更高。

Nacos 简介

Nacos (Naming Configuration Service) 归属于 Spring Cloud Alibaba 技术栈下,集动态服务发现、配置和服务管理平台,用于构建元原生应用程序。其中 服务发现是微服务架构中的最关键的组件之一 ,Nacos提供了一组简单易用的特性,可以帮助我们更快速的实现动态服务发现、配置、元数据及流量管理。

什么是Nacos

注册中心 + 配置中心 = Nacos。

为啥使用Nacos?

注册中心对比

CAP模型

在这里我们不得不提到一个很重要的理论,就是CAP模型,这也是分布式系统设计中考虑的三个核心要素:

以上就是CAP原则(又称CAP定理),但是以上三种情况不可能同时满足,分布式系统设计在考虑满足P(分区容错性)的前提下选择C(一致性)还是A(可用性),也就是我们熟悉的 AP 和 CP。

CP原则(分区容错性+一致性)

CP原则属于强一致性原则,要求所有节点可以查询的数据随时都要保持一致,若干个节点形成一个逻辑的共享区域,某一个节点更新的数据都会立即同步到其他数据节点之中,当数据同步完成之后才能返回成功的结果,但是在实际的运行过程中网络的故障在所难免,如果这个时候若干个服务节点之间无法通讯时就会出现错误,牺牲可用性原则(A)。

AP原则(分区容错性+可用性)

AP原则属于弱一致性原则,在集群中只要有存活的节点,那么所发来的所有请求都可以得到正确的详情,在进行数据同步处理操作中即便某些节点没有成功的实现数据同步也返回成功,这样就牺牲了一致性原则(C),可以应用在网络环境不是很好的场景当中。

对于Nacos而言,支持CP和AP两种模式的动态切换,默认为AP

切换命令:

curl -X PUT '$NACOS_SERVER:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP'

Nacos 类似于我们酒店的前台,首先酒店里面的房间打扫干净以后并且符合入住条件的房间会注册到服务台,这样当有客人来就酒店住店,只需要通过前台去查找到可以入驻的房间即可,不需要进行等待,可以快速的入住到酒店。

服务器提供的注册和发现机制可以帮助客人更快速的找到合适的房间。如果没有一个没有服务前台的酒店,客人入驻的时候需要自己寻找合适的房间,因为客人不知道每个房间的情况,无法确定哪个房间是服务入住条件的房间,客人只能一个一个去找,费时费力,同时这也是不合理的。

在微服务中,软件服务各自独立,但是最终是作为一个整体来服务于客户,软件之间也需要彼此通信和方法调用,微服务架构内部发起通讯调用方法的一方,我们称之为 “服务消费者”,提供远程方法的服务器称之为 “服务提供者”。

往往为了提高系统性能,会提供多个服务器作为 服务提供者 ,这个时候服务消费者找服务提供者的过程,就类似于用户在找房间的过程,为了帮助 服务消费者 快速的发现 服务提供者,在微服务框架中都会引入注册中心。

注册中心就类似于酒店的前台,提供在软件服务的注册和发现功能,服务提供者 会先在注册中心进行注册,声明可以进行对外提供服务,而服务消费者只需要通过注册中心找到可以使用的服务,就可以快速使用服务了,注册中心实现了服务提供和服务消费的快速配合的功能。

Nacos 搭建

一般推荐的是我们使用稳定版,官方也会在文档中说明:

下载之后解压后就可以使用:

执行命令:linux/Mac:

sh startup.sh -m standalone。

Windows:

startup.cmd -m standalone。

PS:注意nacos的文件路径一定要是英文,否则启动会报错。

nacos默认使用的数据库为内嵌的cmdb,我们也可以创建本地数据库并修改配置文件指向本地数据库即可(推荐)。

启动成功以后,我们访问:http://localhost:8848/nacos。

用户名密码默认为:nacos/nacos 如下图所示表示我们启动成功!

Nacos 服务端的搭建

Nacos注册中心

服务发现是微服务架构中的关键组件之一。在这样的架构中,手动为每个客户端配置服务列表可能是一项艰巨的任务,并且使动态扩展变得极其困难。Nacos Discovery 帮助您将服务自动注册到 Nacos 服务器,Nacos 服务器会跟踪服务并动态刷新服务列表。此外,Nacos Discovery 将服务实例的一些元数据,如主机、端口、健康检查 URL、主页等注册到 Nacos。

官方API文档:https://spring.io/projects/spring-cloud-alibaba#learn。

有的同学会说,小农我english不太好,别担心,现在浏览器上不是有翻译吗,直接翻译!

创建项目

我们需要创建一个聚合工程,这样如果需要添加新的Nacos服务,直接添加子模块就可以新建父类项目:spring-cloud-alibaba。

新建子类项目:cloud-alibaba-nacos-9001。

POM

父类项目

<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-alibaba-dependenciesartifactId>
<version>2021.0.1.0version>
<type>pomtype>
<scope>importscope>
dependency>
dependencies>
dependencyManagement>


在子项,引入 Nacos Discovery 进行服务注册/发现

<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
dependency>

YML

server:
port: 9001
spring:
application:
name: nacos-provider
cloud:
discovery:
server-addr: localhost:8848

management:
endpoint:
web:
exposure:
include: '*'

启动类:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@SpringBootApplication
@EnableDiscoveryClient //需要添加这个注解
public class CloudAlibabaNacos9001Application {

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

测试类:


@RestController
public class DemoController {
@Value("${server.port}")
private String serverPort;

@GetMapping(value = "/muxiaonong")
public String getServerPort(){
return "hello Nacos Discovery"+serverPort;
}
}

当我们启动服务以后,就可以看到在服务列表中,看到我们启动服务。

参考 cloud-alibaba-nacos-9001 新建一个的服务 cloud-alibaba-nacos-9002。

Nacos消费者负载均衡

新建子类项目:cloud-alibab-consumer-8083。

pom

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.0modelVersion>
<parent>
<groupId>com.muxiaononggroupId>
<artifactId>spring-cloud-alibabaartifactId>
<version>0.0.1-SNAPSHOTversion>
<relativePath/> <!-- lookup parent from repository -->
parent>
<groupId>com.muxiaononggroupId>
<artifactId>cloud-alibab-consumer-8083artifactId>
<version>0.0.1-SNAPSHOTversion>
<name>cloud-alibab-consumer-8083name>
<description>Demo project for Spring Bootdescription>
<properties>
<java.version>1.8java.version>
properties>
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-actuatorartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-devtoolsartifactId>
<scope>runtimescope>
<optional>trueoptional>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-loadbalancerartifactId>
<version>3.1.0version>
dependency>

dependencies>

project>


同时我们也需要在父类项目中添加子类说明

<modules>
<module>cloudalibaba-nacos-9001module>
<module>cloudalibaba-nacos-9002module>
<module>cloudalibab-consumer-nacos-8083module>
modules>

yml

server:
port: 8083
spring:
application:
name: nacos-consumer
cloud:
discovery:
server-addr: localhost:8848

启动类

@SpringBootApplication
@EnableDiscoveryClient
public class CloudAlibabConsumer8083Application {

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

服务间的调用

如果我们想要我们创建服务的消费者去调用服务提供者,就需要通过Ribbon进行调用。

什么是Ribbon

Spring Cloud Ribbon 是一个基于HTTP和TCP客户端负载均衡器,基于Netflix Ribbon实现,通过Spring Cloud的封装,可以让我们很方便的将面向服务的Rest模板请求自动转换成客户端负载均衡服务调用,虽然它知识一个工具类库,不需要进行独立部署,它几乎存在于每一个Spring Cloud 构建的微服务和基础设施中,对于服务间的调用,AP网关的请求转发都需要经过Ribbon负载均衡来实现,而Ribbon的主要作用是:从注册服务器端拿到对应的服务列表后用负载均衡的方式访问对应的服务。

因为Nacos已经整合了Ribbon,所以我们如果想要使用,只需要导入Spring Cloud Alibaba Nacos的依赖就可以直接使用了。

这个需要注意的是nacos自从2020版本之后不再整合的是Netflix,也就没有ribbon了,如果报错说找不到服务是因为,你使用了负载均衡算法,但是没有ribbon了,它不知道该使用哪个服务。所以这里只需要导入spring-cloud-starter-loadbalancer依赖即可。

<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-loadbalancerartifactId>
<version>3.1.0version>
dependency>

Ribbon的基础使用

对于Ribbon进行远程调用,我们通常使用 RestTemplate,其中getForObject是最常用方法,我们只需要在启动类中添加 RestTemplate就可以正常使用。

@Bean
@LoadBalanced //nacos集成了ribbon
public RestTemplate getRestTemplate() {
return new RestTemplate();
}

当body是一个对象时,可以直接这样实现:

User result = restTemplate.getForObject(uri, User.class);

不需要关注请求响应除body外的其他内容时,该函数就非常好用,可以少一个从Response中获取body的步骤。提供了三种不同的重载实现

getForObject(String url, Class responseType, Object ... urlVariables)。

getForObject(String url, Class responseType, Map urlVariables)。

getForObject(URI url, Class responseType)。

Nacos负载均衡

如果想让我们的消费者consuomer去调用服务提供者9001和9002,就是使用到我们的负载均衡了。

yml

server:
port: 8083
spring:
application:
name: nacos-consumer
cloud:
discovery:
server-addr: localhost:8848
# 服务提供者的名称
service-url:
nacos-user-service: http://nacos-provide

启动类上配置restTemplate

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

测试类

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

@RestController
public class DemoController {

@Autowired
private RestTemplate restTemplate;

//访问服务名
@Value("${service-url.nacos-user-service}")
private String serverURL;

@GetMapping(value = "/consumer/nacos")
public String getDiscovery(){
System.out.println(serverURL);
return restTemplate.getForObject(serverURL+"/muxiaonong",String.class);
}

当我们输入:http://localhost:8083/consumer/nacos,就可以看到9001和9002对应的切换显示了 。

Nacos配置中心

上面我们有讲 注册中心 + 配置中心 = Nacos ,前面我们将了注册中心,现在我们来讲一讲如何使用Nacos作为他的配置中心。

为什么使用Nacos配置中心

1、配置属性的动态刷新。

2、配置文件的集中管理。

我们新建一个子项:cloud-alibaba-config-3377。

pom文件:

<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-configartifactId>
dependency>

YML配置:

在这里我们需要配置两个,一个是让当前项目注册到Nacos中,另外一个是去Nacos中读取指定后缀的配置文件。

bootstrap.yml

# nacos配置
server:
port: 3377
spring:
application:
name: nacos-config-client
cloud:
nacos:
discovery:
server-addr: localhost:8848 #Nacos服务注册中心地址
config:
server-addr: localhost:8848 #Nacos作为配置中心地址
file-extension: yaml #指定yaml格式的配置

application.yml

spring:
profiles:
active: dev

启动类同样添加 @EnableDiscoveryClient注解。

测试类:

import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RefreshScope //支持Nacos的动态刷新功能
public class DemoController {
@Value("${config.info}")
private String configInfo;
@GetMapping("/config/info")
public String getConfigInfo(){
return configInfo;
}
}

Nacos的配置规则

官网:​https://nacos.io/zh-cn/docs/quick-start-spring-cloud.html。​

在Nacos Spring Cloud 中,dataId的完整格式如下:

${prefix}-${spring.profiles.active}.${file-extension}
${spring.application.name}-${spring.profiles.active}.${file-extension}
nacos-config-client-dev.yaml
微服务名称-当前环境-文件格式

接下来而我们只需要在Nacos平台上去创建配置系项即可。

修改Nacos配置,不需要重启项目即可自动刷新。

通过链接访问即可。

来源:牧小农内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯