【SpringCloud】Nacos微服务注册中心

news2024/11/8 13:08:39

微服务的注册中心

注册中心可以说是微服务架构中的"通讯录",它记录了服务和服务地址的映射关系 。在分布式架构中, 服务会注册到这里,当服务需要调⽤其它服务时,就从这里找到服务的地址,进行调用。

注册中心的主要作用:

服务注册中心(下称注册中心)是微服务架构⾮常重要的⼀个组件,在微服务架构⾥主要起到了协调者
的⼀个作⽤。注册中心⼀般包含如下⼏个功能:

  1. 服务发现:
    服务注册/反注册:保存服务提供者和服务调⽤者的信息
    服务订阅/取消订阅:服务调⽤者订阅服务提供者的信息,最好有实时推送的功能
    服务路由(可选):具有筛选整合服务提供者的能⼒。
  2. 服务配置:
    配置订阅:服务提供者和服务调⽤者订阅微服务相关的配置
    配置下发:主动将配置推送给服务提供者和服务调⽤者
  3. 服务健康检测

检测服务提供者的健康情况

常见的注册中心

**Zookeeper **

zookeeper它是⼀个分布式服务框架,是Apache Hadoop 的⼀个⼦项目,它主要是⽤来解决分布式应用中经常遇到的⼀些数据管理问题,如:统⼀命名服务、状态同步服务、集群管理、分布式应⽤配置项 的管理等。简单来说zookeeper=⽂件系统+监听通知机制。

**Eureka **

Eureka是在Java语⾔上,基于Restful Api开发的服务注册与发现组件,Springcloud Netflix中的重要组件 **Consul **

Consul是由HashiCorp基于Go语⾔开发的⽀持多数据中心分布式⾼可⽤的服务发布和注册服务软件, 采用Raft算法保证服务的⼀致性,且⽀持健康检查。

**Nacos **

Nacos是⼀个更易于构建云原⽣应⽤的动态服务发现、配置管理和服务管理平台。简单来说 Nacos 就是注册中⼼心+ 配置中心的组合,提供简单易⽤的特性集,帮助我们解决微服务开发必会涉及到的服务注册与发现,服务配置,服务管理等问题。 Nacos 还是 Spring Cloud Alibaba 组件之⼀,负责服务注册与发现

Home · Netflix/eureka Wiki · GitHub

在Euraka的GitHub上,宣布Eureka 2.x闭源。

这意味着如果开发者继续使⽤作为 2.x 分⽀上现

有⼯作 repo ⼀部分发布的代码库和⼯件,则将自负风险。

Nacos替换方案

Nacos简介

Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了⼀组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。 nacos的作⽤就是⼀个注册中心,用来管理注册上来的各个微服务。

Nacos实战入门

我们就在现有的环境中加入nacos,并将我们的两个微服务注册上去。

搭建nacos环境

①安装nacos:

下载地址: https://github.com/alibaba/nac os/releases

下载zip格式的安装包,然后进⾏解压缩操作

nacos.rar

②启动nacos

#切换⽬录 cd nacos/bin

#命令启动 startup.cmd -m standalone 或者直接双击startup.cmd运行

③访问nacos

打开浏览器输入http://localhost:8848/nacos,即可访问服务,

默认密码是nacos/nacos

将订单微服务注册到nacos

**开始修改 shop-product 模块的代码, 将其注册到nacos服务上 **

①在pom.xml中添加nacos的依赖

<!--        nacos服务注册,服务发现-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

②在主类上添加@EnableDiscoveryClient注解

package com.stringzhua.shop_order;

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

@SpringBootApplication
@EnableDiscoveryClient//开启nacos服务注册
public class ShopOrderApplication {

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

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

③在application.yml中添加nacos服务的地址

server:
  port: 8091
spring:
  application:
    name: service-order
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql:///shop?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&useSSL=true
    username: root
    password: 12345678
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848

④启动服务, 观察nacos的控制⾯板中是否有注册上来的订单微服务

将商品微服务注册到nacos

开始修改 shop-product 模块的代码, 将其注册到nacos服务上

①在pom.xml中添加nacos的依赖

<!--        nacos服务注册,服务发现-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

②在主类上添加@EnableDiscoveryClient注解

package com.stringzhua.shop_product;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@SpringBootApplication
@EnableDiscoveryClient//开启nacos服务注册
public class ShopProductApplication {

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

}

③在application.yml中添加nacos服务的地址

server:
  port: 8081
spring:
  application:
    name: service-product
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql:///shop?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&useSSL=true
    username: root
    password: 12345678
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848

④启动服务, 观察nacos的控制⾯板中是否有注册上来的商品微服务

实现下单:

项目完整源码:

springcloud_alibaba_nacos.rar

Nacos配置管理

Nacos除了可以做注册中心,同样可以做配置管理来使用

统一配置管理

当微服务部署的实例越来越多,达到数十、数百时,逐个修改微服务配置就会让⼈抓狂,而且很容易出错。我们需要⼀种统⼀配置管理⽅案,可以集中管理所有实例的配置。

Nacos⼀⽅面可以将配置集中管理,另⼀方可以在配置变更时,及时通知微服务,实现配置的热更新。

在业界常见的服务配置中心,有下⾯这些:

  • Apollo是由携程开源的分布式配置中心。特点有很多,比如:配置更新之后可以实时生效,支持灰度发布功能,并且能对所有的配置进⾏版本管理、操作审计等功能,提供开放平台API。 并且资料也写的很详细。
  • Disconf是由百度开源的分布式配置中心。它是基于Zookeeper来实现配置变更后实时通知和生效的。
  • SpringCloud Config这是Spring Cloud中带的配置中心组件。它和Spring是⽆缝集成,使用起来非常方便,并且它的配置存储⽀持Git。不过它没有可视化的操作界⾯,配置的生效也不是实时的,需要重启或去刷新。
  • Nacos这是SpingCloud alibaba技术栈中的⼀个组件,前⾯我们已经使⽤它做过服务注册中心。其实它也集成了服务配置的功能,我们可以直接使⽤它作为服务配置中心。

在nacos中添加配置文件

注意:项目的核⼼配置,需要热更新的配置才有放到nacos管理的必要。基本不会变更的⼀些配置还是保 存在微服务本地比较好。

从微服务拉取配置

微服务要拉取nacos中管理的配置,并且与本地的application.yml配置合并,才能完成项⽬启动。 但如果尚未读取application.yml,⼜如何得知nacos地址呢?

因此spring引⼊了⼀种新的配置⽂件: bootstrap.yaml⽂件,会在application.yml之前被读取,流程如下:

配置的实现步骤

引入nacos-config依赖
<!--        nacos服务注册,服务发现-->
<dependency>
  <groupId>com.alibaba.cloud</groupId>
  <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

在商品和订单服务都添加坐标:

添加bootstrap.yaml

不能使用原来的application.yml作为配置⽂件,而是新建⼀个bootstrap.yml作为配置⽂件

配置文件优先级(由高到低):

bootstrap.properties -> bootstrap.yml -> application.properties -> application.yml

spring:
  application:
    name: service-product
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848 #nacos中⼼地址
        file-extension: yaml #配置⽂件格式
  profiles:
    active: dev #  环境标识,开发环境

在nacos中添加配置

测试

配置热更新

我们最终的目的,是修改nacos中的配置后,微服务中⽆需重启即可让配置⽣效,也就是配置热更新。要实现配置热更新,可以使用两种⽅式:

配置中心添加配置:

config:
  appName: "猫猫头"
  env: dev

方式一

在@Value注⼊的变量所在类上添加注解@RefreshScope:

@RestController
@RefreshScope//只需要在需要动态读取配置的类上添加此注解就可以
public class NacosConfigController01 {
    @Value("${config.appName}")
    private String appName;

    @GetMapping("/config1")
    public String Config01() {
        return appName;
    }
}

如果修改的话,不需要重启服务,直接在nacos配置中心修改即可:

方式二

硬编码方式:

@RestController
public class NacosConfigController02 {
    @Autowired
    private ConfigurableApplicationContext applicationContext;

    @GetMapping("config2")
    public String Config02() {
        return applicationContext.getEnvironment().getProperty("config.appName");
    }
}

测试:

配置共享

当配置越来越多的时候,我们就发现有很多配置是重复的,这时候就考虑可不可以将公共配置文件提取出来

同服务内配置共享

实现步骤:

  1. 新建⼀个以 spring.application.name 命名的配置⽂件,然后将其所有环境的公共配置放在里面

  1. 新建⼀个名为service-product-test.yaml配置存放测试环境的配置

  1. 新建⼀个名为service-product-dev.yaml配置存放开发环境的配置

  1. 在两个环境⽂件中配置独有信息

  1. 添加测试⽅法
@Value("${config.env}")
private String env;

//同一微服务的不同环境下共享配置
@GetMapping("/env")
public String nacosConfingTest2() {
    return env;
}

测试dev:

测试test:

不同微服务共享配置

不同服务之间实现配置共享的原理类似于⽂件引入,就是定义⼀个公共配置,然后在当前配置中引入

  1. 在nacos中定义⼀个DataID为datasource.yaml的配置,用于所有微服务共享
 spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql:///shop?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&useSSL=true
    username: root
    password: 12345678

  1. 修改bootstrap.yaml
spring:
  application:
    name: service-product
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848 #nacos中心地址
        file-extension: yaml # 配置文件格式
        shared-dataids: datasource.yaml # 配置要引⼊的配置
        refreshable-dataids: datasource.yaml # 配置要实现动态配置刷新的配置
  profiles:
    active: dev # 环境标识,开发环境

  1. 启动商品微服务进⾏测试

配置共享的优先级

bootstrap.properties -> bootstrap.yml -> application.properties -> application.yml

服务名-proflie.yaml -> 服务名称.yaml -> 本地配置.yaml

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

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

相关文章

服务器数据恢复—分区结构被破坏的reiserfs文件系统数据恢复案例

服务器数据恢复环境&#xff1a; 一台服务器中有一组由4块SAS硬盘组建的RAID5阵列&#xff0c;上层安装linux操作系统统。分区结构&#xff1a;boot分区LVM卷swap分区&#xff08;按照顺序&#xff09;&#xff0c;LVM卷中划分了一个reiserfs文件系统作为根分区。 服务器故障…

Linux下的WatchDog

看门狗&#x1f415; 看门狗简介 看门狗定时器&#xff08;Watchdog Timer&#xff09;是一种定时器&#xff0c;用于检测系统是否正常运行。如果系统在规定时间内没有向看门狗定时器发送复位信号&#xff0c;看门狗定时器就会产生复位信号&#xff0c;使系统复位。看门狗定时…

机器学习(五)——支持向量机SVM(支持向量、间隔、正则化参数C、误差容忍度ε、核函数、软间隔、SVR、回归分类源码)

目录 关于1 间隔与支持向量2 对偶问题3 核函数4 软间隔与正则化5 支持向量回归6 核方法X 案例代码X.1 分类任务X.1.1 源码X.1.2 数据集&#xff08;鸢尾花数据集&#xff09;X.1.3 模型效果 X.2 回归任务X.2.1 源码X.2.2 数据集&#xff08;加州房价数据&#xff09;X.2.3 模型…

25国考照片处理器使用流程图解❗

1、打开“国家公务员局”网站&#xff0c;进入2025公务员专题&#xff0c;找到考生考务入口 2、点击下载地址 3、这几个下载链接都可以 4、下载压缩包 5、解压后先看“使用说明”&#xff0c;再找到“照片处理工具”双击。 6、双击后会进入这样的界面&#xff0c;点击&…

几个docker可用的镜像源

几个docker可用的镜像源 &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; sudo rm -rf /etc/docker/daemon.json sudo mkdir -p /etc/dockersudo tee /etc/docker/daemon.json <<-EOF {"registry-mirrors": ["https://d…

Vue 项目中为何选择 TSX 而非传统 .vue 文件

近年来&#xff0c;Vue 项目中使用 TSX&#xff08;TypeScript JSX&#xff09;的写法逐渐增多&#xff0c;尤其在 TypeScript 项目中。 1. TSX 与 Vue 的结合背景 1、Vue 3 和 TypeScript Vue 3 从设计之初便更好地支持 TypeScript。Vue 3 使用了 TypeScript 重写核心&…

【SpringBoot】18 上传文件到数据库(Thymeleaf + MySQL)

Git仓库 https://gitee.com/Lin_DH/system 介绍 使用 Thymeleaf 写的页面&#xff0c;将&#xff08;txt、jpg、png&#xff09;格式文件上传到 MySQL 数据库中。 依赖 pom.xml <!-- https://mvnrepository.com/artifact/com.mysql/mysql-connector-j --><depende…

[VUE]框架网页开发1 本地开发环境安装

前言 其实你不要看我的文章比较长&#xff0c;但是他就是很长&#xff01;步骤其实很简单&#xff0c;主要是为新手加了很多解释&#xff01; 步骤一&#xff1a;下载并安装 Node.js 访问 Node.js 官网&#xff1a; Node.js — Download Node.js 下载 Windows 64 位版本&…

canal1.1.7使用canal-adapter进行mysql同步数据

重要的事情说前面&#xff0c;canal1.1.8需要jdk11以上&#xff0c;大家自行选择&#xff0c;我这由于项目原因只能使用1.1.7兼容版的 文章参考地址&#xff1a; canal 使用详解_canal使用-CSDN博客 使用canal.deployer-1.1.7和canal.adapter-1.1.7实现mysql数据同步_mysql更…

403 Request Entity Too Lager(请求体太大啦)

昨天收到 QA 的生产报障&#xff0c;说是测试环境的附件上传功能报了 403 的错误&#xff0c;错误信息&#xff1a;403 Request Entity Too Lager。我尝试复现问题&#xff0c;发现传个几兆的文件都费劲啊&#xff0c;一传一个失败。不用说&#xff0c;项目用到 ng 代理&#x…

【VScode】如何在VSCode中配置Python开发环境:从零开始的完整指南

文章目录 前言软件准备软件安装1. 安装Python2. 检查Python是否安装成功3. 安装第三方包4. 安装VSCode 配置VSCode1. 安装Python插件2. 创建项目&#xff0c;配置工作区域3. 编写Python文件4. 配置Python编译设置5. 使用代码格式化工具yapf 更多文章结尾 前言 在当今的编程世界…

SQL,力扣题目571, 给定数字的频率查询中位数

一、力扣链接 LeetCode_571 二、题目描述 Numbers 表&#xff1a; ------------------- | Column Name | Type | ------------------- | num | int | | frequency | int | ------------------- num 是这张表的主键(具有唯一值的列)。 这张表的每一行表示某个数…

LLMs之PDF:zeroX(一款PDF到Markdown 的视觉模型转换工具)的简介、安装和使用方法、案例应用之详细攻略

LLMs之PDF&#xff1a;zeroX(一款PDF到Markdown 的视觉模型转换工具)的简介、安装和使用方法、案例应用之详细攻略 目录 zeroX的简介 1、支持的文件类型 zeroX的安装和使用方法 T1、Node.js 版本&#xff1a; 安装 使用方法 使用文件 URL&#xff1a; 使用本地路径&…

containerd配置私有仓库registry

机器ip端口regtisry192.168.0.725000k8s-*-------k8s集群 1、镜像上传 rootadmin:~# docker push 192.168.0.72:5000/nginx:1.26.1-alpine The push refers to repository [192.168.0.72:5000/nginx] 6961f0b8531c: Pushed 3112cd521249: Pushed d3f50ce9b5b5: Pushed 9efaf2eb…

js例轮播图定时器版

要求 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta http-equiv"X-UA-Compatible" content"IEedge" /><meta name"viewport" content"widthdevice-width, ini…

PostgreSQL 学习笔记:PostgreSQL 主从复制

PostgreSQL 笔记&#xff1a;PostgreSQL 主从复制 博客地址&#xff1a;TMDOG 的博客 在现代应用程序中&#xff0c;数据库的高可用性和扩展性是至关重要的。PostgreSQL 提供了主从复制功能&#xff0c;可以在多个数据库实例之间复制数据&#xff0c;以实现冗余和负载均衡。本…

【系统集成项目管理工程师教程】第5章 软件工程

软件工程是一门研究用工程化方法构建和维护有效、实用和高质量软件的学科&#xff0c;涵盖软件需求、设计、实现、测试、部署交付、质量管理和过程能力成熟度等方面&#xff0c;旨在提高软件生产率、质量并降低成本&#xff0c;确保软件项目的成功开发与维护。 5.1软件工程定义…

Java项目实战II基于Spring Boot的便利店信息管理系统(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 在快节奏的…

vscode Comment Translate 反应慢 加载中...

Comment Translate 版本&#xff1a;v2.3.3 你是不是疑惑切换了 Bing 源也无法使用还是加载中… 那么可能你切换Bing后没重启vscode 下面是切换成功后的插件日志&#xff0c;一定要重启vscode&#xff0c;只是禁用和启用插件不行的&#xff0c;另外google是没用的&#xff0c;用…

网站架构知识之Ansible(day020)

1.Ansible架构 Inventory 主机清单:被管理主机的ip列表,分类 ad-hoc模式: 命令行批量管理(使用ans模块),临时任务 playbook 剧本模式: 类似于把操作写出脚本,可以重复运行这个脚本 2.修改配置 配置文件&#xff1a;/etc/ansible/ansible.cfg 修改配置文件关闭主机Host_key…