zoukankan      html  css  js  c++  java
  • SpringCloud Alibaba Nacos服务注册与配置管理

    Nacos

    SpringCloud Alibaba Nacos是一个狗抑郁构建云原生应用的动态服务发现、配置管理和服务管理平台。

    Nacos:Dynamic Naming and Configuration Service

    Nacos是注册中心+配置中心=Eureka+Bus+Config

    Nacos安装并运行

    本地环境必须有Java8以上版本和maven环境,先从官网上下载Nacos,然后解压安装包,直接在bin目录下的startup.cmd,运行成功后直接访问http://localhost:8848/nacos。用户名密码都是nacos,然后登陆到控制台。

    image-20201204202856985

    服务注册与发现

    如果要在您的项目中使用 Nacos 来实现服务注册/发现,使用 group ID 为 com.alibaba.cloud 和 artifact ID 为 spring-cloud-starter-alibaba-nacos-discovery的 starter。

    
    <dependencies>
            <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>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-actuator</artifactId>
            </dependency>
        </dependencies>
    

    如果不想使用 Nacos 作为您的服务注册与发现,可以将 spring.cloud.nacos.discovery 设置为 false。一般使用时设置成true。
    application.yml

    server:
      port: 9001
    spring:
      application:
        name: nacos-payment-provider
      cloud:
        nacos:
          discovery:
            server-addr: 127.0.0.1:8848
    
    management:
      endpoints:
        web:
          exposure:
            include: '*'
    
    

    之后输入localhost:8848/nacos进入web端nacos管理平台,然后可以在服务列表中看到注册成功的实例名称。

    注册到Nacos中有服务提供者和服务消费者。消费者调用提供者的方式要稍微复杂一些。
    因为Nacos的依赖中默认引入了Ribbon服务调用和负载均衡工具,因为在 Consumer 端需要去调用 Provider 端提供的REST 服务。例子中我们使用最原始的一种方式, 即显示的使用 LoadBalanceClient 和 RestTemplate 结合的方式来访问。

    服务提供方Controller

    @RestController
    public class PayController {
        
        @GetMapping(value = "/echo/{string}")
        public String echo(@PathVariable String string) {
            return "9001 nacos payment" + string;
        }
    }
    
    

    服务提供方配置

    server:
      port: 9002
    spring:
      application:
        name: nacos-payment-provider
      cloud:
        nacos:
          discovery:
            server-addr: 127.0.0.1:8848
    
    management:
      endpoints:
        web:
          exposure:
            include: '*'
    
    

    消费方的pomxml和提供者的一样,这里不再显示。
    消费者的配置文件

    server:
      port: 83
    spring:
      cloud:
        nacos:
          discovery:
            server-addr: 127.0.0.1:8848
      application:
        name: nacos-order83-consumer
    
    management:
      endpoints:
        web:
          exposure:
            include: '*'
    # 消费者将要访问的微服务名称(服务提供者)
    service-url:
      nacos-user-service: http://nacos-payment-provider
    

    消费方的配置类

    @Configuration
    public class ApplicationContextConfig {
    
        @Bean
        @LoadBalanced
        public RestTemplate getRestTemplate(){
            return new RestTemplate();
        }
    
    }
    

    消费者的controller

    @RestController
    public class OrderController {
        @Resource
        private RestTemplate restTemplate;
        @Value("{service-url.nacos-user-service}")
        private String SERVICE_URL;
    
        @GetMapping(value = "/consumer/echo/{string}")
        public String echo(@PathVariable String string) {
            return restTemplate.getForObject("http://nacos-payment-provider/echo/" + string,String.class);
        }
    
    }
    

    启动两个服务,然后访问消费者的localhost:83/consumer/echo/参数
    输出“9002 nacos payment,参数”

    服务注册中心对比

    image-20201204212219087

    C:是所有节点在同一时间看到的数据是一致的;A:是所有的请求都会得到响应。

    一般俩说如果不需要存储服务级别的信息且服务实例是通过nacos-client注册,并能够保持心跳上报,那么可以选择AP模式,当前主流的服务如Spring cloud和Dubbo服务,都适用于AP模式,AP模式是为了服务的可能性减弱了一致性,因此AP模式下只支持注册临时实例。

    如果需要在服务级别编辑或者存储配置信息,那么CP是必要的,K8s服务和DNS服务适用于CP模式。CP模式下则支持持久化实例,此时则是以Raft协议伪集群运行模式,该模式下注册实例之前还必须先注册服务,如果服务不存在,则会返回错误。

    Nacos引入中,默认包含有Ribbon相关依赖,因此负载均衡算法包含轮询,随机,加权等。

    Nacos Config

    使用Spring Cloud Alibaba Nacos Config,可基于SpringCloud的编程模式快速接入Nacos配置管理功能。

    Nacos同SpringCloud-Config一样,在项目初始化时,要保证先从配置中心进行配置拉取,拉取配置后,才能保证项目的正常启动。

    SpringBoot中配置文件是存在优先级顺序的,bootstrap优先级高于application。

    引入相关依赖

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

    配置文件

    application.yml

    spring:
      profiles:
        active: dev # 表示开发环境
        #active: test # 表示测试环境
        #active: info
    

    bootstrap.yml

    # nacos配置
    server:
      port: 3377
    
    spring:
      application:
        name: nacos-config-client
      cloud:
        nacos:
          discovery:
            server-addr: localhost:8848 #Nacos服务注册中心地址
          config:
            server-addr: localhost:8848 #Nacos作为配置中心地址
            file-extension: yaml #指定yaml格式的配置
            
    

    动态获取配置

    在自定义的属性值所在的类上添加@RefreshScope:动态获取并刷新配置

    @Value("${配置项的名}"):获取配置文件中指定配置项的值
    controller

    @RestController
    @RefreshScope //动态刷新
    public class ConfigClientController {
        @Value("${config.info}")
        private String configInfo;
    
        @GetMapping("config/info")
        public String getConfigInfo(){
            //将nacos控制平台上的配置信息返回
            return configInfo;
        }
    }
    

    启动nacos,主启动类启动。

    进入localhost:8848/nacos/,登录nacos后,点击配置列表,选择添加配置。

    这里需要注意的是,配置文件名的命名规范。

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

    image-20201205161218121

    image-20201205161233859

    image-20201205161300587

    将这三个属性值合并起来就是配置中心新建的配置文件的DataIdnacos-config-client-dev.yaml。只有这样动态刷新配置时才能识别。

    image-20201205161619436

    image-20201205161810284

    这时配置好config.info的值后,访问controller指定路径。结果如下。

    image-20201205161840465

    将配置文件中的版本改成2后重新访问。

    image-20201205161923310
    如果配置中心和当前应用的配置文件中配置了相同的项,优先使用配置中心的配置。

    image-20200929182608276

    image-20200929182622410

    {"msg":"success","empname":"zhangsan","code":0,"age":24}
    

    Nacos的名称空间

    类似于Java里面的包名和类名,最外层的namespace是可以用于区分部署环境的,GroupID和DataID用于区分不同的对象。

    Nacos默认名称空间是public,Namespace主要用来实现隔离。

    比如说现在有三个环境:开发,测试和生产环境,我们可以创建三个NameSpace,不同的Namespace之间是相互隔离的。

    Service是微服务,一个Service可以包含多个集群,Nacos默认几圈是DEFAULT,集群Cluster是对指定微服务的一个虚拟划分。

    将Service微服务分别部署在杭州机房和北京机房。

    最后是Instance是微服务的实例。

    指定spring.profile.active和配置文件的DataID 来使不同的环境下读取不同的配置

    默认空间+默认分组+新建dev+test两个DataID。

    通过`spring.profile.active属性就能进行火哥环境下配置文件的读取。

    image-20201205164817246

    image-20201205164833043

    image-20201205164851946

  • 相关阅读:
    《分析服务从入门到精通读书笔记》第五章、创建多维数据集之浏览数据(1)
    灵活运用SQL Server2008 SSIS变量
    SSIS几个通用属性
    [原创]Silverlight开发实践系列导航(提供源码)
    【转】Scott_ASP.NET MVC框架(第四部分) 处理表单编辑和提交场景
    C#数据结构(二)栈和队列
    C#数据结构(一)线性表
    django学习(一)
    谈谈电子商务网站的促销规则(定价策略)设计(三)
    GAE使用中的问题
  • 原文地址:https://www.cnblogs.com/dataoblogs/p/14121818.html
Copyright © 2011-2022 走看看