【cloud Alibaba】(一)服务注册和配置中心——Nacos
各位小伙伴们大家好,欢迎来到这个小扎扎的spring cloud专栏,在这个系列专栏中我对B站尚硅谷阳哥的spring cloud教程进行一个总结,鉴于 看到就是学到、学到就是赚到 精神,这波依然是血赚 ┗|`O′|┛
💡Nacos知识点速览
- 🍹 Nacos
- 🍸 什么是SpringCloud Alibaba
- 🍸 什么是Nacos?
- 🍸 Nacos下载安装
- 🍹 Nacos的使用
- 🍸 Nacos服务注册与发现
- 🍷 服务提供方9001、9002模块
- 🍷 服务消费者83模块
- 🍷 nacos作注册中心与其他的区别
- 🍸 Nacos作配置中心
- 🍷 基础配置
- 🍷 进阶配置
- 🍹 Nacos集群和持久化配置
- 🍸 持久化数据库切换
- 🍸 nacos集群配置
- 🍸 nginx负载均衡
🍹 Nacos
🍸 什么是SpringCloud Alibaba
前面已经学习过了SpringCloud为什么还要学习SpringCloud Alibaba?这是因为SpringCloud Netflix项目进入了维护模式,意味着 SpringCloud Netflix 将不再开发新的组件,维护中的组件将通过平行组件所替代。于是SpringCloud Alibaba应运而生,是目前比较主流的分布式微服务开发框架,它是在SpringCloud的基础上建立的
🍸 什么是Nacos?
Nacos是SpringCloud Alibaba中的一个十分重要的组件,它的名字取自Nameing Configuration Service,这也就意味着Nacos承担着服务注册和配置中心的责任,也就相当于SpringCloud中erueka+config+bus的组合版。springcloud官网如是介绍到Nacos:阿里巴巴开源产品,一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
🍸 Nacos下载安装
下载地址:https://github.com/alibaba/nacos/tags
下载完成之后解压缩zip压缩包,即可双击bin目录下的startup.cmd文件启动nacos的单机版进行使用,启动之后的nacos可以在浏览器通过url链接http://localhost:8848/nacos访问图形化界面,默认的用户名和密码都是nacos
🍹 Nacos的使用
🍸 Nacos服务注册与发现
首先在使用SpringCloud Alibaba之前,必须在父项目的pom文件中引入SpringCloud Alibaba的依赖
<!--spring cloud 阿里巴巴-->
<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>
🍷 服务提供方9001、9002模块
这里以9001支付模块为例,9002参考9001模块进行创建
第一步: 创建maven项目并引入nacos依赖
<!--SpringCloud ailibaba nacos -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
第二步: 配置文件
server:
port: 9001
spring:
application:
name: nacos-payment-provider
cloud:
nacos:
discovery:
server-addr: localhost:8848 #配置Nacos地址
#端口暴露
management:
endpoints:
web:
exposure:
include: '*'
第三步: 主启动类使用@EnableDiscoveryClient注解标注开启注册功能
@EnableDiscoveryClient
@SpringBootApplication
public class CloudAlibabaPayment9001 {
public static void main(String[] args) {
SpringApplication.run(CloudAlibabaPayment9001.class, args);
System.out.println("启动成功");
}
}
第三步: controller接口
@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;
}
}
🍷 服务消费者83模块
第一步: 创建maven项目并引入nacos依赖
<!--SpringCloud ailibaba nacos -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
第二步: 配置文件
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注解标注开启注册功能
@EnableDiscoveryClient
@SpringBootApplication
public class CloudAlibabaConsumeOrder83 {
public static void main(String[] args) {
SpringApplication.run(CloudAlibabaConsumeOrder83.class, args);
System.out.println("启动成功");
}
}
第四步: 由于使用到了ribbon的rpc调用,于是需要使用代码进行相关配置
@Configuration
public class ApplicationContextConfig {
@Bean
@LoadBalanced
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
}
第五步: controller接口
@RestController
@RequestMapping("consumer")
public class OrderNacosController {
@Resource
private RestTemplate restTemplate;
/**
* 从application.yml配置文件中读取该配置的值
*/
@Value("${service-url.nacos-user-service}")
private String serverURL;
@GetMapping(value = "/payment/nacos/{id}")
public String paymentInfo(@PathVariable("id") Long id) {
return restTemplate.getForObject(serverURL + "/payment/nacos/" + id, String.class);
}
}
经过上述的配置,目前注册中心中一共有三个服务,分别是服务提供者9001和9002,、服务消费者83。由于nacos的依赖里整合了ribbon依赖,所以说导入nacos依赖后可以实现服务访问的负载均衡操作,在服务消费方进行RestTemplate配置后,即可rpc远程轮询两个服务提供方。于是通过反复发送http://localhost:83/consumer/payment/nacos/23请求,即可发现数据是依次从9001和9002返回
🍷 nacos作注册中心与其他的区别
之前学习过Eureka和Zookeeper作服务的注册与发现,在CAP原则方面,Eureka选择使用AP原则,而Zookeeper选择使用CP原则,但是Nacos却可以在AP和CP原则之间进行切换,只需要使用一行PUT请求即可实现
curl -X PUT '$NACOS_SERVER:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP'
🍸 Nacos作配置中心
🍷 基础配置
第一步: 创建maven项目并引入nacos依赖
<!--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>
第二步: 配置文件,按加载顺序配置
bootstrap.yml
spring:
profiles:
active: dev
application.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格式的配置
第三步: 主启动类使用@EnableDiscoveryClient注解标注开启注册功能
@EnableDiscoveryClient
@SpringBootApplication
public class ConfigNacosClient3377 {
public static void main(String[] args) {
SpringApplication.run(ConfigNacosClient3377.class, args);
System.out.println("启动成功");
}
}
第四步: controller接口
@RestController
@RefreshScope // nacos的动态刷新
public class ConfigClientController {
@Value("${config.info}")
private String configInfo;
@GetMapping("/config/info")
public String getConfigInfo() {
return configInfo;
}
}
第五步: 创建远程配置文件, 之前的springcloud远程配置使用的是GitHub或者Gitee实现,nacos则可以在它的图形化界面上直接创建配置文件,配置文件名的匹配规则如下
也就是说,以本次项目为例,nacos上配置文件的命名应该是nacos-config-client-dev.yaml
启动配置服务3377的主启动类,浏览器访问http://localhost:3377/config/info
因为nacos支持动态刷新,所以当nacos上的配置文件值进行修改后,直接刷新链接即可刷新配置的值,反观springcloud Config还需要发送post请求手动刷新才能获取到最新的配置信息
🍷 进阶配置
为什么需要进阶配置?
- 在实际开发中,通常—个系统会准备dev开发环境、test测试环境、prod生产环境…进阶配置可以保证指定环境启动时服务能正确读取到Nacos上相应环境的配置文件。
- 一个大型分布式微服务系统会有很多微服务子项目,每个微服务项目又都会有相应的开发环境、测试环境、预发环境、正式环境……那怎么对这些微服务配置进行管理呢?
nacos的配置文件有Namespace命名空间(用于区分环境)、Group分组、Data lD文件名,它使用Namespace+Group+Data lD唯一定位一个在nacos上的远程配置文件。其中如果不进行配置指定的话,Namespace默认为public、Group默认为DEFAULT_GROUP,Data lD必须通过配置文件指定,匹配规则参考基础配置篇
分组group配置
在默认public命名空间里有两个同名配置文件,但是它们的分组不同
命名空间namespace配置
配置文件bootstra.yml中配置的namespace值是命名空间ID,而不是名字
🍹 Nacos集群和持久化配置
若想要实现Nacos集群的集群配置,需要三样东西:一个Nginx集群作为VIP进行负载均衡,一个nacos集群进行远程配置,一个MySQL进行集群配置的集中式存储,也就是以下这张官方给出的Nacos集群架构图(下面的所有配置操作都在Linux中完成,官方推荐在Linux中搭建nacos集群)
🍸 持久化数据库切换
nacos的远程配置将配置数据存储在内置的derby中(apache的一种内嵌式数据库),如果想要部署nacos集群,肯定不能让配置数据存储在集群成员各自的derby中,不然就会造成各成员间的数据不一致的现象。为了解决这一问题,我们需要一个集中式存储的方式来支持集群化部署,目前nacos只支持MySQL的存储,于是我们只能选择使用MySQL
第一步: 找到nacos安装目录下的conf文件夹里的nacos-mysql.sql,在Navicat中创建一个新的数据库并运行该sql文件,或者是使用命令运行,运行成功就会生成11张表,这些表就存储着nacos的各种信息数据
第二步: 修改conf文件下的application.properties文件配置你的MySQL数据库连接,如果你的nacos之前配置过其他ip的数据库就注释掉,如果没有就直接把以下配置配到该文件的最下面
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://数据库ip地址,本地就是localhost:3306/上一步创建的数据库名称?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=数据库的用户名
db.password=数据库的密码
重启nacos服务重新访问nacos的图形化界面url就会得到一个干干净净的没有任何配置的nacos,而且这个nacos的所有新增配置都将会存储在application.properties文件配置的MySQL数据库中
🍸 nacos集群配置
第一步: 复制conf文件夹下的cluster.conf.example命名为cluster.conf,修改其中配置,先使用命令hostname -i来获取Linux的ip,然后把得到的ip加自定义端口号配置到cluster.conf文件中,配置到这个文件上的三个端口号在启动后会被认为是同一个nacos集群上的成员
第二步: 复制bin文件夹下的start.sh文件命名为start.sh.bk作为备用,修改start.sh文件以达到可以通过-p命令的方式启动不同端口的nacos
第三步: 修改start.sh文件最下面的
当修改完成之后就可以通过命令./startup.sh -p XXXX来以不同的端口号启动nacos了
🍸 nginx负载均衡
复制nginx的conf文件夹下的nginx.conf命名为nginx.conf.bk,修改nginx.conf.中的配置
启动Nacos集群:
进入nacos的bin目录下
./startup.sh -p 3333
./startup.sh -p 4444
./startup.sh -p 5555
启动nginx(-c指定配置文件的路径):
进入nginx的sbin目录下
./nginx -c /usr/local/nginx/conf/nginx.conf
访问192.168.159.121:1111 如果可以进入nacos的web界面,就证明安装成功了
注册进nacos集群
将服务提供者微服务注册进nacos集群(此时nacos扮演的角色是注册中心,而不是配置中心),可以通过配置文件来完成
以上操作,以9002模块视角分析就是如下情况