首页 > 其他分享 >服务注册中心+配置中心-Nacos-微服务核心组件【分布式微服务笔记07】

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

时间:2024-07-31 14:28:14浏览次数:10  
标签:服务 07 配置 nacos Nacos server config public

服务注册中心+配置中心-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: 10004
    
    spring:
      application:
        name: member-service-nacos-provider #配置应用的名称
    
    
      datasource:
        type: com.alibaba.druid.pool.DruidDataSource
        url: jdbc:mysql://localhost:3306/e_commerce_center_db?useSSL=true&useUnicode=true&characterEncoding=UTF-8
        username: root
        password: zy
    
      #配置nacos
      cloud:
        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: 80
    
    spring:
      application:
        name: member-service-nacos-consumer-80
      #配置nacos
      cloud:
        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 负载均衡 的能力
        @Bean
        public 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-provider
        public static final String MEMBER_SERVICE_NACOS_PROVIDER_URL = "http://member-service-nacos-provider";
    
        @Autowired
        private 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 {

//    配置注入负载均衡算法
    @Bean
    public 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: 5000
    
    spring:
      application:
        #需要参考 nacos配置中心的Data Id
        name: e-commerce-nacos-config-client
      #配置Nacos
      cloud:
        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: 5000
    
    spring:
      application:
        name: e-commerce-nacos-config-client
        
      #配置Nacos
      cloud:
        nacos:
          discovery:
            server-addr: localhost:8848
          config:
            server-addr: localhost:8848 
            file-extension: yaml 
            group: group1 #指定组
    
Namespace方案

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

Namespace方案 的 实现:

  1. 新建命名空间

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

  3. 修改bootstrap.yml文件

    server:
      port: 5000
    
    spring:
      application:
        name: e-commerce-nacos-config-client
      cloud:
        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可以把不同的微服务划分到同一个分组里面去

标签:服务,07,配置,nacos,Nacos,server,config,public
From: https://www.cnblogs.com/zydevelop/p/18334548/zy_springcloud07

相关文章

  • 搭建 STM32 网关服务器的全流程:集成嵌入式 C++、TCP/IP 通信、Flash 存储及 JWT 认证(
    引言随着物联网(IoT)技术的快速发展,基于STM32的服务器(类似网关)在数据采集、设备控制等方面的应用越来越广泛。本文将介绍搭建一个基于STM32的服务器所需的技术栈,以及详细的搭建步骤和代码示例。技术栈介绍在搭建基于STM32的服务器时,我们需要用到以下技术栈和组件:1.硬......
  • 如何在Linux云服务器上通过Docker Compose部署安装Halo,搭建个人博客网站?
    目录前置步骤环境搭建创建容器组在系统任意位置创建一个文件夹创建docker-compose.yaml启动Halo服务配置反向代理以及域名解析Halo初始化页面。更新新版本的halo前置步骤首先你需要一套linux服务器,这里默认你已经有了。如果没有可以在云服务器优惠合集选择,如果你是个人博客选......
  • 与币安服务器的时差
    我正在尝试用Python构建一个非常简单的自动化工具,以便我可以在币安上发布订单。这实际上是在牢记“目标”(终点线)的同时掌握Python的窍门。我正在使用这个很棒的库其中我想做的基本事情就是找出答案如果我的计算机时间和币安服务器的时间之间存在时间差。为......
  • HBuilderX 开发中使用 Node.js 搭建PDA扫码程序的服务端过程
    以下是使用HBuilderX和Node.js搭建程序服务端的大致步骤: 1. 安装Node.js首先,从Node.js官方网站下载并安装适合您操作系统的版本。在命令提示符中执行node-v,npm-v,检查nodejs版本是否安装完成。配置环境变量。2. 安装Oracle客户端根据您的操作系统,下载并安......
  • P2163 [SHOI2007] 园丁的烦恼 题解
    题目传送门题目大意:在一个平面直角坐标系上,给定\(n\)个点的坐标\((x,y)\),\(m\)次询问,每次询问一个矩形范围内的点的数量,此矩形用\(\{a,b,c,d\}\)来描述,其中\((a,b)\)为左下角,\((c,d)\)为右上角。思路:不难将题目转化为:给定一个长度为\(n\)的序列,序列中的每个元......
  • 计算机入门和服务器入门知识总结
    一、计算机入门知识1.1什么是计算机是一种能接收和存储信息,并按照存储在其内部的程序对海量数据进行自动、高速地处理,然后把处理结果输出的现代化智能电子设备发明计算机的目标是代替人类去高效且高质量地完成工作。1.2计算机发展史第一代计算机(1946-1957)电子管时代第......
  • Polly服务熔断
    //自定义异常publicclassMyException:Exception{publicMyException(string?message):base(message){}}publicclassCircuitBreakerExample{//熔断规则privatestaticreadonlyIAsyncPolicy<HttpResponseMessage>_circuitB......
  • 从服务器获取数据后更新 DataTable 的列
    我需要一个解决方案来解决我的问题。我有一个Django应用程序,我在服务器端处理中使用DataTables,表模板对于我拥有的所有模型都是动态的,我只需传递列(带有data,||的字典列表|和name)在模板的上下文中,非常简单...title之后,我需要对列进行一些......
  • docker换国内镜像源-Docker安装 Nginx测试-Docker部署Gitblit服务器
    docker换国内镜像源,docker换源echo>/etc/docker/daemon.jsoncat>/etc/docker/daemon.json<<END{  "registry-mirrors":[    "https://hub-mirror.c.163.com",    "https://ustc-edu-cn.mirror.aliyuncs.com",    "https:/......
  • Leetcode每日一题 20240729 682.棒球比赛
    题目描述你现在是一场采用特殊赛制棒球比赛的记录员。这场比赛由若干回合组成,过去几回合的得分可能会影响以后几回合的得分。比赛开始时,记录是空白的。你会得到一个记录操作的字符串列表ops,其中ops[i]是你需要记录的第i项操作,ops遵循下述规则:整数x:表示本回合新获......