1-CloudAlibaba-Nacos
(注册中心)学习笔记 2020.10.13
前言:
阿里的
Nacos
为什么要使用他, 而不使用Eureka
或者Consul
这些微服常用的注册中心。阿里的
Nacos
优势在于更易于构建原生应用的动态服务发现、配置管理和服务管理平台。简单的相当
Nacos
拥有了注册中心(类似Eureka
)与配置中心(CloudConfig
) 加上CloudBus
(实时刷新配置属性,生效)、3个功能技术的集合。同时支持
CP
数据强一致性模式, 支持注册持久化实例, 该模式注册实例时必须先注册服务实例, 如果服务实例不存在则直接报错, 类似就是启动消费者的时候,引用到了提供者服务, 必须提供者服务先存在与注册中心, 否则直接报错。同时也支持切换AP高可用模式, 为了可用性减弱了数据一致性, 所以仅支持临时实例,
1.0 Docker
环境下安装Nacos
(官网)
1.1 下载Nacos
镜像
docker pull nacos/nacos-server
1.2 启动Nacos
容器 (使用内置derby数据库) (其他启动属性)
docker run -id --name nacos-standalone -e MODE=standalone -p 8848:8848 (镜像ID)
PS:
-e MODE=standalone
表示是启动单机版本。
1.3 启动完成后进行访问
http://公网IP:8848/nacos/
如果能看到登录页面, 则说明服务正常启动了。
账号密码默认都是:
nacos
2.0 使用Nacos
作为服务注册中心
2.1 新建提供者model
/引入依赖
前面父
POM
文件已经引入了阿里的cloud版本锁定与管理, 所以子模块引入不需要指定版本。
<!--SpringCloud ailibaba nacos -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
Nacos
与其他注册中心技术一样, 集成了netflix-ribbon
依赖, 自带负载均衡策略。启动多个相同服务名的服务, 当消费者进行调用时候会默认使用轮询策略进行多台相同服务实例的调用。
2.2 编写application.yml
配置文件增加Nacos
属性
server:
port: 9001
spring:
application:
name: nacos-provider # 服务名称
cloud:
nacos:
discovery:
server-addr: 公网IP:8848 #配置Nacos地址
# 开放监控管理路径
management:
endpoints:
web:
exposure:
include: '*'
2.3 主启动类/引导类上加上Cloud
提供服务发现注解@EnableDiscoveryClient
@EnableDiscoveryClient // 增加服务发现注解
@SpringBootApplication
@RestController
public class NacosProvider
{
public static void main(String[] args) {
SpringApplication.run(NacosProvider.class, args);
}
@Value("${server.port}")
private String serverPort;
@GetMapping(value = "/nacos/{id}")
public String getPort(@PathVariable("id") Integer id)
{
return "nacos registry, serverPort: "+ serverPort+"\t id"+id;
}
}
2.4 启动服务进行测试
将提供者服务启动, 然后上
Nacos
管理界面上查看是否服务成功注册上去。
3.0 新建消费model
/引入依赖
<!--SpringCloud ailibaba nacos -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--SpringCloud openfeign -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
3.1 编写application.yml
配置文件增加Nacos
属性
server:
port: 8080
spring:
application:
name: nacos-consumer
cloud:
nacos:
discovery:
server-addr: 公网IP:8848
3.2 主启动类/引导类上加上Cloud
提供服务发现注解与启用openfeign
注解
@EnableDiscoveryClient
@SpringBootApplication // 启用服务发现
@EnableFeignClients // 启用openfeign
@RestController
public class NacosConsumer
{
public static void main(String[] args)
{
SpringApplication.run(NacosConsumer.class,args);
}
@Autowired
private FeginClient feginClient;
@GetMapping(value = "/consumer/nacos/{id}")
public String consumer(@PathVariable("id") Integer id)
{
//进行服务调用
return feginClient.getPort(id);
}
}
3.3 编写FeginClient
接口
@FeignClient(name = "nacos-provider") //注解要指定服务名 _不能有下划线
public interface FeginClient {
@GetMapping(value = "/nacos/{id}")
public String getPort(@PathVariable("id") Integer id);
}
3.4 进行调用测试
http://localhost:8080/consumer/nacos/888
结果: (实现了默认的轮询策略调用)
nacos registry, serverPort: 9001 id888
nacos registry, serverPort: 9002 id888
扩展:
4.0 不使用内置,使用自定义MySQL数据库进行持久化配置 (所以需要我们自己配置)
在0.7版本之前,在单机模式时nacos使用嵌入式数据库实现数据的存储,不方便观察数据存储的基本情况。0.7版本增加了支持mysql数据源能力,具体的操作步骤:
1.安装数据库,版本要求:5.6.5+
2.初始化mysql数据库,数据库初始化文件:nacos-mysql.sql (数据库脚本官网链接)
4.1 连接上docker原有的MySQL数据库容器执行nacos-mysql.sql脚本
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GYBBFicH-1602641521006)(%5B!%5B04KnmT.png%5D%28https://s1.ax1x.com/2020/10/13/04KnmT.png%29%5D%28https://imgchr.com/i/04KnmT%29#pic_center)]
4.2 带指定属性的启动Nacos容器 (启动属性说明)
指定我们的MySQL数据库。
查询MySQL容器IP : docker inspect (容器ID) | grep IPAddress
MYSQL_SERVICE_HOST=MySQL容器IP
docker run -id --name zhihai_nacos-standalone -e MODE=standalone -e SPRING_DATASOURCE_PLATFORM=mysql -e MYSQL_SERVICE_HOST=172.17.0.3 -e MYSQL_SERVICE_PORT=3306 -e MYSQL_SERVICE_DB_NAME=nacos -e MYSQL_SERVICE_USER=root -e MYSQL_SERVICE_PASSWORD=root -e JVM_XMS=320m -e JVM_XMX=320m -e JVM_XMN=128m -p 8848:8848 (镜像ID)
PS: 本人购买的虚拟机内存就2G , 在没加上启动属性: -e JVM_XMS=320m -e JVM_XMX=320m -e JVM_XMN=128m 的时候, 启动出现了以下错误。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PKgpNyqm-1602641659829)(%5B!%5B04bI0g.jpg%5D%28https://s1.ax1x.com/2020/10/14/04bI0g.jpg%29%5D%28https://imgchr.com/i/04bI0g%29#pic_center)]
找了好久, 我猜是Jvm分配内存过大的原因, 所以加上上面自定义启动属性来启动容器, 进行默认分配就正常启动了。
代表nacos
很吃内存, 如果内存不大, 可能就需要考虑使用其他注册中心服务器。
Nacos
集群默认支持的是CAP原则中的AP原则,但是也可切换为CP原则,切换命令如下:
curl -X PUT '$NACOS_SERVER:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP'
1