当前位置: 首页 > news >正文

【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模块视角分析就是如下情况
在这里插入图片描述

相关文章:

  • 我自己制作的导航页网站,源码分享~
  • SpringMvc+Spring+MyBatis+Maven+Ajax+Json注解开发 利用Maven的依赖导入不使用架包模式 (实操十)
  • 编程中什么情况下需要加 volatile?
  • 机器学习数据集读取和预处理
  • 两万字带你了解Java多线程(详细大总结)
  • 转行自学软件测试没后悔,我的经历证明,改变永远没有错
  • Pandas数据分析:快速图表可视化各类操作详解+实例代码(一)
  • mysql的主从创建及mycat的安装
  • OSS存储开放接口规范 和 错误响应
  • 悲观锁、乐观锁和自旋锁
  • RTL8720CM WI-FI+蓝牙,低功耗IoT(物联网)应用 40QFN
  • 程序设计竞赛-过了这个村没这个店
  • C语言实现基于高效率IP路由查找的内容
  • 南大通用GBase8s 常用SQL语句(263)
  • Bootstrap Table 实现 分页选中
  • 【159天】尚学堂高琪Java300集视频精华笔记(128)
  • 〔开发系列〕一次关于小程序开发的深度总结
  • 10个最佳ES6特性 ES7与ES8的特性
  • Create React App 使用
  • EOS是什么
  • javascript从右向左截取指定位数字符的3种方法
  • JavaScript设计模式之工厂模式
  • Vue 动态创建 component
  • Vue.js源码(2):初探List Rendering
  • 七牛云 DV OV EV SSL 证书上线,限时折扣低至 6.75 折!
  • 腾讯优测优分享 | Android碎片化问题小结——关于闪光灯的那些事儿
  • 在GitHub多个账号上使用不同的SSH的配置方法
  • 责任链模式的两种实现
  • RDS-Mysql 物理备份恢复到本地数据库上
  • Spring Batch JSON 支持
  • 曾刷新两项世界纪录,腾讯优图人脸检测算法 DSFD 正式开源 ...
  • ​【数据结构与算法】冒泡排序:简单易懂的排序算法解析
  • ​Python 3 新特性:类型注解
  • # 数论-逆元
  • #我与Java虚拟机的故事#连载17:我的Java技术水平有了一个本质的提升
  • #周末课堂# 【Linux + JVM + Mysql高级性能优化班】(火热报名中~~~)
  • (1)Map集合 (2)异常机制 (3)File类 (4)I/O流
  • (1)安装hadoop之虚拟机准备(配置IP与主机名)
  • (20050108)又读《平凡的世界》
  • (35)远程识别(又称无人机识别)(二)
  • (5)STL算法之复制
  • (7)摄像机和云台
  • (Redis使用系列) Springboot 使用redis的List数据结构实现简单的排队功能场景 九
  • (备忘)Java Map 遍历
  • (附源码)ssm经济信息门户网站 毕业设计 141634
  • (七)Java对象在Hibernate持久化层的状态
  • (五)activiti-modeler 编辑器初步优化
  • (一)pytest自动化测试框架之生成测试报告(mac系统)
  • (转)IOS中获取各种文件的目录路径的方法
  • (转载)Linux 多线程条件变量同步
  • .NET BackgroundWorker
  • .Net Web项目创建比较不错的参考文章
  • .NetCore实践篇:分布式监控Zipkin持久化之殇
  • .NET导入Excel数据
  • .Net调用Java编写的WebServices返回值为Null的解决方法(SoapUI工具测试有返回值)