思维导图概念总结,地址:everything will be fine | ProcessOn
spring-cloud-alibaba版本说明
https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E
Spring Boot 2.4+ 和以下版本之间变化较大,目前企业级客户老项目相关 Spring Boot 版本仍停留在 Spring Boot 2.4 以下,为了同时满足存量用户和新用户不同需求,社区以 Spring Boot 2.4 为分界线,同时维护 2.2.x 和 2021.x 两个分支迭代
Nacos学习
官方网址
名字服务 (Naming Service)
提供分布式系统中所有对象(Object)、实体(Entity)的“名字”到关联的元数据之间的映射管理服务,例如 ServiceName -> Endpoints Info, Distributed Lock Name -> Lock Owner/Status Info, DNS Domain Name -> IP List, 服务发现和 DNS 就是名字服务的2大场景。
配置服务 (Configuration Service)
在服务或者应用运行过程中,提供动态配置或者元数据以及配置管理的服务提供者。
OpenAPI可以借助api去查实例,注册实例等。。(某些接口在版本更新得时候未及时更新,比如注销实例)
版本对比
2.X | 1.X | |
底层的通信协议 | grpc | http协议 |
注册中心数据存放位置 | \data\protocol\raft\naming_persistent_service_v2 持久实例存在此目录 | ..\data\naming\data 持久实例存在此目录,临时实例存在内存中 |
集群搭建 | Nacos2.x版本相比1.X新增了gRPC的通信方式,因此需要增加2个端口。新增端口是在配置的主端口(server.port)基础上,进行一定偏移量自动生成。与主端口的偏移量1000--客户端gRPC请求服务端端口,用于客户端向服务端发起连接和请求,1001--服务端gRPC请求服务端端口,用于服务间同步等 |
Nacos基本概念
服务 (Service)
服务是指一个或一组软件功能(例如特定信息的检索或一组操作的执行),其目的是不同的客户端可以为不同的目的重用(例如通过跨进程的网络调用)。Nacos 支持主流的服务生态,如 Kubernetes Service、gRPC|Dubbo RPC Service 或者 Spring Cloud RESTful Service。
服务注册中心 (Service Registry)
服务注册中心,它是服务及其实例和元数据的数据库。服务实例在启动时注册到服务注册表,并在关闭时注销。服务和路由器的客户端查询服务注册表以查找服务的可用实例。服务注册中心可能会调用服务实例的健康检查 API 来验证它是否能够处理请求。
服务元数据 (Service Metadata)
服务元数据是指包括服务端点(endpoints)、服务标签、服务版本号、服务实例权重、路由规则、安全策略等描述服务的数据。
服务提供方 (Service Provider)
是指提供可复用和可调用服务的应用方。
服务消费方 (Service Consumer)
是指会发起对某个服务调用的应用方。
Nacos注册中心核心功能
服务注册:Nacos Client会通过发送REST请求的方式向Nacos Server注册自己的服务,提供自身的元数据,比如ip地址、端口等信息。Nacos Server接收到注册请求后,就会把这些元数据信息存储在一个双层的内存Map中。
服务心跳:在服务注册后,Nacos Client会维护一个定时心跳来持续通知Nacos Server,说明服务一直处于可用状态,防止被剔除。默认5s发送一次心跳。
服务同步:Nacos Server集群之间会互相同步服务实例,用来保证服务信息的一致性。
服务发现:服务消费者(Nacos Client)在调用服务提供者的服务时,会发送一个REST请求给Nacos Server,获取上面注册的服务清单,并且缓存在Nacos Client本地,同时会在Nacos Client本地开启一个定时任务定时拉取服务端最新的注册表信息更新到本地缓存
服务健康检查:Nacos Server会开启一个定时任务用来检查注册服务实例的健康情况,对于超过15s没有收到客户端心跳的实例会将它的healthy属性置为false(客户端服务发现时不会发现),如果某个实例超过30秒没有收到心跳,直接剔除该实例(被剔除的实例如果恢复发送心跳则会重新注册)
Nacos服务下载
https://github.com/alibaba/nacos/releases
Nacos服务启动
启动脚本里默认是cluster,需要改成standlone
配置文件在\conf下application.properties(说明nacos也是基于springboot 实现的)
可配置:配置端口,数据源spring.datasource.platform=mysql,如果不配置数据源,默认存在内存中,集群肯定是要配置数据库的
Nacos客户端引入Nacos注册中心
在1.4.1版本之后启动类不需要加EnableDiscoverClient
1.引入pom
父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.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.12.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.pppp.qqqq</groupId>
<artifactId>spring-cloud-alibaba</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>spring-cloud-alibaba</name>
<packaging>pom</packaging>
<description>Demo project for vip-spring-cloud-alibaba</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Hoxton.SR12</spring-cloud.version>
<spring-cloud-alibaba.version>2.2.8.RELEASE</spring-cloud-alibaba.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
</project>
当前项目pom中引入依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
2.配置文件
server:
port: 8040
spring:
application:
name: mall-user #微服务名称
#配置nacos注册中心地址
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
#需要在nacos中建命名空间取id过来
namespace: 49c955cf-1cd8-46a9-9823-aeb98ed3d602
cluster-name: qf
group: qf
#ephemeral: false
#不配也可以,默认就是nacos
username: nacos
password: nacos
其他详细配置可参考https://github.com/alibaba/spring-cloud-alibaba/wiki/Nacos-discovery
3.启动客户端服务日志
c.a.c.n.registry.NacosServiceRegistry : nacos registry, DEFAULT_GROUP mall-user 192.168.31.20:8040 register finished
4.注册中心界面
用openApi查询实例
服务逻辑隔离
Namespace 隔离设计
命名空间(Namespace)用于进行租户(用户)粒度的隔离,Namespace 的常用场景之一是不同环境的隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。
修改yml配置
1 spring:
2 application:
3 name: mall-user #微服务名称
4
5 cloud:
6 nacos:
7 discovery:
8 server-addr: 127.0.0.1:8848 #配置nacos注册中心地址
9 namespace: bc50d386-8870-4a26-8803-0187486c57be # dev 开发环境
group服务分组
不同的服务可以归类到同一分组,group也可以起到服务隔离的作用。yml中可以通过spring.cloud.nacos.discovery.group参数配置
临时实例与持久实例
配置方式
1 spring:
2 application:
3 name: mall-user #微服务名称
4
5 cloud:
6 nacos:
7 discovery:
8 server-addr: 127.0.0.1:8848 #配置nacos注册中心地址
9 namespace: bc50d386-8870-4a26-8803-0187486c57be # dev 开发环境
10 ephemeral: false # 持久化实例
在2.X之后同一个服务不能同时注册临时实例和持久实例
持久实例存放路径\data\protocol\raft\naming_persistent_service_v2
在定义上区分临时实例和持久化 实例的关键是健康检查的方式。临时实例使用客户端上报模式,而持久化实例使用服务端反向探测模式。
在大中型的公司里,这两种类型的服务往往都有。⼀些基础的组件例如数据库、缓存等,这些往往不能上报心跳,这种类型的服务在注册时,就需要作为持久化实例注册。而上层的业务服务,例如 微服务或者 Dubbo 服务,服务的 Provider 端支持添加汇报心跳的逻辑,此时就可以使用动态服务的注册方式。
Nacos 1.x 中持久化及非 持久化的属性是作为实例的⼀个元数据进行存储和识别。Nacos 2.x 中继续沿用了持久化及非持久化的设定,但是有了⼀些调整。在 Nacos2.0 中将是否持久化的数据抽象至服务级别, 且不再允许⼀个服务同时存在持久化实例和非持久化实例,实例的持久化属性继承自服务的持久化属性
核心代码
ServiceRegistry.java
//springcloud提供的服务注册的接口,如果自己写服务中心,则实现这个接口即可,在spring-cloud-commons
NamingService.java
public static void main(String[] args) throws NacosException {
Properties properties = new Properties();
properties.setProperty("serverAddr", "192.168.31.20:8848");
//核心接口
NamingService naming = NamingFactory.createNamingService(properties);
//服务注册
naming.registerInstance("mall-user", "192.168.31.21", 8889, "ppppp");
//服务发现
System.out.println(naming.getAllInstances("mall-user"));
}
源码出自: com.alibaba.nacos.api.naming.NamingService