一、SpringCloud Alibaba Nacos
Nacos:分别为Naming和Configuration的前两个字母,最后的s为Service,一个更易于构建云原生应用的动态服务发现,配置管理和服务管理中心。Nacos就是注册中心+配置中心的组合,等价于,Nacos = Eureka+Config+Bus。所以Nacos能替代Eureka做服务注册中心,Nacos替代Config做服务配置中心。
Nacos做服务注册中心与其他注册中心的比较
二、安装并运行Nacos
- 先从官网下载Nacos:https://github.com/alibaba/nacos/releases/tag/1.1.4
- 解压安装包,直接运行bin目录下的startup.cmd
三、Nacos作为服务注册中心
3.1、服务提供者
-
新建Spring Boot 的Module名称 :cloudalibaba-provider-payment9001
-
pom.xml添加如下依赖
<!--父POM--> <!--spring cloud alibaba 2.1.0.RELEASE--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>2.1.0.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency>
<!--本模块POM--> <dependencies> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.62</version> </dependency> </dependencies>
- 编写application.yml
server:
port: 9001
spring:
application:
name: nacos-payment-provider
cloud:
nacos:
discovery:
server-addr: localhost:8848 #配置Nacos地址
management:
endpoints:
web:
exposure:
include: '*'
- 主启动
@EnableDiscoveryClient @SpringBootApplication public class PaymentMain9001 { public static void main(String[] args) { SpringApplication.run(PaymentMain9001.class,args); } }
- 业务类
@RestController public class PaymentController{ @Value("${server.port}") private String serverPort; @GetMapping(value = "/payment/nacos/{id}") public String getPayment(@PathVariable("id") Integer id){ return "nacos registry, serverPort: "+ serverPort+"\t id"+id; } }
- 测试:http://lcoalhost:9001/payment/nacos/1;
为了下一章节演示nacos的负载均衡,参照9001新建9002
3.2、服务消费者
<dependencies> <!--SpringCloud ailibaba nacos --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>
为什么nacos支持负载均衡,因为nacos集成了netflix-ribbon。
- 编写application.yml
server: port: 83 spring: application: name: nacos-order-consumer cloud: nacos: discovery: server-addr: localhost:8848 service-url: nacos-user-service: http://nacos-payment-provider
- 主启动
@EnableDiscoveryClient @SpringBootApplication public class OrderNacosMain83{ public static void main(String[] args){ SpringApplication.run(OrderNacosMain83.class,args); }
@Bean @LoadBalanced public RestTemplate getRestTemplate(){ return new RestTemplate(); } }
- 业务类
@RestController @Slf4j public class OrderNacosController{ @Resource private RestTemplate restTemplate; @Value("${service-url.nacos-user-service}") private String serverURL; @GetMapping(value = "/consumer/payment/nacos/{id}") public String paymentInfo(@PathVariable("id") Long id){ return restTemplate.getForObject(serverURL+"/payment/nacos/"+id,String.class); } }
- 测试:http://localhost:83/consumer/payment/nacos/13;83访问9001/9002,轮询负载OK
3.3、各种注册中心对比
Nacos全景图所示
各种注册中心对比
模式选择:如果不需要存储服务级别的信息且服务实例是通过nacos-client注册,并能够保持心跳上报,那么就可以选择AP模式,当前主流的服务如:Spring cloud和 Dubbo服务,都适用于AP模式,AP模式为了服务的可能性而减弱了一致性,因此AP模式下只支持注册临时实例。
curl -X PUT ‘$NACOS_SERVER:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP’
<dependencies> <!--nacos-config--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency> <!--nacos-discovery--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <!--web + actuator--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <!--一般基础配置--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>
- 编写application.yml
nacos和Springcloud-config一样,在项目初始时,要保证先从配置中心进行配置拉去,拉去配置之后,才能保证项目的正常启动。
Springboot中配置文件的加载时存在优先级顺序的,bootstrap优先级高于application。
1、编写bootstrap.yml
server: port: 3377 spring: application: name: nacos-config-client cloud: nacos: discovery: server-addr: localhost:8848 #服务注册中心地址 config: server-addr: localhost:8848 #配置中心地址 file-extension: yaml #指定yaml格式的配置
2、编写application.yml
spring:
profiles:
active: dev
- 主启动
@EnableDiscoveryClient @SpringBootApplication public class NacosConfigClientMain3377{ public static void main(String[] args) { SpringApplication.run(NacosConfigClientMain3377.class, args); } }
- 业务类
@RestController @RefreshScope public class ConfigClientController{ @Value("${config.info}") private String configInfo; @GetMapping("/config/info") public String getConfigInfo() { return configInfo; } }
通过Spring Cloud原生注解@RefreshScope实现配置自动更新。
通过官网:
在Nacos中添加配置信息
- 配置:设置DataId
-
-
公式${spring.application.name}-${spring.profile.active}.${spring.cloud.nacos.config.file-extension}
-
prefix默认为spring.application.name的值
-
spring.profile.active既为当前环境对应的profile,可以通过配置项spring.profile.active 来配置
-
-
总结说明
-
-
启动前需要在nacos客户端-配置管理-配置管理栏目下有没有对应的yaml配置文件
-
运行cloud-config-nacos-client3377的主启动类
-
调用接口查看配置信息 http://localhost:3377/config/info
-
-
自带动态刷新
-
(1)、多环境多项目管理的问题
问题1 | 问题2 |
实际开发中, 通常会为一个系统准备多套环境dev/test/prod 如何保证指定环境启动时服务能够正确读取到Nacos上相应环境的配置文件呢 |
一个大型分布式服务费系统会有很多微服务子项目, 每个微服务项目有都会有相应的开发环境,测试环境、正式环境.... 那么怎么对这些微服务配置进行管理呢。 |
首先看下nacos的管理页面
配置列表中的dataID、group和命名空间namespace三者关系?
- Namespace+Group+Data ID
- 类似Java里面的package名和类名,最外层的namespace是可以用来区分部署环境的,Group和DataID逻辑上区分两个目标对象。
- 默认情况:
- NameSpace=public,Group=DEFAULT_GROUP,默认Cluster是DEAFAULT。
- Nacos默认的命名空间是public,Namespace主要用来实现隔离。比方说我们现在有三个环境:开发、测试、生产环境,那么我们就可以创建三个Namespace,不同的NameSpace之间是隔离的。
- Group默认是DEFAULT_GROUP,GROUP可以把不同的微服务划分到同一个分组里面去。
- service就是微服务:一个service可以包含多个Cluster(集群),Nacos默认Cluster是DEAFAULT,Cluster是对指定微服务的一个虚拟划分。比方说为了容灾,将Service微服务分别部署在杭州机房和广州机房。这时给杭州机房的Service微服务起一个集群名称(HZ),给广州机房的Service微服务起一个集群名称(GZ),还可以尽量让同一个机房的微服务相互调用,以提升性能。
- 最后是Instance(微服务的服务实例)
(2)、案例
①、DataID方案
1、新建dev配置DataID
2、新建test配置DataID
3、通过spring.profile.active属性就能进行多环境下配置文件的读取
4、测试
- http://localhost:3377/config/info
- bootstrap.yml中配置是什么就加载什么
②、Group方案
通过Group实现环境区分
1、新建Group
2、在nacos图形界面控制台上面新建配置文件DataID
3、修改bootstrap+application
在config下增加一条group的配置即可。可配置为DEV_GROUP或TEST_GROUP
③、Namespace方案
1、新建dev/test的Namespace
2、回到服务管理-服务列表查看
3、按照域名配置填写
因此开源的时候推荐用户把所有服务列表放到一个vip(虚拟IP,可以使用Nginx)下面,然后挂到一个域名下面。
- http://ip1:port/openAPI直连IP模式,机器挂了则需要修改IP才能使用。
- http://VIP:port?openAPI挂载VIP模式,直连vip即可,下面挂server真是ip,可读性不好
- http://nacos.com:port/openAPI
说明:https://nacos.io/zh-cn/docs/deployment.html
默认Nacos使用嵌入式数据库实现数据的存储,所以,如果启动多个默认配置下的Nacos节点,数据存储是存在一致性问题的。为了解决这个问题,Nacos采用了集中式存储的方式来支持集群化部署,目前只支持MySQL的存储。
spring.datasource.platform=mysql db.num=1 db.url.0=jdbc:mysql://11.162.196.16:3306/nacos_devtest?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true db.user= db.password=
再以单机模式启动nacos,nacos所有写嵌入式数据库的数据都写到mysql
CREATE DATABASE nacos_config; USE nacos_config;
-- 粘贴运行nacos-mysql.sql里面的脚本
- nacos-server-1.1.4\nacos\conf目录下找到application.properties修改存储库
spring.datasource.platform=mysql db.num=1 db.url.0=jdbc:mysql://localhost:3306/nacos_devtest?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true db.user=root db.password=root
启动nacos,可以看到是个全新的空记录界面,以前是记录进derby
(1)、预备环境准备
-
64 bit OSlinux/unix/Mac,推荐使用linxu
-
64 bit JDK 1.8+
-
Maven 3.2x+
-
3个或者3个以上nacos节点才能构成集群
(2)、下载源码或者安装包
Nacos下载linux版本 https://github.com/alibaba/nacos/releases/tag/1.1.4
nacos-server-1.1.4.tar.gz
解压后安装
(3)、集群配置步骤(重点)
①、Linux服务器上mysql数据库配置
- SQL脚本存放位置
ll /usr/local/nacos/conf/
自己Linux机器上的Mysql数据库创建库,粘贴运行脚本
②、application.properties文件
spring.datasource.platform=mysql db.num=1 db.url.0=jdbc:mysql://192.168.126.139:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true db.user=root db.password=root
# mysql 授权远程访问 GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION; flush privileges;
③、Linux服务器上nacos的集群配置cluster.conf
vim cluster.conf
这个IP不能写127.0.0.1,必须是Linux命令hostname -i能够识别的IP
④、编辑Nacos的启动脚本startup.sh,使它能够接受不同的启动端
-
-
修改内容
vim /usr/local/bin/startup.sh
- 执行
⑤、Nginx的配置,由它作为负载均衡器
修改nginx的配置文件
upstream cluster{ server 192.168.126.140:3333; server 192.168.126.140:4444; server 192.168.126.140:5555; } server{ listen 1111; server_name localhost; location /{ proxy_pass http://cluster; } ....省略
按照指定启动
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf.nacos
⑥、截止到此处,1个Nginx+3个nacos注册中心+1个mysql
测试通过nginx访问nacos:https://192.168.126.138:1111/nacos/#/login
新建一个配置测试
⑦、测试
微服务cloudalibaba-provider-payment9002启动注册进nacos集群
yam文件
server-addr: 写你自己的虚拟机ip:1111
高可用小总结