服务注册中心+配置中心-Nacos-微服务核心组件【分布式微服务笔记07】

服务注册中心+配置中心-Nacos-微服务核心组件【分布式微服务笔记07】

服务注册中心+配置中心-Nacos

  1. Nacos 有两大功能: 注册中心[替代Eureka]+配置中心[替代Config]
  2. 架构理论基础: CAP 理论(支持AP【高可用、分区容错性】 和CP【分区容错性和数据一致性】, 可以切换)

Nacos 结构图

Nacos 作为 服务注册中心

服务提供者代码实现
  1. 引入依赖

    <dependency><!--引入 nacos 场景启动器starter--><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-nacos-discovery</artifactId>
    </dependency>
    
  2. 编辑application.yml文件

    server:port: 10004spring:application:name: member-service-nacos-provider #配置应用的名称datasource:type: com.alibaba.druid.pool.DruidDataSourceurl: jdbc:mysql://localhost:3306/e_commerce_center_db?useSSL=true&useUnicode=true&characterEncoding=UTF-8username: rootpassword: zy#配置nacoscloud:nacos:discovery:server-addr: localhost:8848 #配置nacos-server的地址
    #暴露监控点
    management:endpoints:web:exposure:include: '*'
    
  3. 创建主启动类

    @EnableDiscoveryClient //启用 nacos 服务发现
    @SpringBootApplication
    public class MemberNacosProviderApplication10004 {public static void main(String[] args) {SpringApplication.run(MemberNacosProviderApplication10004.class, args);}
    }
    
服务消费者代码实现
  1. 引入依赖

    <dependency><!--引入 nacos 场景启动器starter--><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-nacos-discovery</artifactId>
    </dependency>
    
  2. 编辑application.yml文件

    server:port: 80spring:application:name: member-service-nacos-consumer-80#配置nacoscloud:nacos:discovery:server-addr: localhost:8848 #nacos-server的地址
    
  3. 创建主启动类

    @SpringBootApplication
    @EnableDiscoveryClient //引入nacos服务发现
    public class MemberNacosConsumerApplication80 {public static void main(String[] args) {SpringApplication.run(MemberNacosConsumerApplication80.class, args);}
    }
    
  4. 编写配置类

    //配置注入 RestTemplate
    @Configuration
    public class CustomizationBean {@LoadBalanced //赋予 restTemplate 负载均衡 的能力@Beanpublic RestTemplate getRestTemplate() {return new RestTemplate();}
    }
    
  5. 编写 Controller

    @EnableDiscoveryClient //启用服务发现
    @RestController
    @RequestMapping("/member/nacos/consumer")
    @Slf4j
    public class MemberNacosConsumerController {//定义MEMBER_SERVICE_PROVIDER_URL 基础url地址//member-service-nacos-provider 表示服务提供方【集群】,注册到nacos-server的服务名【小写】//就是服务提供方【集群】,对外暴露的名称 member-service-nacos-providerpublic static final String MEMBER_SERVICE_NACOS_PROVIDER_URL = "http://member-service-nacos-provider";@Autowiredprivate RestTemplate restTemplate;//接口/****  添加member;*  member :通过restTemplate 发出的请求携带的数据;*  Result.class :返回对象的类型;*/@PostMapping("/save")public Result<Member> save(Member member) {return restTemplate.postForObject(MEMBER_SERVICE_NACOS_PROVIDER_URL + "/member/save", member, Result.class);}//根据id 调用服务接口 返回member@GetMapping("/get/{id}")public Result<Member> getMemberById(@PathVariable("id") Long id) {return restTemplate.getForObject(MEMBER_SERVICE_NACOS_PROVIDER_URL + "/member/get/" + id, Result.class);}}
    
配置自己的负载均衡算法
//配置自己的负载均衡算法
@Configuration
public class RibbonRule {//    配置注入负载均衡算法@Beanpublic IRule myRibbonRule(){return new RandomRule();//new 的就是负载均衡算法 ,自己选择,这里是随机算法}
}
Nacos AP 和 CP的切换

【偏理论,实际开发中也不太会切换】

只需要记住:Nacos AP 和 CP 是可以切换的, 大多数都是选择AP 模式

选择AP 还是CP?

  1. CP: 服务可以不能用,但必须要保证数据的一致性。
  2. AP: 数据可以短暂不一致,但最终是需要一致的,无论如何都要保证服务的可用。
  3. 只能在CP 和AP 选择一个平衡点, 大多数都是选择AP 模式

Nacos 集群默认支持的是CAP原则中的AP原则,但是也可切换为CP原则(一般不切换)
CURL切换命令: curl -X PUT
'$NACOS_SERVER:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP'
URL指令:
$NACOS_SERVER:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP

Nacos 作为 服务配置中心

由于采用本地静态配置无法保持是实性等问题,我们需要有服务配置中心

参考文档: https://nacos.io/zh-cn/docs/quick-start-spring-cloud.html

配置中心代码实现
  1. 在 http://localhost:8848/nacos/ 新建配置

  2. 在微服务模块进行相关配置

    1.进入相关依赖

    <!--引入 配置中心 nacos-config 启动器 -->
    <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-nacos-config</artifactId>
    </dependency>
    

    2.配置application.yml

    spring:profiles:active: dev #指定环境  dev/test/prod
    

    3.配置bootstrap.yml

    springboot 中配置文件的加载是存在优先级顺序的, bootstrap.yml 优先级高于application.yml

    server:port: 5000spring:application:#需要参考 nacos配置中心的Data Idname: e-commerce-nacos-config-client#配置Nacoscloud:nacos:discovery:server-addr: localhost:8848 #服务注册中心地址config:server-addr: localhost:8848 #服务配置中心地址file-extension: yaml #指定 yaml格式的配置
    

    ​ Nacos 微服务模块会根据配置,找到配置中心的配置文件,会将 name: e-commerce-nacos-config-client 和 active: dev 和 file- extension: yaml 进行拼接,最终会找到Data Id 为e-commerce-nacos-config-client-dev.yaml 的配置文件进行拉取。

    即 : ${spring.application.name}-${spring.profile.active}.${spring.cloud.nacos.config.file-extension}

    4.编写主启动类

    @SpringBootApplication
    @EnableDiscoveryClient
    public class NacosConfigClientApplication5000 {public static void main(String[] args) {SpringApplication.run(NacosConfigClientApplication5000.class, args);}
    }
    

​ 5.编写Controller

@RestController
@Slf4j
public class NacosConfigClientController {//client 会拉取对应的Data Id的信息/*   config:ip: "122.22.22.22"name: "zy"*/@Value("${config.ip}")private String configIp;@Value("${config.name}")private String configName;@GetMapping("/nacos/config/ip")public String getConfigIp(){return configIp;}@GetMapping("/nacos/config/name")public String getConfigName(){return configName;}
}
配置信息自动刷新

@RefreshScope 是springcloud 原生注解,实现配置信息自动刷新, 如果在Nacos Server 修改了配置数据,Client 端就会得到最新配置

@RestController
@Slf4j
@RefreshScope //实现配置信息自动刷新
public class NacosConfigClientController {@Value("${config.ip}")private String configIp;@Value("${config.name}")private String configName;@GetMapping("/nacos/config/ip")public String getConfigIp(){return configIp;}@GetMapping("/nacos/config/name")public String getConfigName(){return configName;}
}
Nacos 配置隔离

Nacos 实现配置隔离有多种方案:

  1. Data ID方案
  2. Group方案
  3. Namespace方案
Data ID方案

Data ID方案的使用场景:【按照Data ID 进行隔离】微服务模块可以切换获取到Nacos Server 的配置数据【包括开发环境dev、测试环境test】。 即:根据环境不同切换不同的配置数据

Data ID方案 的 实现

  1. 需要再增加一个配置数据

  2. 修改application.yml 、

    spring:profiles:active: test #指定环境  dev/test/prod
    
Group方案

Group方案的使用场景:【按照组来隔离】在一个分布式项目中,有不同的开发小组,需要到Nacos Server获取自己对应的开发环境配置的数据

Group方案 的 实现:

  1. 添加新的配置,并指定组名

  2. 修改bootstrap.yml

    server:port: 5000spring:application:name: e-commerce-nacos-config-client#配置Nacoscloud:nacos:discovery:server-addr: localhost:8848config:server-addr: localhost:8848 file-extension: yaml group: group1 #指定组
    
Namespace方案

Namespace 方案的使用场景:【按照组织和公司来隔离】在一个分布式项目中,有多个组织/公司 的开发组参与,需要到 Nacos Server 获取开发环境/其他环境 的配置信息

Namespace方案 的 实现:

  1. 新建命名空间

  2. 在创建好的命名空间下,创建新的配置

  3. 修改bootstrap.yml文件

    server:port: 5000spring:application:name: e-commerce-nacos-config-clientcloud:nacos:discovery:server-addr: localhost:8848 config:server-addr: localhost:8848 file-extension: yaml group: seckill #指定组namespace: 36827fcf-3e1c-4c3c-a778-e95941260d2a #指定命名空间
    
Namespace/Group/Data ID方案 梳理

  1. Nacos默认的命名空间是public,Namespace主要用来实现配置隔离, 隔离范围大
  2. Group默认是DEFAULT GROUP,Group可以把不同的微服务划分到同一个分组里面去

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Oracle数据库自动备份

1.bat脚本 格式为ANSI格式 set CURDATE=%date:~0,4%%date:~5,2%%date:~8,2% set CURMON=%date:~0,4%%date:~5,2% set CURTIME=%time:~0,2% if "%CURTIME%"==" 0" set CURTIME=00 if "%CURTIME%"==" 1" set CURTIME=01 if "%CURT…

老式移动和联通标准SIM卡在2024的今天

前言 在我手里的,是一张普通联通和一张移动M-ZONE标准SIM卡桌上散落的SIM卡碎片已经说明了一切——— 我要把这些00后的SIM卡装入2024年的手机(图中为大卡的测试机,没那么有风险)联通 输入123456,直接被锁,提示要用puk码解锁我后来再搜索puk码的时候才知道默认pin码是123…

我的编程经历,从天桥地摊Basic到西藏阿里的.Net AOT。(一,从井到Sharp)

撇清一层歧义:标题中的阿里不是指阿里巴巴集团,喜马拉雅也不是指那个做音频频道的公司,文中所及内容以及我本人都与他们没有任何关联。依照地理正式名称:阿里指的是西藏西部阿里地区,喜马拉雅指的是青藏高原地球最高山脉。 从前我在博客园不叫这个名字,今天很多自己的早…

计算机网络基础第五讲 传输层

计算机网络基础第五讲 传输层 第一节:传输层概述 1. 运输层概述2. 运输层功能两种不同协议:TCP:面向连接,全双工可靠信道;仅支持单播;复杂 UDP:无连接不可靠;支持单播,多播,广播;应用层来负责可靠;简单 第二节:端口号 1. 运输层的端口 进程标识符来标记进程; 不应…

计算机网络基础第六讲 应用层

计算机网络基础第六讲 应用层 第一节:应用层概述第二节:DNS 1. 域名系统DNS实现域名到IP的映射2. 域名服务器3. 域名的解析过程迭代+递归解析递归解析4. 提高可靠性和速度的方法第三节:FTP 1.FTP概述2. FTP工作模式3. FTP两个连接控制连接必须先于数据连接建立 数据连接必须…

TCP状态转移图说明及使用tcpdump进行观测

一、TCP状态转移图说明图1.TCP状态转移图这张图展示了 TCP(Transmission Control Protocol,传输控制协议)的状态转移图,描述了 TCP 连接在不同阶段之间的状态变化和相互转换。 (一)、建立连接(三次握手)图2.TCP三次握手示意图1、服务器准备好接受外来连接,通常通过soc…

git学习笔记1

记录学习过程: git是如何运行工作的,先把文件从工作区传输到暂存区,之后再从暂存区传输到本地仓库git仓库的初始化,在需要的文件夹中右键鼠标"Open Git Bash Here",然后输入git init:git把文件先存放到暂存区之后git才能把文件存放到本地仓库可以查看当前git文件的…

彻底卸载Python

前言通常我们在一些软件的使用上有碰壁,第一反应就是卸载重装。所以有小伙伴就问我Python怎么卸载才能彻底卸载干净,今天这篇文章,小编就来教大家如何彻底卸载Python软件卸载方法1:首先,在安装python时,下载了一个可执行文件,也就是Python的安装包,我们双击它,点击uni…

java覆盖率检测-jacoco

一、Jacoco 简介 官网地址:https://www.jacoco.org/jacoco/trunk/index.html一、Jenkins集成jacoco 1、安装JaCoCo插件 jenkins->系统管理->管理插件在可用插件搜索Jacoco,搜索到安装即可 2、在job中增加“构建后操作”,选择Record JaCoCo coverage report 3、修改Ja…

mapboxgl V3 Slot插槽使用介绍

一、介绍 插槽允许在样式中创建定义明确的插入点,如:通常“面”图层需要插入到“线”图层下方,在标准样式之前,需要通过指定图层 id 来实现,一旦 id 发生变化,则会抛出错误,而在新的标准样式中,只需要指定相应的插槽即可。 {"layers": [...,{"id":…

基于 ChatGPT 的聊天软件合集打包分享

推荐了一些基于ChatGPT的聊天软件,包括ChatBox(支持多种AI模型的桌面客户端)、GPT4All(可在本地运行大型语言模型)、ChatGPT Next Web和ChatGPT Web(提供Docker支持的Web应用),以及BotGem(支持OpenAI和Azure的简单指令库)。 「基于 ChatGPT 的聊天软件合集打包」 链…