微服务与分布式架构系统下的服务注册与发现是一个关键的环节,阿里提供的nacos以其安装与配置简单、功能强大而著称,是当前微服务与分布式项目开发中微服务治理工具的首选。
一、nacos简介
1、是阿里开源,遵循CAP中的AP原则
2、注册中心应用
3、配置中心应用
二、nacos服务的安装与配置
1、nacos下载
- 全称是什么?
Naming Configuration Service,中文为“命名配置服务”。
- nacos是什么?
是注册中心+配置中心+配置总线功能的组合,这里只介绍注册中心功能,其数据存储在内存中
- 去哪儿下载?
下载地址:Releases · alibaba/nacos · GitHub
官网文档:Redirecting to: https://nacos.io/
2、nacos在Windows中安装与配置
windows下只是为了开发方便,使用的是单机模式,nacos的windows版本默认使用的就是单机模式。
(1)将解压后的nacos文件夹,拷贝到D\programd中
(2)在nacos的bin目录中,双击startup.cmd启动服务
(3)登录nacos管理页,用户名与密码都为nacos
3、nacos在Linux中安装与配置参考
在生产环境中,nacos肯定是集群模式,nacos至少三个节点才能构成集群,节点中的数据存储在mysql中。
3.1 Linux安装jdk1.8或以上版本
安装参考本站:Linux与CentOS系统管理及网络服务应用技巧-CSDN博客
3.2 修改bin/startup.sh文件
1、启动方式默认就是集群,不必修改export MODE="cluster"
2、nacos启动默认使用jvm内存2个g,如果服务器内存不足,可调整内存大小
JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx256m -Xmn128m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=128m"
3.3 数据库初始化修改conf/application.properties
修改端口号,端口号分别为8848,8849,8850
server.port=8848
mysql持久
创建数据库
# 选择mysql持久化 spring.datasource.platform=mysql # 数据库数量 db.num=1 spring.datasource.platform=mysql # 数据连接配置 db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true db.user=root db.password=123
3.4 集群配置
1、设置集群地址
改名把conf/cluster.conf.example 改为为cluster.conf
设置ip和端口
2、产生三个服务
mv nacos/ nacos8848
cp -r nacos8848/ nacos8850
cp -r nacos8848/ nacos8849
3、修改后两个端口号
vi nacos8849/conf/application.propertiesserver.port=8849
vi nacos8850/conf/application.propertiesserver.port=8850
4、启动,依次执行如下命令
nacos8848/bin/startup.sh
nacos8849/bin/startup.sh
nacos8850/bin/startup.sh
5、测试,访问任意一个节点,输入帐号和密码,默认是nacos,观察集群管理中的节点列表http://192.168.188.107:8850/nacos
192.168.188.107:8848 192.168.188.107:8849 192.168.188.107:8850
三、nacos工作原理
1、服务注册
注册服务服务提供者client向nacos注册自己的服务信息(如:自己的ip,端口,服务名等信息),nacos会把这些信息存储在一个map中。
服务心跳client在注册后,会使用定时器默认每5秒向nacos发送一次心跳,用来说明本client是活跃状态。
2、服务发现
获取服务信息消费者client在调用服务提供者时,会向nacos发送请求,获取指定服务的注册数据,并缓存在client本地。
定时更新消费者开启一个定时器任务,拉取nacos最新的服务列表到本地缓存。
3、nacos服务
集群nacos集群之间会相互同步数据,在一至性方面,默认是ap,也可切换到cp。
建康检查nacos会定时检查已注册的服务实例的建康信息,如果超过15s都没有某实例的心跳,会将其healthy值设置为false,这种状态的服务信息不会在服务发现时获取,如果nacos超过30s都没收到该实例的心跳,会从服务列表中剔除,直到该实例恢复了心跳则重新注册。
四、nacos的应用
创建Spring boot的project项目,名称为mynacos,在此项目下分别创建两个module:provider与consumer
1、注册服务
创建一个module模块,名称为provider服务提供者,并进行配置。
- pom文件
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>
- yml文件
server: port: 8001 mybatis: type-aliases-package: com.mysoft.beans mapper-locations: [classpath:mapper/**/*.xml] spring: application: name: provider-dept # 在注册中心上显示的服务名 cloud: nacos: discovery: server-addr: localhost:8848 # nacos地址,如果没有配置nacos地址,则默认就是localhost:8848 datasource: # 数据库连接池与数据库配置 type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://localhost:3306/mydb username: root password: 1234
- 主类添加注解:@EnableDiscoveryClient用于服务发现
@EnableDiscoveryClient @SpringBootApplication public class ProviderApplication { public static void main(String[] args) { SpringApplication.run(ProviderApplication.class, args); System.out.println("提供者"); }
- 启动该provider,观看nacos服务管理列表中是否有服务注册
2、发现服务
创建一个module模块,名称consumer服务消费者,并进行配置。
- pom文件
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>
- yml文件
server: port: 80 spring: application: name: consumer-na cloud: nacos: discovery: server-addr: 127.0.0.1:8848
- 主类添加注解@EnableFeignClients
@EnableFeignClients @SpringBootApplication public class ConsumerApplication { public static void main(String[] args) { SpringApplication.run(ConsumerApplication.class, args); //默认为提供者,可以通过Java设置为消费模式 System.out.println("消费者"); } }
- controller类
@RestController public class DeptController_Consumer { //static String url="http://localhost:8001"; static String url="http://provider-dept"; @Autowired RestTemplate tmp; @RequestMapping("/consumer/dept/get/{id}") public Dept get(@PathVariable Integer id){ System.out.println("id:"+id); return tmp.getForObject(url+"/dept/get/"+id,Dept.class); } @RequestMapping("/consumer/dept/list") public List<Dept> list(){ return tmp.getForObject(url+"/dept",List.class); } }
- 修改配置类
@Configuration public class ConfigBean { @Bean //loadBalanced作用:在发起http请求时,会到注册中心读取服务对应的ip列表 @LoadBalanced public RestTemplate getRestTmp(){ return new RestTemplate(); } }
- 启动该consumer,观看nacos服务管理列表中是否有服务注册
3、测试一下
浏览器地址栏输入:localhost/consumer/dept/list
更多精彩内容请关注本站!!!