Alibaba微服务组件Nacos注册中心

1. 什么是 Nacos
        官方:一个更易于构建云原生应用的动态 服务发现( Nacos Discovery ) 服务配置( Nacos Config ) 和服务管理平台。
集 注册中心+配置中心+服务管理 平台
        Nacos 的关键特性包括:
        服务发现和服务健康监测
        动态配置服务
        动态 DNS 服务
        服务及其元数据管理
2. Nacos 注册中心
管理所有微服务、解决微服务之间调用关系错综复杂、难以维护的问题;
        2.1 注册中心演变及其设计思想

1. 最初的单体应用时代, 如果我一个服务是产品服务,一个试订单服务. 产品服务想要去访问订单服务, 我们都是怎么做的呢?

 也就是说: 商品服务调用订单服务, 通过的是http远程调用的方式实现的, 这样的问题是什么呢?

  • 如果订单服务宕机了, 商品服务还能调通么?
  • 如果订单服务的ip地址更改了, 商品服务的远程调用地址是不是也要一起发生变化?
  • 如果订单服务一台服务器不够用了,  需要增加一台服务器, 商品服务就要自己维护一个订单服务的ip列表. 并按照一定规则访问

这就是单体服务的问题, 因为ip是写死在商品服务里面的, 所以, 一旦发生变化, 不能自动感知, 必须手动修改. 

2. 订单服务流量增多, 变成了多个订单服务

这个时候, 我们怎么做的呢? 我们要满足实际业务的需求, 订单量太大了, 单台服务器经常支撑不了了, 于是就想到, 部署多台服务来分担压力.

就出现了上面的模型, 可是, 这个模型存在什么样的问题呢?

  • 程序员自己维护的ip列表, 如果订单服务某一台挂了怎么办, 那就请求不通了
  • 如果订单服服务依然不能满足需求, 还要继续扩容, 程序员又要重新维护一份订单服务的ip列表. 

手动维护ip列表肯定不好, 一方面一旦有任何变动, 就需要进行维护; 另一方面, 从效率上来讲, 也不高. 还容易出错. 于是慢慢有就有了nginx

3. 使用nginx来维护订单服务的ip列表

 商品服务的所有请求过来了, 不要直接去请求订单服务. 通过nginx去请求订单服务. 在nginx中维护了订单服务的ip列表. 并且可以指定负载均衡策略.

嗯, 这个选择好像还不错, 不用程序员经常改商品服务代码了, 也不用程序员自己写如何分配请求的流量了. 那么他就满足我们所有的需求么?当然也不是

  • 虽然程序员不用在代码中维护ip列表了, 但是在nginx中依然要维护. 如果订单服务有很多很多, 怎么办? 我们知道在nginx上是通过upstream来维护ip的, 如果有成百上千的服务, 那么我们要维护成百上千个ip么?
  • 如果订单服务扩缩容了, 是不是一样要修改nginx的配置文件呢?

于是我们就想,有没有一种办法, 能够让微服务自动的就被注册上呢?这个需求迫在眉睫

4. 于是, 就有了注册中心的概念. 最初, 我们的想法也很简单

首先有一个数据库表来维护所有的服务, 并标记这些服务的启动状态

然后, 每当有一个服务启动, 那么都调用注册接口, 其实注册接口就是一个insert服务器信息到数据库的过程

第三, 每次商品服务要调用订单服务了, 先去数据库里面查询可用的订单服务列表. 然后根据策略选择服务ip, 

第四, 根据ip发送请求. 

这里面也会有一些问题

  • 服务宕机了怎么办? 还来不及发出通知
  • 每次商品服务调用订单服务, 都要去数据库查询可用的服务列表, 这样当流量大了, 就会给数据库造成很大的压力, 而且, 每次都查数据库, 效率也不高. 
  • 注册中心宕机 了怎么办?

于是, 想到将我们的注册中心进行改造. 改造的更加完美一些

5. 改造后的注册中心

 这个就是在上面的基础上改造过来的

1. 增加了一个last_heartTime, 记录心跳时间.

2. 当商品服务和订单服务启动的时候, 需要调用注册接口, 告诉注册中心, 我上线了, 实质上这是一个insert记录的过程

3. 商品服务和订单服务有一个定时任务timetask1, 定期发送心跳. 然后注册中心就会修改这个心跳时间. 通常是30秒发送一次. 

4. 商品服务有一个定时任务timerTask2, 定期去任务中心拉取服务列表, 并将其保存在客户端缓存中, 当请求过来的时候, 通过ribbon拉取客户端缓存的ip, 按照负载均衡策略, 选择指定的订单服务发送远程调用, 

5. 在注册中心有一个定时任务timerTask3,  如果注册中心在规定的时间内, 没有收到微服务的心跳, 那么就认为服务挂了, 将其状态设置为down, 下次拉取的时候, 这台服务器不会被拉取过去. 其实,这是一个状态修改的过程

6. 当服务停止的时候, 会调用服务注销接口, 通知注册中心,服务停止, 注册中心就是将其从注册表中删除. 其实这就是一个delete记录的过程

2.3 核心功能
Nacos Discovery
服务注册 Nacos Client 会通过发送 REST 请求的方式向 Nacos Server 注册自己的服务,提供自身的元数据,比如 ip 地 址、端口等信息。Nacos Server 接收到注册请求后,就会把这些元数据信息存储在一个双层的内存 Map 中。
服务心跳 :在服务注册后, Nacos Client 会维护一个定时心跳来持续通知 Nacos Server ,说明服务一直处于可用状态,防 止被剔除。默认5s 发送一次心跳。
服务同步 Nacos Server 集群之间会互相同步服务实例,用来保证服务信息的一致性。 leader raft
服务发现 :服务消费者( Nacos Client )在调用服务提供者的服务时,会发送一个 REST 请求给 Nacos Server ,获取上面 注册的服务清单,并且缓存在Nacos Client 本地,同时会在 Nacos Client 本地开启一个定时任务定时拉取服务端最新的注 册表信息更新到本地缓存
服务健康检查 Nacos Server 会开启一个定时任务用来检查注册服务实例的健康情况,对于超过 15s 没有收到客户端心跳 的实例会将它的healthy 属性置为 false( 客户端服务发现时不会发现 ) ,如果某个实例超过 30 秒没有收到心跳,直接剔除该 实例( 被剔除的实例如果恢复发送心跳则会重新注册 )
主流的注册中心
CAP C 一致性 A可用性 P 分区容错性
3 Nacos Server 部署
单机启动 nacos ,执行命令
bin/startup.sh ‐m standalone

也可以修改默认启动方式

访问 nocas 的管理端: http://127.0.0.1:8848/nacos ,默认的用户名密码是 nocas/nocas

搭建Nacos-client服务

父级maven

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>spring-nacos</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>
    <modules>
        <module>firsrt-nacos</module>
        <module>two-nacos</module>
    </modules>
    <properties>

        <java.version>1.8</java.version>
        <spring.cloud.alibaba.version>2.2.5.RELEASE</spring.cloud.alibaba.version>
        <spring.boot.version>2.3.11.RELEASE</spring.boot.version>
        <spring.cloud.version>Hoxton.SR8</spring.cloud.version>
    </properties>

    <dependencyManagement>
        <dependencies>
        <!--   spring boot 依赖  spring boot版本管理  -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>${spring.boot.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <!--   spring cloud alibbba  版本管理以及微服务组件  -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
            <version>${spring.cloud.alibaba.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <!--   spring cloud  版本管理以及微服务组件   -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring.cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        </dependencies>
    </dependencyManagement>




</project>

firsrt-nacos 项目

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>spring-nacos</artifactId>
        <groupId>org.example</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>firsrt-nacos</artifactId>

    <properties>
        <java.version>8</java.version>
    </properties>
    <dependencies>
        <!--  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>
    </dependencies>
</project>

application.properties

server.port=8002
#微服务名称
spring.application.name=firsrt-nacos
#配置 Nacos server 的地址
spring.cloud.nacos.discovery.server‐addr=localhost:8848

TestController 

package com.yqx.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author yanqx
 * @date 2023/11/13  14:18
 */
@RestController
@RequestMapping("/order")
public class TestController {


    @Value("${server.port}")
    String port;

    @RequestMapping("/reduct")
    public String reduct() throws InterruptedException {
        System.out.println("扣减库存");
        return "扣减库存:"+port;
    }
}

启动后会发现  

two-nacos 项目

pom

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>spring-nacos</artifactId>
        <groupId>org.example</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>two-nacos</artifactId>

    <properties>
        <java.version>8</java.version>
    </properties>
    <dependencies>
        <!--  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>
    </dependencies>
</project>

application.properties

server.port=8003
#微服务名称
spring.application.name=two-nacos
#配置 Nacos server 的地址
spring.cloud.nacos.discovery.server‐addr=localhost:8848
Application
package com.yqx;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

/**
 * @author yanqx
 * @date 2023/11/13  14:10
 */
@SpringBootApplication
public class TwoNacosApplication {

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

    public static void main(String[] args) {
        SpringApplication.run(TwoNacosApplication.class, args);
    }

}

调用第一个方法的controller 

package com.yqx.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

/**
 * @author yanqx
 * @date 2023/11/13  14:53
 */
@RestController
@RequestMapping("/two")
public class TwoController {


    @Autowired
    RestTemplate restTemplate;

    @RequestMapping("/add")
    public String add(){
        System.out.println("下单成功!");

        String msg = restTemplate.getForObject("http://firsrt-nacos/order/reduct", String.class);
        return "Hello World"+msg;
    }
}

 Nacos注册中心架构

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ps5计时计费软件安装教程,佳易王电玩店计时收费系统

ps5计时计费软件安装教程&#xff0c;佳易王电玩店计时收费系统 一、佳易王电玩PS5游戏厅计时计费软件部分功能简介&#xff1a; 1、计时计费功能 &#xff1a;开台时间和所用的时长直观显示&#xff0c;每3秒即可刷新一次时间。 2、销售商品功能 &#xff1a;商品可以绑定桌…

2023双十一爆冷收场,订单后暗藏这些电商痛点问题需要注意

打开某软件的瞬间&#xff0c;手不小心抖一下就进入了淘宝&#xff0c;而且无法第一时间准确找到关闭按钮。相信不少人都在这个双十一通过开屏广告为淘宝“贡献”至“超8亿”的访问量&#xff0c;更有网友辣评&#xff1a;“现在打开别的软件跳转淘宝的速度都比直接打开淘宝要快…

MySQL怎样处理排序⭐️如何优化需要排序的查询?

前言 在MySQL的查询中常常会用到 order by 和 group by 这两个关键字 它们的相同点是都会对字段进行排序&#xff0c;那查询语句中的排序是如何实现的呢&#xff1f; 当使用的查询语句需要进行排序时有两种处理情况&#xff1a; 当前记录本来就是有序的&#xff0c;不需要进…

折爱心教程(简单版本)

文章目录 1.折出双三角形2.向中心折叠3.形成正方形4.对折正反面相同5.向中心折6.外侧角向中心折7.顶部三角形向下折叠注意参考资料 我怎么也没有想到&#xff0c;身为混迹职场多年的老油子&#xff0c;竟然还能遇到折纸这种硬性task。 可是给的教程步骤省略太多了&#xff0c;看…

uni-app:如何配置uni.request请求的超时响应时间(全局+局部)

方法一&#xff1a;全局配置响应时间 一、进入项目的manifest.json的代码视图模块 二、写入代码 "networkTimeout": {"request": 5000 }, 表示现在request请求响应时间最多位5秒 方法二&#xff1a;局部设置响应时间 一、直接在uni.request中写入属性…

深度学习YOLOv5车辆颜色识别检测 - python opencv 计算机竞赛

文章目录 1 前言2 实现效果3 CNN卷积神经网络4 Yolov56 数据集处理及模型训练5 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; **基于深度学习YOLOv5车辆颜色识别检测 ** 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0…

最新AI创作系统ChatGPT系统运营源码/支持最新GPT-4-Turbo模型/支持DALL-E3文生图

一、AI创作系统 SparkAi创作系统是基于OpenAI很火的ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如…

高级数据结构——树状数组

树状数组&#xff08;Binary Index Tree, BIT&#xff09;&#xff0c;是一种一般用来处理单点修改和区间求和操作类型的题目的数据结构&#xff0c;时间复杂度为O(log n)。 对于普通数组来说&#xff0c;单点修改的时间复杂度是 O(1)&#xff0c;但区间求和的时间复杂度是 O(n…

【创作活动】作为程序员的那些愚蠢瞬间

作为一名程序员&#xff0c;我相信你一定遇到过这种情况&#xff1a;在写代码的时候&#xff0c;遇到了一些bug&#xff0c;在当下怎么检查都查不出问题出现在哪&#xff0c;等过几天后突然发现困扰自己的问题原来这么简单&#xff0c;突然觉得自己很蠢。这种情况在我身上也发生…

人工智能-深度学习之序列模型

想象一下有人正在看网飞&#xff08;Netflix&#xff0c;一个国外的视频网站&#xff09;上的电影。 一名忠实的用户会对每一部电影都给出评价&#xff0c; 毕竟一部好电影需要更多的支持和认可。 然而事实证明&#xff0c;事情并不那么简单。 随着时间的推移&#xff0c;人们对…

漏洞分析 | 漏洞调试的捷径:精简代码加速分析与利用

0x01前言 近期&#xff0c;Microsoft威胁情报团队曝光了DEV-0950&#xff08;Lace Tempest&#xff09;组织利用SysAid的事件。随后&#xff0c;SysAid安全团队迅速启动了应急响应&#xff0c;以应对该组织的攻击手法。然而&#xff0c;在对漏洞的分析和复现过程中&#xff0c…

使用Microsoft Dynamics AX 2012 - 1. 什么是Microsoft Dynamics AX?

Dynamics AX是Microsoft的核心业务管理解决方案&#xff0c;旨在满足中型公司和跨国组织的要求。基于 DynamicsAX基于最先进的体系结构和深度集成&#xff0c;在确保高可用性的同时&#xff0c;展现了全面的功能。 在AX 2012版中&#xff0c;Dynamics AX显示了大量新功能和增强…

Postman内置动态参数以及自定义的动态参数

近期在复习Postman的基础知识&#xff0c;在小破站上跟着百里老师系统复习了一遍&#xff0c;也做了一些笔记&#xff0c;希望可以给大家一点点启发。 一&#xff09;内置动态参数 {{$timestamp}} 生成当前时间的时间戳{{$randomInt}} 生成0-1000之间的随机数{{$guid}} 生成随…

⑩【MySQL】存储引擎详解, InnoDB、MyISAM、Memory。

个人简介&#xff1a;Java领域新星创作者&#xff1b;阿里云技术博主、星级博主、专家博主&#xff1b;正在Java学习的路上摸爬滚打&#xff0c;记录学习的过程~ 个人主页&#xff1a;.29.的博客 学习社区&#xff1a;进去逛一逛~ 存储引擎 ⑩【MySQL存储引擎】1. MySQL体系结构…

隐私协议 Secret Network 宣布使用 Octopus Network 构建的 NEAR-IBC 连接 NEAR 生态

2023年11月 NearCon2023 活动期间&#xff0c;基于 Cosmos SDK 构建的隐私协议 Secret Network&#xff0c;宣布使用 Octopus Network 开发的 NEAR-IBC&#xff0c;于2024年第一季度实现 Secret Network 与 NEAR Protocol 之间的跨链交互。 这将会是Cosmos 生态与 NEAR 之间的首…

java VR全景商城免费搭建 saas商城 b2b2c商城 o2o商城 积分商城 秒杀商城 拼团商城 分销商城 短视频商城

1. 涉及平台 平台管理、商家端&#xff08;PC端、手机端&#xff09;、买家平台&#xff08;H5/公众号、小程序、APP端&#xff08;IOS/Android&#xff09;、微服务平台&#xff08;业务服务&#xff09; 2. 核心架构 Spring Cloud、Spring Boot、Mybatis、Redis 3. 前端框架…

一个开源的汽修rbac后台管理系统项目,基于若依框架,实现了activiti工作流,附源码

文章目录 前言&源码项目参考图&#xff1a; e店邦O2O平台项目总结一、springboot1.1、springboot自动配置原理1.2、springboot优缺点1.3、springboot注解 二、rbac2.1、概括2.2、三个元素的理解 三、数据字典3.1、概括与作用3.2、怎么设计3.3、若依中使用字典 四、工作流—…

STM32CubeIDE报“xxx is not implemented and will always fail”解决方法

本文介绍STM32CubeIDE报“xxx is not implemented and will always fail”解决方法。 最近用STM32CubeIDE开发STM32程序时&#xff0c;编译报警告&#xff1a; warning: _close is not implemented and will always fail warning: _lseek is not implemented and will always…

idea中把spring boot项目打成jar包

打jar包 打开项目&#xff0c;右击项目选中Open Module Settings进入project Structure 选中Artifacts&#xff0c;点击中间的加号&#xff08;Project Settings->Artifacts->JAR->From modules with dependencies &#xff09; 弹出Create JAR from Modules&#…

想转行互联网行业,是选择网络安全还是人工智能?

随着数字时代的到来&#xff0c;网络安全和人工智能成了科技创新产业的重要组成部分。也逐渐成了大多数人心中热门的行业选择。那么该如何抉择呢&#xff1f; 首先我们来了解下人工智能的发展前景&#xff1a; 如今&#xff0c;人工智能技术无论是在核心技术方面&#xff0c…