SpringCloud Alibaba——高级(二)Nacos 服务注册和配置中心
Nacos 服务注册和配置中心
一、Nacos简介
1、是什么
一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台
Nacos:Dynamic Naming and Configuration service
就是注册中心+配置中心的组合
等价于
Nacos=Eureka+Config+Bus
2、能干嘛
替代Eureka做服务注册中心
替代Config做服务配置中心
3、去哪下
4、各种注册中心比较
二、安装运行Nacos
1、本地Java8+Maven环境
2、官网下载Nacos
3、解压安装包,直接运行bin目录下的startup.cmd
4、命令运行成功后直接访问http://localhost:8848/nacos
默认登录账号密码都是nacos
5、结果页面
三、Nacos作为服务注册中心演示
1、官网文档
2、基于Nacos的服务提供者
1)新建Module
cloudalibaba-provider-payment9001
2)POM
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
3)YML
server:
port: 9001
spring:
application:
name: nacos-payment-provider
cloud:
nacos:
discovery:
server-addr: 127.0.0.0:8848 #配置Nacos地址
management:
endpoints:
web:
exposure:
inslude: '*'
4)主启动类
package com.atguigu.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient
public class PaymentMain9002 {
public static void main(String[] args) {
SpringApplication.run(PaymentMain9002.class,args);
}
}
5)业务类
package com.atguigu.springcloud.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class PaymentController {
@Value("${server.port}")
private String serverPort;
@GetMapping("/payment/nacos/{id}")
public String getPayment(@PathVariable("id") Integer id){
return "nacos registry, serverPort: "+serverPort+"\t id"+id;
}
}
6)测试
http://localhost:9001/payment/nacos/1
7)为了下一张章节演示nacos的负载均衡,参照9001新建9002
如果想拷贝一个虚拟映射
3、基于Nacos的服务消费者
1)新建 Module
cloudalibaba-consumer-nacod-order83
2)pom
同上
3)yml
server:
port: 83
spring:
application:
name: nacos-order-consumer
cloud:
nacos:
discovery:
server-addr: 127.0.0.0:8848
#消费者将要去访问的微服务名称 (注册成功进nacos的微服务提供者)
service-url:
nacos-user-service: http://nacos-payment-provider
4)主启动类
package com.atguigu.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient
public class OrderNacosMain83 {
public static void main(String[] args) {
SpringApplication.run(OrderNacosMain83.class,args);
}
}
5)业务类
Config:
package com.atguigu.springcloud.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;
@Configuration
public class ApplicationContextConfig {
@Bean
@LoadBalanced
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
Controller:
package com.atguigu.springcloud.controller;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import javax.annotation.Resource;
@RestController
@Slf4j
public class OrderNacosController {
//之前的写法
//public static final String SERVER_URL="http://nacos-payment-provider";
//实现配置和代码分离
@Value("${service-url.nacos-user-service}")
private String serverURL;
@Resource
private RestTemplate restTemplate;
@GetMapping("/consumer/payment/nacos/{id}")
public String paymentInfo(@PathVariable("id") Long id){
return restTemplate.getForObject(serverURL+"/payment/nacos/"+id,String.class);
}
}
6)测试
启动8848/9001/9002/83
http://localhost:83/consumer/payment/nacos/13
4、服务注册中心对比
1)Nacos全景图所示
2)Nacos和CAP
Nacos | Eureka | Consul | CoreDNS | Zookeeper | |
---|---|---|---|---|---|
一致性协议 | CP+AP | AP | CP | / | CP |
健康检查 | TCP/HTTP/MySQL/Client Beat | Client Beat | TCP/HTTP/gRPC | / | Client Beat |
负载均衡 | 权重/DSL/metadata/CMDB | Ribbon | Fabio | RR | / |
雪崩保护 | 支持 | 支持 | 不支持 | 不支持 | 不支持 |
自动注销实例 | 支持 | 支持 | 不支持 | 不支持 | 支持 |
访问协议 | HTTP/DNS/UDP | HTTP | HTTP/DNS | DNS | TCP |
监听支持 | 支持 | 支持 | 支持 | 不支持 | 支持 |
多数据中心 | 支持 | 支持 | 支持 | 不支持 | 不支持 |
跨注册中心 | 支持 | 不支持 | 支持 | 不支持 | 不支持 |
SpringCloud 集成 | 支持 | 支持 | 支持 | 不支持 | 不支持 |
Dubbo 集成 | 支持 | 不支持 | 不支持 | 不支持 | 支持 |
K8s集成 | 支持 | 不支持 | 支持 | 支持 | 不支持 |
3)切换
Nacos支持AP和CP模式切换
C是所有节点在同一时间看到的数据都是一致的(数据一致);而A的定义是多有的请求都会收到响应(高可用)
切换模式:
curl -X PUT '$NACOS_SERVER:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP'
四、Nacos作为服务配置中心演示
1、Nacos作为配置中心-基础演示
1)新建cloudalibaba-config-nacos-client3377
2)pom
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
3)yml
俩个:
Nacos同SpringCloud-config一样 ,在项目初始化时,要保证先从配置中心进行配置拉取,拉取配置后,才能保证项目的正常启动。
bootstrap高于application
bootstrap.yml:
server:
port: 3377
spring:
application:
name: nacos-config-client
cloud:
nacos:
discovery:
server-addr: 101.200.198.216:8848 #Nacos服务注册中心地址
config:
server-addr: 101.200.198.216:8848 #Nacos配置中心地址
file-extension: yaml #指定yaml格式的配置
application.yml:
spring:
profiles:
active: dev #表示开发环境
4)主启动类
package com.atguigu.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@EnableDiscoveryClient
@SpringBootApplication
public class NacosConfigClientMain3377 {
public static void main(String[] args) {
SpringApplication.run(NacosConfigClientMain3377.class,args);
}
}
5)业务类
package com.atguigu.springcloud.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RefreshScope //支持Nacos的动态刷新功能
public class ConfigClientController {
@Value("${config.info}")
private String configInfo;
@GetMapping("/config/info")
public String getConfigInfo(){
return configInfo;
}
}
6)在Nacos中添加配置信息
匹配规则:
1>理论:
Nacos中的dataid的组成格式及与SpringBoot配置文件中的匹配规则
官网地址
在 Nacos Spring Cloud 中,dataId 的完整格式如下:
${prefix}-${spring.profile.active}.${file-extension}
2>实操
小总结:
7)测试
http://localhost:3377/config/info
8)自带动态刷新
2、Nacos作为配置中心-分类配置
1)问题
多环境多项目管理
问题1
实际开发中,通常一个系统会准备
dev开发环境
test测试环境
prod生成环境
如何保证指定环境启动时服务能正确读取到Nacos上相应环境的配置文件?
问题2
一个大型分布式微服务系统会有很多微服务子项目,
每个微服务项目又都会相应的开发环境、测试环境、预发环境、正式环境等
怎么对这些微服务配置进行管理呢?
2)Nacos的图形化管理界面
3)Namespace+Group+Data ID 三者的关系,为什么这么设计
类似Java里面的package名和类名
最外层的namespace是可以用于区分部署环境的,Group和DataID逻辑上区分两个目标对象
三者情况:
Nacos默认的命名空间是public,Namespace主要用来实现隔离的、
比方说我们现在又三个环境:开发、测试、生成环境,我们就可以创建三个Namespace,不同的Namespace之间是隔离的。
Group可以把不同的微服务划分到同一个分组里面去。
Service就是微服务;一个Service可以包含多个Cluster(集群),Nacos默认Cluster是DEFAULT,Clulster是对指定微服务的一个虚拟划分。
比方说为了容灾,将Service微服务分别部署在了杭州机房和广州机房,
这时就可以给杭州机房的Service微服务起一个集群名称(HZ),
给广州机房的Service微服务起一个集群名称(GZ),还可以尽量让同一个机房的微服务互相调用,以提升性能。
最后Instance,就是微服务的实例
4)Case三种方案加载配置
1>DataID方案
指定spring.profile.active和配置文件的DataID来使不同环境下读取不同的配置
默认命名空间+默认分组+新建dev和test两个不同的DataID
通过spring.profile.active属性就能进行多环境下配配置文件的读取
测试:
http://localhost:3377/config/info
配什么就加载什么
2>Group方案
通过Group实现环境区分——新建Group
在nacos图形界面控制台上面新建配置文件DataID
bootstrap+application
group: TEST_GROUP
3>Namespace方案
新建 dev/test的Namespace
回到服务管理-服务列表查看
按照域名配置填写
YML
namespace: 0d8e05fe-6fb9-4879-8e62-abcf0c411e16
测试:
http://localhost:3377/config/info
五、Nacos集群和持久化配置(重要)
1、官网说明
1)官网架构图:
2)上图翻译
3)说明
默认Nacos使用嵌入式数据库实现数据的存储。所以,如果启动多个默认配置下的Nacos节点,数据存储是存在一致性问题的。为了解决这个问题,Nacos采用了集中式存储的方式来支持集群化部署,目前只支持MySQL的存储
2、Nacos持久化配置解释
1)Nacos默认自带的是嵌入式数据库derby
2)derby到mysql切换配置步骤
1、nacos-server-1.1.4/nacos/conf目录下找到SQL脚本
nacos-mysql.sql
执行脚本
2、nacos-server-1.1.4/nacos/conf目录下找到application.properties
将如下代码追加到该文件后面
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=nacos_devtest
db.password=youdontknow
3)启动Nacos,可以看到是个全新的空记录界面,以前是记录进derby
3、Linux版Nacos+MySQL生产环境配置
1)预计需要环境
1个Nginx+3个Nacos注册中心+1个Mysql
2)Nacos下载Linux版
下载地址
Linux版本,下载好上传到Linux系统中,
或者可以直接在Linux系统中下载
指令如下:
wget https://github.com/alibaba/nacos/releases/download/1.1.4/nacos-server-1.1.4.tar.gz
下载完成解压
tar -zxvf nacos-server-1.1.4.tar.gz
解压后的目录:
3)集群配置步骤(重点)
1>Linux服务器上mysql数据库配置
SQL脚本:
在Linux系统的mysql上运行该脚本
创建了如下表:
2>application.properties配置
修改conf目录下的application.properties文件
vim application.properties
按i启动文件编辑
在后面追加如下配置
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=nacos_devtest
db.password=youdontknow
修改完以后按 Shift+:wq 保存文件
3>Linux服务器上 nacos的集群配置cluster.conf
复制文件 cluster.conf 并修改
修改后cluster.conf文件内容为
(你自己的ip及每个nacos的端口号)
注:这个ip不能写127.0.0.1,必须是Linux命令hostname -i 能够识别的IP
4>编辑Nacos的启动脚本startup.sh,使它能够接受不同的启动端口
目录:nacos/bin/startup.sh
集群启动,我们希望可以类似其他软件的shell命令,传递不同的端口号启动不同的nacos实例。
命令:startup.sh -p 3333 表示启动端口号为3333的nacos服务器实例,和上一步的cluster.conf配置的一致
具体操作
cp startup.sh startup.sh.bk
先拷贝一份,防止改错
修改完成
启动方法 :
startup.sh -p 3333
startup.sh -p 4444
startup.sh -p 5555
5>Nginx的配置,由它作为负载均衡器
目录conf/nginx.conf
6>截止到此处,1个Nginx+3个nacos注册中心+1个mysql
启动nginx和三台nacos
启动nacos:
./startup.sh -p 3333
./startup.sh -p 4444
./startup.sh -p 5555
查看nacos集群个数
ps -ef|grep nacos|grep -v grep|wc -l
在sbin目录下启动nginx(使用我们修改的配置文件)
./nginx -c /root/nginx-1.16.1/conf/nginx.conf
查看nginx是否启动
ps -ef|grep nginx
测试:
http://192.168.111.144:1111/nacos
4)测试
修改yml中的server-addr
server-addr: 192.168.111.144:1111
5)高可用小总结
推荐阅读
-
springCloud使用Nacos作为服务发现与注册中心,配置中心
-
SpringCloud + Nacos 做服务注册与配置中心
-
Nacos作为微服务注册中心和配置中心详解
-
Nacos 作为服务注册中心和配置中心 简单Demo
-
Nacos作为微服务架构的注册发现中心和配置中心
-
Spring Cloud Alibaba 整合nacos作为注册中心和配置中心
-
Spring Cloud Alibaba:Nacos 作为注册中心和配置中心使用
-
Spring Cloud Alibaba配置Nacos,作为注册中心和配置中心
-
springcloud学习记录-Alibaba Nacos服务注册和配置中心
-
18.SpringCloud Alibaba Nacos服务注册和配置中心