nacos实战

news2024/11/26 14:59:20

spring cloud是一系列框架的有序集合,是分布式系统构建工具

服务领域模型

不同的组(group)之间不能调用,只能进行组内调用

namespace=》group/service=》cluster=》instance

没有nacos的时候

微服务调用,可以直接使用RestTemplate进行调用。

但是服务量增大,一个服务需要部署在多台服务器上时,使用nginx做负载均衡

springboot与spring cloud alibaba版本对应

版本说明 · alibaba/spring-cloud-alibaba Wiki · GitHub

注册中心

nacos注册中心集成springboot

引入依赖

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

在启动类上加注解

@EnableDiscoveryClient

添加配置

server:
  port: 8081
spring:
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
        service: order-service

使用RestTemplate依赖spring-boot-starter-web

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

启动项目后,nacos中

 服务调用(RestTemplate)

调用双方的服务都注册到nacos中

调用方

在启动类中添加RestTemplate

    @Bean
    @LoadBalanced
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }

Controller,其中,stock-service是被调用方的服务名

    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("order/create")
    public String createOrder(){
        return restTemplate.getForObject("http://stock-service/stock/reduce", String.class);
    }

添加依赖(好像没有这个依赖也可以调用)

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-loadbalancer</artifactId>
        </dependency>

注册中心原理

1. 服务启动时,将服务注册到注册中心中(服务名:实例)

2. 注册中心有心跳机制,定时检测服务是否存活

3. 客户端调用时,会查询注册中心的服务列表

4. 客户端定时拉取注册中心的服务列表,以防服务信息发生改变

5. 当检测到服务发生变化时,注册中心会发送UDP协议进行更新(UDP是不可靠的传输)

nacos注册中心的入口是NacosNamingService

通过Raft协议和Disro协议进行数据同步

AP:Disro协议

CP:Raft协议


nacos集群 

内置的derby改成mysql

使用nacos集群的时候,需要修改nacos的数据源,内置的数据库会导致各个节点数据不一致

 nacos对应的mysql脚本在源码的distribution中

 使用mysql需要修改nacos的配置文件application.properties

### If use MySQL as datasource:
spring.datasource.platform=mysql

### Count of DB:
db.num=1

### Connect URL of DB:
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=nacos
db.password.0=nacos

修改cluster.conf

使用nacos集群,需要修改cluster.conf中的相应配置,修改成集群的ip和端口

nginx对集群进行负载均衡

 application.yml中对应的服务地址也需要添加

集群启动命令

startup.cmd -m cluster

 

配置中心

常用的配置中心

Apollo(阿波罗、国产)

1.统一管理不同环境、不同集群的配置2.配置修改实时生效(热发布)
3版本发布管理
4.灰度发布
5.权限管理、发布审核、操作审计
6.提供开放平台API

Disconf(百度,用的较少)

Spring cloud Config

基于git存储配置,缺少可视化界面

naocs 数据模型

Nacos 数据模型 Key 由三元组唯一确定, Namespace默认是空串,公共命名空间(public),分组默认是 DEFAULT_GROUP。

nacos集成springboot

添加依赖

       <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>

nacos作为配置中心不需要在启动类在添加@Enablexxx注解

修改配置文件

需要在bootstrap.properties或者bootstrap.yml中配置,不能在application.xxx中配置

因为bootstrap是应用程序引导执行,早于application执行

spring:
  cloud:
    nacos:
      config:
        server-addr: localhost:8848
        username: nacos
        password: nacos

读取配置

在nacos的配置列表中添加spring.application.name同名的配置,在代码中能够直接读取配置

    @Value("${name}")
    private String name;

    @RequestMapping("getName")
    public String getName(){
        return name;
    }

 通过这段代码,可以拿到配置中的name值

在controller上添加@RefreshScope,可以实现修改修改后拿到最新的配置值(配置自动更新、实时更新)

 没有指定配置文件时,没有写扩展名时,#{spring.application.name}.properties文件会覆盖#{spring.application.name}文件中的配置

例:stock-app.properties中配置了name=zhangsan,stock-app中配置了name=lisi

最终读取到的name是zhangsan

如果指定了扩展名,那么会读取对应扩展名下的配置(stock-app.yaml

 

还可以指定环境,此时读取stock-app-test.yaml

 

还可以指定命名空间,此时读取命名空间是ns1下的配置文件

 

shared-configs可以添加共享配置,优先级最低

extension-configs支持一个应用有多个dataId配置

优先级

共享配置 < 扩展配置 < stock-app < stock-app.yaml < stock-app-dev.yaml

配置动态刷新的原理

动态监听:

push

请求发送到服务端后推送给客户端

需要维护客户端和服务端之间的长链接

pull

客户端定时从服务端拉取变更

时间间隔不好把控

动态刷新:长轮询机制

1. 客户端定时发送请求从服务端拉取变更

2. http请求的超时时间是30s,如果配置没有变更,把http请求封装成ClientLongPoll对象,放在队列中

3. 同时启动一个线程,29.5s后执行

3.1 如果在29.5s中配置没有任务变化,直接返回http对象

3.2 如果在29.5s中配置发生变更,变更的事件会循环队列,找到是哪个请求对应的变更,返回结果,取消延迟线程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/471592.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

React18开发总结(完善中)

遇到这样一个问题&#xff0c;初始化时用户登陆后需要获取到用户信息&#xff0c;但是发现获取用户信息这个接口触发了2次&#xff0c;这是不应该的&#xff0c;于是我查阅了一下资料&#xff0c;把自己的笔记记录下来。 还有就是使用mobx遇到的控制台警告问题&#xff0c;也一…

Python 中如何实现自动导入缺失的库?

在编写 Python 项目的时候&#xff0c;我们经常会遇到导入模块失败的错误&#xff1a; ImportError: No module named xxx或者ModuleNotFoundError: No module named xxx 导入失败&#xff0c;通常分为两种&#xff1a;一种是导入自己写的模块&#xff08;即以 .py 为后缀的文件…

你不想成长,生活总会逼着你成长,阿里P8架构师分享十年学习生涯

成为阿里P8&#xff0c;并不是一件容易的事情&#xff0c;我花了将近十年的时间&#xff0c;才达到了这样的目标。这十年间来&#xff0c;说辛苦也是真辛苦&#xff0c;但这些辛苦是让我感觉到满足的&#xff0c;毕竟这样的成功并不是人人都能够得来的。 为了成为阿里P8的这十…

Linux(ubuntu) 挂载磁盘

前言 很多博客写了一些格式化磁盘&#xff0c;分区等等&#xff0c;这和挂载磁盘的概念是混淆的。分区是为了安装系统&#xff0c;我们挂载磁盘肯定是已经安装好Ubuntu 系统了&#xff0c;分区干什么&#xff0c;误人子弟啊。 另外格式化磁盘并不是挂载磁盘必须的选项&#x…

55.网页设计规则#3_图片和插图

使用好的图片 图片类型 不同类型的图像&#xff1a;产品照片、故事性照片、插图、图案&#xff1b;使用图片来支持你网站的信息和故事。所以只使用相关的图片倾向于使用原始图片。如果不可能&#xff0c;请使用原始外观的图片&#xff08;而不是一般的图片&#xff01;&#…

Numpy方法总简单说明作用

NumPy的大部分代码都是用C语言写的&#xff0c;其底层算法在设计时就有着优异的性能&#xff0c;这使得NumPy比纯Python代码高效得多 NumPy&#xff08;Numerical Python&#xff09;是Python的一种开源的数值计算扩展。这种工具可用来存储和处理大型矩阵&#xff0c;比Python…

JAVAWeb10-Web 开发会话技术-Session-02

1. session 有什么用 ● 思考两个问题—抛砖引玉 不同的用户登录网站后&#xff0c;不管该用户浏览该网站的哪个页面&#xff0c;都可显示登录人的名字&#xff0c;还可以随时去查看自己的购物车中的商品, 是如何实现的?也就是说&#xff0c;一个用户在浏览网站不同页面时&a…

如何高效的学习接口自动化测试?从零开始学习接口自动化测试:选择合适的学习资源和编程语言

目录 引言&#xff1a; 一、学习前的准备 二、选择合适的学习资源 三、实践中学习 四、总结 引言&#xff1a; 在日常的软件开发过程中&#xff0c;接口自动化测试是一个非常重要的环节。接口自动化测试可以帮助我们快速准确地检测出软件中的缺陷&#xff0c;提高软件的质…

更简单的存取Bean方式-@Bean方法注解

1.Bean方法存储 类注解是添加在某个类上的,那么方法注解是添加在某个方法前的 public class UserBeans {Beanpublic User user1(){User user new User();user.setUid(001);user.setUname("zhangsan");user.setAge(19);user.setPassword("123123");retur…

Git/Github操作手册

Git 是目前最流行的版本管理工具&#xff0c;也是程序员的必备技能之一。 这里主要介绍一下git/github远程仓库的使用及相关配置&#xff1a; 一、SSH Keys SSH Keys是什么呢&#xff1f;简单来说相当于一把钥匙&#xff08;在机器中即电脑中进行配置&#xff09;&#xff0…

【Java数据结构】——第九节.向上建堆和向下建堆的区别

作者简介&#xff1a;大家好&#xff0c;我是未央&#xff1b; 博客首页&#xff1a;未央.303 系列专栏&#xff1a;Java初阶数据结构 每日一句&#xff1a;人的一生&#xff0c;可以有所作为的时机只有一次&#xff0c;那就是现在&#xff01;&#xff01;&#xff01; 文章目…

算法训练 | Day41动态规划

343. 整数拆分 思路&#xff1a; 确定dp数组&#xff08;dp table&#xff09;以及下标的含义&#xff1a;dp[i]&#xff1a;分拆数字i&#xff0c;可以得到的最大乘积为dp[i]。 确定递推公式&#xff1a;dp[i] max(dp[i], max((i - j) * j, dp[i - j] * j)) 可以想 dp[i]最…

TimesNet

Key Points 1D变2D 这是本文的核心。大部分现有方法都是作用于时间序列的时间维度&#xff0c;捕获时序依赖性。实际上&#xff0c;现实时间序列一般都有多种模式&#xff0c;比如不同的周期&#xff0c;各种趋势&#xff0c;这些模式混杂在一起。如果直接对原始序列的时间维…

SpringTask任务调度工具的使用

1. Spring Task 1.1 介绍 Spring Task 是Spring框架提供的任务调度工具&#xff0c;可以按照约定的时间自动执行某个代码逻辑。 **定位&#xff1a;**定时任务框架 **作用&#xff1a;**定时自动执行某段Java代码 应用场景&#xff1a; 1). 信用卡每月还款提醒 **强调&…

网络机顶盒哪个好?发烧友实测2023网络机顶盒排名

不懂网络机顶盒哪个好的新手们在选购时大部分会参考排行榜&#xff0c;某知名权威数码网站公布了2023年最新网络机顶盒排名&#xff0c;结果是否公正呢&#xff1f;我自费购入了排名前五的网络机顶盒&#xff0c;进行了十多天的深入测评&#xff0c;今天就来详细聊聊我的真实体…

最近部门新的00后真是卷王,工作没1年,入职18K

都说00后躺平了&#xff0c;但是有一说一&#xff0c;该卷的还是卷。 这不&#xff0c;前段时间我们公司来了个00后&#xff0c;工作都没1年&#xff0c;到我们公司起薪18K&#xff0c;都快接近我了。后来才知道人家是个卷王&#xff0c;从早干到晚就差搬张床到工位睡觉了。 …

2.2 逻辑代数中的三种基本运算

学习建议&#xff1a; 理解运算符的含义&#xff1a;首先&#xff0c;我们需要理解每个逻辑运算符的含义。例如&#xff0c;“与”运算符表示两个输入信号同时为真时输出为真&#xff0c;而“或”运算符表示两个输入信号中至少一个为真时输出为真。 练习运算符的应用&#xff…

使用openssl生成https证书

首先去官网下载openssl工具&#xff1a;Win32/Win64 OpenSSL Installer for Windows - Shining Light Productions (slproweb.com) 然后安装完成需要执行&#xff08;1&#xff09;openssl genrsa -des3 -out root.key 1024 &#xff08;2&#xff09;openssl req -new -key ro…

Java面试题总结 | Java面试题总结7- 计算机网络模块(持续更新)

计算机网络 文章目录 计算机网络get和post的区别TCP和UDPTCP和UDP的应用层协议TCP是如何保证可靠传输的视频聊天用的是TCP还是UDP&#xff0c;为什么可靠的UDP协议UDT(UDP-based Data Transfer Protocol)KCPQUIC Cookie和Session的区别Cookie的优缺点cookie的优点&#xff1a;c…

连ChatGPT都不懂的五一调休,到底怎么来的?

今天是周几&#xff1f; 你上了几天班了&#xff1f; 还要上几天班放假&#xff1f; 五一啥安排&#xff1f; 出行的票抢到了吗&#xff1f; 调休到底是谁发明的&#xff1f;&#xff01; 五一劳动节是要劳动吗&#xff1f; 为什么昨天是周一&#xff0c;今天还是周一&a…