微服务与分布式架构系统下的服务注册与发现是一个关键的环节,阿里提供的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
更多精彩内容请关注本站!!!